diff --git a/README.md b/README.md index 11a3493ea..975a82a02 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ It's easy to use, configurable for high-quality graphics. Benefit from the modul #### [Download](https://github.com/pissang/claygl/releases) -#### [API](http://docs.claygl.com/api) +#### [API](http://docs.claygl.xyz/api) -#### [Examples](http://examples.claygl.com) +#### [Examples](http://examples.claygl.xyz) ## Projects diff --git a/dist/claygl.es.js b/dist/claygl.es.js index 4d154ea91..798bed959 100644 --- a/dist/claygl.es.js +++ b/dist/claygl.es.js @@ -593,9 +593,6 @@ Clip.prototype = { }; Clip.prototype.constructor = Clip; -/** - * @module echarts/animation/Animator - */ var arraySlice = Array.prototype.slice; function defaultGetter(target, key) { @@ -615,7 +612,8 @@ function interpolateArray(p0, p1, percent, out, arrDim) { for (var i = 0; i < len; i++) { out[i] = interpolateNumber(p0[i], p1[i], percent); } - } else { + } + else { var len2 = p0[0].length; for (var i = 0; i < len; i++) { for (var j = 0; j < len2; j++) { @@ -752,10 +750,10 @@ function isArraySame(arr0, arr1, arrDim) { return true; } -function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, interpolater) { +function createTrackClip(animator, globalEasing, oneTrackDone, keyframes, propName, interpolater, maxTime) { var getter = animator._getter; var setter = animator._setter; - var useSpline = easing === 'spline'; + var useSpline = globalEasing === 'spline'; var trackLen = keyframes.length; if (!trackLen) { @@ -776,16 +774,17 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in return a.time - b.time; }); - var trackMaxTime = keyframes[trackLen - 1].time; // Percents of each keyframe var kfPercents = []; // Value of each keyframe var kfValues = []; + // Easing funcs of each keyframe. + var kfEasings = []; var prevValue = keyframes[0].value; var isAllValueEqual = true; for (var i = 0; i < trackLen; i++) { - kfPercents.push(keyframes[i].time / trackMaxTime); + kfPercents.push(keyframes[i].time / maxTime); // Assume value is a color when it is a string var value = keyframes[i].value; @@ -798,6 +797,7 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in prevValue = value; kfValues.push(value); + kfEasings.push(keyframes[i].easing); } if (isAllValueEqual) { return; @@ -828,7 +828,7 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in var onframe = function(target, percent) { // Find the range keyframes // kf1-----kf2---------current--------kf3 - // find kf2(i) and kf3(i+1) and do interpolation + // find kf2(i) and kf3(i + 1) and do interpolation if (percent < cachePercent) { // Start from next key start = Math.min(cacheKey + 1, trackLen - 1); @@ -837,24 +837,30 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in break; } } - i = Math.min(i, trackLen-2); - } else { + i = Math.min(i, trackLen - 2); + } + else { for (i = cacheKey; i < trackLen; i++) { if (kfPercents[i] > percent) { break; } } - i = Math.min(i-1, trackLen-2); + i = Math.min(i - 1, trackLen - 2); } cacheKey = i; cachePercent = percent; - var range = (kfPercents[i+1] - kfPercents[i]); + var range = (kfPercents[i + 1] - kfPercents[i]); if (range === 0) { return; - } else { + } + else { w = (percent - kfPercents[i]) / range; + // Clamp 0 - 1 + w = Math.max(Math.min(1, w), 0); } + w = kfEasings[i + 1](w); + if (useSpline) { p1 = kfValues[i]; p0 = kfValues[i === 0 ? i : i - 1]; @@ -869,20 +875,23 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in p0, p1, p2, p3, w ) ); - } else if (isValueArray) { + } + else if (isValueArray) { catmullRomInterpolateArray( p0, p1, p2, p3, w, w*w, w*w*w, getter(target, propName), arrDim ); - } else { + } + else { setter( target, propName, catmullRomInterpolate(p0, p1, p2, p3, w, w*w, w*w*w) ); } - } else { + } + else { if (interpolater) { setter( target, @@ -895,13 +904,15 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in ) ); } + else if (isValueArray) { interpolateArray( kfValues[i], kfValues[i+1], w, getter(target, propName), arrDim ); - } else { + } + else { setter( target, propName, @@ -913,15 +924,15 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in var clip = new Clip({ target: animator._target, - life: trackMaxTime, + life: maxTime, loop: animator._loop, delay: animator._delay, onframe: onframe, onfinish: oneTrackDone }); - if (easing && easing !== 'spline') { - clip.setEasing(easing); + if (globalEasing && globalEasing !== 'spline') { + clip.setEasing(globalEasing); } return clip; @@ -958,6 +969,14 @@ function Animator(target, loop, getter, setter, interpolater) { this._onframeList = []; this._clipList = []; + + this._maxTime = 0; + + this._lastKFTime = 0; +} + +function noopEasing(w) { + return w; } Animator.prototype = { @@ -965,12 +984,17 @@ Animator.prototype = { constructor: Animator, /** - * @param {number} time Keyframe time using millisecond - * @param {Object} props A key-value object. Value can be number, 1d and 2d array + * @param {number} time Keyframe time using millisecond + * @param {Object} props A key-value object. Value can be number, 1d and 2d array + * @param {string|Function} [easing] * @return {clay.animation.Animator} * @memberOf clay.animation.Animator.prototype */ - when: function (time, props) { + when: function (time, props, easing$$1) { + + this._maxTime = Math.max(time, this._maxTime); + + easing$$1 = (typeof easing$$1 === 'function' ? easing$$1 : easing[easing$$1]) || noopEasing; for (var propName in props) { if (!this._tracks[propName]) { this._tracks[propName] = []; @@ -983,17 +1007,31 @@ Animator.prototype = { time: 0, value: cloneValue( this._getter(this._target, propName) - ) + ), + easing: easing$$1 }); } } this._tracks[propName].push({ time: parseInt(time), - value: props[propName] + value: props[propName], + easing: easing$$1 }); } return this; }, + /** + * @param {number} time Keyframe elapsed time since last keyframe + * @param {Object} props A key-value object. Value can be number, 1d and 2d array + * @param {string|Function} [easing] + * @return {clay.animation.Animator} + * @memberOf clay.animation.Animator.prototype + */ + then: function (duringTime, props, easing$$1) { + this.when(duringTime + this._lastKFTime, props, easing$$1); + this._lastKFTime += duringTime; + return this; + }, /** * callback when running animation * @param {Function} callback callback have two args, animating target and current percent @@ -1023,7 +1061,7 @@ Animator.prototype = { * @return {clay.animation.Animator} * @memberOf clay.animation.Animator.prototype */ - start: function (easing) { + start: function (globalEasing) { var self = this; var clipCount = 0; @@ -1038,8 +1076,8 @@ Animator.prototype = { var lastClip; for (var propName in this._tracks) { var clip = createTrackClip( - this, easing, oneTrackDone, - this._tracks[propName], propName, self._interpolater + this, globalEasing, oneTrackDone, + this._tracks[propName], propName, self._interpolater, self._maxTime ); if (clip) { this._clipList.push(clip); @@ -11008,6 +11046,11 @@ var Texture = Base.extend( * @default true */ flipY: true, + + /** + * A flag to indicate if texture source is sRGB + */ + sRGB: true, /** * @type {number} * @default 4 @@ -11646,6 +11689,9 @@ LRU$1.prototype.clear = function() { this._map = {}; }; +/** + * @namespace clay.core.color + */ var colorUtil = {}; var kCSSColorTable = { @@ -11798,10 +11844,10 @@ function putToCache(colorStr, rgbaArr) { } /** + * @name clay.core.color.parse * @param {string} colorStr * @param {Array.} out * @return {Array.} - * @memberOf module:zrender/util/color */ colorUtil.parse = function (colorStr, rgbaArr) { if (!colorStr) { @@ -11925,6 +11971,7 @@ colorUtil.parseToFloat = function (colorStr, rgbaArr) { }; /** + * @name clay.core.color.hsla2rgba * @param {Array.} hsla * @param {Array.} rgba * @return {Array.} rgba @@ -11954,6 +12001,7 @@ function hsla2rgba(hsla, rgba) { } /** + * @name clay.core.color.rgba2hsla * @param {Array.} rgba * @return {Array.} hsla */ @@ -12020,10 +12068,10 @@ function rgba2hsla(rgba) { } /** + * @name clay.core.color.lift * @param {string} color * @param {number} level * @return {string} - * @memberOf module:zrender/util/color */ colorUtil.lift = function (color, level) { var colorArr = colorUtil.parse(color); @@ -12041,9 +12089,9 @@ colorUtil.lift = function (color, level) { }; /** + * @name clay.core.color.toHex * @param {string} color * @return {string} - * @memberOf module:zrender/util/color */ colorUtil.toHex = function (color) { var colorArr = colorUtil.parse(color); @@ -12054,6 +12102,7 @@ colorUtil.toHex = function (color) { /** * Map value to color. Faster than lerp methods because color is represented by rgba array. + * @name clay.core.color * @param {number} normalizedValue A float between 0 and 1. * @param {Array.>} colors List of rgba color array * @param {Array.} [out] Mapped gba color array @@ -12082,9 +12131,6 @@ colorUtil.fastLerp = function (normalizedValue, colors, out) { return out; }; -/** - * @deprecated - */ colorUtil.fastMapToColor = colorUtil.fastLerp; /** @@ -12093,7 +12139,6 @@ colorUtil.fastMapToColor = colorUtil.fastLerp; * @param {boolean=} fullOutput Default false. * @return {(string|Object)} Result color. If fullOutput, * return {color: ..., leftIndex: ..., rightIndex: ..., value: ...}, - * @memberOf module:zrender/util/color */ colorUtil.lerp = function (normalizedValue, colors, fullOutput) { if (!(colors && colors.length) @@ -12135,12 +12180,12 @@ colorUtil.lerp = function (normalizedValue, colors, fullOutput) { colorUtil.mapToColor = colorUtil.lerp; /** + * @name clay.core.color * @param {string} color * @param {number=} h 0 ~ 360, ignore when null. * @param {number=} s 0 ~ 1, ignore when null. * @param {number=} l 0 ~ 1, ignore when null. * @return {string} Color string in rgba format. - * @memberOf module:zrender/util/color */ colorUtil.modifyHSL = function (color, h, s, l) { color = colorUtil.parse(color); @@ -12159,7 +12204,6 @@ colorUtil.modifyHSL = function (color, h, s, l) { * @param {string} color * @param {number=} alpha 0 ~ 1 * @return {string} Color string in rgba format. - * @memberOf module:zrender/util/color */ colorUtil.modifyAlpha = function (color, alpha) { color = colorUtil.parse(color); @@ -14296,7 +14340,6 @@ var Renderer = Base.extend(function () { } // Render opaque list - scene.trigger('beforerender:opaque', this, opaqueList); var opaqueRenderInfo = this.renderPass(opaqueList, camera, { getMaterial: function (renderable) { return sceneMaterial || renderable.material; @@ -14304,9 +14347,6 @@ var Renderer = Base.extend(function () { sortCompare: this.opaqueSortCompare }); - scene.trigger('afterrender:opaque', this, opaqueList, opaqueRenderInfo); - scene.trigger('beforerender:transparent', this, transparentList); - var transparentRenderInfo = this.renderPass(transparentList, camera, { getMaterial: function (renderable) { return sceneMaterial || renderable.material; @@ -14314,7 +14354,6 @@ var Renderer = Base.extend(function () { sortCompare: this.transparentSortCompare }); - scene.trigger('afterrender:transparent', this, transparentList, transparentRenderInfo); var renderInfo = {}; for (var name in opaqueRenderInfo) { renderInfo[name] = opaqueRenderInfo[name] + transparentRenderInfo[name]; @@ -14417,6 +14456,8 @@ var Renderer = Base.extend(function () { * @return {IRenderInfo} */ renderPass: function(list, camera, passConfig) { + this.trigger('beforerenderpass', this, list, camera, passConfig); + var renderInfo = { triangleCount: 0, vertexCount: 0, @@ -14607,6 +14648,8 @@ var Renderer = Base.extend(function () { list[i].__program = null; } + this.trigger('afterrenderpass', this, list, camera, passConfig); + return renderInfo; }, @@ -19013,6 +19056,104 @@ var Sphere$1 = Geometry.extend( } }); +/** + * @constructor clay.geometry.ParametricSurface + * @extends clay.Geometry + * @param {Object} [opt] + * @param {Object} [generator] + * @param {Function} generator.x + * @param {Function} generator.y + * @param {Function} generator.z + * @param {Array} [generator.u=[0, 1, 0.05]] + * @param {Array} [generator.v=[0, 1, 0.05]] + */ +var ParametricSurface$1 = Geometry.extend( +/** @lends clay.geometry.ParametricSurface# */ +{ + dynamic: false, + /** + * @type {Object} + */ + generator: null + +}, function() { + this.build(); +}, +/** @lends clay.geometry.ParametricSurface.prototype */ +{ + /** + * Build parametric surface geometry + */ + build: function () { + var generator = this.generator; + + if (!generator || !generator.x || !generator.y || !generator.z) { + throw new Error('Invalid generator'); + } + var xFunc = generator.x; + var yFunc = generator.y; + var zFunc = generator.z; + var uRange = generator.u || [0, 1, 0.05]; + var vRange = generator.v || [0, 1, 0.05]; + + var uNum = Math.floor((uRange[1] - uRange[0] + uRange[2]) / uRange[2]); + var vNum = Math.floor((vRange[1] - vRange[0] + vRange[2]) / vRange[2]); + + if (!isFinite(uNum) || !isFinite(vNum)) { + throw new Error('Infinite generator'); + } + + var vertexNum = uNum * vNum; + this.attributes.position.init(vertexNum); + this.attributes.texcoord0.init(vertexNum); + + var pos = []; + var texcoord = []; + var nVertex = 0; + for (var j = 0; j < vNum; j++) { + for (var i = 0; i < uNum; i++) { + var u = i * uRange[2] + uRange[0]; + var v = j * vRange[2] + vRange[0]; + pos[0] = xFunc(u, v); + pos[1] = yFunc(u, v); + pos[2] = zFunc(u, v); + + texcoord[0] = i / (uNum - 1); + texcoord[1] = j / (vNum - 1); + + this.attributes.position.set(nVertex, pos); + this.attributes.texcoord0.set(nVertex, texcoord); + nVertex++; + } + } + + var IndicesCtor = vertexNum > 0xffff ? Uint32Array : Uint16Array; + var nIndices = (uNum - 1) * (vNum - 1) * 6; + var indices = this.indices = new IndicesCtor(nIndices); + + var n = 0; + for (var j = 0; j < vNum - 1; j++) { + for (var i = 0; i < uNum - 1; i++) { + var i2 = j * uNum + i; + var i1 = (j * uNum + i + 1); + var i4 = (j + 1) * uNum + i + 1; + var i3 = (j + 1) * uNum + i; + + indices[n++] = i1; + indices[n++] = i2; + indices[n++] = i4; + + indices[n++] = i2; + indices[n++] = i3; + indices[n++] = i4; + } + } + + this.generateVertexNormals(); + this.updateBoundingBox(); + } +}); + var mathUtil = {}; mathUtil.isPowerOfTwo = function (value) { @@ -19258,6 +19399,271 @@ Object.defineProperty(Texture2D.prototype, 'height', { } }); +var isPowerOfTwo$1 = mathUtil.isPowerOfTwo; + +var targetList = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; + +/** + * @constructor clay.TextureCube + * @extends clay.Texture + * + * @example + * ... + * var mat = new clay.Material({ + * shader: clay.shader.library.get('clay.phong', 'environmentMap') + * }); + * var envMap = new clay.TextureCube(); + * envMap.load({ + * 'px': 'assets/textures/sky/px.jpg', + * 'nx': 'assets/textures/sky/nx.jpg' + * 'py': 'assets/textures/sky/py.jpg' + * 'ny': 'assets/textures/sky/ny.jpg' + * 'pz': 'assets/textures/sky/pz.jpg' + * 'nz': 'assets/textures/sky/nz.jpg' + * }); + * mat.set('environmentMap', envMap); + * ... + * envMap.success(function () { + * // Wait for the sky texture loaded + * animation.on('frame', function (frameTime) { + * renderer.render(scene, camera); + * }); + * }); + */ +var TextureCube = Texture.extend(function () { + return /** @lends clay.TextureCube# */{ + + /** + * @type {boolean} + * @default false + */ + // PENDING cubemap should not flipY in default. + // flipY: false, + + /** + * @type {Object} + * @property {?HTMLImageElement|HTMLCanvasElemnet} px + * @property {?HTMLImageElement|HTMLCanvasElemnet} nx + * @property {?HTMLImageElement|HTMLCanvasElemnet} py + * @property {?HTMLImageElement|HTMLCanvasElemnet} ny + * @property {?HTMLImageElement|HTMLCanvasElemnet} pz + * @property {?HTMLImageElement|HTMLCanvasElemnet} nz + */ + image: { + px: null, + nx: null, + py: null, + ny: null, + pz: null, + nz: null + }, + /** + * Pixels data of each side. Will be ignored if images are set. + * @type {Object} + * @property {?Uint8Array} px + * @property {?Uint8Array} nx + * @property {?Uint8Array} py + * @property {?Uint8Array} ny + * @property {?Uint8Array} pz + * @property {?Uint8Array} nz + */ + pixels: { + px: null, + nx: null, + py: null, + ny: null, + pz: null, + nz: null + }, + + /** + * @type {Array.} + */ + mipmaps: [] + }; +}, { + update: function (renderer) { + var _gl = renderer.gl; + _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); + + this.updateCommon(renderer); + + var glFormat = this.format; + var glType = this.type; + + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, this.getAvailableWrapS()); + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, this.getAvailableWrapT()); + + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, this.getAvailableMagFilter()); + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, this.getAvailableMinFilter()); + + var anisotropicExt = renderer.getGLExtension('EXT_texture_filter_anisotropic'); + if (anisotropicExt && this.anisotropic > 1) { + _gl.texParameterf(_gl.TEXTURE_CUBE_MAP, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic); + } + + // Fallback to float type if browser don't have half float extension + if (glType === 36193) { + var halfFloatExt = renderer.getGLExtension('OES_texture_half_float'); + if (!halfFloatExt) { + glType = glenum.FLOAT; + } + } + + if (this.mipmaps.length) { + var width = this.width; + var height = this.height; + for (var i = 0; i < this.mipmaps.length; i++) { + var mipmap = this.mipmaps[i]; + this._updateTextureData(_gl, mipmap, i, width, height, glFormat, glType); + width /= 2; + height /= 2; + } + } + else { + this._updateTextureData(_gl, this, 0, this.width, this.height, glFormat, glType); + + if (!this.NPOT && this.useMipmap) { + _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + } + + _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, null); + }, + + _updateTextureData: function (_gl, data, level, width, height, glFormat, glType) { + for (var i = 0; i < 6; i++) { + var target = targetList[i]; + var img = data.image && data.image[target]; + if (img) { + _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, glFormat, glType, img); + } + else { + _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, width, height, 0, glFormat, glType, data.pixels && data.pixels[target]); + } + } + }, + + /** + * @param {clay.Renderer} renderer + * @memberOf clay.TextureCube.prototype + */ + generateMipmap: function (renderer) { + var _gl = renderer.gl; + if (this.useMipmap && !this.NPOT) { + _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); + _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + }, + + bind: function (renderer) { + renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, this.getWebGLTexture(renderer)); + }, + + unbind: function (renderer) { + renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, null); + }, + + // Overwrite the isPowerOfTwo method + isPowerOfTwo: function () { + if (this.image.px) { + return isPowerOfTwo$1(this.image.px.width) + && isPowerOfTwo$1(this.image.px.height); + } + else { + return isPowerOfTwo$1(this.width) + && isPowerOfTwo$1(this.height); + } + }, + + isRenderable: function () { + if (this.image.px) { + return isImageRenderable(this.image.px) + && isImageRenderable(this.image.nx) + && isImageRenderable(this.image.py) + && isImageRenderable(this.image.ny) + && isImageRenderable(this.image.pz) + && isImageRenderable(this.image.nz); + } + else { + return !!(this.width && this.height); + } + }, + + load: function (imageList, crossOrigin) { + var loading = 0; + var self = this; + util$1.each(imageList, function (src, target){ + var image = new Image(); + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + image.onload = function () { + loading --; + if (loading === 0){ + self.dirty(); + self.trigger('success', self); + } + image.onload = null; + }; + image.onerror = function () { + loading --; + image.onerror = null; + }; + + loading++; + image.src = src; + self.image[target] = image; + }); + + return this; + } +}); + +Object.defineProperty(TextureCube.prototype, 'width', { + get: function () { + if (this.image && this.image.px) { + return this.image.px.width; + } + return this._width; + }, + set: function (value) { + if (this.image && this.image.px) { + console.warn('Texture from image can\'t set width'); + } + else { + if (this._width !== value) { + this.dirty(); + } + this._width = value; + } + } +}); +Object.defineProperty(TextureCube.prototype, 'height', { + get: function () { + if (this.image && this.image.px) { + return this.image.px.height; + } + return this._height; + }, + set: function (value) { + if (this.image && this.image.px) { + console.warn('Texture from image can\'t set height'); + } + else { + if (this._height !== value) { + this.dirty(); + } + this._height = value; + } + } +}); +function isImageRenderable(image) { + return image.nodeName === 'CANVAS' || + image.nodeName === 'VIDEO' || + image.complete; +} + var _library = {}; function ShaderLibrary () { @@ -20044,7 +20450,7 @@ var request = { get : get }; -var standardEssl = "\n@export clay.standard.vertex\n#define SHADER_NAME standard\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#if defined(AOMAP_ENABLED)\nattribute vec2 texcoord2 : TEXCOORD_1;\n#endif\nattribute vec3 normal : NORMAL;\nattribute vec4 tangent : TANGENT;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#if defined(AOMAP_ENABLED)\nvarying vec2 v_Texcoord2;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n v_Barycentric = barycentric;\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n#if defined(AOMAP_ENABLED)\n v_Texcoord2 = texcoord2;\n#endif\n}\n@end\n@export clay.standard.fragment\n#define PI 3.14159265358979\n#define GLOSSINESS_CHANNEL 0\n#define ROUGHNESS_CHANNEL 0\n#define METALNESS_CHANNEL 1\nuniform mat4 viewInverse : VIEWINVERSE;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\nuniform sampler2D diffuseMap;\n#endif\n#ifdef SPECULARMAP_ENABLED\nuniform sampler2D specularMap;\n#endif\n#ifdef USE_ROUGHNESS\nuniform float roughness : 0.5;\n #ifdef ROUGHNESSMAP_ENABLED\nuniform sampler2D roughnessMap;\n #endif\n#else\nuniform float glossiness: 0.5;\n #ifdef GLOSSINESSMAP_ENABLED\nuniform sampler2D glossinessMap;\n #endif\n#endif\n#ifdef METALNESSMAP_ENABLED\nuniform sampler2D metalnessMap;\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\nuniform samplerCube environmentMap;\n #ifdef PARALLAX_CORRECTED\nuniform vec3 environmentBoxMin;\nuniform vec3 environmentBoxMax;\n #endif\n#endif\n#ifdef BRDFLOOKUP_ENABLED\nuniform sampler2D brdfLookup;\n#endif\n#ifdef EMISSIVEMAP_ENABLED\nuniform sampler2D emissiveMap;\n#endif\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n#ifdef AOMAP_ENABLED\nuniform sampler2D aoMap;\nuniform float aoIntensity;\nvarying vec2 v_Texcoord2;\n#endif\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef USE_METALNESS\nuniform float metalness : 0.0;\n#else\nuniform vec3 specularColor : [0.1, 0.1, 0.1];\n#endif\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float emissionIntensity: 1;\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef ENVIRONMENTMAP_PREFILTER\nuniform float maxMipmapLevel: 5;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.plugin.compute_shadow_map\n@import clay.util.parallax_correct\n@import clay.util.ACES\nfloat G_Smith(float g, float ndv, float ndl)\n{\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(float g, float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (PI * tmp * tmp);\n}\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\nuniform float parallaxOcclusionScale : 0.02;\nuniform float parallaxMaxLayers : 20;\nuniform float parallaxMinLayers : 5;\nuniform sampler2D parallaxOcclusionMap;\nmat3 transpose(in mat3 inMat)\n{\n vec3 i0 = inMat[0];\n vec3 i1 = inMat[1];\n vec3 i2 = inMat[2];\n return mat3(\n vec3(i0.x, i1.x, i2.x),\n vec3(i0.y, i1.y, i2.y),\n vec3(i0.z, i1.z, i2.z)\n );\n}\nvec2 parallaxUv(vec2 uv, vec3 viewDir)\n{\n float numLayers = mix(parallaxMaxLayers, parallaxMinLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));\n float layerHeight = 1.0 / numLayers;\n float curLayerHeight = 0.0;\n vec2 deltaUv = viewDir.xy * parallaxOcclusionScale / (viewDir.z * numLayers);\n vec2 curUv = uv;\n float height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n for (int i = 0; i < 30; i++) {\n curLayerHeight += layerHeight;\n curUv -= deltaUv;\n height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n if (height < curLayerHeight) {\n break;\n }\n }\n vec2 prevUv = curUv + deltaUv;\n float next = height - curLayerHeight;\n float prev = 1.0 - texture2D(parallaxOcclusionMap, prevUv).r - curLayerHeight + layerHeight;\n return mix(curUv, prevUv, next / (next - prev));\n}\n#endif\nvoid main() {\n vec4 albedoColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n albedoColor *= v_Color;\n#endif\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n vec2 uv = v_Texcoord;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n#endif\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\n uv = parallaxUv(v_Texcoord, normalize(transpose(tbn) * -V));\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 texel = texture2D(diffuseMap, uv);\n #ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n #endif\n albedoColor.rgb *= texel.rgb;\n #ifdef DIFFUSEMAP_ALPHA_ALPHA\n albedoColor.a *= texel.a;\n #endif\n#endif\n#ifdef USE_METALNESS\n float m = metalness;\n #ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, uv)[METALNESS_CHANNEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n #endif\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 spec = mix(vec3(0.04), baseColor, m);\n#else\n vec3 spec = specularColor;\n#endif\n#ifdef USE_ROUGHNESS\n float g = 1.0 - roughness;\n #ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, uv)[ROUGHNESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#else\n float g = glossiness;\n #ifdef GLOSSINESSMAP_ENABLED\n float g2 = texture2D(glossinessMap, uv)[GLOSSINESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#endif\n#ifdef SPECULARMAP_ENABLED\n spec *= sRGBToLinear(texture2D(specularMap, uv)).rgb;\n#endif\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, uv).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n tbn[1] = -tbn[1];\n N = normalize(tbn * N);\n }\n }\n#endif\n vec3 diffuseTerm = vec3(0.0, 0.0, 0.0);\n vec3 specularTerm = vec3(0.0, 0.0, 0.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, spec);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_];\n }}\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_COUNT; _idx_++)\n {{\n vec3 lightPosition = pointLightPosition[_idx_];\n vec3 lc = pointLightColor[_idx_];\n float range = pointLightRange[_idx_];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsPoint[_idx_];\n }\n#endif\n vec3 li = lc * ndl * attenuation * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -normalize(directionalLightDirection[_idx_]);\n vec3 lc = directionalLightColor[_idx_];\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n vec3 li = lc * ndl * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = spotLightPosition[i];\n vec3 spotLightDirection = -normalize(spotLightDirection[i]);\n vec3 lc = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n float c = dot(spotLightDirection, L);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n vec3 li = lc * attenuation * (1.0 - falloff) * shadowContrib * ndl;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }\n#endif\n vec4 outColor = albedoColor;\n outColor.rgb *= diffuseTerm;\n outColor.rgb += specularTerm;\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = spec * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 51.5);\n outColor.rgb += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2;\n }}\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\n vec3 envWeight = g * fresnelTerm;\n vec3 L = reflect(-V, N);\n #ifdef PARALLAX_CORRECTED\n L = parallaxCorrect(L, v_WorldPosition, environmentBoxMin, environmentBoxMax);\n #endif\n #ifdef ENVIRONMENTMAP_PREFILTER\n float rough = clamp(1.0 - g, 0.0, 1.0);\n float bias = rough * maxMipmapLevel;\n vec3 envTexel = decodeHDR(textureCubeLodEXT(environmentMap, L, bias)).rgb;\n #ifdef BRDFLOOKUP_ENABLED\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n envWeight = spec * brdfParam.x + brdfParam.y;\n #endif\n #else\n vec3 envTexel = textureCube(environmentMap, L).xyz;\n #endif\n outColor.rgb += envTexel * envWeight;\n#endif\n float aoFactor = 1.0;\n#ifdef SSAOMAP_ENABLED\n aoFactor = min(texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r, aoFactor);\n#endif\n#ifdef AOMAP_ENABLED\n aoFactor = min(1.0 - clamp((1.0 - texture2D(aoMap, v_Texcoord2).r) * aoIntensity, 0.0, 1.0), aoFactor);\n#endif\n outColor.rgb *= aoFactor;\n vec3 lEmission = emission;\n#ifdef EMISSIVEMAP_ENABLED\n lEmission *= texture2D(emissiveMap, uv).rgb;\n#endif\n outColor.rgb += lEmission * emissionIntensity;\n#ifdef GAMMA_ENCODE\n outColor.rgb = pow(outColor.rgb, vec3(1 / 2.2));\n#endif\n if(lineWidth > 0.)\n {\n outColor.rgb = mix(outColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (outColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n outColor.rgb = ACESToneMapping(outColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n outColor = linearTosRGB(outColor);\n#endif\n gl_FragColor = encodeHDR(outColor);\n}\n@end\n@export clay.standardMR.vertex\n@import clay.standard.vertex\n@end\n@export clay.standardMR.fragment\n#define USE_METALNESS\n#define USE_ROUGHNESS\n@import clay.standard.fragment\n@end"; +var standardEssl = "\n@export clay.standard.vertex\n#define SHADER_NAME standard\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#if defined(AOMAP_ENABLED)\nattribute vec2 texcoord2 : TEXCOORD_1;\n#endif\nattribute vec3 normal : NORMAL;\nattribute vec4 tangent : TANGENT;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#if defined(AOMAP_ENABLED)\nvarying vec2 v_Texcoord2;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n v_Barycentric = barycentric;\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n#if defined(AOMAP_ENABLED)\n v_Texcoord2 = texcoord2;\n#endif\n}\n@end\n@export clay.standard.fragment\n#define PI 3.14159265358979\n#define GLOSSINESS_CHANNEL 0\n#define ROUGHNESS_CHANNEL 0\n#define METALNESS_CHANNEL 1\nuniform mat4 viewInverse : VIEWINVERSE;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\nuniform sampler2D diffuseMap;\n#endif\n#ifdef SPECULARMAP_ENABLED\nuniform sampler2D specularMap;\n#endif\n#ifdef USE_ROUGHNESS\nuniform float roughness : 0.5;\n #ifdef ROUGHNESSMAP_ENABLED\nuniform sampler2D roughnessMap;\n #endif\n#else\nuniform float glossiness: 0.5;\n #ifdef GLOSSINESSMAP_ENABLED\nuniform sampler2D glossinessMap;\n #endif\n#endif\n#ifdef METALNESSMAP_ENABLED\nuniform sampler2D metalnessMap;\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\nuniform samplerCube environmentMap;\n #ifdef PARALLAX_CORRECTED\nuniform vec3 environmentBoxMin;\nuniform vec3 environmentBoxMax;\n #endif\n#endif\n#ifdef BRDFLOOKUP_ENABLED\nuniform sampler2D brdfLookup;\n#endif\n#ifdef EMISSIVEMAP_ENABLED\nuniform sampler2D emissiveMap;\n#endif\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n#ifdef AOMAP_ENABLED\nuniform sampler2D aoMap;\nuniform float aoIntensity;\nvarying vec2 v_Texcoord2;\n#endif\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef USE_METALNESS\nuniform float metalness : 0.0;\n#else\nuniform vec3 specularColor : [0.1, 0.1, 0.1];\n#endif\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float emissionIntensity: 1;\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef ENVIRONMENTMAP_PREFILTER\nuniform float maxMipmapLevel: 5;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.plugin.compute_shadow_map\n@import clay.util.parallax_correct\n@import clay.util.ACES\nfloat G_Smith(float g, float ndv, float ndl)\n{\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(float g, float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (PI * tmp * tmp);\n}\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\nuniform float parallaxOcclusionScale : 0.02;\nuniform float parallaxMaxLayers : 20;\nuniform float parallaxMinLayers : 5;\nuniform sampler2D parallaxOcclusionMap;\nmat3 transpose(in mat3 inMat)\n{\n vec3 i0 = inMat[0];\n vec3 i1 = inMat[1];\n vec3 i2 = inMat[2];\n return mat3(\n vec3(i0.x, i1.x, i2.x),\n vec3(i0.y, i1.y, i2.y),\n vec3(i0.z, i1.z, i2.z)\n );\n}\nvec2 parallaxUv(vec2 uv, vec3 viewDir)\n{\n float numLayers = mix(parallaxMaxLayers, parallaxMinLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));\n float layerHeight = 1.0 / numLayers;\n float curLayerHeight = 0.0;\n vec2 deltaUv = viewDir.xy * parallaxOcclusionScale / (viewDir.z * numLayers);\n vec2 curUv = uv;\n float height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n for (int i = 0; i < 30; i++) {\n curLayerHeight += layerHeight;\n curUv -= deltaUv;\n height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n if (height < curLayerHeight) {\n break;\n }\n }\n vec2 prevUv = curUv + deltaUv;\n float next = height - curLayerHeight;\n float prev = 1.0 - texture2D(parallaxOcclusionMap, prevUv).r - curLayerHeight + layerHeight;\n return mix(curUv, prevUv, next / (next - prev));\n}\n#endif\nvoid main() {\n vec4 albedoColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n albedoColor *= v_Color;\n#endif\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n vec2 uv = v_Texcoord;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n#endif\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\n uv = parallaxUv(v_Texcoord, normalize(transpose(tbn) * -V));\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 texel = texture2D(diffuseMap, uv);\n #ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n #endif\n albedoColor.rgb *= texel.rgb;\n #ifdef DIFFUSEMAP_ALPHA_ALPHA\n albedoColor.a *= texel.a;\n #endif\n#endif\n#ifdef USE_METALNESS\n float m = metalness;\n #ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, uv)[METALNESS_CHANNEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n #endif\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 spec = mix(vec3(0.04), baseColor, m);\n#else\n vec3 spec = specularColor;\n#endif\n#ifdef USE_ROUGHNESS\n float g = 1.0 - roughness;\n #ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, uv)[ROUGHNESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#else\n float g = glossiness;\n #ifdef GLOSSINESSMAP_ENABLED\n float g2 = texture2D(glossinessMap, uv)[GLOSSINESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#endif\n#ifdef SPECULARMAP_ENABLED\n spec *= sRGBToLinear(texture2D(specularMap, uv)).rgb;\n#endif\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, uv).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n tbn[1] = -tbn[1];\n N = normalize(tbn * N);\n }\n }\n#endif\n vec3 diffuseTerm = vec3(0.0, 0.0, 0.0);\n vec3 specularTerm = vec3(0.0, 0.0, 0.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, spec);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_];\n }}\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_COUNT; _idx_++)\n {{\n vec3 lightPosition = pointLightPosition[_idx_];\n vec3 lc = pointLightColor[_idx_];\n float range = pointLightRange[_idx_];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsPoint[_idx_];\n }\n#endif\n vec3 li = lc * ndl * attenuation * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -normalize(directionalLightDirection[_idx_]);\n vec3 lc = directionalLightColor[_idx_];\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n vec3 li = lc * ndl * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = spotLightPosition[i];\n vec3 spotLightDirection = -normalize(spotLightDirection[i]);\n vec3 lc = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n float c = dot(spotLightDirection, L);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n vec3 li = lc * attenuation * (1.0 - falloff) * shadowContrib * ndl;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }\n#endif\n vec4 outColor = albedoColor;\n outColor.rgb *= diffuseTerm;\n outColor.rgb += specularTerm;\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = spec * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 51.5);\n outColor.rgb += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2;\n }}\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\n vec3 envWeight = g * fresnelTerm;\n vec3 L = reflect(-V, N);\n #ifdef PARALLAX_CORRECTED\n L = parallaxCorrect(L, v_WorldPosition, environmentBoxMin, environmentBoxMax);\n #endif\n #ifdef ENVIRONMENTMAP_PREFILTER\n float rough = clamp(1.0 - g, 0.0, 1.0);\n float bias = rough * maxMipmapLevel;\n vec3 envTexel = decodeHDR(textureCubeLodEXT(environmentMap, L, bias)).rgb;\n #ifdef BRDFLOOKUP_ENABLED\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n envWeight = spec * brdfParam.x + brdfParam.y;\n #endif\n #else\n vec3 envTexel = textureCube(environmentMap, L).xyz;\n #endif\n outColor.rgb += envTexel * envWeight;\n#endif\n float aoFactor = 1.0;\n#ifdef SSAOMAP_ENABLED\n aoFactor = min(texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r, aoFactor);\n#endif\n#ifdef AOMAP_ENABLED\n aoFactor = min(1.0 - clamp((1.0 - texture2D(aoMap, v_Texcoord2).r) * aoIntensity, 0.0, 1.0), aoFactor);\n#endif\n outColor.rgb *= aoFactor;\n vec3 lEmission = emission;\n#ifdef EMISSIVEMAP_ENABLED\n lEmission *= texture2D(emissiveMap, uv).rgb;\n#endif\n outColor.rgb += lEmission * emissionIntensity;\n if(lineWidth > 0.)\n {\n outColor.rgb = mix(outColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (outColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n outColor.rgb = ACESToneMapping(outColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n outColor = linearTosRGB(outColor);\n#endif\n gl_FragColor = encodeHDR(outColor);\n}\n@end\n@export clay.standardMR.vertex\n@import clay.standard.vertex\n@end\n@export clay.standardMR.fragment\n#define USE_METALNESS\n#define USE_ROUGHNESS\n@import clay.standard.fragment\n@end"; // Import standard shader Shader['import'](standardEssl); @@ -20662,13 +21068,13 @@ var Skeleton = Base.extend(function () { var utilGlsl = "\n@export clay.util.rand\nhighp float rand(vec2 uv) {\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot(uv.xy, vec2(a,b)), sn = mod(dt, 3.141592653589793);\n return fract(sin(sn) * c);\n}\n@end\n@export clay.util.calculate_attenuation\nuniform float attenuationFactor : 5.0;\nfloat lightAttenuation(float dist, float range)\n{\n float attenuation = 1.0;\n attenuation = dist*dist/(range*range+1.0);\n float att_s = attenuationFactor;\n attenuation = 1.0/(attenuation*att_s+1.0);\n att_s = 1.0/(att_s+1.0);\n attenuation = attenuation - att_s;\n attenuation /= 1.0 - att_s;\n return clamp(attenuation, 0.0, 1.0);\n}\n@end\n@export clay.util.edge_factor\nfloat edgeFactor(float width)\n{\n vec3 d = fwidth(v_Barycentric);\n vec3 a3 = smoothstep(vec3(0.0), d * width, v_Barycentric);\n return min(min(a3.x, a3.y), a3.z);\n}\n@end\n@export clay.util.encode_float\nvec4 encodeFloat(const in float depth)\n{\n const vec4 bitShifts = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);\n const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);\n vec4 res = fract(depth * bitShifts);\n res -= res.xxyz * bit_mask;\n return res;\n}\n@end\n@export clay.util.decode_float\nfloat decodeFloat(const in vec4 color)\n{\n const vec4 bitShifts = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);\n return dot(color, bitShifts);\n}\n@end\n@export clay.util.float\n@import clay.util.encode_float\n@import clay.util.decode_float\n@end\n@export clay.util.rgbm_decode\nvec3 RGBMDecode(vec4 rgbm, float range) {\n return range * rgbm.rgb * rgbm.a;\n}\n@end\n@export clay.util.rgbm_encode\nvec4 RGBMEncode(vec3 color, float range) {\n if (dot(color, color) == 0.0) {\n return vec4(0.0);\n }\n vec4 rgbm;\n color /= range;\n rgbm.a = clamp(max(max(color.r, color.g), max(color.b, 1e-6)), 0.0, 1.0);\n rgbm.a = ceil(rgbm.a * 255.0) / 255.0;\n rgbm.rgb = color / rgbm.a;\n return rgbm;\n}\n@end\n@export clay.util.rgbm\n@import clay.util.rgbm_decode\n@import clay.util.rgbm_encode\nvec4 decodeHDR(vec4 color)\n{\n#if defined(RGBM_DECODE) || defined(RGBM)\n return vec4(RGBMDecode(color, 51.5), 1.0);\n#else\n return color;\n#endif\n}\nvec4 encodeHDR(vec4 color)\n{\n#if defined(RGBM_ENCODE) || defined(RGBM)\n return RGBMEncode(color.xyz, 51.5);\n#else\n return color;\n#endif\n}\n@end\n@export clay.util.srgb\nvec4 sRGBToLinear(in vec4 value) {\n return vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\nvec4 linearTosRGB(in vec4 value) {\n return vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}\n@end\n@export clay.chunk.skinning_header\n#ifdef SKINNING\nattribute vec3 weight : WEIGHT;\nattribute vec4 joint : JOINT;\nuniform mat4 skinMatrix[JOINT_COUNT] : SKIN_MATRIX;\nmat4 getSkinMatrix(float idx) {\n return skinMatrix[int(idx)];\n}\n#endif\n@end\n@export clay.chunk.skin_matrix\nmat4 skinMatrixWS = getSkinMatrix(joint.x) * weight.x;\nif (weight.y > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.y) * weight.y;\n}\nif (weight.z > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.z) * weight.z;\n}\nfloat weightW = 1.0-weight.x-weight.y-weight.z;\nif (weightW > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.w) * weightW;\n}\n@end\n@export clay.util.parallax_correct\nvec3 parallaxCorrect(in vec3 dir, in vec3 pos, in vec3 boxMin, in vec3 boxMax) {\n vec3 first = (boxMax - pos) / dir;\n vec3 second = (boxMin - pos) / dir;\n vec3 further = max(first, second);\n float dist = min(further.x, min(further.y, further.z));\n vec3 fixedPos = pos + dir * dist;\n vec3 boxCenter = (boxMax + boxMin) * 0.5;\n return normalize(fixedPos - boxCenter);\n}\n@end\n@export clay.util.clamp_sample\nvec4 clampSample(const in sampler2D texture, const in vec2 coord)\n{\n#ifdef STEREO\n float eye = step(0.5, coord.x) * 0.5;\n vec2 coordClamped = clamp(coord, vec2(eye, 0.0), vec2(0.5 + eye, 1.0));\n#else\n vec2 coordClamped = clamp(coord, vec2(0.0), vec2(1.0));\n#endif\n return texture2D(texture, coordClamped);\n}\n@end\n@export clay.util.ACES\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\n@end"; -var basicEssl = "@export clay.basic.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Barycentric;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_Barycentric = barycentric;\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n}\n@end\n@export clay.basic.fragment\nvarying vec2 v_Texcoord;\nuniform sampler2D diffuseMap;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n#ifdef RENDER_TEXCOORD\n gl_FragColor = vec4(v_Texcoord, 1.0, 1.0);\n return;\n#endif\n gl_FragColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 tex = decodeHDR(texture2D(diffuseMap, v_Texcoord));\n#ifdef SRGB_DECODE\n tex = sRGBToLinear(tex);\n#endif\n#if defined(DIFFUSEMAP_ALPHA_ALPHA)\n gl_FragColor.a = tex.a;\n#endif\n gl_FragColor.rgb *= tex.rgb;\n#endif\n gl_FragColor.rgb += emission;\n if( lineWidth > 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef GAMMA_ENCODE\n gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1 / 2.2));\n#endif\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"; +var basicEssl = "@export clay.basic.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Barycentric;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_Barycentric = barycentric;\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n}\n@end\n@export clay.basic.fragment\nvarying vec2 v_Texcoord;\nuniform sampler2D diffuseMap;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n#ifdef RENDER_TEXCOORD\n gl_FragColor = vec4(v_Texcoord, 1.0, 1.0);\n return;\n#endif\n gl_FragColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 tex = decodeHDR(texture2D(diffuseMap, v_Texcoord));\n#ifdef SRGB_DECODE\n tex = sRGBToLinear(tex);\n#endif\n#if defined(DIFFUSEMAP_ALPHA_ALPHA)\n gl_FragColor.a = tex.a;\n#endif\n gl_FragColor.rgb *= tex.rgb;\n#endif\n gl_FragColor.rgb += emission;\n if( lineWidth > 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"; var lambertEssl = "\n@export clay.lambert.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 normal : NORMAL;\nattribute vec3 barycentric;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4( skinnedPosition, 1.0 );\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_Normal = normalize( ( worldInverseTranspose * vec4(skinnedNormal, 0.0) ).xyz );\n v_WorldPosition = ( world * vec4( skinnedPosition, 1.0) ).xyz;\n v_Barycentric = barycentric;\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n}\n@end\n@export clay.lambert.fragment\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D diffuseMap;\nuniform sampler2D alphaMap;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.plugin.compute_shadow_map\n@import clay.util.ACES\nvoid main()\n{\n#ifdef RENDER_NORMAL\n gl_FragColor = vec4(v_Normal * 0.5 + 0.5, 1.0);\n return;\n#endif\n#ifdef RENDER_TEXCOORD\n gl_FragColor = vec4(v_Texcoord, 1.0, 1.0);\n return;\n#endif\n gl_FragColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 tex = texture2D( diffuseMap, v_Texcoord );\n#ifdef SRGB_DECODE\n tex.rgb = pow(tex.rgb, vec3(2.2));\n#endif\n gl_FragColor.rgb *= tex.rgb;\n#ifdef DIFFUSEMAP_ALPHA_ALPHA\n gl_FragColor.a *= tex.a;\n#endif\n#endif\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {\n diffuseColor += ambientLightColor[_idx_];\n }\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseColor += calcAmbientSHLight(_idx_, v_Normal) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if( shadowEnabled )\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int i = 0; i < POINT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = pointLightPosition[i];\n vec3 lightColor = pointLightColor[i];\n float range = pointLightRange[i];\n vec3 lightDirection = lightPosition - v_WorldPosition;\n float dist = length(lightDirection);\n float attenuation = lightAttenuation(dist, range);\n lightDirection /= dist;\n float ndl = dot( v_Normal, lightDirection );\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if( shadowEnabled )\n {\n shadowContrib = shadowContribsPoint[i];\n }\n#endif\n diffuseColor += lightColor * clamp(ndl, 0.0, 1.0) * attenuation * shadowContrib;\n }\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++)\n {\n vec3 lightDirection = -directionalLightDirection[i];\n vec3 lightColor = directionalLightColor[i];\n float ndl = dot(v_Normal, normalize(lightDirection));\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if( shadowEnabled )\n {\n shadowContrib = shadowContribsDir[i];\n }\n#endif\n diffuseColor += lightColor * clamp(ndl, 0.0, 1.0) * shadowContrib;\n }\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = -spotLightPosition[i];\n vec3 spotLightDirection = -normalize( spotLightDirection[i] );\n vec3 lightColor = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 lightDirection = lightPosition - v_WorldPosition;\n float dist = length(lightDirection);\n float attenuation = lightAttenuation(dist, range);\n lightDirection /= dist;\n float c = dot(spotLightDirection, lightDirection);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n float ndl = dot(v_Normal, lightDirection);\n ndl = clamp(ndl, 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if( shadowEnabled )\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n diffuseColor += lightColor * ndl * attenuation * (1.0-falloff) * shadowContrib;\n }\n#endif\n gl_FragColor.rgb *= diffuseColor;\n gl_FragColor.rgb += emission;\n if(lineWidth > 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"; var wireframeEssl = "@export clay.wireframe.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 world : WORLD;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec3 v_Barycentric;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0 );\n v_Barycentric = barycentric;\n}\n@end\n@export clay.wireframe.fragment\nuniform vec3 color : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\nuniform float lineWidth : 1.0;\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\nvoid main()\n{\n gl_FragColor.rgb = color;\n gl_FragColor.a = (1.0-edgeFactor(lineWidth)) * alpha;\n}\n@end"; -var skyboxEssl = "@export clay.skybox.vertex\nuniform mat4 world : WORLD;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_WorldPosition;\nvoid main()\n{\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n@export clay.skybox.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform samplerCube environmentMap;\nuniform float lod: 0.0;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\nvoid main()\n{\n vec3 eyePos = viewInverse[3].xyz;\n vec3 viewDirection = normalize(v_WorldPosition - eyePos);\n vec3 tex = decodeHDR(textureCubeLodEXT(environmentMap, viewDirection, lod)).rgb;\n#ifdef SRGB_DECODE\n tex.rgb = pow(tex.rgb, vec3(2.2));\n#endif\n gl_FragColor = encodeHDR(vec4(tex, 1.0));\n}\n@end"; +var skyboxEssl = "@export clay.skybox.vertex\nuniform mat4 world : WORLD;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_WorldPosition;\nvoid main()\n{\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n@export clay.skybox.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform samplerCube environmentMap;\nuniform float lod: 0.0;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n vec3 eyePos = viewInverse[3].xyz;\n vec3 viewDirection = normalize(v_WorldPosition - eyePos);\n#ifdef LOD\n vec4 texel = decodeHDR(textureCubeLodEXT(environmentMap, viewDirection, lod));\n#else\n vec4 texel = decodeHDR(textureCube(environmentMap, viewDirection));\n#endif\n#ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n#endif\n#ifdef TONEMAPPING\n texel.rgb = ACESToneMapping(texel.rgb);\n#endif\n#ifdef SRGB_ENCODE\n texel = linearTosRGB(texel);\n#endif\n gl_FragColor = encodeHDR(vec4(texel.rgb, 1.0));\n}\n@end"; var coloradjustEssl = "@export clay.compositor.coloradjust\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float exposure : 0.0;\nuniform float gamma : 1.0;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n color = clamp( (color-vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n color = clamp( color * pow(2.0, exposure), 0.0, 1.0);\n color = clamp( pow(color, vec3(gamma)), 0.0, 1.0);\n float luminance = dot( color, w );\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.brightness\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = tex.rgb + vec3(brightness);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.contrast\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float contrast : 1.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = (tex.rgb-vec3(0.5))*contrast+vec3(0.5);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.exposure\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float exposure : 0.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb * pow(2.0, exposure);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.gamma\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float gamma : 1.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = pow(tex.rgb, vec3(gamma));\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.saturation\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb;\n float luminance = dot(color, w);\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end"; @@ -21050,7 +21456,7 @@ function () { textures: lib.textures, materials: lib.materials, skeletons: lib.skeletons, - meshes: lib.meshes, + meshes: lib.instancedMeshes, clips: lib.clips, nodes: lib.nodes }; @@ -21419,6 +21825,7 @@ function () { metalness: metallicRoughnessMatInfo.metallicFactor || 0, roughness: metallicRoughnessMatInfo.roughnessFactor || 0, emission: materialInfo.emissiveFactor || [0, 0, 0], + emissionIntensity: 1, alphaCutoff: materialInfo.alphaCutoff || 0 }; if (commonProperties.roughnessMap) { @@ -21509,6 +21916,7 @@ function () { specularColor: specularGlossinessMatInfo.specularFactor || [1, 1, 1], glossiness: specularGlossinessMatInfo.glossinessFactor || 0, emission: materialInfo.emissiveFactor || [0, 0, 0], + emissionIntensity: 1, alphaCutoff: materialInfo.alphaCutoff == null ? 0.9 : materialInfo.alphaCutoff }; if (commonProperties.glossinessMap) { @@ -21719,6 +22127,8 @@ function () { }); } + lib.instancedMeshes = []; + util$1.each(json.nodes, function (nodeInfo, idx) { var node; if (nodeInfo.camera != null && this.includeCamera) { @@ -21732,12 +22142,15 @@ function () { // Replace the node with mesh directly node = instanceMesh(primitives[0]); node.setName(nodeInfo.name); + lib.instancedMeshes.push(node); } else { node = new Node(); node.setName(nodeInfo.name); for (var j = 0; j < primitives.length; j++) { - node.add(instanceMesh(primitives[j])); + var newMesh = instanceMesh(primitives[j]); + node.add(newMesh); + lib.instancedMeshes.push(newMesh); } } } @@ -22118,263 +22531,6 @@ var AmbientLight = Light.extend({ */ }); -var isPowerOfTwo$1 = mathUtil.isPowerOfTwo; - -var targetList = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; - -/** - * @constructor clay.TextureCube - * @extends clay.Texture - * - * @example - * ... - * var mat = new clay.Material({ - * shader: clay.shader.library.get('clay.phong', 'environmentMap') - * }); - * var envMap = new clay.TextureCube(); - * envMap.load({ - * 'px': 'assets/textures/sky/px.jpg', - * 'nx': 'assets/textures/sky/nx.jpg' - * 'py': 'assets/textures/sky/py.jpg' - * 'ny': 'assets/textures/sky/ny.jpg' - * 'pz': 'assets/textures/sky/pz.jpg' - * 'nz': 'assets/textures/sky/nz.jpg' - * }); - * mat.set('environmentMap', envMap); - * ... - * envMap.success(function () { - * // Wait for the sky texture loaded - * animation.on('frame', function (frameTime) { - * renderer.render(scene, camera); - * }); - * }); - */ -var TextureCube = Texture.extend(function () { - return /** @lends clay.TextureCube# */{ - /** - * @type {Object} - * @property {?HTMLImageElement|HTMLCanvasElemnet} px - * @property {?HTMLImageElement|HTMLCanvasElemnet} nx - * @property {?HTMLImageElement|HTMLCanvasElemnet} py - * @property {?HTMLImageElement|HTMLCanvasElemnet} ny - * @property {?HTMLImageElement|HTMLCanvasElemnet} pz - * @property {?HTMLImageElement|HTMLCanvasElemnet} nz - */ - image: { - px: null, - nx: null, - py: null, - ny: null, - pz: null, - nz: null - }, - /** - * Pixels data of each side. Will be ignored if images are set. - * @type {Object} - * @property {?Uint8Array} px - * @property {?Uint8Array} nx - * @property {?Uint8Array} py - * @property {?Uint8Array} ny - * @property {?Uint8Array} pz - * @property {?Uint8Array} nz - */ - pixels: { - px: null, - nx: null, - py: null, - ny: null, - pz: null, - nz: null - }, - - /** - * @type {Array.} - */ - mipmaps: [] - }; -}, { - update: function (renderer) { - var _gl = renderer.gl; - _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); - - this.updateCommon(renderer); - - var glFormat = this.format; - var glType = this.type; - - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, this.getAvailableWrapS()); - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, this.getAvailableWrapT()); - - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, this.getAvailableMagFilter()); - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, this.getAvailableMinFilter()); - - var anisotropicExt = renderer.getGLExtension('EXT_texture_filter_anisotropic'); - if (anisotropicExt && this.anisotropic > 1) { - _gl.texParameterf(_gl.TEXTURE_CUBE_MAP, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic); - } - - // Fallback to float type if browser don't have half float extension - if (glType === 36193) { - var halfFloatExt = renderer.getGLExtension('OES_texture_half_float'); - if (!halfFloatExt) { - glType = glenum.FLOAT; - } - } - - if (this.mipmaps.length) { - var width = this.width; - var height = this.height; - for (var i = 0; i < this.mipmaps.length; i++) { - var mipmap = this.mipmaps[i]; - this._updateTextureData(_gl, mipmap, i, width, height, glFormat, glType); - width /= 2; - height /= 2; - } - } - else { - this._updateTextureData(_gl, this, 0, this.width, this.height, glFormat, glType); - - if (!this.NPOT && this.useMipmap) { - _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); - } - } - - _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, null); - }, - - _updateTextureData: function (_gl, data, level, width, height, glFormat, glType) { - for (var i = 0; i < 6; i++) { - var target = targetList[i]; - var img = data.image && data.image[target]; - if (img) { - _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, glFormat, glType, img); - } - else { - _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, width, height, 0, glFormat, glType, data.pixels && data.pixels[target]); - } - } - }, - - /** - * @param {clay.Renderer} renderer - * @memberOf clay.TextureCube.prototype - */ - generateMipmap: function (renderer) { - var _gl = renderer.gl; - if (this.useMipmap && !this.NPOT) { - _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); - _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); - } - }, - - bind: function (renderer) { - renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, this.getWebGLTexture(renderer)); - }, - - unbind: function (renderer) { - renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, null); - }, - - // Overwrite the isPowerOfTwo method - isPowerOfTwo: function () { - if (this.image.px) { - return isPowerOfTwo$1(this.image.px.width) - && isPowerOfTwo$1(this.image.px.height); - } - else { - return isPowerOfTwo$1(this.width) - && isPowerOfTwo$1(this.height); - } - }, - - isRenderable: function () { - if (this.image.px) { - return isImageRenderable(this.image.px) - && isImageRenderable(this.image.nx) - && isImageRenderable(this.image.py) - && isImageRenderable(this.image.ny) - && isImageRenderable(this.image.pz) - && isImageRenderable(this.image.nz); - } - else { - return !!(this.width && this.height); - } - }, - - load: function (imageList, crossOrigin) { - var loading = 0; - var self = this; - util$1.each(imageList, function (src, target){ - var image = new Image(); - if (crossOrigin) { - image.crossOrigin = crossOrigin; - } - image.onload = function () { - loading --; - if (loading === 0){ - self.dirty(); - self.trigger('success', self); - } - image.onload = null; - }; - image.onerror = function () { - loading --; - image.onerror = null; - }; - - loading++; - image.src = src; - self.image[target] = image; - }); - - return this; - } -}); - -Object.defineProperty(TextureCube.prototype, 'width', { - get: function () { - if (this.image && this.image.px) { - return this.image.px.width; - } - return this._width; - }, - set: function (value) { - if (this.image && this.image.px) { - console.warn('Texture from image can\'t set width'); - } - else { - if (this._width !== value) { - this.dirty(); - } - this._width = value; - } - } -}); -Object.defineProperty(TextureCube.prototype, 'height', { - get: function () { - if (this.image && this.image.px) { - return this.image.px.height; - } - return this._height; - }, - set: function (value) { - if (this.image && this.image.px) { - console.warn('Texture from image can\'t set height'); - } - else { - if (this._height !== value) { - this.dirty(); - } - this._height = value; - } - } -}); -function isImageRenderable(image) { - return image.nodeName === 'CANVAS' || - image.nodeName === 'VIDEO' || - image.complete; -} - var KEY_FRAMEBUFFER = 'framebuffer'; var KEY_RENDERBUFFER = 'renderbuffer'; var KEY_RENDERBUFFER_WIDTH = KEY_RENDERBUFFER + '_width'; @@ -23019,6 +23175,8 @@ var Skybox = Mesh.extend(function () { if (this.scene) { this.detachScene(); } + scene.skybox = this; + this.scene = scene; scene.on('beforerender', this._beforeRenderScene, this); }, @@ -23028,6 +23186,7 @@ var Skybox = Mesh.extend(function () { detachScene: function () { if (this.scene) { this.scene.off('beforerender', this._beforeRenderScene); + this.scene.skybox = null; } this.scene = null; }, @@ -23064,6 +23223,12 @@ var Skybox = Mesh.extend(function () { this.update(); // Don't remember to disable blend renderer.gl.disable(renderer.gl.BLEND); + if (this.material.get('lod') > 0) { + this.material.define('fragment', 'LOD'); + } + else { + this.material.undefine('fragment', 'LOD'); + } renderer.renderPass([this], camera); } }); @@ -23265,6 +23430,8 @@ var Skydome = Mesh.extend(function () { if (this.scene) { this.detachScene(); } + scene.skydome = this; + this.scene = scene; scene.on('beforerender', this._beforeRenderScene, this); }, @@ -23275,6 +23442,7 @@ var Skydome = Mesh.extend(function () { detachScene: function () { if (this.scene) { this.scene.off('beforerender', this._beforeRenderScene); + this.scene.skydome = null; } this.scene = null; }, @@ -23610,7 +23778,8 @@ var textureUtil = { if (path.match(/.hdr$/) || option.fileType === 'hdr') { texture = new Texture2D({ width: 0, - height: 0 + height: 0, + sRGB: false }); textureUtil._fetchTexture( path, @@ -23706,6 +23875,9 @@ var textureUtil = { skydome.material.define('fragment', 'RGBM_ENCODE'); } + // Share sRGB + cubeMap.sRGB = panoramaMap.sRGB; + environmentMapPass.texture = cubeMap; environmentMapPass.render(renderer, skydome.scene); environmentMapPass.texture = null; @@ -25424,4499 +25596,4694 @@ RayPicking.Intersection = function (point, pointWorld, target, triangle, triangl this.distance = distance; }; -// Spherical Harmonic Helpers var vec3$15 = glmatrix.vec3; -var sh = {}; - -var targets$3 = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; +var vec2$1 = glmatrix.vec2; -function harmonics(normal, index){ - var x = normal[0]; - var y = normal[1]; - var z = normal[2]; +/** + * @constructor clay.geometry.Cone + * @extends clay.Geometry + * @param {Object} [opt] + * @param {number} [opt.topRadius] + * @param {number} [opt.bottomRadius] + * @param {number} [opt.height] + * @param {number} [opt.capSegments] + * @param {number} [opt.heightSegments] + */ +var Cone$1 = Geometry.extend( +/** @lends clay.geometry.Cone# */ +{ + dynamic: false, + /** + * @type {number} + */ + topRadius: 0, - if (index === 0) { - return 1.0; - } - else if (index === 1) { - return x; - } - else if (index === 2) { - return y; - } - else if (index === 3) { - return z; - } - else if (index === 4) { - return x * z; - } - else if (index === 5) { - return y * z; - } - else if (index === 6) { - return x * y; - } - else if (index === 7) { - return 3.0 * z * z - 1.0; - } - else { - return x * x - y * y; - } -} + /** + * @type {number} + */ + bottomRadius: 1, -var normalTransform = { - px: [2, 1, 0, -1, -1, 1], - nx: [2, 1, 0, 1, -1, -1], - py: [0, 2, 1, 1, -1, -1], - ny: [0, 2, 1, 1, 1, 1], - pz: [0, 1, 2, -1, -1, -1], - nz: [0, 1, 2, 1, -1, 1] -}; + /** + * @type {number} + */ + height: 2, -// Project on cpu. -function projectEnvironmentMapCPU(renderer, cubePixels, width, height) { - var coeff = new vendor.Float32Array(9 * 3); - var normal = vec3$15.create(); - var texel = vec3$15.create(); - var fetchNormal = vec3$15.create(); - for (var m = 0; m < 9; m++) { - var result = vec3$15.create(); - for (var k = 0; k < targets$3.length; k++) { - var pixels = cubePixels[targets$3[k]]; + /** + * @type {number} + */ + capSegments: 20, - var sideResult = vec3$15.create(); - var divider = 0; - var i = 0; - var transform = normalTransform[targets$3[k]]; - for (var y = 0; y < height; y++) { - for (var x = 0; x < width; x++) { + /** + * @type {number} + */ + heightSegments: 1 +}, function() { + this.build(); +}, +/** @lends clay.geometry.Cone.prototype */ +{ + /** + * Build cone geometry + */ + build: function() { + var positions = []; + var texcoords = []; + var faces = []; + positions.length = 0; + texcoords.length = 0; + faces.length = 0; + // Top cap + var capSegRadial = Math.PI * 2 / this.capSegments; - normal[0] = x / (width - 1.0) * 2.0 - 1.0; - // TODO Flip y? - normal[1] = y / (height - 1.0) * 2.0 - 1.0; - normal[2] = -1.0; - vec3$15.normalize(normal, normal); + var topCap = []; + var bottomCap = []; - fetchNormal[0] = normal[transform[0]] * transform[3]; - fetchNormal[1] = normal[transform[1]] * transform[4]; - fetchNormal[2] = normal[transform[2]] * transform[5]; + var r1 = this.topRadius; + var r2 = this.bottomRadius; + var y = this.height / 2; - texel[0] = pixels[i++] / 255; - texel[1] = pixels[i++] / 255; - texel[2] = pixels[i++] / 255; - // RGBM Decode - var scale = pixels[i++] / 255 * 51.5; - texel[0] *= scale; - texel[1] *= scale; - texel[2] *= scale; + var c1 = vec3$15.fromValues(0, y, 0); + var c2 = vec3$15.fromValues(0, -y, 0); + for (var i = 0; i < this.capSegments; i++) { + var theta = i * capSegRadial; + var x = r1 * Math.sin(theta); + var z = r1 * Math.cos(theta); + topCap.push(vec3$15.fromValues(x, y, z)); - vec3$15.scaleAndAdd(sideResult, sideResult, texel, harmonics(fetchNormal, m) * -normal[2]); - // -normal.z equals cos(theta) of Lambertian - divider += -normal[2]; - } - } - vec3$15.scaleAndAdd(result, result, sideResult, 1 / divider); + x = r2 * Math.sin(theta); + z = r2 * Math.cos(theta); + bottomCap.push(vec3$15.fromValues(x, -y, z)); } - coeff[m * 3] = result[0] / 6.0; - coeff[m * 3 + 1] = result[1] / 6.0; - coeff[m * 3 + 2] = result[2] / 6.0; - } - return coeff; -} + // Build top cap + positions.push(c1); + // FIXME + texcoords.push(vec2$1.fromValues(0, 1)); + var n = this.capSegments; + for (var i = 0; i < n; i++) { + positions.push(topCap[i]); + // FIXME + texcoords.push(vec2$1.fromValues(i / n, 0)); + faces.push([0, i+1, (i+1) % n + 1]); + } -/** - * @param {clay.Renderer} renderer - * @param {clay.Texture} envMap - * @param {Object} [textureOpts] - * @param {Object} [textureOpts.lod] - * @param {boolean} [textureOpts.decodeRGBM] - */ -sh.projectEnvironmentMap = function (renderer, envMap, opts) { + // Build bottom cap + var offset = positions.length; + positions.push(c2); + texcoords.push(vec2$1.fromValues(0, 1)); + for (var i = 0; i < n; i++) { + positions.push(bottomCap[i]); + // FIXME + texcoords.push(vec2$1.fromValues(i / n, 0)); + faces.push([offset, offset+((i+1) % n + 1), offset+i+1]); + } - // TODO sRGB + // Build side + offset = positions.length; + var n2 = this.heightSegments; + for (var i = 0; i < n; i++) { + for (var j = 0; j < n2+1; j++) { + var v = j / n2; + positions.push(vec3$15.lerp(vec3$15.create(), topCap[i], bottomCap[i], v)); + texcoords.push(vec2$1.fromValues(i / n, v)); + } + } + for (var i = 0; i < n; i++) { + for (var j = 0; j < n2; j++) { + var i1 = i * (n2 + 1) + j; + var i2 = ((i + 1) % n) * (n2 + 1) + j; + var i3 = ((i + 1) % n) * (n2 + 1) + j + 1; + var i4 = i * (n2 + 1) + j + 1; + faces.push([offset+i2, offset+i1, offset+i4]); + faces.push([offset+i4, offset+i3, offset+i2]); + } + } - opts = opts || {}; - opts.lod = opts.lod || 0; + this.attributes.position.fromArray(positions); + this.attributes.texcoord0.fromArray(texcoords); - var skybox; - var dummyScene = new Scene(); - var size = 64; - if (envMap instanceof Texture2D) { - skybox = new Skydome({ - scene: dummyScene, - environmentMap: envMap - }); - } - else { - size = (envMap.image && envMap.image.px) ? envMap.image.px.width : envMap.width; - skybox = new Skybox({ - scene: dummyScene, - environmentMap: envMap - }); - } - // Convert to rgbm - var width = Math.ceil(size / Math.pow(2, opts.lod)); - var height = Math.ceil(size / Math.pow(2, opts.lod)); - var rgbmTexture = new Texture2D({ - width: width, - height: height - }); - var framebuffer = new FrameBuffer(); - skybox.material.define('fragment', 'RGBM_ENCODE'); - if (opts.decodeRGBM) { - skybox.material.define('fragment', 'RGBM_DECODE'); - } - skybox.material.set('lod', opts.lod); - var envMapPass = new EnvironmentMapPass({ - texture: rgbmTexture - }); - var cubePixels = {}; - for (var i = 0; i < targets$3.length; i++) { - cubePixels[targets$3[i]] = new Uint8Array(width * height * 4); - var camera = envMapPass.getCamera(targets$3[i]); - camera.fov = 90; - framebuffer.attach(rgbmTexture); - framebuffer.bind(renderer); - renderer.render(dummyScene, camera); - renderer.gl.readPixels( - 0, 0, width, height, - Texture.RGBA, Texture.UNSIGNED_BYTE, cubePixels[targets$3[i]] - ); - framebuffer.unbind(renderer); - } + this.initIndicesFromArray(faces); - skybox.dispose(renderer); - framebuffer.dispose(renderer); - rgbmTexture.dispose(renderer); + this.generateVertexNormals(); - return projectEnvironmentMapCPU(renderer, cubePixels, width, height); -}; + this.boundingBox = new BoundingBox(); + var r = Math.max(this.topRadius, this.bottomRadius); + this.boundingBox.min.set(-r, -this.height/2, -r); + this.boundingBox.max.set(r, this.height/2, r); + } +}); /** - * Helpers for creating a common 3d application. - * @namespace clay.application + * @constructor clay.geometry.Cylinder + * @extends clay.Geometry + * @param {Object} [opt] + * @param {number} [opt.radius] + * @param {number} [opt.height] + * @param {number} [opt.capSegments] + * @param {number} [opt.heightSegments] */ +var Cylinder$1 = Geometry.extend( +/** @lends clay.geometry.Cylinder# */ +{ + dynamic: false, + /** + * @type {number} + */ + radius: 1, - // TODO createCompositor - // TODO mobile. scroll events. - // TODO Dispose test. geoCache test. - // TODO fitModel, normal generation. - // TODO Skybox, Skydome. - // TODO Particle ? -var parseColor = colorUtil.parseToFloat; + /** + * @type {number} + */ + height: 2, -/** - * @typedef {string|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} ImageLike - */ -/** - * @typedef {string|Array.} Color - */ -/** - * @typedef {HTMLDomElement|string} DomQuery - */ + /** + * @type {number} + */ + capSegments: 50, -/** - * @constructor - * @alias clay.application.App3D - * @param {DomQuery} dom Container dom element or a selector string that can be used in `querySelector` - * @param {Object} appNS - * @param {Function} appNS.init Initialization callback that will be called when initing app. - * You can return a promise in init to start the loop asynchronously when the promise is resolved. - * @param {Function} appNS.loop Loop callback that will be called each frame. - * @param {Function} appNS.beforeRender - * @param {Function} appNS.afterRender - * @param {number} [appNS.width] Container width. - * @param {number} [appNS.height] Container height. - * @param {number} [appNS.devicePixelRatio] - * @param {Object} [appNS.graphic] Graphic configuration including shadow, postEffect - * @param {boolean} [appNS.graphic.shadow=false] If enable shadow - * @param {boolean} [appNS.graphic.linear=false] If use linear space - * @param {boolean} [appNS.graphic.tonemapping=false] If enable ACES tone mapping. - * @param {boolean} [appNS.event=false] If enable mouse/touch event. It will slow down the system if geometries are complex. - */ -function App3D(dom, appNS) { + /** + * @type {number} + */ + heightSegments: 1 +}, function() { + this.build(); +}, +/** @lends clay.geometry.Cylinder.prototype */ +{ + /** + * Build cylinder geometry + */ + build: function() { + var cone = new Cone$1({ + topRadius: this.radius, + bottomRadius: this.radius, + capSegments: this.capSegments, + heightSegments: this.heightSegments, + height: this.height + }); - appNS = appNS || {}; - appNS.graphic = appNS.graphic || {}; + this.attributes.position.value = cone.attributes.position.value; + this.attributes.normal.value = cone.attributes.normal.value; + this.attributes.texcoord0.value = cone.attributes.texcoord0.value; + this.indices = cone.indices; - if (typeof dom === 'string') { - dom = document.querySelector(dom); + this.boundingBox = cone.boundingBox; } +}); - if (!dom) { throw new Error('Invalid dom'); } +var gbufferEssl = "@export clay.deferred.gbuffer.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat;\nuniform vec2 uvOffset;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#ifdef FIRST_PASS\nattribute vec3 normal : NORMAL;\n#endif\n@import clay.chunk.skinning_header\n#ifdef FIRST_PASS\nvarying vec3 v_Normal;\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nvarying vec3 v_WorldPosition;\n#endif\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef FIRST_PASS\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n bool hasTangent = dot(tangent, tangent) > 0.0;\n#endif\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n #ifdef FIRST_PASS\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n if (hasTangent) {\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n }\n #endif\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n#ifdef FIRST_PASS\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n if (hasTangent) {\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n#endif\n}\n@end\n@export clay.deferred.gbuffer1.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform float glossiness;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nuniform sampler2D roughGlossMap;\nuniform bool useRoughGlossMap;\nuniform bool useRoughness;\nuniform bool doubleSided;\nuniform int roughGlossChannel: 0;\nfloat indexingTexel(in vec4 texel, in int idx) {\n if (idx == 3) return texel.a;\n else if (idx == 1) return texel.g;\n else if (idx == 2) return texel.b;\n else return texel.r;\n}\nvoid main()\n{\n vec3 N = v_Normal;\n if (doubleSided) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = eyePos - v_WorldPosition;\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n }\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_Texcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n gl_FragColor.rgb = (N + 1.0) * 0.5;\n float g = glossiness;\n if (useRoughGlossMap) {\n float g2 = indexingTexel(texture2D(roughGlossMap, v_Texcoord), roughGlossChannel);\n if (useRoughness) {\n g2 = 1.0 - g2;\n }\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n gl_FragColor.a = g + 0.005;\n}\n@end\n@export clay.deferred.gbuffer2.fragment\nuniform sampler2D diffuseMap;\nuniform sampler2D metalnessMap;\nuniform vec3 color;\nuniform float metalness;\nuniform bool useMetalnessMap;\nuniform bool linear;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvoid main ()\n{\n float m = metalness;\n if (useMetalnessMap) {\n vec4 metalnessTexel = texture2D(metalnessMap, v_Texcoord);\n m = clamp(metalnessTexel.r + (m * 2.0 - 1.0), 0.0, 1.0);\n }\n vec4 texel = texture2D(diffuseMap, v_Texcoord);\n if (linear) {\n texel = sRGBToLinear(texel);\n }\n gl_FragColor.rgb = texel.rgb * color;\n gl_FragColor.a = m + 0.005;\n}\n@end\n@export clay.deferred.gbuffer.debug\n@import clay.deferred.chunk.light_head\nuniform int debug: 0;\nvoid main ()\n{\n @import clay.deferred.chunk.gbuffer_read\n if (debug == 0) {\n gl_FragColor = vec4(N, 1.0);\n }\n else if (debug == 1) {\n gl_FragColor = vec4(vec3(z), 1.0);\n }\n else if (debug == 2) {\n gl_FragColor = vec4(position, 1.0);\n }\n else if (debug == 3) {\n gl_FragColor = vec4(vec3(glossiness), 1.0);\n }\n else if (debug == 4) {\n gl_FragColor = vec4(vec3(metalness), 1.0);\n }\n else {\n gl_FragColor = vec4(albedo, 1.0);\n }\n}\n@end"; - var isDomCanvas = dom.nodeName.toUpperCase() === 'CANVAS'; - var rendererOpts = {}; - isDomCanvas && (rendererOpts.canvas = dom); - appNS.devicePixelRatio && (rendererOpts.devicePixelRatio = appNS.devicePixelRatio); +var chunkEssl = "@export clay.deferred.chunk.light_head\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform vec2 windowSize: WINDOW_SIZE;\nuniform vec4 viewport: VIEWPORT;\nuniform mat4 viewProjectionInv;\n#ifdef DEPTH_ENCODED\n@import clay.util.decode_float\n#endif\n@end\n@export clay.deferred.chunk.gbuffer_read\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec2 uv2 = (gl_FragCoord.xy - viewport.xy) / viewport.zw;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n vec4 texel3 = texture2D(gBufferTexture3, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n float glossiness = texel1.a;\n float metalness = texel3.a;\n vec3 N = texel1.rgb * 2.0 - 1.0;\n float z = texture2D(gBufferTexture2, uv).r * 2.0 - 1.0;\n vec2 xy = uv2 * 2.0 - 1.0;\n vec4 projectedPos = vec4(xy, z, 1.0);\n vec4 p4 = viewProjectionInv * projectedPos;\n vec3 position = p4.xyz / p4.w;\n vec3 albedo = texel3.rgb;\n vec3 diffuseColor = albedo * (1.0 - metalness);\n vec3 specularColor = mix(vec3(0.04), albedo, metalness);\n@end\n@export clay.deferred.chunk.light_equation\nfloat D_Phong(in float g, in float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(in float g, in float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (3.1415926 * tmp * tmp);\n}\nvec3 F_Schlick(in float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nvec3 lightEquation(\n in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n in float ndl, in float ndh, in float ndv, in float g\n)\n{\n return ndl * lightColor\n * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n}\n@end"; - var gRenderer = new Renderer(rendererOpts); - var gWidth = appNS.width || dom.clientWidth; - var gHeight = appNS.height || dom.clientHeight; +Shader.import(gbufferEssl); +Shader.import(chunkEssl); - var gScene = new Scene(); - var gTimeline = new Timeline(); - var gShadowPass = appNS.graphic.shadow && new ShadowMapPass(); - var gRayPicking = appNS.event && new RayPicking({ - scene: gScene, - renderer: gRenderer - }); +function createFillCanvas(color) { + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + var ctx = canvas.getContext('2d'); + ctx.fillStyle = color || '#000'; + ctx.fillRect(0, 0, 1, 1); - !isDomCanvas && dom.appendChild(gRenderer.canvas); + return canvas; +} - gRenderer.resize(gWidth, gHeight); +function attachTextureToSlot(renderer, program, symbol, texture, slot) { + var gl = renderer.gl; + program.setUniform(gl, '1i', symbol, slot); - var gFrameTime = 0; - var gElapsedTime = 0; + gl.activeTexture(gl.TEXTURE0 + slot); + // Maybe texture is not loaded yet; + if (texture.isRenderable()) { + texture.bind(renderer); + } + else { + // Bind texture to null + texture.unbind(renderer); + } +} - gTimeline.start(); +// TODO Use globalShader insteadof globalMaterial? +function getBeforeRenderHook1 (gl, defaultNormalMap, defaultRoughnessMap) { - Object.defineProperties(this, { - /** - * Container dom element - * @name clay.application.App3D#container - * @type {HTMLDomElement} - */ - container: { get: function () { return dom; } }, - /** - * @name clay.application.App3D#renderer - * @type {clay.Renderer} - */ - renderer: { get: function () { return gRenderer; }}, - /** - * @name clay.application.App3D#scene - * @type {clay.Renderer} - */ - scene: { get: function () { return gScene; }}, - /** - * @name clay.application.App3D#timeline - * @type {clay.Renderer} - */ - timeline: { get: function () { return gTimeline; }}, - /** - * Time elapsed since last frame. Can be used in loop to calculate the movement. - * @name clay.application.App3D#frameTime - * @type {number} - */ - frameTime: { get: function () { return gFrameTime; }}, - /** - * Time elapsed since application created. - * @name clay.application.App3D#elapsedTime - * @type {number} - */ - elapsedTime: { get: function () { return gElapsedTime; }} - }); + var previousNormalMap; + var previousRougGlossMap; + var previousRenderable; - /** - * Resize the application. Will use the container clientWidth/clientHeight if width/height in parameters are not given. - * @function - * @memberOf {clay.application.App3D} - * @param {number} [width] - * @param {number} [height] - */ - this.resize = function (width, height) { - gWidth = width || appNS.width || dom.clientWidth; - gHeight = height || dom.height || dom.clientHeight; - gRenderer.resize(gWidth, gHeight); - }; + return function (renderable, gBufferMat, prevMaterial) { + // Material not change + if (previousRenderable && previousRenderable.material === renderable.material) { + return; + } - /** - * Dispose the application - * @function - */ - this.dispose = function () { - this._disposed = true; + var standardMaterial = renderable.material; + var program = renderable.__program; - if (appNS.dispose) { - appNS.dispose(this); + var glossiness; + var roughGlossMap; + var useRoughnessWorkflow = standardMaterial.isDefined('fragment', 'USE_ROUGHNESS'); + var doubleSided = standardMaterial.isDefined('fragment', 'DOUBLE_SIDED'); + var roughGlossChannel; + if (useRoughnessWorkflow) { + glossiness = 1.0 - standardMaterial.get('roughness'); + roughGlossMap = standardMaterial.get('roughnessMap'); + roughGlossChannel = standardMaterial.getDefine('fragment', 'ROUGHNESS_CHANNEL'); } - gTimeline.stop(); - gRenderer.disposeScene(gScene); - gShadowPass && gShadowPass.dispose(gRenderer); - - dom.innerHTML = ''; - ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove'].forEach(function (eveType) { - this[makeHandlerName(eveType)] && dom.removeEventListener(makeHandlerName(eveType)); - }); - }; + else { + glossiness = standardMaterial.get('glossiness'); + roughGlossMap = standardMaterial.get('glossinessMap'); + roughGlossChannel = standardMaterial.getDefine('fragment', 'GLOSSINESS_CHANNEL'); + } + var useRoughGlossMap = !!roughGlossMap; - gRayPicking && this._initMouseEvents(gRayPicking); + var normalMap = standardMaterial.get('normalMap') || defaultNormalMap; + var uvRepeat = standardMaterial.get('uvRepeat'); + var uvOffset = standardMaterial.get('uvOffset'); - this._geoCache = new LRU$1(20); - this._texCache = new LRU$1(20); + roughGlossMap = roughGlossMap || defaultRoughnessMap; - // Do init the application. - var initPromise = Promise.resolve(appNS.init && appNS.init(this)); - // Use the inited camera. - gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); + if (prevMaterial !== gBufferMat) { + gBufferMat.set('glossiness', glossiness); + gBufferMat.set('normalMap', normalMap); + gBufferMat.set('roughGlossMap', roughGlossMap); + gBufferMat.set('useRoughGlossMap', +useRoughGlossMap); + gBufferMat.set('useRoughness', +useRoughnessWorkflow); + gBufferMat.set('doubleSided', +doubleSided); + gBufferMat.set('roughGlossChannel', +roughGlossChannel || 0); + gBufferMat.set('uvRepeat', uvRepeat); + gBufferMat.set('uvOffset', uvOffset); + } + else { + program.setUniform( + gl, '1f', 'glossiness', glossiness + ); - var gTexturesList = {}; - var gGeometriesList = {}; + if (previousNormalMap !== normalMap) { + attachTextureToSlot(this, program, 'normalMap', normalMap, 0); + } + if (previousRougGlossMap !== roughGlossMap) { + attachTextureToSlot(this, program, 'roughGlossMap', roughGlossMap, 1); + } + program.setUniform(gl, '1i', 'useRoughGlossMap', +useRoughGlossMap); + program.setUniform(gl, '1i', 'useRoughness', +useRoughnessWorkflow); + program.setUniform(gl, '1i', 'doubleSided', +doubleSided); + program.setUniform(gl, '1i', 'roughGlossChannel', +roughGlossChannel || 0); + if (uvRepeat != null) { + program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); + } + if (uvOffset != null) { + program.setUniform(gl, '2f', 'uvOffset', uvOffset); + } + } - if (!appNS.loop) { - console.warn('Miss loop method.'); - } + previousNormalMap = normalMap; + previousRougGlossMap = roughGlossMap; - var self = this; - initPromise.then(function () { - appNS.loop && gTimeline.on('frame', function (frameTime) { - gFrameTime = frameTime; - gElapsedTime += frameTime; - appNS.loop(self); + previousRenderable = renderable; + }; +} - gScene.update(); - self._updateGraphicOptions(appNS.graphic, gScene.opaqueList); - self._updateGraphicOptions(appNS.graphic, gScene.transparentList); +function getBeforeRenderHook2(gl, defaultDiffuseMap, defaultMetalnessMap) { + var previousDiffuseMap; + var previousRenderable; + var previousMetalnessMap; - gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); - // Render shadow pass - gShadowPass && gShadowPass.render(gRenderer, gScene, null, true); + return function (renderable, gBufferMat, prevMaterial) { + // Material not change + if (previousRenderable && previousRenderable.material === renderable.material) { + return; + } - appNS.beforeRender && appNS.beforeRender(self); - self._doRender(gRenderer, gScene, true); - appNS.afterRender && appNS.afterRender(self); + var program = renderable.__program; + var standardMaterial = renderable.material; - // Mark all resources unused; - markUnused(gTexturesList); - markUnused(gGeometriesList); + var color = standardMaterial.get('color'); + var metalness = standardMaterial.get('metalness'); - // Collect resources used in this frame. - var newTexturesList = []; - var newGeometriesList = []; - collectResources(gScene, newTexturesList, newGeometriesList); + var diffuseMap = standardMaterial.get('diffuseMap'); + var metalnessMap = standardMaterial.get('metalnessMap'); - // Dispose those unsed resources. - checkAndDispose(gRenderer, gTexturesList); - checkAndDispose(gRenderer, gGeometriesList); + var uvRepeat = standardMaterial.get('uvRepeat'); + var uvOffset = standardMaterial.get('uvOffset'); - gTexturesList = newTexturesList; - gGeometriesList = newGeometriesList; - }); - }); -} + var useMetalnessMap = !!metalnessMap; -function isImageLikeElement(val) { - return val instanceof Image - || val instanceof HTMLCanvasElement - || val instanceof HTMLVideoElement; -} + diffuseMap = diffuseMap || defaultDiffuseMap; + metalnessMap = metalnessMap || defaultMetalnessMap; -function getKeyFromImageLike(val) { - typeof val === 'string' - ? val : (val.__key__ || (val.__key__ = util$1.genGUID())); -} + if (prevMaterial !== gBufferMat) { + gBufferMat.set('color', color); + gBufferMat.set('metalness', metalness); + gBufferMat.set('diffuseMap', diffuseMap); + gBufferMat.set('metalnessMap', metalnessMap); + gBufferMat.set('useMetalnessMap', +useMetalnessMap); + gBufferMat.set('uvRepeat', uvRepeat); + gBufferMat.set('uvOffset', uvOffset); -function makeHandlerName(eveType) { - return '_' + eveType + 'Handler'; -} + gBufferMat.set('linear', +standardMaterial.linear); + } + else { + program.setUniform(gl, '1f', 'metalness', metalness); -function packageEvent(eventType, pickResult, offsetX, offsetY) { - var event = util$1.clone(pickResult); - event.type = eventType; - event.offsetX = offsetX; - event.offsetY = offsetY; - return event; -} + program.setUniform(gl, '3f', 'color', color); + if (previousDiffuseMap !== diffuseMap) { + attachTextureToSlot(this, program, 'diffuseMap', diffuseMap, 0); + } + if (previousMetalnessMap !== metalnessMap) { + attachTextureToSlot(this, program, 'metalnessMap', metalnessMap, 1); + } + program.setUniform(gl, '1i', 'useMetalnessMap', +useMetalnessMap); + program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); + program.setUniform(gl, '2f', 'uvOffset', uvOffset); -function bubblingEvent(target, event) { - while (target && !event.cancelBubble) { - target.trigger(event.type, event); - target = target.getParent(); - } + program.setUniform(gl, '1i', 'linear', +standardMaterial.linear); + } + + previousDiffuseMap = diffuseMap; + previousMetalnessMap = metalnessMap; + + previousRenderable = renderable; + }; } -App3D.prototype._initMouseEvents = function (rayPicking) { - var dom = this.container; +/** + * GBuffer is provided for deferred rendering and SSAO, SSR pass. + * It will do two passes rendering to three target textures. See + * + {@link clay.deferred.GBuffer#getTargetTexture1} + * + {@link clay.deferred.GBuffer#getTargetTexture2} + * + {@link clay.deferred.GBuffer#getTargetTexture3} + * @constructor + * @alias clay.deferred.GBuffer + * @extends clay.core.Base + */ +var GBuffer = Base.extend(function () { - var oldTarget = null; - ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove'].forEach(function (eveType) { - dom.addEventListener(eveType, this[makeHandlerName(eveType)] = function (e) { - if (!rayPicking.camera) { // Not have camera yet. - return; - } + return { - var box = dom.getBoundingClientRect(); - var offsetX = e.clientX - box.left; - var offsetY = e.clientY - box.top; + enableTargetTexture1: true, - var pickResult = rayPicking.pick(offsetX, offsetY); + enableTargetTexture2: true, - if (pickResult) { - // Just ignore silent element. - if (pickResult.target.silent) { - return; - } + enableTargetTexture3: true, - if (eveType === 'mousemove') { - var targetChanged = pickResult.target !== oldTarget; - if (targetChanged) { - oldTarget && bubblingEvent(oldTarget, packageEvent('mouseout', { - target: oldTarget - }, offsetX, offsetY)); - } - bubblingEvent(pickResult.target, packageEvent('mousemove', pickResult, offsetX, offsetY)); - if (targetChanged) { - bubblingEvent(pickResult.target, packageEvent('mouseover', pickResult, offsetX, offsetY)); - } - } - else { - bubblingEvent(pickResult.target, packageEvent(eveType, pickResult, offsetX, offsetY)); - } - oldTarget = pickResult.target; - } - else if (oldTarget) { - bubblingEvent(oldTarget, packageEvent('mouseout', { - target: oldTarget - }, offsetX, offsetY)); - oldTarget = null; + renderTransparent: false, + + _renderList: [], + // - R: normal.x + // - G: normal.y + // - B: normal.z + // - A: glossiness + _gBufferTex1: new Texture2D({ + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST, + // PENDING + type: Texture.HALF_FLOAT + }), + + // - R: depth + _gBufferTex2: new Texture2D({ + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST, + // format: Texture.DEPTH_COMPONENT, + // type: Texture.UNSIGNED_INT + + format: Texture.DEPTH_STENCIL, + type: Texture.UNSIGNED_INT_24_8_WEBGL + }), + + // - R: albedo.r + // - G: albedo.g + // - B: albedo.b + // - A: metalness + _gBufferTex3: new Texture2D({ + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST + }), + + _defaultNormalMap: new Texture2D({ + image: createFillCanvas('#000') + }), + _defaultRoughnessMap: new Texture2D({ + image: createFillCanvas('#fff') + }), + _defaultMetalnessMap: new Texture2D({ + image: createFillCanvas('#fff') + }), + _defaultDiffuseMap: new Texture2D({ + image: createFillCanvas('#fff') + }), + + _frameBuffer: new FrameBuffer(), + + _gBufferMaterial1: new Material({ + shader: new Shader( + Shader.source('clay.deferred.gbuffer.vertex'), + Shader.source('clay.deferred.gbuffer1.fragment') + ), + vertexDefines: { + FIRST_PASS: null + }, + fragmentDefines: { + FIRST_PASS: null } - }); - }, this); -}; + }), + _gBufferMaterial2: new Material({ + shader: new Shader( + Shader.source('clay.deferred.gbuffer.vertex'), + Shader.source('clay.deferred.gbuffer2.fragment') + ) + }), -App3D.prototype._updateGraphicOptions = function (graphicOpts, list) { - var enableTonemapping = !!graphicOpts.tonemapping; - var isLinearSpace = !!graphicOpts.linear; + _debugPass: new Pass({ + fragment: Shader.source('clay.deferred.gbuffer.debug') + }) + }; +}, /** @lends clay.deferred.GBuffer# */{ - var prevMaterial; + /** + * Set G Buffer size. + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + if (this._gBufferTex1.width === width + && this._gBufferTex1.height === height + ) { + return; + } + this._gBufferTex1.width = width; + this._gBufferTex1.height = height; - for (var i = 0; i < list.length; i++) { - var mat = list[i].material; - if (mat === prevMaterial) { - continue; + this._gBufferTex2.width = width; + this._gBufferTex2.height = height; + + this._gBufferTex3.width = width; + this._gBufferTex3.height = height; + }, + + // TODO is dpr needed? + setViewport: function (x, y, width, height, dpr) { + var viewport; + if (typeof x === 'object') { + viewport = x; + } + else { + viewport = { + x: x, y: y, + width: width, height: height, + devicePixelRatio: dpr || 1 + }; } + this._frameBuffer.viewport = viewport; + }, - enableTonemapping ? mat.define('fragment', 'TONEMAPPING') : mat.undefine('fragment', 'TONEMAPPING'); - if (isLinearSpace) { - mat.define('fragment', 'SRGB_ENCODE'); - mat.define('fragment', 'SRGB_DECODE'); + getViewport: function () { + if (this._frameBuffer.viewport) { + return this._frameBuffer.viewport; } else { - mat.undefine('fragment', 'SRGB_ENCODE'); - mat.undefine('fragment', 'SRGB_DECODE'); + return { + x: 0, y: 0, + width: this._gBufferTex1.width, + height: this._gBufferTex1.height, + devicePixelRatio: 1 + }; } + }, - prevMaterial = mat; - } -}; + /** + * Update G Buffer + * @param {clay.Renderer} renderer + * @param {clay.Scene} scene + * @param {clay.camera.Perspective} camera + */ + update: function (renderer, scene, camera) { -App3D.prototype._doRender = function (renderer, scene) { - var camera = scene.getMainCamera(); - camera.aspect = renderer.getViewportAspect(); - renderer.render(scene); -}; + var gl = renderer.gl; + var frameBuffer = this._frameBuffer; + var viewport = frameBuffer.viewport; + var opaqueList = scene.opaqueList; + var transparentList = scene.transparentList; -function markUnused(resourceList) { - for (var i = 0; i < resourceList.length; i++) { - resourceList[i].__used__ = 0; - } -} + var offset = 0; + var renderList = this._renderList; + for (var i = 0; i < opaqueList.length; i++) { + if (!opaqueList[i].ignoreGBuffer) { + renderList[offset++] = opaqueList[i]; + } + } + if (this.renderTransparent) { + for (var i = 0; i < transparentList.length; i++) { + if (!transparentList[i].ignoreGBuffer) { + renderList[offset++] = transparentList[i]; + } + } + } + renderList.length = offset; -function checkAndDispose(renderer, resourceList) { - for (var i = 0; i < resourceList.length; i++) { - if (!resourceList[i].__used__) { - resourceList[i].dispose(renderer); + gl.clearColor(0, 0, 0, 0); + gl.depthMask(true); + gl.colorMask(true, true, true, true); + gl.disable(gl.BLEND); + + var enableTargetTexture1 = this.enableTargetTexture1; + var enableTargetTexture2 = this.enableTargetTexture2; + var enableTargetTexture3 = this.enableTargetTexture3; + if (!enableTargetTexture1 && !enableTargetTexture3) { + console.warn('Can\'t disable targetTexture1 targetTexture3 both'); + enableTargetTexture1 = true; } - } -} -function updateUsed(resource, list) { - resource.__used__ = resource.__used__ || 0; - resource.__used__++; - if (resource.__used__ === 1) { - // Don't push to the list twice. - list.push(resource); - } -} -function collectResources(scene, textureResourceList, geometryResourceList) { - function trackQueue(queue) { - var prevMaterial; - var prevGeometry; - for (var i = 0; i < queue.length; i++) { - var renderable = queue[i]; - var geometry = renderable.geometry; - var material = renderable.material; + if (enableTargetTexture2) { + frameBuffer.attach(this._gBufferTex2, renderer.gl.DEPTH_STENCIL_ATTACHMENT); + } - // TODO optimize!! - if (material !== prevMaterial) { - var textureUniforms = material.getTextureUniforms(); - for (var u = 0; u < textureUniforms.length; u++) { - var uniformName = textureUniforms[u]; - var val = material.uniforms[uniformName].value; - if (!val) { - continue; - } - if (val instanceof Texture) { - updateUsed(val, textureResourceList); - } - else if (val instanceof Array) { - for (var k = 0; k < val.length; k++) { - if (val[k] instanceof Texture) { - updateUsed(val[k], textureResourceList); - } - } - } - } + // PENDING, scene.boundingBoxLastFrame needs be updated if have shadow + renderer.bindSceneRendering(scene); + if (enableTargetTexture1) { + // Pass 1 + frameBuffer.attach(this._gBufferTex1); + frameBuffer.bind(renderer); + + if (viewport) { + var dpr = viewport.devicePixelRatio; + // use scissor to make sure only clear the viewport + gl.enable(gl.SCISSOR_TEST); + gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); } - if (geometry !== prevGeometry) { - updateUsed(geometry, geometryResourceList); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + if (viewport) { + gl.disable(gl.SCISSOR_TEST); } + var gBufferMaterial1 = this._gBufferMaterial1; + var passConfig = { + getMaterial: function () { + return gBufferMaterial1; + }, + beforeRender: getBeforeRenderHook1(gl, this._defaultNormalMap, this._defaultRoughnessMap), + sortCompare: renderer.opaqueSortCompare + }; + // FIXME Use MRT if possible + renderer.renderPass(renderList, camera, passConfig); - prevMaterial = material; - prevGeometry = geometry; } - } + if (enableTargetTexture3) { - trackQueue(scene.opaqueList); - trackQueue(scene.transparentList); + // Pass 2 + frameBuffer.attach(this._gBufferTex3); + frameBuffer.bind(renderer); - for (var k = 0; k < scene.lights.length; k++) { - // Track AmbientCubemap - if (scene.lights[k].cubemap) { - updateUsed(scene.lights[k].cubemap, textureResourceList); + if (viewport) { + var dpr = viewport.devicePixelRatio; + // use scissor to make sure only clear the viewport + gl.enable(gl.SCISSOR_TEST); + gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); + } + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + if (viewport) { + gl.disable(gl.SCISSOR_TEST); + } + + var gBufferMaterial2 = this._gBufferMaterial2; + var passConfig = { + getMaterial: function () { + return gBufferMaterial2; + }, + beforeRender: getBeforeRenderHook2(gl, this._defaultDiffuseMap, this._defaultMetalnessMap), + sortCompare: renderer.opaqueSortCompare + }; + renderer.renderPass(renderList, camera, passConfig); } - } -} -/** - * Load a texture from image or string. - * @param {ImageLike} img - * @param {Object} [opts] Texture options. - * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} - * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} - * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} - * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} - * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} - * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} - * @param {number} [opts.exposure] Only be used when source is a HDR image. - * @param {boolean} [useCache] If use cache. - * @return {Promise} - * @example - * app.loadTexture('diffuseMap.jpg') - * .then(function (texture) { - * material.set('diffuseMap', texture); - * }); - */ -App3D.prototype.loadTexture = function (urlOrImg, opts, useCache) { - var self = this; - var key = getKeyFromImageLike(urlOrImg); - if (useCache) { - if (this._texCache.get(key)) { - return this._texCache.get(key); + + renderer.bindSceneRendering(null); + frameBuffer.unbind(renderer); + }, + + renderDebug: function (renderer, camera, type, viewport) { + var debugTypes = { + normal: 0, + depth: 1, + position: 2, + glossiness: 3, + metalness: 4, + albedo: 5 + }; + if (debugTypes[type] == null) { + console.warn('Unkown type "' + type + '"'); + // Default use normal + type = 'normal'; } - } - // TODO Promise ? - var promise = new Promise(function (resolve, reject) { - var texture = self.loadTextureSync(urlOrImg, opts); - if (!texture.isRenderable()) { - texture.success(function () { - if (self._disposed) { - return; - } - resolve(texture); - }); - texture.error(function () { - if (self._disposed) { - return; - } - reject(); - }); - } - else { - resolve(texture); - } - }); - if (useCache) { - this._texCache.put(key, promise); - } - return promise; -}; -/** - * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. - * @param {ImageLike} img - * @param {Object} [opts] Texture options. - * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} - * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} - * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} - * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} - * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} - * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} - * @param {number} [opts.exposure] Only be used when source is a HDR image. - * @return {Promise} - * @example - * var texture = app.loadTexture('diffuseMap.jpg', { - * anisotropic: 8, - * flipY: false - * }); - * material.set('diffuseMap', texture); - */ -App3D.prototype.loadTextureSync = function (urlOrImg, opts) { - var texture = new Texture2D(opts); - if (typeof urlOrImg === 'string') { - if (urlOrImg.match(/.hdr$|^data:application\/octet-stream/)) { - texture = textureUtil.loadTexture(urlOrImg, { - exposure: opts && opts.exposure, - fileType: 'hdr' - }, function () { - texture.dirty(); - texture.trigger('success'); - }); - } - else { - texture.load(urlOrImg); - } - } - else if (isImageLikeElement(urlOrImg)) { - texture.image = urlOrImg; - texture.dynamic = urlOrImg instanceof HTMLVideoElement; - } - return texture; -}; + renderer.saveClear(); + renderer.saveViewport(); + renderer.clearBit = renderer.gl.DEPTH_BUFFER_BIT; -/** - * Create a material. - * @param {Object} materialConfig. materialConfig contains `shader`, `transparent` and uniforms that used in corresponding uniforms. - * Uniforms can be `color`, `alpha` `diffuseMap` etc. - * @param {string|clay.Shader} [shader='clay.standardMR'] Default to be standard shader with metalness and roughness workflow. - * @param {boolean} [transparent=false] If material is transparent. - * @return {clay.Material} - */ -App3D.prototype.createMaterial = function (matConfig) { - matConfig = matConfig || {}; - matConfig.shader = matConfig.shader || 'clay.standardMR'; - var shader = matConfig.shader instanceof Shader ? matConfig.shader : library.get(matConfig.shader); - var material = new Material({ - shader: shader - }); - function makeTextureSetter(key) { - return function (texture) { - material.setUniform(key, texture); - }; - } - for (var key in matConfig) { - if (material.uniforms[key]) { - var val = matConfig[key]; - if (material.uniforms[key].type === 't' || isImageLikeElement(val)) { - // Try to load a texture. - this.loadTexture(val).then(makeTextureSetter(key)); - } - else { - material.setUniform(key, val); - } + if (viewport) { + renderer.setViewport(viewport); } - } + var viewProjectionInv = new Matrix4(); + Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); - if (matConfig.transparent) { - matConfig.depthMask = false; - matConfig.transparent = true; - } - return material; -}; + var debugPass = this._debugPass; + debugPass.setUniform('viewportSize', [renderer.getWidth(), renderer.getHeight()]); + debugPass.setUniform('gBufferTexture1', this._gBufferTex1); + debugPass.setUniform('gBufferTexture2', this._gBufferTex2); + debugPass.setUniform('gBufferTexture3', this._gBufferTex3); + debugPass.setUniform('debug', debugTypes[type]); + debugPass.setUniform('viewProjectionInv', viewProjectionInv.array); + debugPass.render(renderer); -/** - * Create a cube mesh and add it to the scene or the given parent node. - * @function - * @param {Array.|number} [subdivision=1] Subdivision of cube. - * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a white cube. - * app.createCube() - */ -App3D.prototype.createCube = function (subdiv, material, parentNode) { - if (subdiv == null) { - subdiv = 1; - } - if (typeof subdiv === 'number') { - subdiv = [subdiv, subdiv, subdiv]; - } + renderer.restoreViewport(); + renderer.restoreClear(); + }, - var geoKey = 'cube-' + subdiv.join('-'); - var cube = this._geoCache.get(geoKey); - if (!cube) { - cube = new Cube$1({ - widthSegments: subdiv[0], - heightSegments: subdiv[1], - depthSegments: subdiv[2] - }); - this._geoCache.put(geoKey, cube); - } - return this.createMesh(cube, material, parentNode); -}; + /** + * Get first target texture. + * Channel storage: + * + R: normal.x * 0.5 + 0.5 + * + G: normal.y * 0.5 + 0.5 + * + B: normal.z * 0.5 + 0.5 + * + A: glossiness + * @return {clay.Texture2D} + */ + getTargetTexture1: function () { + return this._gBufferTex1; + }, -/** - * Create a cube mesh that camera is inside the cube. - * @function - * @param {Array.|number} [subdivision=1] Subdivision of cube. - * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a white cube inside. - * app.createCubeInside() - */ -App3D.prototype.createCubeInside = function (subdiv, material, parentNode) { - if (subdiv == null) { - subdiv = 1; - } - if (typeof subdiv === 'number') { - subdiv = [subdiv, subdiv, subdiv]; - } - var geoKey = 'cubeInside-' + subdiv.join('-'); - var cube = this._geoCache.get(geoKey); - if (!cube) { - cube = new Cube$1({ - inside: true, - widthSegments: subdiv[0], - heightSegments: subdiv[1], - depthSegments: subdiv[2] - }); - this._geoCache.put(geoKey, cube); - } + /** + * Get second target texture. + * Channel storage: + * + R: depth + * @return {clay.Texture2D} + */ + getTargetTexture2: function () { + return this._gBufferTex2; + }, - return this.createMesh(cube, material, parentNode); -}; + /** + * Get third target texture. + * Channel storage: + * + R: albedo.r + * + G: albedo.g + * + B: albedo.b + * + A: metalness + * @return {clay.Texture2D} + */ + getTargetTexture3: function () { + return this._gBufferTex3; + }, -/** - * Create a sphere mesh and add it to the scene or the given parent node. - * @function - * @param {number} [subdivision=20] Subdivision of sphere. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a semi-transparent sphere. - * app.createSphere(20, { - * color: [0, 0, 1], - * transparent: true, - * alpha: 0.5 - * }) - */ -App3D.prototype.createSphere = function (subdivision, material, parentNode) { - if (subdivision == null) { - subdivision = 20; - } - var geoKey = 'sphere-' + subdivision; - var sphere = this._geoCache.get(geoKey); - if (!sphere) { - sphere = new Sphere$1({ - widthSegments: subdivision * 2, - heightSegments: subdivision - }); - this._geoCache.put(geoKey, sphere); - } - return this.createMesh(sphere, material, parentNode); -}; -/** - * Create a plane mesh and add it to the scene or the given parent node. - * @function - * @param {Array.|number} [subdivision=1] Subdivision of plane. - * Can be a number to represent both width and height dimensions. Or an array to represent them respectively. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a red color plane. - * app.createPlane(1, { - * color: [1, 0, 0] - * }) - */ -App3D.prototype.createPlane = function (subdiv, material, parentNode) { - if (subdiv == null) { - subdiv = 1; - } - if (typeof subdiv === 'number') { - subdiv = [subdiv, subdiv]; - } - var geoKey = 'plane-' + subdiv.join('-'); - var planeGeo = this._geoCache.get(geoKey); - if (!planeGeo) { - planeGeo = new Plane$3({ - widthSegments: subdiv[0], - heightSegments: subdiv[1] - }); - this._geoCache.put(geoKey, planeGeo); + /** + * @param {clay.Renderer} renderer + */ + dispose: function (renderer) { } - return this.createMesh(planeGeo, material, parentNode); -}; - -/** - * Create a general mesh with given geometry instance and material config. - * @param {*} geometry - */ -App3D.prototype.createMesh = function (geometry, mat, parentNode) { - var mesh = new Mesh({ - geometry: geometry, - material: mat instanceof Material ? mat : this.createMaterial(mat) - }); - parentNode = parentNode || this.scene; - parentNode.add(mesh); - return mesh; -}; +}); -/** - * Create a perspective or orthographic camera and add it to the scene. - * @param {Array.|clay.math.Vector3} position - * @param {Array.|clay.math.Vector3} target - * @param {string} [type="perspective"] Can be 'perspective' or 'orthographic'(in short 'ortho') - * @return {clay.camera.Perspective} - */ -App3D.prototype.createCamera = function (position, target, type) { - var CameraCtor; - if (type === 'ortho' || type === 'orthographic') { - CameraCtor = Orthographic$1; - } - else { - if (type && type !== 'perspective') { - console.error('Unkown camera type ' + type + '. Use default perspective camera'); - } - CameraCtor = Perspective$1; - } +var lightvolumeGlsl = "@export clay.deferred.light_volume.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_Position;\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, 1.0);\n v_Position = position;\n}\n@end"; - var camera = new CameraCtor(); - if (position instanceof Vector3) { - camera.position.copy(position); - } - else if (position instanceof Array) { - camera.position.setArray(position); - } +var spotGlsl = "@export clay.deferred.spot_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\n@import clay.util.calculate_attenuation\nuniform vec3 lightPosition;\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform float umbraAngleCosine;\nuniform float penumbraAngleCosine;\nuniform float lightRange;\nuniform float falloffFactor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform mat4 lightMatrix;\nuniform float lightShadowMapSize;\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n float attenuation = lightAttenuation(dist, lightRange);\n float c = dot(-normalize(lightDirection), L);\n float falloff = clamp((c - umbraAngleCosine) / (penumbraAngleCosine - umbraAngleCosine), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = (1.0 - falloff) * attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrix, position, lightShadowMapSize\n );\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; - if (target instanceof Array) { - target = new Vector3(target[0], target[1], target[2]); - } - if (target instanceof Vector3) { - camera.lookAt(target); - } +var directionalGlsl = "@export clay.deferred.directional_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform float lightShadowMapSize;\nuniform mat4 lightMatrices[SHADOW_CASCADE];\nuniform float shadowCascadeClipsNear[SHADOW_CASCADE];\nuniform float shadowCascadeClipsFar[SHADOW_CASCADE];\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = -normalize(lightDirection);\n vec3 V = normalize(eyePosition - position);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = 1.0;\n for (int _idx_ = 0; _idx_ < SHADOW_CASCADE; _idx_++) {{\n if (\n z >= shadowCascadeClipsNear[_idx_] &&\n z <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrices[_idx_], position, lightShadowMapSize,\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n }\n }}\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; - this.scene.add(camera); +var ambientGlsl = "@export clay.deferred.ambient_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec2 windowSize: WINDOW_SIZE;\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo;\n gl_FragColor.a = 1.0;\n}\n@end"; - return camera; -}; +var ambientshGlsl = "@export clay.deferred.ambient_sh_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec3 lightCoefficients[9];\nuniform vec2 windowSize: WINDOW_SIZE;\nvec3 calcAmbientSHLight(vec3 N) {\n return lightCoefficients[0]\n + lightCoefficients[1] * N.x\n + lightCoefficients[2] * N.y\n + lightCoefficients[3] * N.z\n + lightCoefficients[4] * N.x * N.z\n + lightCoefficients[5] * N.z * N.y\n + lightCoefficients[6] * N.y * N.x\n + lightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + lightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 N = texel1.rgb * 2.0 - 1.0;\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo * calcAmbientSHLight(N);\n gl_FragColor.a = 1.0;\n}\n@end"; -/** - * Create a directional light and add it to the scene. - * @param {Array.|clay.math.Vector3} dir A Vector3 or array to represent the direction. - * @param {Color} [color='#fff'] Color of directional light, default to be white. - * @param {number} [intensity] Intensity of directional light, default to be 1. - * - * @example - * app.createDirectionalLight([-1, -1, -1], '#fff', 2); - */ -App3D.prototype.createDirectionalLight = function (dir, color, intensity) { - var light = new DirectionalLight(); - if (dir instanceof Vector3) { - dir = dir.array; - } - light.position.setArray(dir).negate(); - light.lookAt(Vector3.ZERO); - if (typeof color === 'string') { - color = parseColor(color); - } - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); +var ambientcubemapGlsl = "@export clay.deferred.ambient_cubemap_light\n@import clay.deferred.chunk.light_head\nuniform vec3 lightColor;\nuniform samplerCube lightCubemap;\nuniform sampler2D brdfLookup;\nuniform vec3 eyePosition;\n@import clay.util.rgbm\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 V = normalize(eyePosition - position);\n vec3 L = reflect(-V, N);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float rough = clamp(1.0 - glossiness, 0.0, 1.0);\n float bias = rough * 5.0;\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n vec3 envWeight = specularColor * brdfParam.x + brdfParam.y;\n vec3 envTexel = RGBMDecode(textureCubeLodEXT(lightCubemap, L, bias), 51.5);\n gl_FragColor.rgb = lightColor * envTexel * envWeight;\n gl_FragColor.a = 1.0;\n}\n@end"; - this.scene.add(light); - return light; -}; +var pointGlsl = "@export clay.deferred.point_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform samplerCube lightShadowMap;\nuniform float lightShadowMapSize;\n#endif\nvarying vec3 v_Position;\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContribOmni(\n lightShadowMap, -L * dist, lightRange\n );\n gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n#endif\n gl_FragColor.a = 1.0;\n}\n@end"; -/** - * Create a spot light and add it to the scene. - * @param {Array.|clay.math.Vector3} position Position of the spot light. - * @param {Array.|clay.math.Vector3} [target] Target position where spot light points to. - * @param {number} [range=20] Falloff range of spot light. Default to be 20. - * @param {Color} [color='#fff'] Color of spot light, default to be white. - * @param {number} [intensity=1] Intensity of spot light, default to be 1. - * @param {number} [umbraAngle=30] Umbra angle of spot light. Default to be 30 degree from the middle line. - * @param {number} [penumbraAngle=45] Penumbra angle of spot light. Default to be 45 degree from the middle line. - * - * @example - * app.createSpotLight([5, 5, 5], [0, 0, 0], 20, #900); - */ -App3D.prototype.createSpotLight = function (position, target, range, color, intensity, umbraAngle, penumbraAngle) { - var light = new SpotLight(); - light.position.setArray(position instanceof Vector3 ? position.array : position); +var sphereGlsl = "@export clay.deferred.sphere_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform float lightRadius;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n vec3 R = reflect(V, N);\n float tmp = dot(L, R);\n vec3 cToR = tmp * R - L;\n float d = length(cToR);\n L = L + cToR * clamp(lightRadius / d, 0.0, 1.0);\n L = normalize(L);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = lightColor * ndl * attenuation;\n glossiness = clamp(glossiness - lightRadius / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n gl_FragColor.a = 1.0;\n}\n@end"; - if (target instanceof Array) { - target = new Vector3(target[0], target[1], target[2]); - } - if (target instanceof Vector3) { - light.lookAt(target); - } +var tubeGlsl = "@export clay.deferred.tube_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 lightExtend;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n vec3 R = reflect(V, N);\n vec3 L0 = lightPosition - lightExtend - position;\n vec3 L1 = lightPosition + lightExtend - position;\n vec3 LD = L1 - L0;\n float len0 = length(L0);\n float len1 = length(L1);\n float irra = 2.0 * clamp(dot(N, L0) / (2.0 * len0) + dot(N, L1) / (2.0 * len1), 0.0, 1.0);\n float LDDotR = dot(R, LD);\n float t = (LDDotR * dot(R, L0) - dot(L0, LD)) / (dot(LD, LD) - LDDotR * LDDotR);\n t = clamp(t, 0.0, 1.0);\n L = L0 + t * LD;\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n glossiness = clamp(glossiness - 0.0 / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = lightColor * irra * lightAttenuation(dist, lightRange)\n * (diffuseColor + D_Phong(glossiness, ndh) * F_Schlick(ndv, specularColor));\n gl_FragColor.a = 1.0;\n}\n@end"; - if (typeof color === 'string') { - color = parseColor(color); - } - range != null && (light.range = range); - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); - umbraAngle != null && (light.umbraAngle = umbraAngle); - penumbraAngle != null && (light.penumbraAngle = penumbraAngle); +// Light-pre pass deferred rendering +// http://www.realtimerendering.com/blog/deferred-lighting-approaches/ +// Light shaders +Shader.import(prezGlsl); +Shader.import(utilGlsl); +Shader.import(lightvolumeGlsl); - this.scene.add(light); +// Light shaders +Shader.import(spotGlsl); +Shader.import(directionalGlsl); +Shader.import(ambientGlsl); +Shader.import(ambientshGlsl); +Shader.import(ambientcubemapGlsl); +Shader.import(pointGlsl); +Shader.import(sphereGlsl); +Shader.import(tubeGlsl); - return light; -}; +Shader.import(prezGlsl); /** - * Create a point light. - * @param {Array.|clay.math.Vector3} position Position of point light.. - * @param {number} [range=100] Falloff range of point light. - * @param {Color} [color='#fff'] Color of point light. - * @param {number} [intensity=1] Intensity of point light. + * Deferred renderer + * @constructor + * @alias clay.deferred.Renderer + * @extends clay.core.Base */ -App3D.prototype.createPointLight = function (position, range, color, intensity) { - var light = new PointLight(); - light.position.setArray(position instanceof Vector3 ? position.array : position); +var DeferredRenderer = Base.extend(function () { - if (typeof color === 'string') { - color = parseColor(color); - } - range != null && (light.range = range); - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); + var fullQuadVertex = Shader.source('clay.compositor.vertex'); + var lightVolumeVertex = Shader.source('clay.deferred.light_volume.vertex'); - this.scene.add(light); + var directionalLightShader = new Shader(fullQuadVertex, Shader.source('clay.deferred.directional_light')); - return light; -}; + var lightAccumulateBlendFunc = function (gl) { + gl.blendEquation(gl.FUNC_ADD); + gl.blendFunc(gl.ONE, gl.ONE); + }; -/** - * Create a ambient light. - * @param {Color} [color='#fff'] Color of ambient light. - * @param {number} [intensity=1] Intensity of ambient light. - */ -App3D.prototype.createAmbientLight = function (color, intensity) { - var light = new AmbientLight(); + var createLightPassMat = function (shader) { + return new Material({ + shader: shader, + blend: lightAccumulateBlendFunc, + transparent: true, + depthMask: false + }); + }; - if (typeof color === 'string') { - color = parseColor(color); - } - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); + var createVolumeShader = function (name) { + return new Shader(lightVolumeVertex, Shader.source('clay.deferred.' + name)); + }; - this.scene.add(light); + // Rotate and positioning to fit the spot light + // Which the cusp of cone pointing to the positive z + // and positioned on the origin + var coneGeo = new Cone$1({ + capSegments: 10 + }); + var mat = new Matrix4(); + mat.rotateX(Math.PI / 2) + .translate(new Vector3(0, -1, 0)); - return light; -}; + coneGeo.applyTransform(mat); -/** - * Create an cubemap ambient light and an spherical harmonic ambient light - * for specular and diffuse lighting in PBR rendering - * @param {ImageLike} [envImage] Panorama environment image, HDR format is better. - * @param {number} [specularIntenstity=0.7] Intensity of specular light. - * @param {number} [diffuseIntenstity=0.7] Intensity of diffuse light. - * @param {number} [exposure=1] Exposure of HDR image. Only if image in first paramter is HDR. - * @param {number} [prefilteredCubemapSize=32] The size of prefilerted cubemap. Larger value will take more time to do expensive prefiltering. - */ -App3D.prototype.createAmbientCubemapLight = function (envImage, specIntensity, diffIntensity, exposure, prefilteredCubemapSize) { - var self = this; - if (exposure == null) { - exposure = 1; - } - if (prefilteredCubemapSize == null) { - prefilteredCubemapSize = 32; - } + var cylinderGeo = new Cylinder$1({ + capSegments: 10 + }); + // Align with x axis + mat.identity().rotateZ(Math.PI / 2); + cylinderGeo.applyTransform(mat); - var scene = this.scene; + return /** @lends clay.deferred.Renderer# */ { - return this.loadTexture(envImage, { - exposure: exposure - }).then(function (envTexture) { - var specLight = new AmbientCubemapLight({ - intensity: specIntensity != null ? specIntensity : 0.7 - }); - specLight.cubemap = envTexture; - envTexture.flipY = false; - // TODO Cache prefilter ? - specLight.prefilter(self.renderer, 32); + /** + * Provide ShadowMapPass for shadow rendering. + * @type {clay.prePass.ShadowMap} + */ + shadowMapPass: null, + /** + * If enable auto resizing from given defualt renderer size. + * @type {boolean} + */ + autoResize: true, - var diffLight = new AmbientSHLight({ - intensity: diffIntensity != null ? diffIntensity : 0.7, - coefficients: sh.projectEnvironmentMap( - self.renderer, specLight.cubemap, { - lod: 1 - } - ) - }); - scene.add(specLight); - scene.add(diffLight); + _createLightPassMat: createLightPassMat, - return { - specular: specLight, - diffuse: diffLight, - // Original environment map - environmentMap: envTexture - }; - }); -}; + _gBuffer: new GBuffer(), -/** - * Load a [glTF](https://github.com/KhronosGroup/glTF) format model. - * You can convert FBX/DAE/OBJ format models to [glTF](https://github.com/KhronosGroup/glTF) with [fbx2gltf](https://github.com/pissang/claygl#fbx-to-gltf20-converter) python script, - * or simply using the [Clay Viewer](https://github.com/pissang/clay-viewer) client application. - * @param {string} url - * @param {Object} opts - * @param {string|clay.Shader} [opts.shader='clay.standard'] 'basic'|'lambert'|'standard'. - * @param {boolean} [opts.waitTextureLoaded=false] If add to scene util textures are all loaded. - * @param {boolean} [opts.autoPlayAnimation=true] If autoplay the animation of model. - * @param {boolean} [opts.upAxis='y'] Change model to y up if upAxis is 'z' - * @param {boolean} [opts.textureFlipY=false] - * @param {string} [opts.textureRootPath] Root path of texture. Default to be relative with glTF file. - * @return {Promise} - */ -App3D.prototype.loadModel = function (url, opts) { - if (typeof url !== 'string') { - throw new Error('Invalid URL.'); - } + _lightAccumFrameBuffer: new FrameBuffer({ + depthBuffer: false + }), - opts = opts || {}; - if (opts.autoPlayAnimation == null) { - opts.autoPlayAnimation = true; - } - var shader = opts.shader || 'clay.standard'; + _lightAccumTex: new Texture2D({ + // FIXME Device not support float texture + type: Texture.HALF_FLOAT, + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST + }), - var loaderOpts = { - rootNode: new Node(), - shader: shader, - textureRootPath: opts.textureRootPath, - crossOrigin: 'Anonymous', - textureFlipY: opts.textureFlipY - }; - if (opts.upAxis && opts.upAxis.toLowerCase() === 'z') { - loaderOpts.rootNode.rotation.identity().rotateX(-Math.PI / 2); - } + _fullQuadPass: new Pass({ + blendWithPrevious: true + }), - var loader = new GLTFLoader(loaderOpts); + _directionalLightMat: createLightPassMat(directionalLightShader), - var scene = this.scene; - var timeline = this.timeline; - var self = this; + _ambientMat: createLightPassMat(new Shader( + fullQuadVertex, Shader.source('clay.deferred.ambient_light') + )), + _ambientSHMat: createLightPassMat(new Shader( + fullQuadVertex, Shader.source('clay.deferred.ambient_sh_light') + )), + _ambientCubemapMat: createLightPassMat(new Shader( + fullQuadVertex, Shader.source('clay.deferred.ambient_cubemap_light') + )), - return new Promise(function (resolve, reject) { - function afterLoad(result) { - if (self._disposed) { - return; - } + _spotLightShader: createVolumeShader('spot_light'), + _pointLightShader: createVolumeShader('point_light'), - scene.add(result.rootNode); - if (opts.autoPlayAnimation) { - result.clips.forEach(function (clip) { - timeline.addClip(clip); - }); - } - resolve(result); - } - loader.success(function (result) { - if (self._disposed) { - return; - } + _sphereLightShader: createVolumeShader('sphere_light'), + _tubeLightShader: createVolumeShader('tube_light'), - if (!opts.waitTextureLoaded) { - afterLoad(result); - } - else { - Promise.all(result.textures.map(function (texture) { - if (texture.isRenderable()) { - return Promise.resolve(texture); - } - return new Promise(function (resolve) { - texture.success(resolve); - texture.error(resolve); - }); - })).then(function () { - afterLoad(result); - }).catch(function () { - afterLoad(result); - }); - } - }); - loader.error(function () { - reject(); - }); - loader.load(url); - }); -}; + _lightSphereGeo: new Sphere$1({ + widthSegments: 10, + heightSegements: 10 + }), + _lightConeGeo: coneGeo, -var application = { - App3D: App3D, + _lightCylinderGeo: cylinderGeo, + + _outputPass: new Pass({ + fragment: Shader.source('clay.compositor.output') + }) + }; +}, /** @lends clay.deferred.Renderer# */ { /** - * Create a 3D application that will manage the app initialization and loop. - * @name clay.application.create - * @param {HTMLDomElement|string} dom Container dom element or a selector string that can be used in `querySelector` - * @param {Object} appNS - * @param {Function} init Initialization callback that will be called when initing app. - * @param {Function} loop Loop callback that will be called each frame. - * @param {number} [width] Container width. - * @param {number} [height] Container height. - * @param {number} [devicePixelRatio] - * @return {clay.application.App3D} - * - * @example - * clay.application.create('#app', { - * init: function (app) { - * app.createCube(); - * var camera = app.createCamera(); - * camera.position.set(0, 0, 2); - * }, - * loop: function () { // noop } - * }) + * Do render + * @param {clay.Renderer} renderer + * @param {clay.Scene} scene + * @param {clay.Camera} camera + * @param {Object} [opts] + * @param {boolean} [opts.renderToTarget = false] If not ouput and render to the target texture + * @param {boolean} [opts.notUpdateShadow = true] If not update the shadow. + * @param {boolean} [opts.notUpdateScene = true] If not update the scene. */ - create: function (dom, appNS) { - return new App3D(dom, appNS); - } -}; - -/** - * @constructor - * @alias clay.async.Task - * @mixes clay.core.mixin.notifier - */ -var Task = function() { - this._fullfilled = false; - this._rejected = false; -}; -/** - * Task successed - * @param {} data - */ -Task.prototype.resolve = function(data) { - this._fullfilled = true; - this._rejected = false; - this.trigger('success', data); -}; -/** - * Task failed - * @param {} err - */ -Task.prototype.reject = function(err) { - this._rejected = true; - this._fullfilled = false; - this.trigger('error', err); -}; -/** - * If task successed - * @return {boolean} - */ -Task.prototype.isFullfilled = function() { - return this._fullfilled; -}; -/** - * If task failed - * @return {boolean} - */ -Task.prototype.isRejected = function() { - return this._rejected; -}; -/** - * If task finished, either successed or failed - * @return {boolean} - */ -Task.prototype.isSettled = function() { - return this._fullfilled || this._rejected; -}; + render: function (renderer, scene, camera, opts) { -util$1.extend(Task.prototype, notifier); + opts = opts || {}; + opts.renderToTarget = opts.renderToTarget || false; + opts.notUpdateShadow = opts.notUpdateShadow || false; + opts.notUpdateScene = opts.notUpdateScene || false; -function makeRequestTask(url, responseType) { - var task = new Task(); - request.get({ - url: url, - responseType: responseType, - onload: function(res) { - task.resolve(res); - }, - onerror: function(error) { - task.reject(error); + if (!opts.notUpdateScene) { + scene.update(false, true); } - }); - return task; -} -/** - * Make a request task - * @param {string|object|object[]|string[]} url - * @param {string} [responseType] - * @example - * var task = Task.makeRequestTask('./a.json'); - * var task = Task.makeRequestTask({ - * url: 'b.bin', - * responseType: 'arraybuffer' - * }); - * var tasks = Task.makeRequestTask(['./a.json', './b.json']); - * var tasks = Task.makeRequestTask([ - * {url: 'a.json'}, - * {url: 'b.bin', responseType: 'arraybuffer'} - * ]); - * @return {clay.async.Task|clay.async.Task[]} - */ -Task.makeRequestTask = function(url, responseType) { - if (typeof url === 'string') { - return makeRequestTask(url, responseType); - } else if (url.url) { // Configure object - var obj = url; - return makeRequestTask(obj.url, obj.responseType); - } else if (Array.isArray(url)) { // Url list - var urlList = url; - var tasks = []; - urlList.forEach(function(obj) { - var url, responseType; - if (typeof obj === 'string') { - url = obj; - } else if (Object(obj) === obj) { - url = obj.url; - responseType = obj.responseType; - } - tasks.push(makeRequestTask(url, responseType)); - }); - return tasks; - } -}; -/** - * @return {clay.async.Task} - */ -Task.makeTask = function() { - return new Task(); -}; -util$1.extend(Task.prototype, notifier); + camera.update(true); -/** - * @constructor - * @alias clay.async.TaskGroup - * @extends clay.async.Task - */ -var TaskGroup = function () { + // PENDING For stereo rendering + var dpr = renderer.getDevicePixelRatio(); + if (this.autoResize + && (renderer.getWidth() * dpr !== this._lightAccumTex.width + || renderer.getHeight() * dpr !== this._lightAccumTex.height) + ) { + this.resize(renderer.getWidth() * dpr, renderer.getHeight() * dpr); + } - Task.apply(this, arguments); + this._gBuffer.update(renderer, scene, camera); - this._tasks = []; + // Accumulate light buffer + this._accumulateLightBuffer(renderer, scene, camera, !opts.notUpdateShadow); - this._fulfilledNumber = 0; + if (!opts.renderToTarget) { + this._outputPass.setUniform('texture', this._lightAccumTex); - this._rejectedNumber = 0; -}; + this._outputPass.render(renderer); + // this._gBuffer.renderDebug(renderer, camera, 'normal'); + } + }, -var Ctor = function (){}; -Ctor.prototype = Task.prototype; -TaskGroup.prototype = new Ctor(); + /** + * @return {clay.Texture2D} + */ + getTargetTexture: function () { + return this._lightAccumTex; + }, -TaskGroup.prototype.constructor = TaskGroup; + /** + * @return {clay.FrameBuffer} + */ + getTargetFrameBuffer: function () { + return this._lightAccumFrameBuffer; + }, -/** - * Wait for all given tasks successed, task can also be any notifier object which will trigger success and error events. Like {@link clay.Texture2D}, {@link clay.TextureCube}, {@link clay.loader.GLTF}. - * @param {Array.} tasks - * @chainable - * @example - * // Load texture list - * var list = ['a.jpg', 'b.jpg', 'c.jpg'] - * var textures = list.map(function (src) { - * var texture = new clay.Texture2D(); - * texture.load(src); - * return texture; - * }); - * var taskGroup = new clay.async.TaskGroup(); - * taskGroup.all(textures).success(function () { - * // Do some thing after all textures loaded - * }); - */ -TaskGroup.prototype.all = function (tasks) { - var count = 0; - var self = this; - var data = []; - this._tasks = tasks; - this._fulfilledNumber = 0; - this._rejectedNumber = 0; + /** + * @return {clay.deferred.GBuffer} + */ + getGBuffer: function () { + return this._gBuffer; + }, - util$1.each(tasks, function (task, idx) { - if (!task || !task.once) { - return; - } - count++; - task.once('success', function (res) { - count--; + // TODO is dpr needed? + setViewport: function (x, y, width, height, dpr) { + this._gBuffer.setViewport(x, y, width, height, dpr); + this._lightAccumFrameBuffer.viewport = this._gBuffer.getViewport(); + }, - self._fulfilledNumber++; - // TODO - // Some tasks like texture, loader are not inherited from task - // We need to set the states here - task._fulfilled = true; - task._rejected = false; + // getFullQuadLightPass: function () { + // return this._fullQuadPass; + // }, - data[idx] = res; - if (count === 0) { - self.resolve(data); - } - }); - task.once('error', function () { + /** + * Set renderer size. + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + this._lightAccumTex.width = width; + this._lightAccumTex.height = height; - self._rejectedNumber ++; + // PENDING viewport ? + this._gBuffer.resize(width, height); + }, - task._fulfilled = false; - task._rejected = true; + _accumulateLightBuffer: function (renderer, scene, camera, updateShadow) { + var gl = renderer.gl; + var lightAccumTex = this._lightAccumTex; + var lightAccumFrameBuffer = this._lightAccumFrameBuffer; - self.reject(task); - }); - }); - if (count === 0) { - setTimeout(function () { - self.resolve(data); - }); - return this; - } - return this; -}; -/** - * Wait for all given tasks finished, either successed or failed - * @param {Array.} tasks - * @return {clay.async.TaskGroup} - */ -TaskGroup.prototype.allSettled = function (tasks) { - var count = 0; - var self = this; - var data = []; - if (tasks.length === 0) { - setTimeout(function () { - self.trigger('success', data); - }); - return this; - } - this._tasks = tasks; + var eyePosition = camera.getWorldPosition().array; - util$1.each(tasks, function (task, idx) { - if (!task || !task.once) { - return; + // Update volume meshes + for (var i = 0; i < scene.lights.length; i++) { + this._updateLightProxy(scene.lights[i]); } - count++; - task.once('success', function (res) { - count--; - self._fulfilledNumber++; + var shadowMapPass = this.shadowMapPass; + if (shadowMapPass && updateShadow) { + gl.clearColor(1, 1, 1, 1); + this._prepareLightShadow(renderer, scene, camera); + } - task._fulfilled = true; - task._rejected = false; + this.trigger('beforelightaccumulate', renderer, scene, camera, updateShadow); - data[idx] = res; - if (count === 0) { - self.resolve(data); - } - }); - task.once('error', function (err) { - count--; + lightAccumFrameBuffer.attach(lightAccumTex); + lightAccumFrameBuffer.bind(renderer); + var clearColor = renderer.clearColor; - self._rejectedNumber++; + var viewport = lightAccumFrameBuffer.viewport; + if (viewport) { + var dpr = viewport.devicePixelRatio; + // use scissor to make sure only clear the viewport + gl.enable(gl.SCISSOR_TEST); + gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); + } + gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.enable(gl.BLEND); + if (viewport) { + gl.disable(gl.SCISSOR_TEST); + } - task._fulfilled = false; - task._rejected = true; + this.trigger('startlightaccumulate', renderer, scene, camera); - // TODO - data[idx] = null; - if (count === 0) { - self.resolve(data); - } - }); - }); - return this; -}; -/** - * Get successed sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getFulfilledNumber = function (recursive) { - if (recursive) { - var nFulfilled = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nFulfilled += task.getFulfilledNumber(recursive); - } else if(task._fulfilled) { - nFulfilled += 1; - } - } - return nFulfilled; - } else { - return this._fulfilledNumber; - } -}; + var viewProjectionInv = new Matrix4(); + Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); -/** - * Get failed sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getRejectedNumber = function (recursive) { - if (recursive) { - var nRejected = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nRejected += task.getRejectedNumber(recursive); - } else if(task._rejected) { - nRejected += 1; - } - } - return nRejected; - } else { - return this._rejectedNumber; - } -}; + var volumeMeshList = []; -/** - * Get finished sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getSettledNumber = function (recursive) { + for (var i = 0; i < scene.lights.length; i++) { + var light = scene.lights[i]; + var uTpl = light.uniformTemplates; - if (recursive) { - var nSettled = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nSettled += task.getSettledNumber(recursive); - } else if(task._rejected || task._fulfilled) { - nSettled += 1; - } - } - return nSettled; - } else { - return this._fulfilledNumber + this._rejectedNumber; - } -}; + var volumeMesh = light.volumeMesh || light.__volumeMesh; -/** - * Get all sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getTaskNumber = function (recursive) { - if (recursive) { - var nTask = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nTask += task.getTaskNumber(recursive); - } else { - nTask += 1; - } - } - return nTask; - } else { - return this._tasks.length; - } -}; + if (volumeMesh) { + var material = volumeMesh.material; + // Volume mesh will affect the scene bounding box when rendering + // if castShadow is true + volumeMesh.castShadow = false; -var CanvasMaterial = Base.extend({ + var unknownLightType = false; + switch (light.type) { + case 'POINT_LIGHT': + material.setUniform('lightColor', uTpl.pointLightColor.value(light)); + material.setUniform('lightRange', uTpl.pointLightRange.value(light)); + material.setUniform('lightPosition', uTpl.pointLightPosition.value(light)); + break; + case 'SPOT_LIGHT': + material.setUniform('lightPosition', uTpl.spotLightPosition.value(light)); + material.setUniform('lightColor', uTpl.spotLightColor.value(light)); + material.setUniform('lightRange', uTpl.spotLightRange.value(light)); + material.setUniform('lightDirection', uTpl.spotLightDirection.value(light)); + material.setUniform('umbraAngleCosine', uTpl.spotLightUmbraAngleCosine.value(light)); + material.setUniform('penumbraAngleCosine', uTpl.spotLightPenumbraAngleCosine.value(light)); + material.setUniform('falloffFactor', uTpl.spotLightFalloffFactor.value(light)); + break; + case 'SPHERE_LIGHT': + material.setUniform('lightColor', uTpl.sphereLightColor.value(light)); + material.setUniform('lightRange', uTpl.sphereLightRange.value(light)); + material.setUniform('lightRadius', uTpl.sphereLightRadius.value(light)); + material.setUniform('lightPosition', uTpl.sphereLightPosition.value(light)); + break; + case 'TUBE_LIGHT': + material.setUniform('lightColor', uTpl.tubeLightColor.value(light)); + material.setUniform('lightRange', uTpl.tubeLightRange.value(light)); + material.setUniform('lightExtend', uTpl.tubeLightExtend.value(light)); + material.setUniform('lightPosition', uTpl.tubeLightPosition.value(light)); + break; + default: + unknownLightType = true; + } - color: [1, 1, 1, 1], + if (unknownLightType) { + continue; + } - opacity: 1, + material.setUniform('eyePosition', eyePosition); + material.setUniform('viewProjectionInv', viewProjectionInv.array); + material.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); + material.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); + material.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); - pointSize: 0, + volumeMeshList.push(volumeMesh); - pointShape: 'rectangle' -}); + } + else { + var pass = this._fullQuadPass; + var unknownLightType = false; + // Full quad light + switch (light.type) { + case 'AMBIENT_LIGHT': + pass.material = this._ambientMat; + pass.material.setUniform('lightColor', uTpl.ambientLightColor.value(light)); + break; + case 'AMBIENT_SH_LIGHT': + pass.material = this._ambientSHMat; + pass.material.setUniform('lightColor', uTpl.ambientSHLightColor.value(light)); + pass.material.setUniform('lightCoefficients', uTpl.ambientSHLightCoefficients.value(light)); + break; + case 'AMBIENT_CUBEMAP_LIGHT': + pass.material = this._ambientCubemapMat; + pass.material.setUniform('lightColor', uTpl.ambientCubemapLightColor.value(light)); + pass.material.setUniform('lightCubemap', uTpl.ambientCubemapLightCubemap.value(light)); + pass.material.setUniform('brdfLookup', uTpl.ambientCubemapLightBRDFLookup.value(light)); + break; + case 'DIRECTIONAL_LIGHT': + var hasShadow = shadowMapPass && light.castShadow; + pass.material = this._directionalLightMat; + pass.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); + if (hasShadow) { + pass.material.define('fragment', 'SHADOW_CASCADE', light.shadowCascade); + } + pass.material.setUniform('lightColor', uTpl.directionalLightColor.value(light)); + pass.material.setUniform('lightDirection', uTpl.directionalLightDirection.value(light)); + break; + default: + // Unkonw light type + unknownLightType = true; + } + if (unknownLightType) { + continue; + } -var mat4$8 = glmatrix.mat4; -var vec3$16 = glmatrix.vec3; -var vec4$2 = glmatrix.vec4; + var passMaterial = pass.material; + passMaterial.setUniform('eyePosition', eyePosition); + passMaterial.setUniform('viewProjectionInv', viewProjectionInv.array); + passMaterial.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); + passMaterial.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); + passMaterial.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); -var vec4Create = vec4$2.create; + // TODO + if (shadowMapPass && light.castShadow) { + passMaterial.setUniform('lightShadowMap', light.__shadowMap); + passMaterial.setUniform('lightMatrices', light.__lightMatrices); + passMaterial.setUniform('shadowCascadeClipsNear', light.__cascadeClipsNear); + passMaterial.setUniform('shadowCascadeClipsFar', light.__cascadeClipsFar); -var round = Math.round; + passMaterial.setUniform('lightShadowMapSize', light.shadowResolution); + } -var PRIMITIVE_TRIANGLE = 1; -var PRIMITIVE_LINE = 2; -var PRIMITIVE_POINT = 3; + pass.renderQuad(renderer); + } + } -function PrimitivePool(constructor) { - this.ctor = constructor; + this._renderVolumeMeshList(renderer, camera, volumeMeshList); - this._data = []; + this.trigger('lightaccumulate', renderer, scene, camera); - this._size = 0; -} + lightAccumFrameBuffer.unbind(renderer); -PrimitivePool.prototype = { - pick: function () { - var data = this._data; - var size = this._size; - var obj = data[size]; - if (! obj) { - // Constructor must have no parameters - obj = new this.ctor(); - data[size] = obj; - } - this._size++; - return obj; - }, + this.trigger('afterlightaccumulate', renderer, scene, camera); - reset: function () { - this._size = 0; }, - shrink: function () { - this._data.length = this._size; - }, + _prepareLightShadow: (function () { + var worldView = new Matrix4(); + return function (renderer, scene, camera) { + var shadowCasters; - clear: function () { - this._data = []; - this._size = 0; - } -}; + shadowCasters = this._shadowCasters || (this._shadowCasters = []); + var count = 0; + var list = scene.opaqueList; + for (var i = 0; i < list.length; i++) { + if (list[i].castShadow) { + shadowCasters[count++] = list[i]; + } + } + shadowCasters.length = count; -function Triangle() { - this.vertices = [vec4Create(), vec4Create(), vec4Create()]; - this.color = vec4Create(); + for (var i = 0; i < scene.lights.length; i++) { + var light = scene.lights[i]; + var volumeMesh = light.volumeMesh || light.__volumeMesh; + if (!light.castShadow) { + continue; + } - this.depth = 0; -} + switch (light.type) { + case 'POINT_LIGHT': + case 'SPOT_LIGHT': + // Frustum culling + Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); + if (renderer.isFrustumCulled( + volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array + )) { + continue; + } -Triangle.prototype.type = PRIMITIVE_TRIANGLE; + this._prepareSingleLightShadow( + renderer, scene, camera, light, shadowCasters, volumeMesh.material + ); + break; + case 'DIRECTIONAL_LIGHT': + this._prepareSingleLightShadow( + renderer, scene, camera, light, shadowCasters, null + ); + } + } + }; + })(), -function Point() { - // Here use an array to make it more convinient to proccessing in _setPrimitive method - this.vertices = [vec4Create()]; + _prepareSingleLightShadow: function (renderer, scene, camera, light, casters, material) { + switch (light.type) { + case 'POINT_LIGHT': + var shadowMaps = []; + this.shadowMapPass.renderPointLightShadow( + renderer, scene, light, casters, shadowMaps + ); + material.setUniform('lightShadowMap', shadowMaps[0]); + material.setUniform('lightShadowMapSize', light.shadowResolution); + break; + case 'SPOT_LIGHT': + var shadowMaps = []; + var lightMatrices = []; + this.shadowMapPass.renderSpotLightShadow( + renderer, scene, light, casters, lightMatrices, shadowMaps + ); + material.setUniform('lightShadowMap', shadowMaps[0]); + material.setUniform('lightMatrix', lightMatrices[0]); + material.setUniform('lightShadowMapSize', light.shadowResolution); + break; + case 'DIRECTIONAL_LIGHT': + var shadowMaps = []; + var lightMatrices = []; + var cascadeClips = []; + this.shadowMapPass.renderDirectionalLightShadow( + renderer, scene, camera, light, casters, cascadeClips, lightMatrices, shadowMaps + ); + var cascadeClipsNear = cascadeClips.slice(); + var cascadeClipsFar = cascadeClips.slice(); + cascadeClipsNear.pop(); + cascadeClipsFar.shift(); - this.color = vec4Create(); + // Iterate from far to near + cascadeClipsNear.reverse(); + cascadeClipsFar.reverse(); + lightMatrices.reverse(); - this.depth = 0; -} + light.__cascadeClipsNear = cascadeClipsNear; + light.__cascadeClipsFar = cascadeClipsFar; + light.__shadowMap = shadowMaps[0]; + light.__lightMatrices = lightMatrices; + break; + } + }, -Point.prototype.type = PRIMITIVE_POINT; + // Update light volume mesh + // Light volume mesh is rendered in light accumulate pass instead of full quad. + // It will reduce pixels significantly when local light is relatively small. + // And we can use custom volume mesh to shape the light. + // + // See "Deferred Shading Optimizations" in GDC2011 + _updateLightProxy: function (light) { + var volumeMesh; + if (light.volumeMesh) { + volumeMesh = light.volumeMesh; + } + else { + switch (light.type) { + // Only local light (point and spot) needs volume mesh. + // Directional and ambient light renders in full quad + case 'POINT_LIGHT': + case 'SPHERE_LIGHT': + var shader = light.type === 'SPHERE_LIGHT' + ? this._sphereLightShader : this._pointLightShader; + // Volume mesh created automatically + if (!light.__volumeMesh) { + light.__volumeMesh = new Mesh({ + material: this._createLightPassMat(shader), + geometry: this._lightSphereGeo, + // Disable culling + // if light volume mesh intersect camera near plane + // We need mesh inside can still be rendered + culling: false + }); + } + volumeMesh = light.__volumeMesh; + var r = light.range + (light.radius || 0); + volumeMesh.scale.set(r, r, r); + break; + case 'SPOT_LIGHT': + light.__volumeMesh = light.__volumeMesh || new Mesh({ + material: this._createLightPassMat(this._spotLightShader), + geometry: this._lightConeGeo, + culling: false + }); + volumeMesh = light.__volumeMesh; + var aspect = Math.tan(light.penumbraAngle * Math.PI / 180); + var range = light.range; + volumeMesh.scale.set(aspect * range, aspect * range, range / 2); + break; + case 'TUBE_LIGHT': + light.__volumeMesh = light.__volumeMesh || new Mesh({ + material: this._createLightPassMat(this._tubeLightShader), + geometry: this._lightCylinderGeo, + culling: false + }); + volumeMesh = light.__volumeMesh; + var range = light.range; + volumeMesh.scale.set(light.length / 2 + range, range, range); + break; + } + } + if (volumeMesh) { + volumeMesh.update(); + // Apply light transform + Matrix4.multiply(volumeMesh.worldTransform, light.worldTransform, volumeMesh.worldTransform); + var hasShadow = this.shadowMapPass && light.castShadow; + volumeMesh.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); + } + }, -function Line() { - this.vertices = [vec4Create(), vec4Create()]; - this.color = vec4Create(); + _renderVolumeMeshList: (function () { + var worldViewProjection = new Matrix4(); + var worldView = new Matrix4(); + var preZMaterial = new Material({ + shader: new Shader(Shader.source('clay.prez.vertex'), Shader.source('clay.prez.fragment')) + }); + return function (renderer, camera, volumeMeshList) { + var gl = renderer.gl; - this.depth = 0; + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); + gl.blendEquation(gl.FUNC_ADD); + gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE); + gl.depthFunc(gl.LEQUAL); - this.lineWidth = 1; -} + gl.clear(gl.DEPTH_BUFFER_BIT); -Line.prototype.type = PRIMITIVE_LINE; + var viewport = renderer.viewport; + var dpr = viewport.devicePixelRatio; + var viewportUniform = [ + viewport.x * dpr, viewport.y * dpr, + viewport.width * dpr, viewport.height * dpr + ]; -function depthSortFunc(x, y) { - // Sort from far to near, which in depth of projection space is from larger to smaller - return y.depth - x.depth; -} + var windowSizeUniform = [ + this._lightAccumTex.width, + this._lightAccumTex.height + ]; -function vec3ToColorStr(v3) { - return 'rgb(' + round(v3[0] * 255) + ',' + round(v3[1] * 255) + ',' + round(v3[2] * 255) + ')'; -} + for (var i = 0; i < volumeMeshList.length; i++) { + var volumeMesh = volumeMeshList[i]; -function vec4ToColorStr(v4) { - return 'rgba(' + round(v4[0] * 255) + ',' + round(v4[1] * 255) + ',' + round(v4[2] * 255) + ',' + v4[3] + ')'; -} + // Frustum culling + Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); + if (renderer.isFrustumCulled( + volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array + )) { + continue; + } -var CanvasRenderer = Base.extend({ + // Use prez to avoid one pixel rendered twice + gl.colorMask(false, false, false, false); + gl.depthMask(true); + // depthMask must be enabled before clear DEPTH_BUFFER + gl.clear(gl.DEPTH_BUFFER_BIT); - canvas: null, + Matrix4.multiply(worldViewProjection, camera.projectionMatrix, worldView); - _width: 100, + var preZProgram = renderer.getProgram(volumeMesh, preZMaterial); + volumeMesh.__program = preZProgram; + renderer.validateProgram(preZProgram); + preZProgram.bind(renderer); - _height: 100, + var semanticInfo = preZMaterial.shader.matrixSemantics.WORLDVIEWPROJECTION; + preZProgram.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); + volumeMesh.render(renderer, preZMaterial, preZProgram); - devicePixelRatio: window.devicePixelRatio || 1.0, + // Render light + gl.colorMask(true, true, true, true); + gl.depthMask(false); + var program = renderer.getProgram(volumeMesh, volumeMesh.material); + volumeMesh.__program = program; + renderer.validateProgram(program); + program.bind(renderer); - color: [0.0, 0.0, 0.0, 0.0], + var semanticInfo = volumeMesh.material.shader.matrixSemantics.WORLDVIEWPROJECTION; + // Set some common uniforms + program.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); + program.setUniformOfSemantic(gl, 'WINDOW_SIZE', windowSizeUniform); + program.setUniformOfSemantic(gl, 'VIEWPORT', viewportUniform); - clear: true, + volumeMesh.material.bind(renderer, program); + volumeMesh.render(renderer, volumeMesh.material, program); + } - ctx: null, + gl.depthFunc(gl.LESS); + }; + })(), - // Cached primitive list, including triangle, line, point - _primitives: [], + /** + * @param {clay.Renderer} renderer + */ + dispose: function (renderer) { + this._gBuffer.dispose(renderer); - // Triangle pool - _triangles: new PrimitivePool(Triangle), + this._lightAccumFrameBuffer.dispose(renderer); + this._lightAccumTex.dispose(renderer); - // Line pool - _lines: new PrimitivePool(Line), + this._lightConeGeo.dispose(renderer); + this._lightCylinderGeo.dispose(renderer); + this._lightSphereGeo.dispose(renderer); - // Point pool - _points: new PrimitivePool(Point) -}, function () { - if (! this.canvas) { - this.canvas = document.createElement('canvas'); - } - var canvas = this.canvas; + this._fullQuadPass.dispose(renderer); + this._outputPass.dispose(renderer); - try { - this.ctx = canvas.getContext('2d'); - var ctx = this.ctx; - if (!ctx) { - throw new Error(); - } - } - catch (e) { - throw 'Error creating WebGL Context ' + e; + this._directionalLightMat.dispose(renderer); + + this.shadowMapPass.dispose(renderer); } +}); - this.resize(); -}, { +// Spherical Harmonic Helpers +var vec3$16 = glmatrix.vec3; +var sh = {}; - resize: function (width, height) { - var dpr = this.devicePixelRatio; - var canvas = this.canvas; - if (width != null) { - canvas.style.width = width + 'px'; - canvas.style.height = height + 'px'; - canvas.width = width * dpr; - canvas.height = height * dpr; +var targets$3 = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; - this._width = width; - this._height = height; - } - else { - this._width = canvas.width / dpr; - this._height = canvas.height / dpr; - } - }, +function harmonics(normal, index){ + var x = normal[0]; + var y = normal[1]; + var z = normal[2]; - getWidth: function () { - return this._width; - }, + if (index === 0) { + return 1.0; + } + else if (index === 1) { + return x; + } + else if (index === 2) { + return y; + } + else if (index === 3) { + return z; + } + else if (index === 4) { + return x * z; + } + else if (index === 5) { + return y * z; + } + else if (index === 6) { + return x * y; + } + else if (index === 7) { + return 3.0 * z * z - 1.0; + } + else { + return x * x - y * y; + } +} - getHeight: function () { - return this._height; - }, +var normalTransform = { + px: [2, 1, 0, -1, -1, 1], + nx: [2, 1, 0, 1, -1, -1], + py: [0, 2, 1, 1, -1, -1], + ny: [0, 2, 1, 1, 1, 1], + pz: [0, 1, 2, -1, -1, -1], + nz: [0, 1, 2, 1, -1, 1] +}; - getViewportAspect: function () { - return this._width / this._height; - }, +// Project on cpu. +function projectEnvironmentMapCPU(renderer, cubePixels, width, height) { + var coeff = new vendor.Float32Array(9 * 3); + var normal = vec3$16.create(); + var texel = vec3$16.create(); + var fetchNormal = vec3$16.create(); + for (var m = 0; m < 9; m++) { + var result = vec3$16.create(); + for (var k = 0; k < targets$3.length; k++) { + var pixels = cubePixels[targets$3[k]]; - render: function (scene, camera) { + var sideResult = vec3$16.create(); + var divider = 0; + var i = 0; + var transform = normalTransform[targets$3[k]]; + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { - if (this.clear) { - var color = this.color; - var ctx = this.ctx; - var dpr = this.devicePixelRatio; - var w = this._width * dpr; - var h = this._height * dpr; - if (color && color[3] === 0) { - ctx.clearRect(0, 0, w, h); - } - else { - // Has transparency - if (color[3] < 1) { - ctx.clearRect(0, 0, w, h); + normal[0] = x / (width - 1.0) * 2.0 - 1.0; + // TODO Flip y? + normal[1] = y / (height - 1.0) * 2.0 - 1.0; + normal[2] = -1.0; + vec3$16.normalize(normal, normal); + + fetchNormal[0] = normal[transform[0]] * transform[3]; + fetchNormal[1] = normal[transform[1]] * transform[4]; + fetchNormal[2] = normal[transform[2]] * transform[5]; + + texel[0] = pixels[i++] / 255; + texel[1] = pixels[i++] / 255; + texel[2] = pixels[i++] / 255; + // RGBM Decode + var scale = pixels[i++] / 255 * 51.5; + texel[0] *= scale; + texel[1] *= scale; + texel[2] *= scale; + + vec3$16.scaleAndAdd(sideResult, sideResult, texel, harmonics(fetchNormal, m) * -normal[2]); + // -normal.z equals cos(theta) of Lambertian + divider += -normal[2]; } - ctx.fillStyle = color.length === 4 ? vec4ToColorStr(color) : vec3ToColorStr(color); - ctx.fillRect(0, 0, w, h); } + vec3$16.scaleAndAdd(result, result, sideResult, 1 / divider); } - scene.update(); - camera.update(); + coeff[m * 3] = result[0] / 6.0; + coeff[m * 3 + 1] = result[1] / 6.0; + coeff[m * 3 + 2] = result[2] / 6.0; + } + return coeff; +} - var opaqueList = scene.opaqueList; - var transparentList = scene.transparentList; - var list = opaqueList.concat(transparentList); +/** + * @param {clay.Renderer} renderer + * @param {clay.Texture} envMap + * @param {Object} [textureOpts] + * @param {Object} [textureOpts.lod] + * @param {boolean} [textureOpts.decodeRGBM] + */ +sh.projectEnvironmentMap = function (renderer, envMap, opts) { - this.renderPass(list, camera); - }, + // TODO sRGB - renderPass: function (list, camera) { - var viewProj = mat4$8.create(); - mat4$8.multiply(viewProj, camera.projectionMatrix.array, camera.viewMatrix.array); - var worldViewProjMat = mat4$8.create(); - var posViewSpace = vec3$16.create(); + opts = opts || {}; + opts.lod = opts.lod || 0; - var primitives = this._primitives; - var trianglesPool = this._triangles; - var linesPool = this._lines; - var pointsPool = this._points; + var skybox; + var dummyScene = new Scene(); + var size = 64; + if (envMap instanceof Texture2D) { + skybox = new Skydome({ + scene: dummyScene, + environmentMap: envMap + }); + } + else { + size = (envMap.image && envMap.image.px) ? envMap.image.px.width : envMap.width; + skybox = new Skybox({ + scene: dummyScene, + environmentMap: envMap + }); + } + // Convert to rgbm + var width = Math.ceil(size / Math.pow(2, opts.lod)); + var height = Math.ceil(size / Math.pow(2, opts.lod)); + var rgbmTexture = new Texture2D({ + width: width, + height: height + }); + var framebuffer = new FrameBuffer(); + skybox.material.define('fragment', 'RGBM_ENCODE'); + if (opts.decodeRGBM) { + skybox.material.define('fragment', 'RGBM_DECODE'); + } + skybox.material.set('lod', opts.lod); + var envMapPass = new EnvironmentMapPass({ + texture: rgbmTexture + }); + var cubePixels = {}; + for (var i = 0; i < targets$3.length; i++) { + cubePixels[targets$3[i]] = new Uint8Array(width * height * 4); + var camera = envMapPass.getCamera(targets$3[i]); + camera.fov = 90; + framebuffer.attach(rgbmTexture); + framebuffer.bind(renderer); + renderer.render(dummyScene, camera); + renderer.gl.readPixels( + 0, 0, width, height, + Texture.RGBA, Texture.UNSIGNED_BYTE, cubePixels[targets$3[i]] + ); + framebuffer.unbind(renderer); + } - trianglesPool.reset(); - linesPool.reset(); - pointsPool.reset(); + skybox.dispose(renderer); + framebuffer.dispose(renderer); + rgbmTexture.dispose(renderer); - var nPrimitive = 0; + return projectEnvironmentMapCPU(renderer, cubePixels, width, height); +}; - var indices = [0, 0, 0]; - var matColor = []; - for (var i = 0; i < list.length; i++) { - var renderable = list[i]; +/** + * Helpers for creating a common 3d application. + * @namespace clay.application + */ - mat4$8.multiply(worldViewProjMat, viewProj, renderable.worldTransform.array); + // TODO createCompositor + // TODO Dispose test. geoCache test. + // TODO Tonemapping exposure + // TODO fitModel. + // TODO Particle ? +var parseColor = colorUtil.parseToFloat; - var geometry = renderable.geometry; - var material = renderable.material; - var attributes = geometry.attributes; +var EVE_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', + 'touchstart', 'touchend', 'touchmove', + 'mousewheel', 'DOMMouseScroll' +]; - // alpha is default 1 - if (material.color.length == 3) { - vec3$16.copy(matColor, material.color); - matColor[3] = 1; - } - else { - vec4$2.copy(matColor, material.color); - } +/** + * @typedef {string|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} ImageLike + */ +/** + * @typedef {string|Array.} Color + */ +/** + * @typedef {HTMLDomElement|string} DomQuery + */ - var nVertex = geometry.vertexCount; - // Only support TRIANGLES, LINES, POINTS draw modes - switch (renderable.mode) { - case glenum.TRIANGLES: - if (geometry.isUseIndices()) { - var nFace = geometry.triangleCount; - for (var j = 0; j < nFace; j++) { - geometry.getFace(j, indices); +/** + * @constructor + * @alias clay.application.App3D + * @param {DomQuery} dom Container dom element or a selector string that can be used in `querySelector` + * @param {Object} appNS + * @param {Function} appNS.init Initialization callback that will be called when initing app. + * You can return a promise in init to start the loop asynchronously when the promise is resolved. + * @param {Function} appNS.loop Loop callback that will be called each frame. + * @param {Function} appNS.beforeRender + * @param {Function} appNS.afterRender + * @param {number} [appNS.width] Container width. + * @param {number} [appNS.height] Container height. + * @param {number} [appNS.devicePixelRatio] + * @param {Object} [appNS.graphic] Graphic configuration including shadow, postEffect + * @param {boolean} [appNS.graphic.shadow=false] If enable shadow + * @param {boolean} [appNS.graphic.linear=false] If use linear space + * @param {boolean} [appNS.graphic.tonemapping=false] If enable ACES tone mapping. + * @param {boolean} [appNS.event=false] If enable mouse/touch event. It will slow down the system if geometries are complex. + */ +function App3D(dom, appNS) { - var triangle = trianglesPool.pick(); - triangle.material = material; + appNS = appNS || {}; + appNS.graphic = appNS.graphic || {}; - var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); + if (typeof dom === 'string') { + dom = document.querySelector(dom); + } - if (! clipped) { - primitives[nPrimitive++] = triangle; - } - } - } - else { - for (var j = 0; j < nVertex;) { - indices[0] = j++; - indices[1] = j++; - indices[2] = j++; + if (!dom) { throw new Error('Invalid dom'); } - var triangle = trianglesPool.pick(); - triangle.material = material; + var isDomCanvas = dom.nodeName.toUpperCase() === 'CANVAS'; + var rendererOpts = {}; + isDomCanvas && (rendererOpts.canvas = dom); + appNS.devicePixelRatio && (rendererOpts.devicePixelRatio = appNS.devicePixelRatio); - var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); + var gRenderer = new Renderer(rendererOpts); + var gWidth = appNS.width || dom.clientWidth; + var gHeight = appNS.height || dom.clientHeight; - if (! clipped) { - primitives[nPrimitive++] = triangle; - } - } - } - break; - case glenum.LINES: - // LINES mode can't use face - for (var j = 0; j < nVertex;) { - indices[0] = j++; - indices[1] = j++; - var line = linesPool.pick(); - line.material = material; - line.lineWidth = renderable.lineWidth; + var gScene = new Scene(); + var gTimeline = new Timeline(); + var gShadowPass = appNS.graphic.shadow && new ShadowMapPass(); + var gRayPicking = appNS.event && new RayPicking({ + scene: gScene, + renderer: gRenderer + }); - var clipped = this._setPrimitive(line, indices, 2, attributes, worldViewProjMat, matColor); + !isDomCanvas && dom.appendChild(gRenderer.canvas); - if (! clipped) { - primitives[nPrimitive++] = line; - } - } - break; - case glenum.POINTS: - for (var j = 0; j < nVertex; j++) { - indices[0] = j; - var point = pointsPool.pick(); - point.material = material; + gRenderer.resize(gWidth, gHeight); - var clipped = this._setPrimitive(point, indices, 1, attributes, worldViewProjMat, matColor); + var gFrameTime = 0; + var gElapsedTime = 0; - if (! clipped) { - primitives[nPrimitive++] = point; - } - } - // POINTS mode can't use face - break; - } - } + gTimeline.start(); - trianglesPool.shrink(); - linesPool.shrink(); - pointsPool.shrink(); + Object.defineProperties(this, { + /** + * Container dom element + * @name clay.application.App3D#container + * @type {HTMLDomElement} + */ + container: { get: function () { return dom; } }, + /** + * @name clay.application.App3D#renderer + * @type {clay.Renderer} + */ + renderer: { get: function () { return gRenderer; }}, + /** + * @name clay.application.App3D#scene + * @type {clay.Renderer} + */ + scene: { get: function () { return gScene; }}, + /** + * @name clay.application.App3D#timeline + * @type {clay.Renderer} + */ + timeline: { get: function () { return gTimeline; }}, + /** + * Time elapsed since last frame. Can be used in loop to calculate the movement. + * @name clay.application.App3D#frameTime + * @type {number} + */ + frameTime: { get: function () { return gFrameTime; }}, + /** + * Time elapsed since application created. + * @name clay.application.App3D#elapsedTime + * @type {number} + */ + elapsedTime: { get: function () { return gElapsedTime; }} + }); - primitives.length = nPrimitive; + /** + * Resize the application. Will use the container clientWidth/clientHeight if width/height in parameters are not given. + * @function + * @memberOf {clay.application.App3D} + * @param {number} [width] + * @param {number} [height] + */ + this.resize = function (width, height) { + gWidth = width || appNS.width || dom.clientWidth; + gHeight = height || dom.height || dom.clientHeight; + gRenderer.resize(gWidth, gHeight); + }; - primitives.sort(depthSortFunc); - this._drawPrimitives(primitives); - }, + /** + * Dispose the application + * @function + */ + this.dispose = function () { + this._disposed = true; - _setPrimitive: (function () { - var vertexColor = vec4Create(); - return function (primitive, indices, size, attributes, worldViewProjMat, matColor) { - var colorAttrib = attributes.color; - var useVertexColor = colorAttrib.value && colorAttrib.value.length > 0; - var priColor = primitive.color; + if (appNS.dispose) { + appNS.dispose(this); + } + gTimeline.stop(); + gRenderer.disposeScene(gScene); + gShadowPass && gShadowPass.dispose(gRenderer); - primitive.depth = 0; - if (useVertexColor) { - vec4$2.set(priColor, 0, 0, 0, 0); - } + dom.innerHTML = ''; + EVE_NAMES.forEach(function (eveType) { + this[makeHandlerName(eveType)] && dom.removeEventListener(makeHandlerName(eveType)); + }); + }; - var clipped = true; + gRayPicking && this._initMouseEvents(gRayPicking); - var percent = 1 / size; - for (var i = 0; i < size; i++) { - var coord = primitive.vertices[i]; - attributes.position.get(indices[i], coord); - coord[3] = 1; - vec4$2.transformMat4(coord, coord, worldViewProjMat); - if (useVertexColor) { - colorAttrib.get(indices[i], vertexColor); - // Average vertex color - // Each primitive only call fill or stroke once - // So color must be the same - vec4$2.scaleAndAdd(priColor, priColor, vertexColor, percent); - } + this._geoCache = new LRU$1(20); + this._texCache = new LRU$1(20); - // Clipping - var x = coord[0]; - var y = coord[1]; - var z = coord[2]; - var w = coord[3]; + // Do init the application. + var initPromise = Promise.resolve(appNS.init && appNS.init(this)); + // Use the inited camera. + gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); - // TODO Point clipping - if (x > -w && x < w && y > -w && y < w && z > -w && z < w) { - clipped = false; - } + var gTexturesList = {}; + var gGeometriesList = {}; - var invW = 1 / w; - coord[0] = x * invW; - coord[1] = y * invW; - coord[2] = z * invW; - // Use primitive average depth; - primitive.depth += coord[2]; - } + if (!appNS.loop) { + console.warn('Miss loop method.'); + } - if (! clipped) { - primitive.depth /= size; + var self = this; + initPromise.then(function () { + appNS.loop && gTimeline.on('frame', function (frameTime) { + gFrameTime = frameTime; + gElapsedTime += frameTime; + appNS.loop(self); - if (useVertexColor) { - vec4$2.mul(priColor, priColor, matColor); - } - else { - vec4$2.copy(priColor, matColor); - } - } + gScene.update(); - return clipped; - } - })(), + self._updateGraphicOptions(appNS.graphic, gScene.opaqueList, false); + self._updateGraphicOptions(appNS.graphic, gScene.transparentList, false); + var skyboxList = []; + gScene.skybox && skyboxList.push(gScene.skybox); + gScene.skydome && skyboxList.push(gScene.skydome); + self._updateGraphicOptions(appNS.graphic, skyboxList, true); - _drawPrimitives: function (primitives) { - var ctx = this.ctx; - ctx.save(); + gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); + // Render shadow pass + gShadowPass && gShadowPass.render(gRenderer, gScene, null, true); - var prevMaterial; + appNS.beforeRender && appNS.beforeRender(self); + self._doRender(gRenderer, gScene, true); + appNS.afterRender && appNS.afterRender(self); - var dpr = this.devicePixelRatio; - var width = this._width * dpr; - var height = this._height * dpr; - var halfWidth = width / 2; - var halfHeight = height / 2; + // Mark all resources unused; + markUnused(gTexturesList); + markUnused(gGeometriesList); - var prevLineWidth; - var prevStrokeColor; + // Collect resources used in this frame. + var newTexturesList = []; + var newGeometriesList = []; + collectResources(gScene, newTexturesList, newGeometriesList); - for (var i = 0; i < primitives.length; i++) { - var primitive = primitives[i]; - var vertices = primitive.vertices; + // Dispose those unsed resources. + checkAndDispose(gRenderer, gTexturesList); + checkAndDispose(gRenderer, gGeometriesList); - var primitiveType = primitive.type; - var material = primitive.material; - if (material !== prevMaterial) { - // Set material - ctx.globalAlpha = material.opacity; - prevMaterial = material; - } + gTexturesList = newTexturesList; + gGeometriesList = newGeometriesList; + }); + }); +} - var colorStr = vec4ToColorStr(primitive.color); - switch (primitiveType) { - case PRIMITIVE_TRIANGLE: - var v0 = vertices[0]; - var v1 = vertices[1]; - var v2 = vertices[2]; - ctx.fillStyle = colorStr; - ctx.beginPath(); - ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); - ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); - ctx.lineTo((v2[0] + 1) * halfWidth, (-v2[1] + 1) * halfHeight); - ctx.closePath(); - ctx.fill(); - break; - case PRIMITIVE_LINE: - var v0 = vertices[0]; - var v1 = vertices[1]; - var lineWidth = primitive.lineWidth; - if (prevStrokeColor !== colorStr) { - prevStrokeColor = ctx.strokeStyle = colorStr; - } - if (lineWidth !== prevLineWidth) { - ctx.lineWidth = prevLineWidth = lineWidth; - } - ctx.beginPath(); - ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); - ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); - ctx.stroke(); - break; - case PRIMITIVE_POINT: - var pointSize = material.pointSize; - var pointShape = material.pointShape; - var halfSize = pointSize / 2; - if (pointSize > 0) { - var v0 = vertices[0]; - var cx = (v0[0] + 1) * halfWidth; - var cy = (-v0[1] + 1) * halfHeight; +function isImageLikeElement(val) { + return val instanceof Image + || val instanceof HTMLCanvasElement + || val instanceof HTMLVideoElement; +} - ctx.fillStyle = colorStr; - if (pointShape === 'rectangle') { - ctx.fillRect(cx - halfSize, cy - halfSize, pointSize, pointSize); - } - else if (pointShape === 'circle') { - ctx.beginPath(); - ctx.arc(cx, cy, halfSize, 0, Math.PI * 2); - ctx.fill(); - } - } - break; - } - } +function getKeyFromImageLike(val) { + typeof val === 'string' + ? val : (val.__key__ || (val.__key__ = util$1.genGUID())); +} - ctx.restore(); - }, +function makeHandlerName(eveType) { + return '_' + eveType + 'Handler'; +} - dispose: function () { - this._triangles.clear(); - this._lines.clear(); - this._points.clear(); - this._primitives = []; +function packageEvent(eventType, pickResult, offsetX, offsetY, wheelDelta) { + var event = util$1.clone(pickResult); + event.type = eventType; + event.offsetX = offsetX; + event.offsetY = offsetY; + if (wheelDelta !== null) { + event.wheelDelta = wheelDelta; + } + return event; +} - this.ctx = null; - this.canvas = null; +function bubblingEvent(target, event) { + while (target && !event.cancelBubble) { + target.trigger(event.type, event); + target = target.getParent(); } -}); +} -// PENDING -// Use topological sort ? +App3D.prototype._initMouseEvents = function (rayPicking) { + var dom = this.container; -/** - * Node of graph based post processing. - * - * @constructor clay.compositor.Node - * @extends clay.core.Base - * - */ -var Node$1 = Base.extend(function () { - return /** @lends clay.compositor.Node# */ { - /** - * @type {string} - */ - name: '', + var oldTarget = null; + EVE_NAMES.forEach(function (_eveType) { + dom.addEventListener(_eveType, this[makeHandlerName(_eveType)] = function (e) { + if (!rayPicking.camera) { // Not have camera yet. + return; + } + e.preventDefault(); - /** - * Input links, will be updated by the graph - * @example: - * inputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - inputLinks: {}, + var box = dom.getBoundingClientRect(); + var offsetX, offsetY; + var eveType = _eveType; + + if (eveType.indexOf('touch') >= 0) { + var touch = eveType != 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + if (eveType === 'touchstart') { + eveType = 'mousedown'; + } + else if (eveType === 'touchend') { + eveType = 'mouseup'; + } + else if (eveType === 'touchmove') { + eveType = 'mousemove'; + } + offsetX = touch.clientX - box.left; + offsetY = touch.clientY - box.top; + } + else { + offsetX = e.clientX - box.left; + offsetY = e.clientY - box.top; + } - /** - * Output links, will be updated by the graph - * @example: - * outputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - outputLinks: {}, + var pickResult = rayPicking.pick(offsetX, offsetY); - // Save the output texture of previous frame - // Will be used when there exist a circular reference - _prevOutputTextures: {}, - _outputTextures: {}, + var delta; + if (eveType === 'DOMMouseScroll' || eveType === 'mousewheel') { + delta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; + } - // Example: { name: 2 } - _outputReferences: {}, + if (pickResult) { + // Just ignore silent element. + if (pickResult.target.silent) { + return; + } - _rendering: false, - // If rendered in this frame - _rendered: false, + if (eveType === 'mousemove') { + // PENDING touchdown should trigger mouseover event ? + var targetChanged = pickResult.target !== oldTarget; + if (targetChanged) { + oldTarget && bubblingEvent(oldTarget, packageEvent('mouseout', { + target: oldTarget + }, offsetX, offsetY)); + } + bubblingEvent(pickResult.target, packageEvent('mousemove', pickResult, offsetX, offsetY)); + if (targetChanged) { + bubblingEvent(pickResult.target, packageEvent('mouseover', pickResult, offsetX, offsetY)); + } + } + else { + bubblingEvent(pickResult.target, packageEvent(eveType, pickResult, offsetX, offsetY, delta)); + } + oldTarget = pickResult.target; + } + else if (oldTarget) { + bubblingEvent(oldTarget, packageEvent('mouseout', { + target: oldTarget + }, offsetX, offsetY)); + oldTarget = null; + } + }); + }, this); +}; - _compositor: null - }; -}, -/** @lends clay.compositor.Node.prototype */ -{ +App3D.prototype._updateGraphicOptions = function (graphicOpts, list, isSkybox) { + var enableTonemapping = !!graphicOpts.tonemapping; + var isLinearSpace = !!graphicOpts.linear; - // TODO Remove parameter function callback - updateParameter: function (outputName, renderer) { - var outputInfo = this.outputs[outputName]; - var parameters = outputInfo.parameters; - var parametersCopy = outputInfo._parametersCopy; - if (!parametersCopy) { - parametersCopy = outputInfo._parametersCopy = {}; + var prevMaterial; + + for (var i = 0; i < list.length; i++) { + var mat = list[i].material; + if (mat === prevMaterial) { + continue; } - if (parameters) { - for (var key in parameters) { - if (key !== 'width' && key !== 'height') { - parametersCopy[key] = parameters[key]; - } + + enableTonemapping ? mat.define('fragment', 'TONEMAPPING') : mat.undefine('fragment', 'TONEMAPPING'); + if (isLinearSpace) { + var decodeSRGB = true; + if (isSkybox && mat.get('environmentMap') && !mat.get('environmentMap').sRGB) { + decodeSRGB = false; } - } - var width, height; - if (parameters.width instanceof Function) { - width = parameters.width.call(this, renderer); - } - else { - width = parameters.width; - } - if (parameters.height instanceof Function) { - height = parameters.height.call(this, renderer); + decodeSRGB && mat.define('fragment', 'SRGB_DECODE'); + mat.define('fragment', 'SRGB_ENCODE'); } else { - height = parameters.height; - } - if ( - parametersCopy.width !== width - || parametersCopy.height !== height - ) { - if (this._outputTextures[outputName]) { - this._outputTextures[outputName].dispose(renderer.gl); - } + mat.undefine('fragment', 'SRGB_DECODE'); + mat.undefine('fragment', 'SRGB_ENCODE'); } - parametersCopy.width = width; - parametersCopy.height = height; - return parametersCopy; - }, + prevMaterial = mat; + } +}; - /** - * Set parameter - * @param {string} name - * @param {} value - */ - setParameter: function (name, value) {}, - /** - * Get parameter value - * @param {string} name - * @return {} - */ - getParameter: function (name) {}, - /** - * Set parameters - * @param {Object} obj - */ - setParameters: function (obj) { - for (var name in obj) { - this.setParameter(name, obj[name]); - } - }, +App3D.prototype._doRender = function (renderer, scene) { + var camera = scene.getMainCamera(); + camera.aspect = renderer.getViewportAspect(); + renderer.render(scene); +}; - render: function () {}, - getOutput: function (renderer /*optional*/, name) { - if (name == null) { - // Return the output texture without rendering - name = renderer; - return this._outputTextures[name]; - } - var outputInfo = this.outputs[name]; - if (!outputInfo) { - return ; - } +function markUnused(resourceList) { + for (var i = 0; i < resourceList.length; i++) { + resourceList[i].__used__ = 0; + } +} - // Already been rendered in this frame - if (this._rendered) { - // Force return texture in last frame - if (outputInfo.outputLastFrame) { - return this._prevOutputTextures[name]; - } - else { - return this._outputTextures[name]; - } - } - else if ( - // TODO - this._rendering // Solve Circular Reference - ) { - if (!this._prevOutputTextures[name]) { - // Create a blank texture at first pass - this._prevOutputTextures[name] = this._compositor.allocateTexture(outputInfo.parameters || {}); - } - return this._prevOutputTextures[name]; +function checkAndDispose(renderer, resourceList) { + for (var i = 0; i < resourceList.length; i++) { + if (!resourceList[i].__used__) { + resourceList[i].dispose(renderer); } + } +} - this.render(renderer); - - return this._outputTextures[name]; - }, +function updateUsed(resource, list) { + resource.__used__ = resource.__used__ || 0; + resource.__used__++; + if (resource.__used__ === 1) { + // Don't push to the list twice. + list.push(resource); + } +} +function collectResources(scene, textureResourceList, geometryResourceList) { + function trackQueue(queue) { + var prevMaterial; + var prevGeometry; + for (var i = 0; i < queue.length; i++) { + var renderable = queue[i]; + var geometry = renderable.geometry; + var material = renderable.material; - removeReference: function (outputName) { - this._outputReferences[outputName]--; - if (this._outputReferences[outputName] === 0) { - var outputInfo = this.outputs[outputName]; - if (outputInfo.keepLastFrame) { - if (this._prevOutputTextures[outputName]) { - this._compositor.releaseTexture(this._prevOutputTextures[outputName]); + // TODO optimize!! + if (material !== prevMaterial) { + var textureUniforms = material.getTextureUniforms(); + for (var u = 0; u < textureUniforms.length; u++) { + var uniformName = textureUniforms[u]; + var val = material.uniforms[uniformName].value; + if (!val) { + continue; + } + if (val instanceof Texture) { + updateUsed(val, textureResourceList); + } + else if (val instanceof Array) { + for (var k = 0; k < val.length; k++) { + if (val[k] instanceof Texture) { + updateUsed(val[k], textureResourceList); + } + } + } } - this._prevOutputTextures[outputName] = this._outputTextures[outputName]; } - else { - // Output of this node have alreay been used by all other nodes - // Put the texture back to the pool. - this._compositor.releaseTexture(this._outputTextures[outputName]); + if (geometry !== prevGeometry) { + updateUsed(geometry, geometryResourceList); } - } - }, - - link: function (inputPinName, fromNode, fromPinName) { - // The relationship from output pin to input pin is one-on-multiple - this.inputLinks[inputPinName] = { - node: fromNode, - pin: fromPinName - }; - if (!fromNode.outputLinks[fromPinName]) { - fromNode.outputLinks[fromPinName] = []; + prevMaterial = material; + prevGeometry = geometry; } - fromNode.outputLinks[fromPinName].push({ - node: this, - pin: inputPinName - }); - - // Enabled the pin texture in shader - this.pass.material.enableTexture(inputPinName); - }, + } - clear: function () { - this.inputLinks = {}; - this.outputLinks = {}; - }, + trackQueue(scene.opaqueList); + trackQueue(scene.transparentList); - updateReference: function (outputName) { - if (!this._rendering) { - this._rendering = true; - for (var inputName in this.inputLinks) { - var link = this.inputLinks[inputName]; - link.node.updateReference(link.pin); - } - this._rendering = false; + for (var k = 0; k < scene.lights.length; k++) { + // Track AmbientCubemap + if (scene.lights[k].cubemap) { + updateUsed(scene.lights[k].cubemap, textureResourceList); } - if (outputName) { - this._outputReferences[outputName] ++; + } +} +/** + * Load a texture from image or string. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} + * @param {boolean} [opts.convertToPOT=false] Force convert None Power of Two texture to Power of two so it can be tiled. + * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} + * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} + * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} + * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} + * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} + * @param {number} [opts.exposure] Only be used when source is a HDR image. + * @param {boolean} [useCache] If use cache. + * @return {Promise} + * @example + * app.loadTexture('diffuseMap.jpg') + * .then(function (texture) { + * material.set('diffuseMap', texture); + * }); + */ +App3D.prototype.loadTexture = function (urlOrImg, opts, useCache) { + var self = this; + var key = getKeyFromImageLike(urlOrImg); + if (useCache) { + if (this._texCache.get(key)) { + return this._texCache.get(key); } - }, - - beforeFrame: function () { - this._rendered = false; + } + // TODO Promise ? + var promise = new Promise(function (resolve, reject) { + var texture = self.loadTextureSync(urlOrImg, opts); + if (!texture.isRenderable()) { + texture.success(function () { + if (self._disposed) { + return; + } + resolve(texture); + }); + texture.error(function () { + if (self._disposed) { + return; + } + reject(); + }); + } + else { + resolve(texture); + } + }); + if (useCache) { + this._texCache.put(key, promise); + } + return promise; +}; - for (var name in this.outputLinks) { - this._outputReferences[name] = 0; +function nearestPowerOfTwo(val) { + return Math.pow(2, Math.round(Math.log(val) / Math.LN2)); +} +function convertTextureToPowerOfTwo(texture) { + if ((texture.wrapS === Texture.REPEAT || texture.wrapT === Texture.REPEAT) + && texture.image + ) { + // var canvas = document.createElement('canvas'); + var width = nearestPowerOfTwo(texture.width); + var height = nearestPowerOfTwo(texture.height); + if (width !== texture.width || height !== texture.height) { + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + var ctx = canvas.getContext('2d'); + ctx.drawImage(texture.image, 0, 0, width, height); + canvas.srcImage = texture.image; + texture.image = canvas; + texture.dirty(); } - }, + } +} - afterFrame: function () { - // Put back all the textures to pool - for (var name in this.outputLinks) { - if (this._outputReferences[name] > 0) { - var outputInfo = this.outputs[name]; - if (outputInfo.keepLastFrame) { - if (this._prevOutputTextures[name]) { - this._compositor.releaseTexture(this._prevOutputTextures[name]); - } - this._prevOutputTextures[name] = this._outputTextures[name]; - } - else { - this._compositor.releaseTexture(this._outputTextures[name]); - } +/** + * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} + * @param {boolean} [opts.convertToPOT=false] Force convert None Power of Two texture to Power of two so it can be tiled. + * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} + * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} + * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} + * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} + * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} + * @param {number} [opts.exposure] Only be used when source is a HDR image. + * @return {clay.Texture2D} + * @example + * var texture = app.loadTexture('diffuseMap.jpg', { + * anisotropic: 8, + * flipY: false + * }); + * material.set('diffuseMap', texture); + */ +App3D.prototype.loadTextureSync = function (urlOrImg, opts) { + var texture = new Texture2D(opts); + if (typeof urlOrImg === 'string') { + if (urlOrImg.match(/.hdr$|^data:application\/octet-stream/)) { + texture = textureUtil.loadTexture(urlOrImg, { + exposure: opts && opts.exposure, + fileType: 'hdr' + }, function () { + texture.dirty(); + texture.trigger('success'); + }); + for (var key in opts) { + texture[key] = opts[key]; + } + } + else { + texture.load(urlOrImg); + if (opts && opts.convertToPOT) { + texture.success(function () { + convertTextureToPowerOfTwo(texture); + }); } } } -}); + else if (isImageLikeElement(urlOrImg)) { + texture.image = urlOrImg; + texture.dynamic = urlOrImg instanceof HTMLVideoElement; + } + return texture; +}; /** - * @constructor clay.compositor.Graph - * @extends clay.core.Base - */ -var Graph = Base.extend(function () { - return /** @lends clay.compositor.Graph# */ { - /** - * @type {Array.} - */ - nodes: [] - }; -}, -/** @lends clay.compositor.Graph.prototype */ -{ - - /** - * Mark to update - */ - dirty: function () { - this._dirty = true; - }, - /** - * @param {clay.compositor.Node} node - */ - addNode: function (node) { - - if (this.nodes.indexOf(node) >= 0) { - return; + * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=false] If flipY. See {@link clay.Texture.flipY} + * @return {Promise} + * @example + * app.loadTextureCube({ + * px: 'skybox/px.jpg', py: 'skybox/py.jpg', pz: 'skybox/pz.jpg', + * nx: 'skybox/nx.jpg', ny: 'skybox/ny.jpg', nz: 'skybox/nz.jpg' + * }).then(function (texture) { + * skybox.setEnvironmentMap(texture); + * }) + */ +App3D.prototype.loadTextureCube = function (imgList, opts) { + var textureCube = this.loadTextureCubeSync(imgList, opts); + return new Promise(function (resolve, reject) { + if (textureCube.isRenderable()) { + resolve(textureCube); } + else { + textureCube.success(function () { + resolve(textureCube); + }).error(function () { + reject(); + }); + } + }); +}; - this.nodes.push(node); +/** + * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=false] If flipY. See {@link clay.Texture.flipY} + * @return {clay.TextureCube} + * @example + * var texture = app.loadTextureCubeSync({ + * px: 'skybox/px.jpg', py: 'skybox/py.jpg', pz: 'skybox/pz.jpg', + * nx: 'skybox/nx.jpg', ny: 'skybox/ny.jpg', nz: 'skybox/nz.jpg' + * }); + * skybox.setEnvironmentMap(texture); + */ +App3D.prototype.loadTextureCubeSync = function (imgList, opts) { + opts = opts || {}; + opts.flipY = opts.flipY || false; + var textureCube = new TextureCube(opts); + if (!imgList || !imgList.px || !imgList.nx || !imgList.py || !imgList.ny || !imgList.pz || !imgList.nz) { + throw new Error('Invalid cubemap format. Should be an object including px,nx,py,ny,pz,nz'); + } + if (typeof imgList.px === 'string') { + textureCube.load(imgList); + } + else { + textureCube.image = util$1.clone(imgList); + } + return textureCube; +}; - this._dirty = true; - }, - /** - * @param {clay.compositor.Node|string} node - */ - removeNode: function (node) { - if (typeof node === 'string') { - node = this.getNodeByName(node); - } - var idx = this.nodes.indexOf(node); - if (idx >= 0) { - this.nodes.splice(idx, 1); - this._dirty = true; - } - }, - /** - * @param {string} name - * @return {clay.compositor.Node} - */ - getNodeByName: function (name) { - for (var i = 0; i < this.nodes.length; i++) { - if (this.nodes[i].name === name) { - return this.nodes[i]; +/** + * Create a material. + * @param {Object} materialConfig. materialConfig contains `shader`, `transparent` and uniforms that used in corresponding uniforms. + * Uniforms can be `color`, `alpha` `diffuseMap` etc. + * @param {string|clay.Shader} [shader='clay.standardMR'] Default to be standard shader with metalness and roughness workflow. + * @param {boolean} [transparent=false] If material is transparent. + * @param {boolean} [convertTextureToPOT=false] Force convert None Power of Two texture to Power of two so it can be tiled. + * @return {clay.Material} + */ +App3D.prototype.createMaterial = function (matConfig) { + matConfig = matConfig || {}; + matConfig.shader = matConfig.shader || 'clay.standardMR'; + var shader = matConfig.shader instanceof Shader ? matConfig.shader : library.get(matConfig.shader); + var material = new Material({ + shader: shader + }); + function makeTextureSetter(key) { + return function (texture) { + material.setUniform(key, texture); + }; + } + for (var key in matConfig) { + if (material.uniforms[key]) { + var val = matConfig[key]; + if ((material.uniforms[key].type === 't' || isImageLikeElement(val)) + && !(val instanceof Texture) + ) { + // Try to load a texture. + this.loadTexture(val, { + convertToPOT: matConfig.convertTextureToPOT + }).then(makeTextureSetter(key)); + } + else { + material.setUniform(key, val); } } - }, - /** - * Update links of graph - */ - update: function () { - for (var i = 0; i < this.nodes.length; i++) { - this.nodes[i].clear(); - } - // Traverse all the nodes and build the graph - for (var i = 0; i < this.nodes.length; i++) { - var node = this.nodes[i]; + } - if (!node.inputs) { - continue; - } - for (var inputName in node.inputs) { - if (!node.inputs[inputName]) { - continue; - } - if (node.pass && !node.pass.material.isUniformEnabled(inputName)) { - console.warn('Pin ' + node.name + '.' + inputName + ' not used.'); - continue; - } - var fromPinInfo = node.inputs[inputName]; + if (matConfig.transparent) { + matConfig.depthMask = false; + matConfig.transparent = true; + } + return material; +}; - var fromPin = this.findPin(fromPinInfo); - if (fromPin) { - node.link(inputName, fromPin.node, fromPin.pin); - } - else { - if (typeof fromPinInfo === 'string') { - console.warn('Node ' + fromPinInfo + ' not exist'); - } - else { - console.warn('Pin of ' + fromPinInfo.node + '.' + fromPinInfo.pin + ' not exist'); - } - } - } - } - }, +/** + * Create a cube mesh and add it to the scene or the given parent node. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Array.|number} [subdivision=1] Subdivision of cube. + * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. + * @return {clay.Mesh} + * @example + * // Create a white cube. + * app.createCube() + */ +App3D.prototype.createCube = function (material, parentNode, subdiv) { + if (subdiv == null) { + subdiv = 1; + } + if (typeof subdiv === 'number') { + subdiv = [subdiv, subdiv, subdiv]; + } - findPin: function (input) { - var node; - // Try to take input as a directly a node - if (typeof input === 'string' || input instanceof Node$1) { - input = { - node: input - }; - } + var geoKey = 'cube-' + subdiv.join('-'); + var cube = this._geoCache.get(geoKey); + if (!cube) { + cube = new Cube$1({ + widthSegments: subdiv[0], + heightSegments: subdiv[1], + depthSegments: subdiv[2] + }); + cube.generateTangents(); + this._geoCache.put(geoKey, cube); + } + return this.createMesh(cube, material, parentNode); +}; - if (typeof input.node === 'string') { - for (var i = 0; i < this.nodes.length; i++) { - var tmp = this.nodes[i]; - if (tmp.name === input.node) { - node = tmp; - } - } - } - else { - node = input.node; - } - if (node) { - var inputPin = input.pin; - if (!inputPin) { - // Use first pin defaultly - if (node.outputs) { - inputPin = Object.keys(node.outputs)[0]; - } - } - if (node.outputs[inputPin]) { - return { - node: node, - pin: inputPin - }; - } - } +/** + * Create a cube mesh that camera is inside the cube. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Array.|number} [subdivision=1] Subdivision of cube. + * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. + * @return {clay.Mesh} + * @example + * // Create a white cube inside. + * app.createCubeInside() + */ +App3D.prototype.createCubeInside = function (material, parentNode, subdiv) { + if (subdiv == null) { + subdiv = 1; } -}); + if (typeof subdiv === 'number') { + subdiv = [subdiv, subdiv, subdiv]; + } + var geoKey = 'cubeInside-' + subdiv.join('-'); + var cube = this._geoCache.get(geoKey); + if (!cube) { + cube = new Cube$1({ + inside: true, + widthSegments: subdiv[0], + heightSegments: subdiv[1], + depthSegments: subdiv[2] + }); + cube.generateTangents(); + this._geoCache.put(geoKey, cube); + } + + return this.createMesh(cube, material, parentNode); +}; /** - * Compositor provide graph based post processing - * - * @constructor clay.compositor.Compositor - * @extends clay.compositor.Graph - * + * Create a sphere mesh and add it to the scene or the given parent node. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {number} [subdivision=20] Subdivision of sphere. + * @return {clay.Mesh} + * @example + * // Create a semi-transparent sphere. + * app.createSphere({ + * color: [0, 0, 1], + * transparent: true, + * alpha: 0.5 + * }) */ -var Compositor = Graph.extend(function() { - return { - // Output node - _outputs: [], +App3D.prototype.createSphere = function (material, parentNode, subdivision) { + if (subdivision == null) { + subdivision = 20; + } + var geoKey = 'sphere-' + subdivision; + var sphere = this._geoCache.get(geoKey); + if (!sphere) { + sphere = new Sphere$1({ + widthSegments: subdivision * 2, + heightSegments: subdivision + }); + sphere.generateTangents(); + this._geoCache.put(geoKey, sphere); + } + return this.createMesh(sphere, material, parentNode); +}; - _texturePool: new TexturePool(), +/** + * Create a plane mesh and add it to the scene or the given parent node. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Array.|number} [subdivision=1] Subdivision of plane. + * Can be a number to represent both width and height dimensions. Or an array to represent them respectively. + * @return {clay.Mesh} + * @example + * // Create a red color plane. + * app.createPlane({ + * color: [1, 0, 0] + * }) + */ +App3D.prototype.createPlane = function (material, parentNode, subdiv) { + if (subdiv == null) { + subdiv = 1; + } + if (typeof subdiv === 'number') { + subdiv = [subdiv, subdiv]; + } + var geoKey = 'plane-' + subdiv.join('-'); + var planeGeo = this._geoCache.get(geoKey); + if (!planeGeo) { + planeGeo = new Plane$3({ + widthSegments: subdiv[0], + heightSegments: subdiv[1] + }); + planeGeo.generateTangents(); + this._geoCache.put(geoKey, planeGeo); + } + return this.createMesh(planeGeo, material, parentNode); +}; - _frameBuffer: new FrameBuffer({ - depthBuffer: false - }) - }; -}, -/** @lends clay.compositor.Compositor.prototype */ -{ - addNode: function(node) { - Graph.prototype.addNode.call(this, node); - node._compositor = this; - }, - /** - * @param {clay.Renderer} renderer - */ - render: function(renderer, frameBuffer) { - if (this._dirty) { - this.update(); - this._dirty = false; +/** + * Create mesh with parametric surface function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Object} generator + * @param {Function} generator.x + * @param {Function} generator.y + * @param {Function} generator.z + * @param {Array} [generator.u=[0, 1, 0.05]] + * @param {Array} [generator.v=[0, 1, 0.05]] + * @return {clay.Mesh} + */ +App3D.prototype.createParametricSurface = function (material, parentNode, generator) { + var geo = new ParametricSurface$1({ + generator: generator + }); + geo.generateTangents(); + return this.createMesh(geo, material, parentNode); +}; - this._outputs.length = 0; - for (var i = 0; i < this.nodes.length; i++) { - if (!this.nodes[i].outputs) { - this._outputs.push(this.nodes[i]); - } - } - } - for (var i = 0; i < this.nodes.length; i++) { - // Update the reference number of each output texture - this.nodes[i].beforeFrame(); - } +/** + * Create a general mesh with given geometry instance and material config. + * @param {clay.Geometry} geometry + * @return {clay.Mesh} + */ +App3D.prototype.createMesh = function (geometry, mat, parentNode) { + var mesh = new Mesh({ + geometry: geometry, + material: mat instanceof Material ? mat : this.createMaterial(mat) + }); + parentNode = parentNode || this.scene; + parentNode.add(mesh); + return mesh; +}; - for (var i = 0; i < this._outputs.length; i++) { - this._outputs[i].updateReference(); - } +/** + * Create an empty node + * @param {clay.Node} parentNode + * @return {clay.Node} + */ +App3D.prototype.createNode = function (parentNode) { + var node = new Node(); + parentNode = parentNode || this.scene; + parentNode.add(node); + return node; +}; - for (var i = 0; i < this._outputs.length; i++) { - this._outputs[i].render(renderer, frameBuffer); +/** + * Create a perspective or orthographic camera and add it to the scene. + * @param {Array.|clay.math.Vector3} position + * @param {Array.|clay.math.Vector3} target + * @param {string} [type="perspective"] Can be 'perspective' or 'orthographic'(in short 'ortho') + * @return {clay.camera.Perspective} + */ +App3D.prototype.createCamera = function (position, target, type) { + var CameraCtor; + if (type === 'ortho' || type === 'orthographic') { + CameraCtor = Orthographic$1; + } + else { + if (type && type !== 'perspective') { + console.error('Unkown camera type ' + type + '. Use default perspective camera'); } + CameraCtor = Perspective$1; + } - for (var i = 0; i < this.nodes.length; i++) { - // Clear up - this.nodes[i].afterFrame(); - } - }, + var camera = new CameraCtor(); + if (position instanceof Vector3) { + camera.position.copy(position); + } + else if (position instanceof Array) { + camera.position.setArray(position); + } - allocateTexture: function (parameters) { - return this._texturePool.get(parameters); - }, + if (target instanceof Array) { + target = new Vector3(target[0], target[1], target[2]); + } + if (target instanceof Vector3) { + camera.lookAt(target); + } - releaseTexture: function (parameters) { - this._texturePool.put(parameters); - }, + this.scene.add(camera); - getFrameBuffer: function () { - return this._frameBuffer; - }, + return camera; +}; - /** - * Dispose compositor - * @param {clay.Renderer} renderer - */ - dispose: function (renderer) { - this._texturePool.clear(renderer); +/** + * Create a directional light and add it to the scene. + * @param {Array.|clay.math.Vector3} dir A Vector3 or array to represent the direction. + * @param {Color} [color='#fff'] Color of directional light, default to be white. + * @param {number} [intensity] Intensity of directional light, default to be 1. + * + * @example + * app.createDirectionalLight([-1, -1, -1], '#fff', 2); + */ +App3D.prototype.createDirectionalLight = function (dir, color, intensity) { + var light = new DirectionalLight(); + if (dir instanceof Vector3) { + dir = dir.array; } -}); + light.position.setArray(dir).negate(); + light.lookAt(Vector3.ZERO); + if (typeof color === 'string') { + color = parseColor(color); + } + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); + + this.scene.add(light); + return light; +}; /** - * @constructor clay.compositor.SceneNode - * @extends clay.compositor.Node + * Create a spot light and add it to the scene. + * @param {Array.|clay.math.Vector3} position Position of the spot light. + * @param {Array.|clay.math.Vector3} [target] Target position where spot light points to. + * @param {number} [range=20] Falloff range of spot light. Default to be 20. + * @param {Color} [color='#fff'] Color of spot light, default to be white. + * @param {number} [intensity=1] Intensity of spot light, default to be 1. + * @param {number} [umbraAngle=30] Umbra angle of spot light. Default to be 30 degree from the middle line. + * @param {number} [penumbraAngle=45] Penumbra angle of spot light. Default to be 45 degree from the middle line. + * + * @example + * app.createSpotLight([5, 5, 5], [0, 0, 0], 20, #900); */ -var SceneNode$1 = Node$1.extend( -/** @lends clay.compositor.SceneNode# */ -{ - name: 'scene', - /** - * @type {clay.Scene} - */ - scene: null, - /** - * @type {clay.Camera} - */ - camera: null, - /** - * @type {boolean} - */ - autoUpdateScene: true, - /** - * @type {boolean} - */ - preZ: false +App3D.prototype.createSpotLight = function (position, target, range, color, intensity, umbraAngle, penumbraAngle) { + var light = new SpotLight(); + light.position.setArray(position instanceof Vector3 ? position.array : position); -}, function() { - this.frameBuffer = new FrameBuffer(); -}, { - render: function(renderer) { + if (target instanceof Array) { + target = new Vector3(target[0], target[1], target[2]); + } + if (target instanceof Vector3) { + light.lookAt(target); + } - this._rendering = true; - var _gl = renderer.gl; + if (typeof color === 'string') { + color = parseColor(color); + } + range != null && (light.range = range); + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); + umbraAngle != null && (light.umbraAngle = umbraAngle); + penumbraAngle != null && (light.penumbraAngle = penumbraAngle); - this.trigger('beforerender'); + this.scene.add(light); - var renderInfo; + return light; +}; - if (!this.outputs) { +/** + * Create a point light. + * @param {Array.|clay.math.Vector3} position Position of point light.. + * @param {number} [range=100] Falloff range of point light. + * @param {Color} [color='#fff'] Color of point light. + * @param {number} [intensity=1] Intensity of point light. + */ +App3D.prototype.createPointLight = function (position, range, color, intensity) { + var light = new PointLight(); + light.position.setArray(position instanceof Vector3 ? position.array : position); - renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); + if (typeof color === 'string') { + color = parseColor(color); + } + range != null && (light.range = range); + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); - } - else { + this.scene.add(light); - var frameBuffer = this.frameBuffer; - for (var name in this.outputs) { - var parameters = this.updateParameter(name, renderer); - var outputInfo = this.outputs[name]; - var texture = this._compositor.allocateTexture(parameters); - this._outputTextures[name] = texture; + return light; +}; - var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; - if (typeof(attachment) == 'string') { - attachment = _gl[attachment]; - } - frameBuffer.attach(texture, attachment); - } - frameBuffer.bind(renderer); +/** + * Create a ambient light. + * @param {Color} [color='#fff'] Color of ambient light. + * @param {number} [intensity=1] Intensity of ambient light. + */ +App3D.prototype.createAmbientLight = function (color, intensity) { + var light = new AmbientLight(); - // MRT Support in chrome - // https://www.khronos.org/registry/webgl/sdk/tests/conformance/extensions/ext-draw-buffers.html - var ext = renderer.getGLExtension('EXT_draw_buffers'); - if (ext) { - var bufs = []; - for (var attachment in this.outputs) { - attachment = parseInt(attachment); - if (attachment >= _gl.COLOR_ATTACHMENT0 && attachment <= _gl.COLOR_ATTACHMENT0 + 8) { - bufs.push(attachment); - } - } - ext.drawBuffersEXT(bufs); - } + if (typeof color === 'string') { + color = parseColor(color); + } + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); - // Always clear - // PENDING - renderer.saveClear(); - renderer.clearBit = glenum.DEPTH_BUFFER_BIT | glenum.COLOR_BUFFER_BIT; - renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); - renderer.restoreClear(); + this.scene.add(light); - frameBuffer.unbind(renderer); - } + return light; +}; - this.trigger('afterrender', renderInfo); +/** + * Create an cubemap ambient light and an spherical harmonic ambient light + * for specular and diffuse lighting in PBR rendering + * @param {ImageLike|TextureCube} [envImage] Panorama environment image, HDR format is better. Or a pre loaded texture cube + * @param {number} [specularIntenstity=0.7] Intensity of specular light. + * @param {number} [diffuseIntenstity=0.7] Intensity of diffuse light. + * @param {number} [exposure=1] Exposure of HDR image. Only if image in first paramter is HDR. + * @param {number} [prefilteredCubemapSize=32] The size of prefilerted cubemap. Larger value will take more time to do expensive prefiltering. + */ +App3D.prototype.createAmbientCubemapLight = function (envImage, specIntensity, diffIntensity, exposure, prefilteredCubemapSize) { + var self = this; + if (exposure == null) { + exposure = 1; + } + if (prefilteredCubemapSize == null) { + prefilteredCubemapSize = 32; + } - this._rendering = false; - this._rendered = true; + var scene = this.scene; + + var loadPromise; + if (envImage instanceof TextureCube) { + loadPromise = envImage.isRenderable() + ? Promise.resolve(envImage) + : new Promise(function (resolve, reject) { + envImage.success(function () { + resolve(envImage); + }); + }); } -}); + else { + loadPromise = this.loadTexture(envImage, { + exposure: exposure + }); + } + + return loadPromise.then(function (envTexture) { + var specLight = new AmbientCubemapLight({ + intensity: specIntensity != null ? specIntensity : 0.7 + }); + specLight.cubemap = envTexture; + envTexture.flipY = false; + // TODO Cache prefilter ? + specLight.prefilter(self.renderer, 32); + + var diffLight = new AmbientSHLight({ + intensity: diffIntensity != null ? diffIntensity : 0.7, + coefficients: sh.projectEnvironmentMap( + self.renderer, specLight.cubemap, { + lod: 1 + } + ) + }); + scene.add(specLight); + scene.add(diffLight); + + return { + specular: specLight, + diffuse: diffLight, + // Original environment map + environmentMap: envTexture + }; + }); +}; /** - * @constructor clay.compositor.TextureNode - * @extends clay.compositor.Node + * Load a [glTF](https://github.com/KhronosGroup/glTF) format model. + * You can convert FBX/DAE/OBJ format models to [glTF](https://github.com/KhronosGroup/glTF) with [fbx2gltf](https://github.com/pissang/claygl#fbx-to-gltf20-converter) python script, + * or simply using the [Clay Viewer](https://github.com/pissang/clay-viewer) client application. + * @param {string} url + * @param {Object} opts + * @param {string|clay.Shader} [opts.shader='clay.standard'] 'basic'|'lambert'|'standard'. + * @param {boolean} [opts.waitTextureLoaded=false] If add to scene util textures are all loaded. + * @param {boolean} [opts.autoPlayAnimation=true] If autoplay the animation of model. + * @param {boolean} [opts.upAxis='y'] Change model to y up if upAxis is 'z' + * @param {boolean} [opts.textureFlipY=false] + * @param {string} [opts.textureRootPath] Root path of texture. Default to be relative with glTF file. + * @return {Promise} */ -var TextureNode$1 = Node$1.extend(function() { - return /** @lends clay.compositor.TextureNode# */ { - /** - * @type {clay.Texture2D} - */ - texture: null, +App3D.prototype.loadModel = function (url, opts) { + if (typeof url !== 'string') { + throw new Error('Invalid URL.'); + } - // Texture node must have output without parameters - outputs: { - color: {} - } + opts = opts || {}; + if (opts.autoPlayAnimation == null) { + opts.autoPlayAnimation = true; + } + var shader = opts.shader || 'clay.standard'; + + var loaderOpts = { + rootNode: new Node(), + shader: shader, + textureRootPath: opts.textureRootPath, + crossOrigin: 'Anonymous', + textureFlipY: opts.textureFlipY }; -}, function () { -}, { + if (opts.upAxis && opts.upAxis.toLowerCase() === 'z') { + loaderOpts.rootNode.rotation.identity().rotateX(-Math.PI / 2); + } - getOutput: function (renderer, name) { - return this.texture; - }, + var loader = new GLTFLoader(loaderOpts); - // Do nothing - beforeFrame: function () {}, - afterFrame: function () {} -}); + var scene = this.scene; + var timeline = this.timeline; + var self = this; -// TODO Shader library -// TODO curlnoise demo wrong + return new Promise(function (resolve, reject) { + function afterLoad(result) { + if (self._disposed) { + return; + } -// PENDING -// Use topological sort ? + scene.add(result.rootNode); + if (opts.autoPlayAnimation) { + result.clips.forEach(function (clip) { + timeline.addClip(clip); + }); + } + resolve(result); + } + loader.success(function (result) { + if (self._disposed) { + return; + } -/** - * Filter node - * - * @constructor clay.compositor.FilterNode - * @extends clay.compositor.Node - * - * @example - var node = new clay.compositor.Node({ - name: 'fxaa', - shader: clay.Shader.source('clay.compositor.fxaa'), - inputs: { - texture: { - node: 'scene', - pin: 'color' + if (!opts.waitTextureLoaded) { + afterLoad(result); } - }, - // Multiple outputs is preserved for MRT support in WebGL2.0 - outputs: { - color: { - attachment: clay.FrameBuffer.COLOR_ATTACHMENT0 - parameters: { - format: clay.Texture.RGBA, - width: 512, - height: 512 - }, - // Node will keep the RTT rendered in last frame - keepLastFrame: true, - // Force the node output the RTT rendered in last frame - outputLastFrame: true + else { + Promise.all(result.textures.map(function (texture) { + if (texture.isRenderable()) { + return Promise.resolve(texture); + } + return new Promise(function (resolve) { + texture.success(resolve); + texture.error(resolve); + }); + })).then(function () { + afterLoad(result); + }).catch(function () { + afterLoad(result); + }); } - } + }); + loader.error(function () { + reject(); + }); + loader.load(url); }); - * - */ -var FilterNode$1 = Node$1.extend(function () { - return /** @lends clay.compositor.Node# */ { - /** - * @type {string} - */ - name: '', - - /** - * @type {Object} - */ - inputs: {}, - - /** - * @type {Object} - */ - outputs: null, +}; - /** - * @type {string} - */ - shader: '', - /** - * Input links, will be updated by the graph - * @example: - * inputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - inputLinks: {}, +var application = { + App3D: App3D, + /** + * Create a 3D application that will manage the app initialization and loop. + * @name clay.application.create + * @param {HTMLDomElement|string} dom Container dom element or a selector string that can be used in `querySelector` + * @param {Object} appNS + * @param {Function} init Initialization callback that will be called when initing app. + * @param {Function} loop Loop callback that will be called each frame. + * @param {number} [width] Container width. + * @param {number} [height] Container height. + * @param {number} [devicePixelRatio] + * @return {clay.application.App3D} + * + * @example + * clay.application.create('#app', { + * init: function (app) { + * app.createCube(); + * var camera = app.createCamera(); + * camera.position.set(0, 0, 2); + * }, + * loop: function () { // noop } + * }) + */ + create: function (dom, appNS) { + return new App3D(dom, appNS); + } +}; - /** - * Output links, will be updated by the graph - * @example: - * outputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - outputLinks: {}, +/** + * @constructor + * @alias clay.async.Task + * @mixes clay.core.mixin.notifier + */ +var Task = function() { + this._fullfilled = false; + this._rejected = false; +}; +/** + * Task successed + * @param {} data + */ +Task.prototype.resolve = function(data) { + this._fullfilled = true; + this._rejected = false; + this.trigger('success', data); +}; +/** + * Task failed + * @param {} err + */ +Task.prototype.reject = function(err) { + this._rejected = true; + this._fullfilled = false; + this.trigger('error', err); +}; +/** + * If task successed + * @return {boolean} + */ +Task.prototype.isFullfilled = function() { + return this._fullfilled; +}; +/** + * If task failed + * @return {boolean} + */ +Task.prototype.isRejected = function() { + return this._rejected; +}; +/** + * If task finished, either successed or failed + * @return {boolean} + */ +Task.prototype.isSettled = function() { + return this._fullfilled || this._rejected; +}; - /** - * @type {clay.compositor.Pass} - */ - pass: null, +util$1.extend(Task.prototype, notifier); - // Save the output texture of previous frame - // Will be used when there exist a circular reference - _prevOutputTextures: {}, - _outputTextures: {}, +function makeRequestTask(url, responseType) { + var task = new Task(); + request.get({ + url: url, + responseType: responseType, + onload: function(res) { + task.resolve(res); + }, + onerror: function(error) { + task.reject(error); + } + }); + return task; +} +/** + * Make a request task + * @param {string|object|object[]|string[]} url + * @param {string} [responseType] + * @example + * var task = Task.makeRequestTask('./a.json'); + * var task = Task.makeRequestTask({ + * url: 'b.bin', + * responseType: 'arraybuffer' + * }); + * var tasks = Task.makeRequestTask(['./a.json', './b.json']); + * var tasks = Task.makeRequestTask([ + * {url: 'a.json'}, + * {url: 'b.bin', responseType: 'arraybuffer'} + * ]); + * @return {clay.async.Task|clay.async.Task[]} + */ +Task.makeRequestTask = function(url, responseType) { + if (typeof url === 'string') { + return makeRequestTask(url, responseType); + } else if (url.url) { // Configure object + var obj = url; + return makeRequestTask(obj.url, obj.responseType); + } else if (Array.isArray(url)) { // Url list + var urlList = url; + var tasks = []; + urlList.forEach(function(obj) { + var url, responseType; + if (typeof obj === 'string') { + url = obj; + } else if (Object(obj) === obj) { + url = obj.url; + responseType = obj.responseType; + } + tasks.push(makeRequestTask(url, responseType)); + }); + return tasks; + } +}; +/** + * @return {clay.async.Task} + */ +Task.makeTask = function() { + return new Task(); +}; - // Example: { name: 2 } - _outputReferences: {}, +util$1.extend(Task.prototype, notifier); - _rendering: false, - // If rendered in this frame - _rendered: false, +/** + * @constructor + * @alias clay.async.TaskGroup + * @extends clay.async.Task + */ +var TaskGroup = function () { - _compositor: null - }; -}, function () { + Task.apply(this, arguments); - var pass = new Pass({ - fragment: this.shader - }); - this.pass = pass; -}, -/** @lends clay.compositor.Node.prototype */ -{ - /** - * @param {clay.Renderer} renderer - */ - render: function (renderer, frameBuffer) { - this.trigger('beforerender', renderer); + this._tasks = []; - this._rendering = true; + this._fulfilledNumber = 0; - var _gl = renderer.gl; + this._rejectedNumber = 0; +}; - for (var inputName in this.inputLinks) { - var link = this.inputLinks[inputName]; - var inputTexture = link.node.getOutput(renderer, link.pin); - this.pass.setUniform(inputName, inputTexture); - } - // Output - if (!this.outputs) { - this.pass.outputs = null; +var Ctor = function (){}; +Ctor.prototype = Task.prototype; +TaskGroup.prototype = new Ctor(); - this._compositor.getFrameBuffer().unbind(renderer); +TaskGroup.prototype.constructor = TaskGroup; - this.pass.render(renderer, frameBuffer); +/** + * Wait for all given tasks successed, task can also be any notifier object which will trigger success and error events. Like {@link clay.Texture2D}, {@link clay.TextureCube}, {@link clay.loader.GLTF}. + * @param {Array.} tasks + * @chainable + * @example + * // Load texture list + * var list = ['a.jpg', 'b.jpg', 'c.jpg'] + * var textures = list.map(function (src) { + * var texture = new clay.Texture2D(); + * texture.load(src); + * return texture; + * }); + * var taskGroup = new clay.async.TaskGroup(); + * taskGroup.all(textures).success(function () { + * // Do some thing after all textures loaded + * }); + */ +TaskGroup.prototype.all = function (tasks) { + var count = 0; + var self = this; + var data = []; + this._tasks = tasks; + this._fulfilledNumber = 0; + this._rejectedNumber = 0; + + util$1.each(tasks, function (task, idx) { + if (!task || !task.once) { + return; } - else { - this.pass.outputs = {}; + count++; + task.once('success', function (res) { + count--; - var attachedTextures = {}; - for (var name in this.outputs) { - var parameters = this.updateParameter(name, renderer); - if (isNaN(parameters.width)) { - this.updateParameter(name, renderer); - } - var outputInfo = this.outputs[name]; - var texture = this._compositor.allocateTexture(parameters); - this._outputTextures[name] = texture; - var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; - if (typeof(attachment) == 'string') { - attachment = _gl[attachment]; - } - attachedTextures[attachment] = texture; - } - this._compositor.getFrameBuffer().bind(renderer); + self._fulfilledNumber++; + // TODO + // Some tasks like texture, loader are not inherited from task + // We need to set the states here + task._fulfilled = true; + task._rejected = false; - for (var attachment in attachedTextures) { - // FIXME attachment changes in different nodes - this._compositor.getFrameBuffer().attach( - attachedTextures[attachment], attachment - ); + data[idx] = res; + if (count === 0) { + self.resolve(data); } + }); + task.once('error', function () { - this.pass.render(renderer); + self._rejectedNumber ++; - // Because the data of texture is changed over time, - // Here update the mipmaps of texture each time after rendered; - this._compositor.getFrameBuffer().updateMipmap(renderer.gl); - } + task._fulfilled = false; + task._rejected = true; - for (var inputName in this.inputLinks) { - var link = this.inputLinks[inputName]; - link.node.removeReference(link.pin); + self.reject(task); + }); + }); + if (count === 0) { + setTimeout(function () { + self.resolve(data); + }); + return this; + } + return this; +}; +/** + * Wait for all given tasks finished, either successed or failed + * @param {Array.} tasks + * @return {clay.async.TaskGroup} + */ +TaskGroup.prototype.allSettled = function (tasks) { + var count = 0; + var self = this; + var data = []; + if (tasks.length === 0) { + setTimeout(function () { + self.trigger('success', data); + }); + return this; + } + this._tasks = tasks; + + util$1.each(tasks, function (task, idx) { + if (!task || !task.once) { + return; } + count++; + task.once('success', function (res) { + count--; - this._rendering = false; - this._rendered = true; + self._fulfilledNumber++; - this.trigger('afterrender', renderer); - }, + task._fulfilled = true; + task._rejected = false; - // TODO Remove parameter function callback - updateParameter: function (outputName, renderer) { - var outputInfo = this.outputs[outputName]; - var parameters = outputInfo.parameters; - var parametersCopy = outputInfo._parametersCopy; - if (!parametersCopy) { - parametersCopy = outputInfo._parametersCopy = {}; - } - if (parameters) { - for (var key in parameters) { - if (key !== 'width' && key !== 'height') { - parametersCopy[key] = parameters[key]; - } - } - } - var width, height; - if (parameters.width instanceof Function) { - width = parameters.width.call(this, renderer); - } - else { - width = parameters.width; - } - if (parameters.height instanceof Function) { - height = parameters.height.call(this, renderer); - } - else { - height = parameters.height; - } - if ( - parametersCopy.width !== width - || parametersCopy.height !== height - ) { - if (this._outputTextures[outputName]) { - this._outputTextures[outputName].dispose(renderer); + data[idx] = res; + if (count === 0) { + self.resolve(data); } - } - parametersCopy.width = width; - parametersCopy.height = height; - - return parametersCopy; - }, + }); + task.once('error', function (err) { + count--; - /** - * Set parameter - * @param {string} name - * @param {} value - */ - setParameter: function (name, value) { - this.pass.setUniform(name, value); - }, - /** - * Get parameter value - * @param {string} name - * @return {} - */ - getParameter: function (name) { - return this.pass.getUniform(name); - }, - /** - * Set parameters - * @param {Object} obj - */ - setParameters: function (obj) { - for (var name in obj) { - this.setParameter(name, obj[name]); - } - }, - // /** - // * Set shader code - // * @param {string} shaderStr - // */ - // setShader: function (shaderStr) { - // var material = this.pass.material; - // material.shader.setFragment(shaderStr); - // material.attachShader(material.shader, true); - // }, - /** - * Proxy of pass.material.define('fragment', xxx); - * @param {string} symbol - * @param {number} [val] - */ - define: function (symbol, val) { - this.pass.material.define('fragment', symbol, val); - }, + self._rejectedNumber++; - /** - * Proxy of pass.material.undefine('fragment', xxx) - * @param {string} symbol - */ - undefine: function (symbol) { - this.pass.material.undefine('fragment', symbol); - }, + task._fulfilled = false; + task._rejected = true; - removeReference: function (outputName) { - this._outputReferences[outputName]--; - if (this._outputReferences[outputName] === 0) { - var outputInfo = this.outputs[outputName]; - if (outputInfo.keepLastFrame) { - if (this._prevOutputTextures[outputName]) { - this._compositor.releaseTexture(this._prevOutputTextures[outputName]); - } - this._prevOutputTextures[outputName] = this._outputTextures[outputName]; + // TODO + data[idx] = null; + if (count === 0) { + self.resolve(data); } - else { - // Output of this node have alreay been used by all other nodes - // Put the texture back to the pool. - this._compositor.releaseTexture(this._outputTextures[outputName]); + }); + }); + return this; +}; +/** + * Get successed sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} + */ +TaskGroup.prototype.getFulfilledNumber = function (recursive) { + if (recursive) { + var nFulfilled = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nFulfilled += task.getFulfilledNumber(recursive); + } else if(task._fulfilled) { + nFulfilled += 1; } } - }, - - clear: function () { - Node$1.prototype.clear.call(this); - - // Default disable all texture - this.pass.material.disableTexturesAll(); + return nFulfilled; + } else { + return this._fulfilledNumber; } -}); - -var shaderSourceReg = /^#source\((.*?)\)/; +}; /** - * @param {Object} json - * @param {Object} [opts] - * @return {clay.compositor.Compositor} + * Get failed sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} */ -function createCompositor(json, opts) { - var compositor = new Compositor(); - opts = opts || {}; - - var lib = { - textures: {}, - parameters: {} - }; - var afterLoad = function(shaderLib, textureLib) { - for (var i = 0; i < json.nodes.length; i++) { - var nodeInfo = json.nodes[i]; - var node = createNode(nodeInfo, lib, opts); - if (node) { - compositor.addNode(node); +TaskGroup.prototype.getRejectedNumber = function (recursive) { + if (recursive) { + var nRejected = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nRejected += task.getRejectedNumber(recursive); + } else if(task._rejected) { + nRejected += 1; } } - }; - - for (var name in json.parameters) { - var paramInfo = json.parameters[name]; - lib.parameters[name] = convertParameter(paramInfo); + return nRejected; + } else { + return this._rejectedNumber; } - // TODO load texture asynchronous - loadTextures(json, lib, opts, function(textureLib) { - lib.textures = textureLib; - afterLoad(); - }); - - return compositor; -} - -function createNode(nodeInfo, lib, opts) { - var type = nodeInfo.type || 'filter'; - var shaderSource; - var inputs; - var outputs; +}; - if (type === 'filter') { - var shaderExp = nodeInfo.shader.trim(); - var res = shaderSourceReg.exec(shaderExp); - if (res) { - shaderSource = Shader.source(res[1].trim()); - } - else if (shaderExp.charAt(0) === '#') { - shaderSource = lib.shaders[shaderExp.substr(1)]; - } - if (!shaderSource) { - shaderSource = shaderExp; - } - if (!shaderSource) { - return; - } - } +/** + * Get finished sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} + */ +TaskGroup.prototype.getSettledNumber = function (recursive) { - if (nodeInfo.inputs) { - inputs = {}; - for (var name in nodeInfo.inputs) { - if (typeof nodeInfo.inputs[name] === 'string') { - inputs[name] = nodeInfo.inputs[name]; - } - else { - inputs[name] = { - node: nodeInfo.inputs[name].node, - pin: nodeInfo.inputs[name].pin - }; + if (recursive) { + var nSettled = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nSettled += task.getSettledNumber(recursive); + } else if(task._rejected || task._fulfilled) { + nSettled += 1; } } + return nSettled; + } else { + return this._fulfilledNumber + this._rejectedNumber; } - if (nodeInfo.outputs) { - outputs = {}; - for (var name in nodeInfo.outputs) { - var outputInfo = nodeInfo.outputs[name]; - outputs[name] = {}; - if (outputInfo.attachment != null) { - outputs[name].attachment = outputInfo.attachment; - } - if (outputInfo.keepLastFrame != null) { - outputs[name].keepLastFrame = outputInfo.keepLastFrame; - } - if (outputInfo.outputLastFrame != null) { - outputs[name].outputLastFrame = outputInfo.outputLastFrame; - } - if (outputInfo.parameters) { - outputs[name].parameters = convertParameter(outputInfo.parameters); +}; + +/** + * Get all sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} + */ +TaskGroup.prototype.getTaskNumber = function (recursive) { + if (recursive) { + var nTask = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nTask += task.getTaskNumber(recursive); + } else { + nTask += 1; } } + return nTask; + } else { + return this._tasks.length; } - var node; - if (type === 'scene') { - node = new SceneNode$1({ - name: nodeInfo.name, - scene: opts.scene, - camera: opts.camera, - outputs: outputs - }); - } - else if (type === 'texture') { - node = new TextureNode$1({ - name: nodeInfo.name, - outputs: outputs - }); - } - // Default is filter - else { - node = new FilterNode$1({ - name: nodeInfo.name, - shader: shaderSource, - inputs: inputs, - outputs: outputs - }); - } - if (node) { - if (nodeInfo.parameters) { - for (var name in nodeInfo.parameters) { - var val = nodeInfo.parameters[name]; - if (typeof(val) === 'string') { - val = val.trim(); - if (val.charAt(0) === '#') { - val = lib.textures[val.substr(1)]; - } - else { - node.on( - 'beforerender', createSizeSetHandler( - name, tryConvertExpr(val) - ) - ); - } - } - node.setParameter(name, val); - } - } - if (nodeInfo.defines && node.pass) { - for (var name in nodeInfo.defines) { - var val = nodeInfo.defines[name]; - node.pass.material.define('fragment', name, val); - } +}; + +var CanvasMaterial = Base.extend({ + + color: [1, 1, 1, 1], + + opacity: 1, + + pointSize: 0, + + pointShape: 'rectangle' +}); + +var mat4$8 = glmatrix.mat4; +var vec3$17 = glmatrix.vec3; +var vec4$2 = glmatrix.vec4; + +var vec4Create = vec4$2.create; + +var round = Math.round; + +var PRIMITIVE_TRIANGLE = 1; +var PRIMITIVE_LINE = 2; +var PRIMITIVE_POINT = 3; + +function PrimitivePool(constructor) { + this.ctor = constructor; + + this._data = []; + + this._size = 0; +} + +PrimitivePool.prototype = { + pick: function () { + var data = this._data; + var size = this._size; + var obj = data[size]; + if (! obj) { + // Constructor must have no parameters + obj = new this.ctor(); + data[size] = obj; } - } - return node; -} + this._size++; + return obj; + }, -function convertParameter(paramInfo) { - var param = {}; - if (!paramInfo) { - return param; - } - ['type', 'minFilter', 'magFilter', 'wrapS', 'wrapT', 'flipY', 'useMipmap'] - .forEach(function(name) { - var val = paramInfo[name]; - if (val != null) { - // Convert string to enum - if (typeof val === 'string') { - val = Texture[val]; - } - param[name] = val; - } - }); - ['width', 'height'] - .forEach(function(name) { - if (paramInfo[name] != null) { - var val = paramInfo[name]; - if (typeof val === 'string') { - val = val.trim(); - param[name] = createSizeParser( - name, tryConvertExpr(val) - ); - } - else { - param[name] = val; - } - } - }); - if (paramInfo.useMipmap != null) { - param.useMipmap = paramInfo.useMipmap; + reset: function () { + this._size = 0; + }, + + shrink: function () { + this._data.length = this._size; + }, + + clear: function () { + this._data = []; + this._size = 0; } - return param; +}; + +function Triangle() { + this.vertices = [vec4Create(), vec4Create(), vec4Create()]; + this.color = vec4Create(); + + this.depth = 0; } -function loadTextures(json, lib, opts, callback) { - if (!json.textures) { - callback({}); - return; - } - var textures = {}; - var loading = 0; +Triangle.prototype.type = PRIMITIVE_TRIANGLE; - var cbd = false; - var textureRootPath = opts.textureRootPath; - util$1.each(json.textures, function(textureInfo, name) { - var texture; - var path = textureInfo.path; - var parameters = convertParameter(textureInfo.parameters); - if (Array.isArray(path) && path.length === 6) { - if (textureRootPath) { - path = path.map(function(item) { - return util$1.relative2absolute(item, textureRootPath); - }); - } - texture = new TextureCube(parameters); - } - else if(typeof path === 'string') { - if (textureRootPath) { - path = util$1.relative2absolute(path, textureRootPath); - } - texture = new Texture2D(parameters); - } - else { - return; - } +function Point() { + // Here use an array to make it more convinient to proccessing in _setPrimitive method + this.vertices = [vec4Create()]; - texture.load(path); - loading++; - texture.once('success', function() { - textures[name] = texture; - loading--; - if (loading === 0) { - callback(textures); - cbd = true; - } - }); - }); + this.color = vec4Create(); - if (loading === 0 && !cbd) { - callback(textures); - } + this.depth = 0; } -function createSizeSetHandler(name, exprFunc) { - return function (renderer) { - // PENDING viewport size or window size - var dpr = renderer.getDevicePixelRatio(); - // PENDING If multiply dpr ? - var width = renderer.getWidth(); - var height = renderer.getHeight(); - var result = exprFunc(width, height, dpr); - this.setParameter(name, result); - }; +Point.prototype.type = PRIMITIVE_POINT; + +function Line() { + this.vertices = [vec4Create(), vec4Create()]; + this.color = vec4Create(); + + this.depth = 0; + + this.lineWidth = 1; } -function createSizeParser(name, exprFunc) { - return function (renderer) { - var dpr = renderer.getDevicePixelRatio(); - var width = renderer.getWidth(); - var height = renderer.getHeight(); - return exprFunc(width, height, dpr); - }; +Line.prototype.type = PRIMITIVE_LINE; + +function depthSortFunc(x, y) { + // Sort from far to near, which in depth of projection space is from larger to smaller + return y.depth - x.depth; } -function tryConvertExpr(string) { - // PENDING - var exprRes = /^expr\((.*)\)$/.exec(string); - if (exprRes) { - try { - var func = new Function('width', 'height', 'dpr', 'return ' + exprRes[1]); - // Try run t - func(1, 1); +function vec3ToColorStr(v3) { + return 'rgb(' + round(v3[0] * 255) + ',' + round(v3[1] * 255) + ',' + round(v3[2] * 255) + ')'; +} - return func; - } - catch (e) { - throw new Error('Invalid expression.'); - } - } +function vec4ToColorStr(v4) { + return 'rgba(' + round(v4[0] * 255) + ',' + round(v4[1] * 255) + ',' + round(v4[2] * 255) + ',' + v4[3] + ')'; } -var gbufferEssl = "@export clay.deferred.gbuffer.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat;\nuniform vec2 uvOffset;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#ifdef FIRST_PASS\nattribute vec3 normal : NORMAL;\n#endif\n@import clay.chunk.skinning_header\n#ifdef FIRST_PASS\nvarying vec3 v_Normal;\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nvarying vec3 v_WorldPosition;\n#endif\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef FIRST_PASS\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n bool hasTangent = dot(tangent, tangent) > 0.0;\n#endif\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n #ifdef FIRST_PASS\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n if (hasTangent) {\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n }\n #endif\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n#ifdef FIRST_PASS\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n if (hasTangent) {\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n#endif\n}\n@end\n@export clay.deferred.gbuffer1.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform float glossiness;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nuniform sampler2D roughGlossMap;\nuniform bool useRoughGlossMap;\nuniform bool useRoughness;\nuniform bool doubleSided;\nuniform int roughGlossChannel: 0;\nfloat indexingTexel(in vec4 texel, in int idx) {\n if (idx == 3) return texel.a;\n else if (idx == 1) return texel.g;\n else if (idx == 2) return texel.b;\n else return texel.r;\n}\nvoid main()\n{\n vec3 N = v_Normal;\n if (doubleSided) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = eyePos - v_WorldPosition;\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n }\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_Texcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n gl_FragColor.rgb = (N + 1.0) * 0.5;\n float g = glossiness;\n if (useRoughGlossMap) {\n float g2 = indexingTexel(texture2D(roughGlossMap, v_Texcoord), roughGlossChannel);\n if (useRoughness) {\n g2 = 1.0 - g2;\n }\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n gl_FragColor.a = g + 0.005;\n}\n@end\n@export clay.deferred.gbuffer2.fragment\nuniform sampler2D diffuseMap;\nuniform sampler2D metalnessMap;\nuniform vec3 color;\nuniform float metalness;\nuniform bool useMetalnessMap;\nuniform bool linear;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvoid main ()\n{\n float m = metalness;\n if (useMetalnessMap) {\n vec4 metalnessTexel = texture2D(metalnessMap, v_Texcoord);\n m = clamp(metalnessTexel.r + (m * 2.0 - 1.0), 0.0, 1.0);\n }\n vec4 texel = texture2D(diffuseMap, v_Texcoord);\n if (linear) {\n texel = sRGBToLinear(texel);\n }\n gl_FragColor.rgb = texel.rgb * color;\n gl_FragColor.a = m + 0.005;\n}\n@end\n@export clay.deferred.gbuffer.debug\n@import clay.deferred.chunk.light_head\nuniform int debug: 0;\nvoid main ()\n{\n @import clay.deferred.chunk.gbuffer_read\n if (debug == 0) {\n gl_FragColor = vec4(N, 1.0);\n }\n else if (debug == 1) {\n gl_FragColor = vec4(vec3(z), 1.0);\n }\n else if (debug == 2) {\n gl_FragColor = vec4(position, 1.0);\n }\n else if (debug == 3) {\n gl_FragColor = vec4(vec3(glossiness), 1.0);\n }\n else if (debug == 4) {\n gl_FragColor = vec4(vec3(metalness), 1.0);\n }\n else {\n gl_FragColor = vec4(albedo, 1.0);\n }\n}\n@end"; +var CanvasRenderer = Base.extend({ -var chunkEssl = "@export clay.deferred.chunk.light_head\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform vec2 windowSize: WINDOW_SIZE;\nuniform vec4 viewport: VIEWPORT;\nuniform mat4 viewProjectionInv;\n#ifdef DEPTH_ENCODED\n@import clay.util.decode_float\n#endif\n@end\n@export clay.deferred.chunk.gbuffer_read\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec2 uv2 = (gl_FragCoord.xy - viewport.xy) / viewport.zw;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n vec4 texel3 = texture2D(gBufferTexture3, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n float glossiness = texel1.a;\n float metalness = texel3.a;\n vec3 N = texel1.rgb * 2.0 - 1.0;\n float z = texture2D(gBufferTexture2, uv).r * 2.0 - 1.0;\n vec2 xy = uv2 * 2.0 - 1.0;\n vec4 projectedPos = vec4(xy, z, 1.0);\n vec4 p4 = viewProjectionInv * projectedPos;\n vec3 position = p4.xyz / p4.w;\n vec3 albedo = texel3.rgb;\n vec3 diffuseColor = albedo * (1.0 - metalness);\n vec3 specularColor = mix(vec3(0.04), albedo, metalness);\n@end\n@export clay.deferred.chunk.light_equation\nfloat D_Phong(in float g, in float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(in float g, in float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (3.1415926 * tmp * tmp);\n}\nvec3 F_Schlick(in float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nvec3 lightEquation(\n in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n in float ndl, in float ndh, in float ndv, in float g\n)\n{\n return ndl * lightColor\n * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n}\n@end"; + canvas: null, -Shader.import(gbufferEssl); -Shader.import(chunkEssl); + _width: 100, -function createFillCanvas(color) { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - ctx.fillStyle = color || '#000'; - ctx.fillRect(0, 0, 1, 1); + _height: 100, - return canvas; -} + devicePixelRatio: window.devicePixelRatio || 1.0, -function attachTextureToSlot(renderer, program, symbol, texture, slot) { - var gl = renderer.gl; - program.setUniform(gl, '1i', symbol, slot); + color: [0.0, 0.0, 0.0, 0.0], - gl.activeTexture(gl.TEXTURE0 + slot); - // Maybe texture is not loaded yet; - if (texture.isRenderable()) { - texture.bind(renderer); - } - else { - // Bind texture to null - texture.unbind(renderer); - } -} + clear: true, -// TODO Use globalShader insteadof globalMaterial? -function getBeforeRenderHook1 (gl, defaultNormalMap, defaultRoughnessMap) { + ctx: null, - var previousNormalMap; - var previousRougGlossMap; - var previousRenderable; + // Cached primitive list, including triangle, line, point + _primitives: [], - return function (renderable, gBufferMat, prevMaterial) { - // Material not change - if (previousRenderable && previousRenderable.material === renderable.material) { - return; + // Triangle pool + _triangles: new PrimitivePool(Triangle), + + // Line pool + _lines: new PrimitivePool(Line), + + // Point pool + _points: new PrimitivePool(Point) +}, function () { + if (! this.canvas) { + this.canvas = document.createElement('canvas'); + } + var canvas = this.canvas; + + try { + this.ctx = canvas.getContext('2d'); + var ctx = this.ctx; + if (!ctx) { + throw new Error(); } + } + catch (e) { + throw 'Error creating WebGL Context ' + e; + } - var standardMaterial = renderable.material; - var program = renderable.__program; + this.resize(); +}, { - var glossiness; - var roughGlossMap; - var useRoughnessWorkflow = standardMaterial.isDefined('fragment', 'USE_ROUGHNESS'); - var doubleSided = standardMaterial.isDefined('fragment', 'DOUBLE_SIDED'); - var roughGlossChannel; - if (useRoughnessWorkflow) { - glossiness = 1.0 - standardMaterial.get('roughness'); - roughGlossMap = standardMaterial.get('roughnessMap'); - roughGlossChannel = standardMaterial.getDefine('fragment', 'ROUGHNESS_CHANNEL'); + resize: function (width, height) { + var dpr = this.devicePixelRatio; + var canvas = this.canvas; + if (width != null) { + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + canvas.width = width * dpr; + canvas.height = height * dpr; + + this._width = width; + this._height = height; } else { - glossiness = standardMaterial.get('glossiness'); - roughGlossMap = standardMaterial.get('glossinessMap'); - roughGlossChannel = standardMaterial.getDefine('fragment', 'GLOSSINESS_CHANNEL'); + this._width = canvas.width / dpr; + this._height = canvas.height / dpr; } - var useRoughGlossMap = !!roughGlossMap; + }, - var normalMap = standardMaterial.get('normalMap') || defaultNormalMap; - var uvRepeat = standardMaterial.get('uvRepeat'); - var uvOffset = standardMaterial.get('uvOffset'); + getWidth: function () { + return this._width; + }, - roughGlossMap = roughGlossMap || defaultRoughnessMap; + getHeight: function () { + return this._height; + }, - if (prevMaterial !== gBufferMat) { - gBufferMat.set('glossiness', glossiness); - gBufferMat.set('normalMap', normalMap); - gBufferMat.set('roughGlossMap', roughGlossMap); - gBufferMat.set('useRoughGlossMap', +useRoughGlossMap); - gBufferMat.set('useRoughness', +useRoughnessWorkflow); - gBufferMat.set('doubleSided', +doubleSided); - gBufferMat.set('roughGlossChannel', +roughGlossChannel || 0); - gBufferMat.set('uvRepeat', uvRepeat); - gBufferMat.set('uvOffset', uvOffset); - } - else { - program.setUniform( - gl, '1f', 'glossiness', glossiness - ); + getViewportAspect: function () { + return this._width / this._height; + }, - if (previousNormalMap !== normalMap) { - attachTextureToSlot(this, program, 'normalMap', normalMap, 0); + render: function (scene, camera) { + + if (this.clear) { + var color = this.color; + var ctx = this.ctx; + var dpr = this.devicePixelRatio; + var w = this._width * dpr; + var h = this._height * dpr; + if (color && color[3] === 0) { + ctx.clearRect(0, 0, w, h); } - if (previousRougGlossMap !== roughGlossMap) { - attachTextureToSlot(this, program, 'roughGlossMap', roughGlossMap, 1); + else { + // Has transparency + if (color[3] < 1) { + ctx.clearRect(0, 0, w, h); + } + ctx.fillStyle = color.length === 4 ? vec4ToColorStr(color) : vec3ToColorStr(color); + ctx.fillRect(0, 0, w, h); } - program.setUniform(gl, '1i', 'useRoughGlossMap', +useRoughGlossMap); - program.setUniform(gl, '1i', 'useRoughness', +useRoughnessWorkflow); - program.setUniform(gl, '1i', 'doubleSided', +doubleSided); - program.setUniform(gl, '1i', 'roughGlossChannel', +roughGlossChannel || 0); - if (uvRepeat != null) { - program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); + } + + scene.update(); + camera.update(); + + var opaqueList = scene.opaqueList; + var transparentList = scene.transparentList; + var list = opaqueList.concat(transparentList); + + this.renderPass(list, camera); + }, + + renderPass: function (list, camera) { + var viewProj = mat4$8.create(); + mat4$8.multiply(viewProj, camera.projectionMatrix.array, camera.viewMatrix.array); + var worldViewProjMat = mat4$8.create(); + var posViewSpace = vec3$17.create(); + + var primitives = this._primitives; + var trianglesPool = this._triangles; + var linesPool = this._lines; + var pointsPool = this._points; + + trianglesPool.reset(); + linesPool.reset(); + pointsPool.reset(); + + var nPrimitive = 0; + + var indices = [0, 0, 0]; + var matColor = []; + for (var i = 0; i < list.length; i++) { + var renderable = list[i]; + + mat4$8.multiply(worldViewProjMat, viewProj, renderable.worldTransform.array); + + var geometry = renderable.geometry; + var material = renderable.material; + var attributes = geometry.attributes; + + // alpha is default 1 + if (material.color.length == 3) { + vec3$17.copy(matColor, material.color); + matColor[3] = 1; } - if (uvOffset != null) { - program.setUniform(gl, '2f', 'uvOffset', uvOffset); + else { + vec4$2.copy(matColor, material.color); } - } - previousNormalMap = normalMap; - previousRougGlossMap = roughGlossMap; + var nVertex = geometry.vertexCount; + // Only support TRIANGLES, LINES, POINTS draw modes + switch (renderable.mode) { + case glenum.TRIANGLES: + if (geometry.isUseIndices()) { + var nFace = geometry.triangleCount; + for (var j = 0; j < nFace; j++) { + geometry.getFace(j, indices); - previousRenderable = renderable; - }; -} + var triangle = trianglesPool.pick(); + triangle.material = material; -function getBeforeRenderHook2(gl, defaultDiffuseMap, defaultMetalnessMap) { - var previousDiffuseMap; - var previousRenderable; - var previousMetalnessMap; + var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); - return function (renderable, gBufferMat, prevMaterial) { - // Material not change - if (previousRenderable && previousRenderable.material === renderable.material) { - return; + if (! clipped) { + primitives[nPrimitive++] = triangle; + } + } + } + else { + for (var j = 0; j < nVertex;) { + indices[0] = j++; + indices[1] = j++; + indices[2] = j++; + + var triangle = trianglesPool.pick(); + triangle.material = material; + + var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); + + if (! clipped) { + primitives[nPrimitive++] = triangle; + } + } + } + break; + case glenum.LINES: + // LINES mode can't use face + for (var j = 0; j < nVertex;) { + indices[0] = j++; + indices[1] = j++; + var line = linesPool.pick(); + line.material = material; + line.lineWidth = renderable.lineWidth; + + var clipped = this._setPrimitive(line, indices, 2, attributes, worldViewProjMat, matColor); + + if (! clipped) { + primitives[nPrimitive++] = line; + } + } + break; + case glenum.POINTS: + for (var j = 0; j < nVertex; j++) { + indices[0] = j; + var point = pointsPool.pick(); + point.material = material; + + var clipped = this._setPrimitive(point, indices, 1, attributes, worldViewProjMat, matColor); + + if (! clipped) { + primitives[nPrimitive++] = point; + } + } + // POINTS mode can't use face + break; + } } - var program = renderable.__program; - var standardMaterial = renderable.material; + trianglesPool.shrink(); + linesPool.shrink(); + pointsPool.shrink(); - var color = standardMaterial.get('color'); - var metalness = standardMaterial.get('metalness'); + primitives.length = nPrimitive; - var diffuseMap = standardMaterial.get('diffuseMap'); - var metalnessMap = standardMaterial.get('metalnessMap'); + primitives.sort(depthSortFunc); + this._drawPrimitives(primitives); + }, - var uvRepeat = standardMaterial.get('uvRepeat'); - var uvOffset = standardMaterial.get('uvOffset'); + _setPrimitive: (function () { + var vertexColor = vec4Create(); + return function (primitive, indices, size, attributes, worldViewProjMat, matColor) { + var colorAttrib = attributes.color; + var useVertexColor = colorAttrib.value && colorAttrib.value.length > 0; + var priColor = primitive.color; - var useMetalnessMap = !!metalnessMap; + primitive.depth = 0; + if (useVertexColor) { + vec4$2.set(priColor, 0, 0, 0, 0); + } - diffuseMap = diffuseMap || defaultDiffuseMap; - metalnessMap = metalnessMap || defaultMetalnessMap; + var clipped = true; - if (prevMaterial !== gBufferMat) { - gBufferMat.set('color', color); - gBufferMat.set('metalness', metalness); - gBufferMat.set('diffuseMap', diffuseMap); - gBufferMat.set('metalnessMap', metalnessMap); - gBufferMat.set('useMetalnessMap', +useMetalnessMap); - gBufferMat.set('uvRepeat', uvRepeat); - gBufferMat.set('uvOffset', uvOffset); + var percent = 1 / size; + for (var i = 0; i < size; i++) { + var coord = primitive.vertices[i]; + attributes.position.get(indices[i], coord); + coord[3] = 1; + vec4$2.transformMat4(coord, coord, worldViewProjMat); + if (useVertexColor) { + colorAttrib.get(indices[i], vertexColor); + // Average vertex color + // Each primitive only call fill or stroke once + // So color must be the same + vec4$2.scaleAndAdd(priColor, priColor, vertexColor, percent); + } - gBufferMat.set('linear', +standardMaterial.linear); - } - else { - program.setUniform(gl, '1f', 'metalness', metalness); + // Clipping + var x = coord[0]; + var y = coord[1]; + var z = coord[2]; + var w = coord[3]; - program.setUniform(gl, '3f', 'color', color); - if (previousDiffuseMap !== diffuseMap) { - attachTextureToSlot(this, program, 'diffuseMap', diffuseMap, 0); + // TODO Point clipping + if (x > -w && x < w && y > -w && y < w && z > -w && z < w) { + clipped = false; + } + + var invW = 1 / w; + coord[0] = x * invW; + coord[1] = y * invW; + coord[2] = z * invW; + // Use primitive average depth; + primitive.depth += coord[2]; } - if (previousMetalnessMap !== metalnessMap) { - attachTextureToSlot(this, program, 'metalnessMap', metalnessMap, 1); + + if (! clipped) { + primitive.depth /= size; + + if (useVertexColor) { + vec4$2.mul(priColor, priColor, matColor); + } + else { + vec4$2.copy(priColor, matColor); + } } - program.setUniform(gl, '1i', 'useMetalnessMap', +useMetalnessMap); - program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); - program.setUniform(gl, '2f', 'uvOffset', uvOffset); - program.setUniform(gl, '1i', 'linear', +standardMaterial.linear); + return clipped; } + })(), - previousDiffuseMap = diffuseMap; - previousMetalnessMap = metalnessMap; + _drawPrimitives: function (primitives) { + var ctx = this.ctx; + ctx.save(); - previousRenderable = renderable; - }; -} + var prevMaterial; -/** - * GBuffer is provided for deferred rendering and SSAO, SSR pass. - * It will do two passes rendering to three target textures. See - * + {@link clay.deferred.GBuffer#getTargetTexture1} - * + {@link clay.deferred.GBuffer#getTargetTexture2} - * + {@link clay.deferred.GBuffer#getTargetTexture3} - * @constructor - * @alias clay.deferred.GBuffer - * @extends clay.core.Base - */ -var GBuffer = Base.extend(function () { + var dpr = this.devicePixelRatio; + var width = this._width * dpr; + var height = this._height * dpr; + var halfWidth = width / 2; + var halfHeight = height / 2; - return { + var prevLineWidth; + var prevStrokeColor; - enableTargetTexture1: true, + for (var i = 0; i < primitives.length; i++) { + var primitive = primitives[i]; + var vertices = primitive.vertices; - enableTargetTexture2: true, + var primitiveType = primitive.type; + var material = primitive.material; + if (material !== prevMaterial) { + // Set material + ctx.globalAlpha = material.opacity; + prevMaterial = material; + } - enableTargetTexture3: true, + var colorStr = vec4ToColorStr(primitive.color); + switch (primitiveType) { + case PRIMITIVE_TRIANGLE: + var v0 = vertices[0]; + var v1 = vertices[1]; + var v2 = vertices[2]; + ctx.fillStyle = colorStr; + ctx.beginPath(); + ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); + ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); + ctx.lineTo((v2[0] + 1) * halfWidth, (-v2[1] + 1) * halfHeight); + ctx.closePath(); + ctx.fill(); + break; + case PRIMITIVE_LINE: + var v0 = vertices[0]; + var v1 = vertices[1]; + var lineWidth = primitive.lineWidth; + if (prevStrokeColor !== colorStr) { + prevStrokeColor = ctx.strokeStyle = colorStr; + } + if (lineWidth !== prevLineWidth) { + ctx.lineWidth = prevLineWidth = lineWidth; + } + ctx.beginPath(); + ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); + ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); + ctx.stroke(); + break; + case PRIMITIVE_POINT: + var pointSize = material.pointSize; + var pointShape = material.pointShape; + var halfSize = pointSize / 2; + if (pointSize > 0) { + var v0 = vertices[0]; + var cx = (v0[0] + 1) * halfWidth; + var cy = (-v0[1] + 1) * halfHeight; - renderTransparent: false, + ctx.fillStyle = colorStr; + if (pointShape === 'rectangle') { + ctx.fillRect(cx - halfSize, cy - halfSize, pointSize, pointSize); + } + else if (pointShape === 'circle') { + ctx.beginPath(); + ctx.arc(cx, cy, halfSize, 0, Math.PI * 2); + ctx.fill(); + } + } + break; + } + } - _renderList: [], - // - R: normal.x - // - G: normal.y - // - B: normal.z - // - A: glossiness - _gBufferTex1: new Texture2D({ - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST, - // PENDING - type: Texture.HALF_FLOAT - }), + ctx.restore(); + }, - // - R: depth - _gBufferTex2: new Texture2D({ - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST, - // format: Texture.DEPTH_COMPONENT, - // type: Texture.UNSIGNED_INT + dispose: function () { + this._triangles.clear(); + this._lines.clear(); + this._points.clear(); + this._primitives = []; - format: Texture.DEPTH_STENCIL, - type: Texture.UNSIGNED_INT_24_8_WEBGL - }), + this.ctx = null; + this.canvas = null; + } +}); - // - R: albedo.r - // - G: albedo.g - // - B: albedo.b - // - A: metalness - _gBufferTex3: new Texture2D({ - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST - }), +// PENDING +// Use topological sort ? - _defaultNormalMap: new Texture2D({ - image: createFillCanvas('#000') - }), - _defaultRoughnessMap: new Texture2D({ - image: createFillCanvas('#fff') - }), - _defaultMetalnessMap: new Texture2D({ - image: createFillCanvas('#fff') - }), - _defaultDiffuseMap: new Texture2D({ - image: createFillCanvas('#fff') - }), +/** + * Node of graph based post processing. + * + * @constructor clay.compositor.Node + * @extends clay.core.Base + * + */ +var Node$1 = Base.extend(function () { + return /** @lends clay.compositor.Node# */ { + /** + * @type {string} + */ + name: '', - _frameBuffer: new FrameBuffer(), + /** + * Input links, will be updated by the graph + * @example: + * inputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + inputLinks: {}, - _gBufferMaterial1: new Material({ - shader: new Shader( - Shader.source('clay.deferred.gbuffer.vertex'), - Shader.source('clay.deferred.gbuffer1.fragment') - ), - vertexDefines: { - FIRST_PASS: null - }, - fragmentDefines: { - FIRST_PASS: null - } - }), - _gBufferMaterial2: new Material({ - shader: new Shader( - Shader.source('clay.deferred.gbuffer.vertex'), - Shader.source('clay.deferred.gbuffer2.fragment') - ) - }), + /** + * Output links, will be updated by the graph + * @example: + * outputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + outputLinks: {}, - _debugPass: new Pass({ - fragment: Shader.source('clay.deferred.gbuffer.debug') - }) - }; -}, /** @lends clay.deferred.GBuffer# */{ + // Save the output texture of previous frame + // Will be used when there exist a circular reference + _prevOutputTextures: {}, + _outputTextures: {}, - /** - * Set G Buffer size. - * @param {number} width - * @param {number} height - */ - resize: function (width, height) { - if (this._gBufferTex1.width === width - && this._gBufferTex1.height === height - ) { - return; - } - this._gBufferTex1.width = width; - this._gBufferTex1.height = height; + // Example: { name: 2 } + _outputReferences: {}, - this._gBufferTex2.width = width; - this._gBufferTex2.height = height; + _rendering: false, + // If rendered in this frame + _rendered: false, - this._gBufferTex3.width = width; - this._gBufferTex3.height = height; - }, + _compositor: null + }; +}, +/** @lends clay.compositor.Node.prototype */ +{ - // TODO is dpr needed? - setViewport: function (x, y, width, height, dpr) { - var viewport; - if (typeof x === 'object') { - viewport = x; + // TODO Remove parameter function callback + updateParameter: function (outputName, renderer) { + var outputInfo = this.outputs[outputName]; + var parameters = outputInfo.parameters; + var parametersCopy = outputInfo._parametersCopy; + if (!parametersCopy) { + parametersCopy = outputInfo._parametersCopy = {}; + } + if (parameters) { + for (var key in parameters) { + if (key !== 'width' && key !== 'height') { + parametersCopy[key] = parameters[key]; + } + } + } + var width, height; + if (parameters.width instanceof Function) { + width = parameters.width.call(this, renderer); } else { - viewport = { - x: x, y: y, - width: width, height: height, - devicePixelRatio: dpr || 1 - }; + width = parameters.width; } - this._frameBuffer.viewport = viewport; - }, - - getViewport: function () { - if (this._frameBuffer.viewport) { - return this._frameBuffer.viewport; + if (parameters.height instanceof Function) { + height = parameters.height.call(this, renderer); } else { - return { - x: 0, y: 0, - width: this._gBufferTex1.width, - height: this._gBufferTex1.height, - devicePixelRatio: 1 - }; + height = parameters.height; + } + if ( + parametersCopy.width !== width + || parametersCopy.height !== height + ) { + if (this._outputTextures[outputName]) { + this._outputTextures[outputName].dispose(renderer.gl); + } } + parametersCopy.width = width; + parametersCopy.height = height; + + return parametersCopy; }, /** - * Update G Buffer - * @param {clay.Renderer} renderer - * @param {clay.Scene} scene - * @param {clay.camera.Perspective} camera + * Set parameter + * @param {string} name + * @param {} value */ - update: function (renderer, scene, camera) { + setParameter: function (name, value) {}, + /** + * Get parameter value + * @param {string} name + * @return {} + */ + getParameter: function (name) {}, + /** + * Set parameters + * @param {Object} obj + */ + setParameters: function (obj) { + for (var name in obj) { + this.setParameter(name, obj[name]); + } + }, - var gl = renderer.gl; + render: function () {}, - var frameBuffer = this._frameBuffer; - var viewport = frameBuffer.viewport; - var opaqueList = scene.opaqueList; - var transparentList = scene.transparentList; + getOutput: function (renderer /*optional*/, name) { + if (name == null) { + // Return the output texture without rendering + name = renderer; + return this._outputTextures[name]; + } + var outputInfo = this.outputs[name]; + if (!outputInfo) { + return ; + } - var offset = 0; - var renderList = this._renderList; - for (var i = 0; i < opaqueList.length; i++) { - if (!opaqueList[i].ignoreGBuffer) { - renderList[offset++] = opaqueList[i]; + // Already been rendered in this frame + if (this._rendered) { + // Force return texture in last frame + if (outputInfo.outputLastFrame) { + return this._prevOutputTextures[name]; } - } - if (this.renderTransparent) { - for (var i = 0; i < transparentList.length; i++) { - if (!transparentList[i].ignoreGBuffer) { - renderList[offset++] = transparentList[i]; - } + else { + return this._outputTextures[name]; } } - renderList.length = offset; - - gl.clearColor(0, 0, 0, 0); - gl.depthMask(true); - gl.colorMask(true, true, true, true); - gl.disable(gl.BLEND); - - var enableTargetTexture1 = this.enableTargetTexture1; - var enableTargetTexture2 = this.enableTargetTexture2; - var enableTargetTexture3 = this.enableTargetTexture3; - if (!enableTargetTexture1 && !enableTargetTexture3) { - console.warn('Can\'t disable targetTexture1 targetTexture3 both'); - enableTargetTexture1 = true; + else if ( + // TODO + this._rendering // Solve Circular Reference + ) { + if (!this._prevOutputTextures[name]) { + // Create a blank texture at first pass + this._prevOutputTextures[name] = this._compositor.allocateTexture(outputInfo.parameters || {}); + } + return this._prevOutputTextures[name]; } - if (enableTargetTexture2) { - frameBuffer.attach(this._gBufferTex2, renderer.gl.DEPTH_STENCIL_ATTACHMENT); - } + this.render(renderer); - // PENDING, scene.boundingBoxLastFrame needs be updated if have shadow - renderer.bindSceneRendering(scene); - if (enableTargetTexture1) { - // Pass 1 - frameBuffer.attach(this._gBufferTex1); - frameBuffer.bind(renderer); + return this._outputTextures[name]; + }, - if (viewport) { - var dpr = viewport.devicePixelRatio; - // use scissor to make sure only clear the viewport - gl.enable(gl.SCISSOR_TEST); - gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); + removeReference: function (outputName) { + this._outputReferences[outputName]--; + if (this._outputReferences[outputName] === 0) { + var outputInfo = this.outputs[outputName]; + if (outputInfo.keepLastFrame) { + if (this._prevOutputTextures[outputName]) { + this._compositor.releaseTexture(this._prevOutputTextures[outputName]); + } + this._prevOutputTextures[outputName] = this._outputTextures[outputName]; } - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - if (viewport) { - gl.disable(gl.SCISSOR_TEST); + else { + // Output of this node have alreay been used by all other nodes + // Put the texture back to the pool. + this._compositor.releaseTexture(this._outputTextures[outputName]); } - var gBufferMaterial1 = this._gBufferMaterial1; - var passConfig = { - getMaterial: function () { - return gBufferMaterial1; - }, - beforeRender: getBeforeRenderHook1(gl, this._defaultNormalMap, this._defaultRoughnessMap), - sortCompare: renderer.opaqueSortCompare - }; - // FIXME Use MRT if possible - renderer.renderPass(renderList, camera, passConfig); + } + }, + link: function (inputPinName, fromNode, fromPinName) { + + // The relationship from output pin to input pin is one-on-multiple + this.inputLinks[inputPinName] = { + node: fromNode, + pin: fromPinName + }; + if (!fromNode.outputLinks[fromPinName]) { + fromNode.outputLinks[fromPinName] = []; } - if (enableTargetTexture3) { + fromNode.outputLinks[fromPinName].push({ + node: this, + pin: inputPinName + }); - // Pass 2 - frameBuffer.attach(this._gBufferTex3); - frameBuffer.bind(renderer); + // Enabled the pin texture in shader + this.pass.material.enableTexture(inputPinName); + }, - if (viewport) { - var dpr = viewport.devicePixelRatio; - // use scissor to make sure only clear the viewport - gl.enable(gl.SCISSOR_TEST); - gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); - } - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - if (viewport) { - gl.disable(gl.SCISSOR_TEST); - } + clear: function () { + this.inputLinks = {}; + this.outputLinks = {}; + }, - var gBufferMaterial2 = this._gBufferMaterial2; - var passConfig = { - getMaterial: function () { - return gBufferMaterial2; - }, - beforeRender: getBeforeRenderHook2(gl, this._defaultDiffuseMap, this._defaultMetalnessMap), - sortCompare: renderer.opaqueSortCompare - }; - renderer.renderPass(renderList, camera, passConfig); + updateReference: function (outputName) { + if (!this._rendering) { + this._rendering = true; + for (var inputName in this.inputLinks) { + var link = this.inputLinks[inputName]; + link.node.updateReference(link.pin); + } + this._rendering = false; + } + if (outputName) { + this._outputReferences[outputName] ++; } + }, - renderer.bindSceneRendering(null); - frameBuffer.unbind(renderer); + beforeFrame: function () { + this._rendered = false; + + for (var name in this.outputLinks) { + this._outputReferences[name] = 0; + } }, - renderDebug: function (renderer, camera, type, viewport) { - var debugTypes = { - normal: 0, - depth: 1, - position: 2, - glossiness: 3, - metalness: 4, - albedo: 5 - }; - if (debugTypes[type] == null) { - console.warn('Unkown type "' + type + '"'); - // Default use normal - type = 'normal'; + afterFrame: function () { + // Put back all the textures to pool + for (var name in this.outputLinks) { + if (this._outputReferences[name] > 0) { + var outputInfo = this.outputs[name]; + if (outputInfo.keepLastFrame) { + if (this._prevOutputTextures[name]) { + this._compositor.releaseTexture(this._prevOutputTextures[name]); + } + this._prevOutputTextures[name] = this._outputTextures[name]; + } + else { + this._compositor.releaseTexture(this._outputTextures[name]); + } + } } + } +}); - renderer.saveClear(); - renderer.saveViewport(); - renderer.clearBit = renderer.gl.DEPTH_BUFFER_BIT; +/** + * @constructor clay.compositor.Graph + * @extends clay.core.Base + */ +var Graph = Base.extend(function () { + return /** @lends clay.compositor.Graph# */ { + /** + * @type {Array.} + */ + nodes: [] + }; +}, +/** @lends clay.compositor.Graph.prototype */ +{ - if (viewport) { - renderer.setViewport(viewport); + /** + * Mark to update + */ + dirty: function () { + this._dirty = true; + }, + /** + * @param {clay.compositor.Node} node + */ + addNode: function (node) { + + if (this.nodes.indexOf(node) >= 0) { + return; } - var viewProjectionInv = new Matrix4(); - Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); - var debugPass = this._debugPass; - debugPass.setUniform('viewportSize', [renderer.getWidth(), renderer.getHeight()]); - debugPass.setUniform('gBufferTexture1', this._gBufferTex1); - debugPass.setUniform('gBufferTexture2', this._gBufferTex2); - debugPass.setUniform('gBufferTexture3', this._gBufferTex3); - debugPass.setUniform('debug', debugTypes[type]); - debugPass.setUniform('viewProjectionInv', viewProjectionInv.array); - debugPass.render(renderer); + this.nodes.push(node); - renderer.restoreViewport(); - renderer.restoreClear(); + this._dirty = true; }, - /** - * Get first target texture. - * Channel storage: - * + R: normal.x * 0.5 + 0.5 - * + G: normal.y * 0.5 + 0.5 - * + B: normal.z * 0.5 + 0.5 - * + A: glossiness - * @return {clay.Texture2D} + * @param {clay.compositor.Node|string} node */ - getTargetTexture1: function () { - return this._gBufferTex1; + removeNode: function (node) { + if (typeof node === 'string') { + node = this.getNodeByName(node); + } + var idx = this.nodes.indexOf(node); + if (idx >= 0) { + this.nodes.splice(idx, 1); + this._dirty = true; + } }, - /** - * Get second target texture. - * Channel storage: - * + R: depth - * @return {clay.Texture2D} + * @param {string} name + * @return {clay.compositor.Node} */ - getTargetTexture2: function () { - return this._gBufferTex2; + getNodeByName: function (name) { + for (var i = 0; i < this.nodes.length; i++) { + if (this.nodes[i].name === name) { + return this.nodes[i]; + } + } }, - /** - * Get third target texture. - * Channel storage: - * + R: albedo.r - * + G: albedo.g - * + B: albedo.b - * + A: metalness - * @return {clay.Texture2D} + * Update links of graph */ - getTargetTexture3: function () { - return this._gBufferTex3; + update: function () { + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].clear(); + } + // Traverse all the nodes and build the graph + for (var i = 0; i < this.nodes.length; i++) { + var node = this.nodes[i]; + + if (!node.inputs) { + continue; + } + for (var inputName in node.inputs) { + if (!node.inputs[inputName]) { + continue; + } + if (node.pass && !node.pass.material.isUniformEnabled(inputName)) { + console.warn('Pin ' + node.name + '.' + inputName + ' not used.'); + continue; + } + var fromPinInfo = node.inputs[inputName]; + + var fromPin = this.findPin(fromPinInfo); + if (fromPin) { + node.link(inputName, fromPin.node, fromPin.pin); + } + else { + if (typeof fromPinInfo === 'string') { + console.warn('Node ' + fromPinInfo + ' not exist'); + } + else { + console.warn('Pin of ' + fromPinInfo.node + '.' + fromPinInfo.pin + ' not exist'); + } + } + } + } }, + findPin: function (input) { + var node; + // Try to take input as a directly a node + if (typeof input === 'string' || input instanceof Node$1) { + input = { + node: input + }; + } - /** - * @param {clay.Renderer} renderer - */ - dispose: function (renderer) { + if (typeof input.node === 'string') { + for (var i = 0; i < this.nodes.length; i++) { + var tmp = this.nodes[i]; + if (tmp.name === input.node) { + node = tmp; + } + } + } + else { + node = input.node; + } + if (node) { + var inputPin = input.pin; + if (!inputPin) { + // Use first pin defaultly + if (node.outputs) { + inputPin = Object.keys(node.outputs)[0]; + } + } + if (node.outputs[inputPin]) { + return { + node: node, + pin: inputPin + }; + } + } } }); -var vec3$17 = glmatrix.vec3; -var vec2$1 = glmatrix.vec2; - /** - * @constructor clay.geometry.Cone - * @extends clay.Geometry - * @param {Object} [opt] - * @param {number} [opt.topRadius] - * @param {number} [opt.bottomRadius] - * @param {number} [opt.height] - * @param {number} [opt.capSegments] - * @param {number} [opt.heightSegments] + * Compositor provide graph based post processing + * + * @constructor clay.compositor.Compositor + * @extends clay.compositor.Graph + * */ -var Cone$1 = Geometry.extend( -/** @lends clay.geometry.Cone# */ -{ - dynamic: false, - /** - * @type {number} - */ - topRadius: 0, - - /** - * @type {number} - */ - bottomRadius: 1, - - /** - * @type {number} - */ - height: 2, +var Compositor = Graph.extend(function() { + return { + // Output node + _outputs: [], - /** - * @type {number} - */ - capSegments: 20, + _texturePool: new TexturePool(), - /** - * @type {number} - */ - heightSegments: 1 -}, function() { - this.build(); + _frameBuffer: new FrameBuffer({ + depthBuffer: false + }) + }; }, -/** @lends clay.geometry.Cone.prototype */ +/** @lends clay.compositor.Compositor.prototype */ { + addNode: function(node) { + Graph.prototype.addNode.call(this, node); + node._compositor = this; + }, /** - * Build cone geometry + * @param {clay.Renderer} renderer */ - build: function() { - var positions = []; - var texcoords = []; - var faces = []; - positions.length = 0; - texcoords.length = 0; - faces.length = 0; - // Top cap - var capSegRadial = Math.PI * 2 / this.capSegments; - - var topCap = []; - var bottomCap = []; - - var r1 = this.topRadius; - var r2 = this.bottomRadius; - var y = this.height / 2; - - var c1 = vec3$17.fromValues(0, y, 0); - var c2 = vec3$17.fromValues(0, -y, 0); - for (var i = 0; i < this.capSegments; i++) { - var theta = i * capSegRadial; - var x = r1 * Math.sin(theta); - var z = r1 * Math.cos(theta); - topCap.push(vec3$17.fromValues(x, y, z)); + render: function(renderer, frameBuffer) { + if (this._dirty) { + this.update(); + this._dirty = false; - x = r2 * Math.sin(theta); - z = r2 * Math.cos(theta); - bottomCap.push(vec3$17.fromValues(x, -y, z)); + this._outputs.length = 0; + for (var i = 0; i < this.nodes.length; i++) { + if (!this.nodes[i].outputs) { + this._outputs.push(this.nodes[i]); + } + } } - // Build top cap - positions.push(c1); - // FIXME - texcoords.push(vec2$1.fromValues(0, 1)); - var n = this.capSegments; - for (var i = 0; i < n; i++) { - positions.push(topCap[i]); - // FIXME - texcoords.push(vec2$1.fromValues(i / n, 0)); - faces.push([0, i+1, (i+1) % n + 1]); + for (var i = 0; i < this.nodes.length; i++) { + // Update the reference number of each output texture + this.nodes[i].beforeFrame(); } - // Build bottom cap - var offset = positions.length; - positions.push(c2); - texcoords.push(vec2$1.fromValues(0, 1)); - for (var i = 0; i < n; i++) { - positions.push(bottomCap[i]); - // FIXME - texcoords.push(vec2$1.fromValues(i / n, 0)); - faces.push([offset, offset+((i+1) % n + 1), offset+i+1]); + for (var i = 0; i < this._outputs.length; i++) { + this._outputs[i].updateReference(); } - // Build side - offset = positions.length; - var n2 = this.heightSegments; - for (var i = 0; i < n; i++) { - for (var j = 0; j < n2+1; j++) { - var v = j / n2; - positions.push(vec3$17.lerp(vec3$17.create(), topCap[i], bottomCap[i], v)); - texcoords.push(vec2$1.fromValues(i / n, v)); - } + for (var i = 0; i < this._outputs.length; i++) { + this._outputs[i].render(renderer, frameBuffer); } - for (var i = 0; i < n; i++) { - for (var j = 0; j < n2; j++) { - var i1 = i * (n2 + 1) + j; - var i2 = ((i + 1) % n) * (n2 + 1) + j; - var i3 = ((i + 1) % n) * (n2 + 1) + j + 1; - var i4 = i * (n2 + 1) + j + 1; - faces.push([offset+i2, offset+i1, offset+i4]); - faces.push([offset+i4, offset+i3, offset+i2]); - } + + for (var i = 0; i < this.nodes.length; i++) { + // Clear up + this.nodes[i].afterFrame(); } + }, - this.attributes.position.fromArray(positions); - this.attributes.texcoord0.fromArray(texcoords); + allocateTexture: function (parameters) { + return this._texturePool.get(parameters); + }, - this.initIndicesFromArray(faces); + releaseTexture: function (parameters) { + this._texturePool.put(parameters); + }, - this.generateVertexNormals(); + getFrameBuffer: function () { + return this._frameBuffer; + }, - this.boundingBox = new BoundingBox(); - var r = Math.max(this.topRadius, this.bottomRadius); - this.boundingBox.min.set(-r, -this.height/2, -r); - this.boundingBox.max.set(r, this.height/2, r); + /** + * Dispose compositor + * @param {clay.Renderer} renderer + */ + dispose: function (renderer) { + this._texturePool.clear(renderer); } }); /** - * @constructor clay.geometry.Cylinder - * @extends clay.Geometry - * @param {Object} [opt] - * @param {number} [opt.radius] - * @param {number} [opt.height] - * @param {number} [opt.capSegments] - * @param {number} [opt.heightSegments] + * @constructor clay.compositor.SceneNode + * @extends clay.compositor.Node */ -var Cylinder$1 = Geometry.extend( -/** @lends clay.geometry.Cylinder# */ +var SceneNode$1 = Node$1.extend( +/** @lends clay.compositor.SceneNode# */ { - dynamic: false, - /** - * @type {number} - */ - radius: 1, - + name: 'scene', /** - * @type {number} + * @type {clay.Scene} */ - height: 2, - + scene: null, /** - * @type {number} + * @type {clay.Camera} */ - capSegments: 50, - + camera: null, /** - * @type {number} + * @type {boolean} */ - heightSegments: 1 -}, function() { - this.build(); -}, -/** @lends clay.geometry.Cylinder.prototype */ -{ + autoUpdateScene: true, /** - * Build cylinder geometry + * @type {boolean} */ - build: function() { - var cone = new Cone$1({ - topRadius: this.radius, - bottomRadius: this.radius, - capSegments: this.capSegments, - heightSegments: this.heightSegments, - height: this.height - }); + preZ: false - this.attributes.position.value = cone.attributes.position.value; - this.attributes.normal.value = cone.attributes.normal.value; - this.attributes.texcoord0.value = cone.attributes.texcoord0.value; - this.indices = cone.indices; +}, function() { + this.frameBuffer = new FrameBuffer(); +}, { + render: function(renderer) { - this.boundingBox = cone.boundingBox; - } -}); + this._rendering = true; + var _gl = renderer.gl; -var lightvolumeGlsl = "@export clay.deferred.light_volume.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_Position;\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, 1.0);\n v_Position = position;\n}\n@end"; + this.trigger('beforerender'); -var spotGlsl = "@export clay.deferred.spot_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\n@import clay.util.calculate_attenuation\nuniform vec3 lightPosition;\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform float umbraAngleCosine;\nuniform float penumbraAngleCosine;\nuniform float lightRange;\nuniform float falloffFactor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform mat4 lightMatrix;\nuniform float lightShadowMapSize;\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n float attenuation = lightAttenuation(dist, lightRange);\n float c = dot(-normalize(lightDirection), L);\n float falloff = clamp((c - umbraAngleCosine) / (penumbraAngleCosine - umbraAngleCosine), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = (1.0 - falloff) * attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrix, position, lightShadowMapSize\n );\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; + var renderInfo; -var directionalGlsl = "@export clay.deferred.directional_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform float lightShadowMapSize;\nuniform mat4 lightMatrices[SHADOW_CASCADE];\nuniform float shadowCascadeClipsNear[SHADOW_CASCADE];\nuniform float shadowCascadeClipsFar[SHADOW_CASCADE];\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = -normalize(lightDirection);\n vec3 V = normalize(eyePosition - position);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = 1.0;\n for (int _idx_ = 0; _idx_ < SHADOW_CASCADE; _idx_++) {{\n if (\n z >= shadowCascadeClipsNear[_idx_] &&\n z <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrices[_idx_], position, lightShadowMapSize,\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n }\n }}\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; + if (!this.outputs) { -var ambientGlsl = "@export clay.deferred.ambient_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec2 windowSize: WINDOW_SIZE;\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo;\n gl_FragColor.a = 1.0;\n}\n@end"; + renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); -var ambientshGlsl = "@export clay.deferred.ambient_sh_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec3 lightCoefficients[9];\nuniform vec2 windowSize: WINDOW_SIZE;\nvec3 calcAmbientSHLight(vec3 N) {\n return lightCoefficients[0]\n + lightCoefficients[1] * N.x\n + lightCoefficients[2] * N.y\n + lightCoefficients[3] * N.z\n + lightCoefficients[4] * N.x * N.z\n + lightCoefficients[5] * N.z * N.y\n + lightCoefficients[6] * N.y * N.x\n + lightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + lightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 N = texel1.rgb * 2.0 - 1.0;\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo * calcAmbientSHLight(N);\n gl_FragColor.a = 1.0;\n}\n@end"; + } + else { -var ambientcubemapGlsl = "@export clay.deferred.ambient_cubemap_light\n@import clay.deferred.chunk.light_head\nuniform vec3 lightColor;\nuniform samplerCube lightCubemap;\nuniform sampler2D brdfLookup;\nuniform vec3 eyePosition;\n@import clay.util.rgbm\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 V = normalize(eyePosition - position);\n vec3 L = reflect(-V, N);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float rough = clamp(1.0 - glossiness, 0.0, 1.0);\n float bias = rough * 5.0;\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n vec3 envWeight = specularColor * brdfParam.x + brdfParam.y;\n vec3 envTexel = RGBMDecode(textureCubeLodEXT(lightCubemap, L, bias), 51.5);\n gl_FragColor.rgb = lightColor * envTexel * envWeight;\n gl_FragColor.a = 1.0;\n}\n@end"; + var frameBuffer = this.frameBuffer; + for (var name in this.outputs) { + var parameters = this.updateParameter(name, renderer); + var outputInfo = this.outputs[name]; + var texture = this._compositor.allocateTexture(parameters); + this._outputTextures[name] = texture; -var pointGlsl = "@export clay.deferred.point_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform samplerCube lightShadowMap;\nuniform float lightShadowMapSize;\n#endif\nvarying vec3 v_Position;\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContribOmni(\n lightShadowMap, -L * dist, lightRange\n );\n gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n#endif\n gl_FragColor.a = 1.0;\n}\n@end"; + var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; + if (typeof(attachment) == 'string') { + attachment = _gl[attachment]; + } + frameBuffer.attach(texture, attachment); + } + frameBuffer.bind(renderer); -var sphereGlsl = "@export clay.deferred.sphere_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform float lightRadius;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n vec3 R = reflect(V, N);\n float tmp = dot(L, R);\n vec3 cToR = tmp * R - L;\n float d = length(cToR);\n L = L + cToR * clamp(lightRadius / d, 0.0, 1.0);\n L = normalize(L);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = lightColor * ndl * attenuation;\n glossiness = clamp(glossiness - lightRadius / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n gl_FragColor.a = 1.0;\n}\n@end"; + // MRT Support in chrome + // https://www.khronos.org/registry/webgl/sdk/tests/conformance/extensions/ext-draw-buffers.html + var ext = renderer.getGLExtension('EXT_draw_buffers'); + if (ext) { + var bufs = []; + for (var attachment in this.outputs) { + attachment = parseInt(attachment); + if (attachment >= _gl.COLOR_ATTACHMENT0 && attachment <= _gl.COLOR_ATTACHMENT0 + 8) { + bufs.push(attachment); + } + } + ext.drawBuffersEXT(bufs); + } -var tubeGlsl = "@export clay.deferred.tube_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 lightExtend;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n vec3 R = reflect(V, N);\n vec3 L0 = lightPosition - lightExtend - position;\n vec3 L1 = lightPosition + lightExtend - position;\n vec3 LD = L1 - L0;\n float len0 = length(L0);\n float len1 = length(L1);\n float irra = 2.0 * clamp(dot(N, L0) / (2.0 * len0) + dot(N, L1) / (2.0 * len1), 0.0, 1.0);\n float LDDotR = dot(R, LD);\n float t = (LDDotR * dot(R, L0) - dot(L0, LD)) / (dot(LD, LD) - LDDotR * LDDotR);\n t = clamp(t, 0.0, 1.0);\n L = L0 + t * LD;\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n glossiness = clamp(glossiness - 0.0 / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = lightColor * irra * lightAttenuation(dist, lightRange)\n * (diffuseColor + D_Phong(glossiness, ndh) * F_Schlick(ndv, specularColor));\n gl_FragColor.a = 1.0;\n}\n@end"; + // Always clear + // PENDING + renderer.saveClear(); + renderer.clearBit = glenum.DEPTH_BUFFER_BIT | glenum.COLOR_BUFFER_BIT; + renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); + renderer.restoreClear(); -// Light-pre pass deferred rendering -// http://www.realtimerendering.com/blog/deferred-lighting-approaches/ -// Light shaders -Shader.import(prezGlsl); -Shader.import(utilGlsl); -Shader.import(lightvolumeGlsl); + frameBuffer.unbind(renderer); + } -// Light shaders -Shader.import(spotGlsl); -Shader.import(directionalGlsl); -Shader.import(ambientGlsl); -Shader.import(ambientshGlsl); -Shader.import(ambientcubemapGlsl); -Shader.import(pointGlsl); -Shader.import(sphereGlsl); -Shader.import(tubeGlsl); + this.trigger('afterrender', renderInfo); -Shader.import(prezGlsl); + this._rendering = false; + this._rendered = true; + } +}); /** - * Deferred renderer - * @constructor - * @alias clay.deferred.Renderer - * @extends clay.core.Base + * @constructor clay.compositor.TextureNode + * @extends clay.compositor.Node */ -var DeferredRenderer = Base.extend(function () { - - var fullQuadVertex = Shader.source('clay.compositor.vertex'); - var lightVolumeVertex = Shader.source('clay.deferred.light_volume.vertex'); - - var directionalLightShader = new Shader(fullQuadVertex, Shader.source('clay.deferred.directional_light')); - - var lightAccumulateBlendFunc = function (gl) { - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.ONE, gl.ONE); - }; - - var createLightPassMat = function (shader) { - return new Material({ - shader: shader, - blend: lightAccumulateBlendFunc, - transparent: true, - depthMask: false - }); - }; +var TextureNode$1 = Node$1.extend(function() { + return /** @lends clay.compositor.TextureNode# */ { + /** + * @type {clay.Texture2D} + */ + texture: null, - var createVolumeShader = function (name) { - return new Shader(lightVolumeVertex, Shader.source('clay.deferred.' + name)); + // Texture node must have output without parameters + outputs: { + color: {} + } }; +}, function () { +}, { - // Rotate and positioning to fit the spot light - // Which the cusp of cone pointing to the positive z - // and positioned on the origin - var coneGeo = new Cone$1({ - capSegments: 10 - }); - var mat = new Matrix4(); - mat.rotateX(Math.PI / 2) - .translate(new Vector3(0, -1, 0)); + getOutput: function (renderer, name) { + return this.texture; + }, - coneGeo.applyTransform(mat); + // Do nothing + beforeFrame: function () {}, + afterFrame: function () {} +}); - var cylinderGeo = new Cylinder$1({ - capSegments: 10 - }); - // Align with x axis - mat.identity().rotateZ(Math.PI / 2); - cylinderGeo.applyTransform(mat); +// TODO Shader library +// TODO curlnoise demo wrong - return /** @lends clay.deferred.Renderer# */ { +// PENDING +// Use topological sort ? +/** + * Filter node + * + * @constructor clay.compositor.FilterNode + * @extends clay.compositor.Node + * + * @example + var node = new clay.compositor.Node({ + name: 'fxaa', + shader: clay.Shader.source('clay.compositor.fxaa'), + inputs: { + texture: { + node: 'scene', + pin: 'color' + } + }, + // Multiple outputs is preserved for MRT support in WebGL2.0 + outputs: { + color: { + attachment: clay.FrameBuffer.COLOR_ATTACHMENT0 + parameters: { + format: clay.Texture.RGBA, + width: 512, + height: 512 + }, + // Node will keep the RTT rendered in last frame + keepLastFrame: true, + // Force the node output the RTT rendered in last frame + outputLastFrame: true + } + } + }); + * + */ +var FilterNode$1 = Node$1.extend(function () { + return /** @lends clay.compositor.Node# */ { /** - * Provide ShadowMapPass for shadow rendering. - * @type {clay.prePass.ShadowMap} + * @type {string} */ - shadowMapPass: null, + name: '', + /** - * If enable auto resizing from given defualt renderer size. - * @type {boolean} + * @type {Object} */ - autoResize: true, + inputs: {}, - _createLightPassMat: createLightPassMat, + /** + * @type {Object} + */ + outputs: null, - _gBuffer: new GBuffer(), + /** + * @type {string} + */ + shader: '', - _lightAccumFrameBuffer: new FrameBuffer({ - depthBuffer: false - }), + /** + * Input links, will be updated by the graph + * @example: + * inputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + inputLinks: {}, - _lightAccumTex: new Texture2D({ - // FIXME Device not support float texture - type: Texture.HALF_FLOAT, - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST - }), + /** + * Output links, will be updated by the graph + * @example: + * outputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + outputLinks: {}, - _fullQuadPass: new Pass({ - blendWithPrevious: true - }), + /** + * @type {clay.compositor.Pass} + */ + pass: null, - _directionalLightMat: createLightPassMat(directionalLightShader), + // Save the output texture of previous frame + // Will be used when there exist a circular reference + _prevOutputTextures: {}, + _outputTextures: {}, - _ambientMat: createLightPassMat(new Shader( - fullQuadVertex, Shader.source('clay.deferred.ambient_light') - )), - _ambientSHMat: createLightPassMat(new Shader( - fullQuadVertex, Shader.source('clay.deferred.ambient_sh_light') - )), - _ambientCubemapMat: createLightPassMat(new Shader( - fullQuadVertex, Shader.source('clay.deferred.ambient_cubemap_light') - )), + // Example: { name: 2 } + _outputReferences: {}, - _spotLightShader: createVolumeShader('spot_light'), - _pointLightShader: createVolumeShader('point_light'), + _rendering: false, + // If rendered in this frame + _rendered: false, - _sphereLightShader: createVolumeShader('sphere_light'), - _tubeLightShader: createVolumeShader('tube_light'), + _compositor: null + }; +}, function () { - _lightSphereGeo: new Sphere$1({ - widthSegments: 10, - heightSegements: 10 - }), + var pass = new Pass({ + fragment: this.shader + }); + this.pass = pass; +}, +/** @lends clay.compositor.Node.prototype */ +{ + /** + * @param {clay.Renderer} renderer + */ + render: function (renderer, frameBuffer) { + this.trigger('beforerender', renderer); - _lightConeGeo: coneGeo, + this._rendering = true; - _lightCylinderGeo: cylinderGeo, + var _gl = renderer.gl; - _outputPass: new Pass({ - fragment: Shader.source('clay.compositor.output') - }) - }; -}, /** @lends clay.deferred.Renderer# */ { - /** - * Do render - * @param {clay.Renderer} renderer - * @param {clay.Scene} scene - * @param {clay.Camera} camera - * @param {Object} [opts] - * @param {boolean} [opts.renderToTarget = false] If not ouput and render to the target texture - * @param {boolean} [opts.notUpdateShadow = true] If not update the shadow. - * @param {boolean} [opts.notUpdateScene = true] If not update the scene. - */ - render: function (renderer, scene, camera, opts) { + for (var inputName in this.inputLinks) { + var link = this.inputLinks[inputName]; + var inputTexture = link.node.getOutput(renderer, link.pin); + this.pass.setUniform(inputName, inputTexture); + } + // Output + if (!this.outputs) { + this.pass.outputs = null; - opts = opts || {}; - opts.renderToTarget = opts.renderToTarget || false; - opts.notUpdateShadow = opts.notUpdateShadow || false; - opts.notUpdateScene = opts.notUpdateScene || false; + this._compositor.getFrameBuffer().unbind(renderer); - if (!opts.notUpdateScene) { - scene.update(false, true); + this.pass.render(renderer, frameBuffer); } + else { + this.pass.outputs = {}; - camera.update(true); + var attachedTextures = {}; + for (var name in this.outputs) { + var parameters = this.updateParameter(name, renderer); + if (isNaN(parameters.width)) { + this.updateParameter(name, renderer); + } + var outputInfo = this.outputs[name]; + var texture = this._compositor.allocateTexture(parameters); + this._outputTextures[name] = texture; + var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; + if (typeof(attachment) == 'string') { + attachment = _gl[attachment]; + } + attachedTextures[attachment] = texture; + } + this._compositor.getFrameBuffer().bind(renderer); - // PENDING For stereo rendering - var dpr = renderer.getDevicePixelRatio(); - if (this.autoResize - && (renderer.getWidth() * dpr !== this._lightAccumTex.width - || renderer.getHeight() * dpr !== this._lightAccumTex.height) - ) { - this.resize(renderer.getWidth() * dpr, renderer.getHeight() * dpr); + for (var attachment in attachedTextures) { + // FIXME attachment changes in different nodes + this._compositor.getFrameBuffer().attach( + attachedTextures[attachment], attachment + ); + } + + this.pass.render(renderer); + + // Because the data of texture is changed over time, + // Here update the mipmaps of texture each time after rendered; + this._compositor.getFrameBuffer().updateMipmap(renderer.gl); } - this._gBuffer.update(renderer, scene, camera); + for (var inputName in this.inputLinks) { + var link = this.inputLinks[inputName]; + link.node.removeReference(link.pin); + } - // Accumulate light buffer - this._accumulateLightBuffer(renderer, scene, camera, !opts.notUpdateShadow); + this._rendering = false; + this._rendered = true; - if (!opts.renderToTarget) { - this._outputPass.setUniform('texture', this._lightAccumTex); + this.trigger('afterrender', renderer); + }, - this._outputPass.render(renderer); - // this._gBuffer.renderDebug(renderer, camera, 'normal'); + // TODO Remove parameter function callback + updateParameter: function (outputName, renderer) { + var outputInfo = this.outputs[outputName]; + var parameters = outputInfo.parameters; + var parametersCopy = outputInfo._parametersCopy; + if (!parametersCopy) { + parametersCopy = outputInfo._parametersCopy = {}; + } + if (parameters) { + for (var key in parameters) { + if (key !== 'width' && key !== 'height') { + parametersCopy[key] = parameters[key]; + } + } + } + var width, height; + if (parameters.width instanceof Function) { + width = parameters.width.call(this, renderer); + } + else { + width = parameters.width; + } + if (parameters.height instanceof Function) { + height = parameters.height.call(this, renderer); + } + else { + height = parameters.height; + } + if ( + parametersCopy.width !== width + || parametersCopy.height !== height + ) { + if (this._outputTextures[outputName]) { + this._outputTextures[outputName].dispose(renderer); + } } + parametersCopy.width = width; + parametersCopy.height = height; + + return parametersCopy; }, /** - * @return {clay.Texture2D} + * Set parameter + * @param {string} name + * @param {} value */ - getTargetTexture: function () { - return this._lightAccumTex; + setParameter: function (name, value) { + this.pass.setUniform(name, value); }, - /** - * @return {clay.FrameBuffer} + * Get parameter value + * @param {string} name + * @return {} */ - getTargetFrameBuffer: function () { - return this._lightAccumFrameBuffer; + getParameter: function (name) { + return this.pass.getUniform(name); }, - /** - * @return {clay.deferred.GBuffer} + * Set parameters + * @param {Object} obj */ - getGBuffer: function () { - return this._gBuffer; - }, - - // TODO is dpr needed? - setViewport: function (x, y, width, height, dpr) { - this._gBuffer.setViewport(x, y, width, height, dpr); - this._lightAccumFrameBuffer.viewport = this._gBuffer.getViewport(); + setParameters: function (obj) { + for (var name in obj) { + this.setParameter(name, obj[name]); + } }, - - // getFullQuadLightPass: function () { - // return this._fullQuadPass; + // /** + // * Set shader code + // * @param {string} shaderStr + // */ + // setShader: function (shaderStr) { + // var material = this.pass.material; + // material.shader.setFragment(shaderStr); + // material.attachShader(material.shader, true); // }, - /** - * Set renderer size. - * @param {number} width - * @param {number} height + * Proxy of pass.material.define('fragment', xxx); + * @param {string} symbol + * @param {number} [val] */ - resize: function (width, height) { - this._lightAccumTex.width = width; - this._lightAccumTex.height = height; - - // PENDING viewport ? - this._gBuffer.resize(width, height); + define: function (symbol, val) { + this.pass.material.define('fragment', symbol, val); }, - _accumulateLightBuffer: function (renderer, scene, camera, updateShadow) { - var gl = renderer.gl; - var lightAccumTex = this._lightAccumTex; - var lightAccumFrameBuffer = this._lightAccumFrameBuffer; - - var eyePosition = camera.getWorldPosition().array; - - // Update volume meshes - for (var i = 0; i < scene.lights.length; i++) { - this._updateLightProxy(scene.lights[i]); - } - - var shadowMapPass = this.shadowMapPass; - if (shadowMapPass && updateShadow) { - gl.clearColor(1, 1, 1, 1); - this._prepareLightShadow(renderer, scene, camera); - } - - this.trigger('beforelightaccumulate', renderer, scene, camera, updateShadow); - - lightAccumFrameBuffer.attach(lightAccumTex); - lightAccumFrameBuffer.bind(renderer); - var clearColor = renderer.clearColor; - - var viewport = lightAccumFrameBuffer.viewport; - if (viewport) { - var dpr = viewport.devicePixelRatio; - // use scissor to make sure only clear the viewport - gl.enable(gl.SCISSOR_TEST); - gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); - } - gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); - gl.clear(gl.COLOR_BUFFER_BIT); - gl.enable(gl.BLEND); - if (viewport) { - gl.disable(gl.SCISSOR_TEST); - } - - this.trigger('startlightaccumulate', renderer, scene, camera); - - var viewProjectionInv = new Matrix4(); - Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); - - var volumeMeshList = []; - - for (var i = 0; i < scene.lights.length; i++) { - var light = scene.lights[i]; - var uTpl = light.uniformTemplates; - - var volumeMesh = light.volumeMesh || light.__volumeMesh; - - if (volumeMesh) { - var material = volumeMesh.material; - // Volume mesh will affect the scene bounding box when rendering - // if castShadow is true - volumeMesh.castShadow = false; - - var unknownLightType = false; - switch (light.type) { - case 'POINT_LIGHT': - material.setUniform('lightColor', uTpl.pointLightColor.value(light)); - material.setUniform('lightRange', uTpl.pointLightRange.value(light)); - material.setUniform('lightPosition', uTpl.pointLightPosition.value(light)); - break; - case 'SPOT_LIGHT': - material.setUniform('lightPosition', uTpl.spotLightPosition.value(light)); - material.setUniform('lightColor', uTpl.spotLightColor.value(light)); - material.setUniform('lightRange', uTpl.spotLightRange.value(light)); - material.setUniform('lightDirection', uTpl.spotLightDirection.value(light)); - material.setUniform('umbraAngleCosine', uTpl.spotLightUmbraAngleCosine.value(light)); - material.setUniform('penumbraAngleCosine', uTpl.spotLightPenumbraAngleCosine.value(light)); - material.setUniform('falloffFactor', uTpl.spotLightFalloffFactor.value(light)); - break; - case 'SPHERE_LIGHT': - material.setUniform('lightColor', uTpl.sphereLightColor.value(light)); - material.setUniform('lightRange', uTpl.sphereLightRange.value(light)); - material.setUniform('lightRadius', uTpl.sphereLightRadius.value(light)); - material.setUniform('lightPosition', uTpl.sphereLightPosition.value(light)); - break; - case 'TUBE_LIGHT': - material.setUniform('lightColor', uTpl.tubeLightColor.value(light)); - material.setUniform('lightRange', uTpl.tubeLightRange.value(light)); - material.setUniform('lightExtend', uTpl.tubeLightExtend.value(light)); - material.setUniform('lightPosition', uTpl.tubeLightPosition.value(light)); - break; - default: - unknownLightType = true; - } - - if (unknownLightType) { - continue; - } - - material.setUniform('eyePosition', eyePosition); - material.setUniform('viewProjectionInv', viewProjectionInv.array); - material.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); - material.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); - material.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); - - volumeMeshList.push(volumeMesh); - - } - else { - var pass = this._fullQuadPass; - var unknownLightType = false; - // Full quad light - switch (light.type) { - case 'AMBIENT_LIGHT': - pass.material = this._ambientMat; - pass.material.setUniform('lightColor', uTpl.ambientLightColor.value(light)); - break; - case 'AMBIENT_SH_LIGHT': - pass.material = this._ambientSHMat; - pass.material.setUniform('lightColor', uTpl.ambientSHLightColor.value(light)); - pass.material.setUniform('lightCoefficients', uTpl.ambientSHLightCoefficients.value(light)); - break; - case 'AMBIENT_CUBEMAP_LIGHT': - pass.material = this._ambientCubemapMat; - pass.material.setUniform('lightColor', uTpl.ambientCubemapLightColor.value(light)); - pass.material.setUniform('lightCubemap', uTpl.ambientCubemapLightCubemap.value(light)); - pass.material.setUniform('brdfLookup', uTpl.ambientCubemapLightBRDFLookup.value(light)); - break; - case 'DIRECTIONAL_LIGHT': - var hasShadow = shadowMapPass && light.castShadow; - pass.material = this._directionalLightMat; - pass.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); - if (hasShadow) { - pass.material.define('fragment', 'SHADOW_CASCADE', light.shadowCascade); - } - pass.material.setUniform('lightColor', uTpl.directionalLightColor.value(light)); - pass.material.setUniform('lightDirection', uTpl.directionalLightDirection.value(light)); - break; - default: - // Unkonw light type - unknownLightType = true; - } - if (unknownLightType) { - continue; - } - - var passMaterial = pass.material; - passMaterial.setUniform('eyePosition', eyePosition); - passMaterial.setUniform('viewProjectionInv', viewProjectionInv.array); - passMaterial.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); - passMaterial.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); - passMaterial.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); - - // TODO - if (shadowMapPass && light.castShadow) { - passMaterial.setUniform('lightShadowMap', light.__shadowMap); - passMaterial.setUniform('lightMatrices', light.__lightMatrices); - passMaterial.setUniform('shadowCascadeClipsNear', light.__cascadeClipsNear); - passMaterial.setUniform('shadowCascadeClipsFar', light.__cascadeClipsFar); + /** + * Proxy of pass.material.undefine('fragment', xxx) + * @param {string} symbol + */ + undefine: function (symbol) { + this.pass.material.undefine('fragment', symbol); + }, - passMaterial.setUniform('lightShadowMapSize', light.shadowResolution); + removeReference: function (outputName) { + this._outputReferences[outputName]--; + if (this._outputReferences[outputName] === 0) { + var outputInfo = this.outputs[outputName]; + if (outputInfo.keepLastFrame) { + if (this._prevOutputTextures[outputName]) { + this._compositor.releaseTexture(this._prevOutputTextures[outputName]); } - - pass.renderQuad(renderer); + this._prevOutputTextures[outputName] = this._outputTextures[outputName]; + } + else { + // Output of this node have alreay been used by all other nodes + // Put the texture back to the pool. + this._compositor.releaseTexture(this._outputTextures[outputName]); } } - - this._renderVolumeMeshList(renderer, camera, volumeMeshList); - - this.trigger('lightaccumulate', renderer, scene, camera); - - lightAccumFrameBuffer.unbind(renderer); - - this.trigger('afterlightaccumulate', renderer, scene, camera); - }, - _prepareLightShadow: (function () { - var worldView = new Matrix4(); - return function (renderer, scene, camera) { - var shadowCasters; + clear: function () { + Node$1.prototype.clear.call(this); - shadowCasters = this._shadowCasters || (this._shadowCasters = []); - var count = 0; - var list = scene.opaqueList; - for (var i = 0; i < list.length; i++) { - if (list[i].castShadow) { - shadowCasters[count++] = list[i]; - } - } - shadowCasters.length = count; + // Default disable all texture + this.pass.material.disableTexturesAll(); + } +}); - for (var i = 0; i < scene.lights.length; i++) { - var light = scene.lights[i]; - var volumeMesh = light.volumeMesh || light.__volumeMesh; - if (!light.castShadow) { - continue; - } +var shaderSourceReg = /^#source\((.*?)\)/; - switch (light.type) { - case 'POINT_LIGHT': - case 'SPOT_LIGHT': - // Frustum culling - Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); - if (renderer.isFrustumCulled( - volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array - )) { - continue; - } +/** + * @name clay.compositor.createCompositor + * @function + * @param {Object} json + * @param {Object} [opts] + * @return {clay.compositor.Compositor} + */ +function createCompositor(json, opts) { + var compositor = new Compositor(); + opts = opts || {}; - this._prepareSingleLightShadow( - renderer, scene, camera, light, shadowCasters, volumeMesh.material - ); - break; - case 'DIRECTIONAL_LIGHT': - this._prepareSingleLightShadow( - renderer, scene, camera, light, shadowCasters, null - ); - } + var lib = { + textures: {}, + parameters: {} + }; + var afterLoad = function(shaderLib, textureLib) { + for (var i = 0; i < json.nodes.length; i++) { + var nodeInfo = json.nodes[i]; + var node = createNode(nodeInfo, lib, opts); + if (node) { + compositor.addNode(node); } - }; - })(), + } + }; - _prepareSingleLightShadow: function (renderer, scene, camera, light, casters, material) { - switch (light.type) { - case 'POINT_LIGHT': - var shadowMaps = []; - this.shadowMapPass.renderPointLightShadow( - renderer, scene, light, casters, shadowMaps - ); - material.setUniform('lightShadowMap', shadowMaps[0]); - material.setUniform('lightShadowMapSize', light.shadowResolution); - break; - case 'SPOT_LIGHT': - var shadowMaps = []; - var lightMatrices = []; - this.shadowMapPass.renderSpotLightShadow( - renderer, scene, light, casters, lightMatrices, shadowMaps - ); - material.setUniform('lightShadowMap', shadowMaps[0]); - material.setUniform('lightMatrix', lightMatrices[0]); - material.setUniform('lightShadowMapSize', light.shadowResolution); - break; - case 'DIRECTIONAL_LIGHT': - var shadowMaps = []; - var lightMatrices = []; - var cascadeClips = []; - this.shadowMapPass.renderDirectionalLightShadow( - renderer, scene, camera, light, casters, cascadeClips, lightMatrices, shadowMaps - ); - var cascadeClipsNear = cascadeClips.slice(); - var cascadeClipsFar = cascadeClips.slice(); - cascadeClipsNear.pop(); - cascadeClipsFar.shift(); + for (var name in json.parameters) { + var paramInfo = json.parameters[name]; + lib.parameters[name] = convertParameter(paramInfo); + } + // TODO load texture asynchronous + loadTextures(json, lib, opts, function(textureLib) { + lib.textures = textureLib; + afterLoad(); + }); - // Iterate from far to near - cascadeClipsNear.reverse(); - cascadeClipsFar.reverse(); - lightMatrices.reverse(); + return compositor; +} - light.__cascadeClipsNear = cascadeClipsNear; - light.__cascadeClipsFar = cascadeClipsFar; - light.__shadowMap = shadowMaps[0]; - light.__lightMatrices = lightMatrices; - break; +function createNode(nodeInfo, lib, opts) { + var type = nodeInfo.type || 'filter'; + var shaderSource; + var inputs; + var outputs; + + if (type === 'filter') { + var shaderExp = nodeInfo.shader.trim(); + var res = shaderSourceReg.exec(shaderExp); + if (res) { + shaderSource = Shader.source(res[1].trim()); } - }, + else if (shaderExp.charAt(0) === '#') { + shaderSource = lib.shaders[shaderExp.substr(1)]; + } + if (!shaderSource) { + shaderSource = shaderExp; + } + if (!shaderSource) { + return; + } + } - // Update light volume mesh - // Light volume mesh is rendered in light accumulate pass instead of full quad. - // It will reduce pixels significantly when local light is relatively small. - // And we can use custom volume mesh to shape the light. - // - // See "Deferred Shading Optimizations" in GDC2011 - _updateLightProxy: function (light) { - var volumeMesh; - if (light.volumeMesh) { - volumeMesh = light.volumeMesh; + if (nodeInfo.inputs) { + inputs = {}; + for (var name in nodeInfo.inputs) { + if (typeof nodeInfo.inputs[name] === 'string') { + inputs[name] = nodeInfo.inputs[name]; + } + else { + inputs[name] = { + node: nodeInfo.inputs[name].node, + pin: nodeInfo.inputs[name].pin + }; + } } - else { - switch (light.type) { - // Only local light (point and spot) needs volume mesh. - // Directional and ambient light renders in full quad - case 'POINT_LIGHT': - case 'SPHERE_LIGHT': - var shader = light.type === 'SPHERE_LIGHT' - ? this._sphereLightShader : this._pointLightShader; - // Volume mesh created automatically - if (!light.__volumeMesh) { - light.__volumeMesh = new Mesh({ - material: this._createLightPassMat(shader), - geometry: this._lightSphereGeo, - // Disable culling - // if light volume mesh intersect camera near plane - // We need mesh inside can still be rendered - culling: false - }); + } + if (nodeInfo.outputs) { + outputs = {}; + for (var name in nodeInfo.outputs) { + var outputInfo = nodeInfo.outputs[name]; + outputs[name] = {}; + if (outputInfo.attachment != null) { + outputs[name].attachment = outputInfo.attachment; + } + if (outputInfo.keepLastFrame != null) { + outputs[name].keepLastFrame = outputInfo.keepLastFrame; + } + if (outputInfo.outputLastFrame != null) { + outputs[name].outputLastFrame = outputInfo.outputLastFrame; + } + if (outputInfo.parameters) { + outputs[name].parameters = convertParameter(outputInfo.parameters); + } + } + } + var node; + if (type === 'scene') { + node = new SceneNode$1({ + name: nodeInfo.name, + scene: opts.scene, + camera: opts.camera, + outputs: outputs + }); + } + else if (type === 'texture') { + node = new TextureNode$1({ + name: nodeInfo.name, + outputs: outputs + }); + } + // Default is filter + else { + node = new FilterNode$1({ + name: nodeInfo.name, + shader: shaderSource, + inputs: inputs, + outputs: outputs + }); + } + if (node) { + if (nodeInfo.parameters) { + for (var name in nodeInfo.parameters) { + var val = nodeInfo.parameters[name]; + if (typeof(val) === 'string') { + val = val.trim(); + if (val.charAt(0) === '#') { + val = lib.textures[val.substr(1)]; } - volumeMesh = light.__volumeMesh; - var r = light.range + (light.radius || 0); - volumeMesh.scale.set(r, r, r); - break; - case 'SPOT_LIGHT': - light.__volumeMesh = light.__volumeMesh || new Mesh({ - material: this._createLightPassMat(this._spotLightShader), - geometry: this._lightConeGeo, - culling: false - }); - volumeMesh = light.__volumeMesh; - var aspect = Math.tan(light.penumbraAngle * Math.PI / 180); - var range = light.range; - volumeMesh.scale.set(aspect * range, aspect * range, range / 2); - break; - case 'TUBE_LIGHT': - light.__volumeMesh = light.__volumeMesh || new Mesh({ - material: this._createLightPassMat(this._tubeLightShader), - geometry: this._lightCylinderGeo, - culling: false - }); - volumeMesh = light.__volumeMesh; - var range = light.range; - volumeMesh.scale.set(light.length / 2 + range, range, range); - break; + else { + node.on( + 'beforerender', createSizeSetHandler( + name, tryConvertExpr(val) + ) + ); + } + } + node.setParameter(name, val); } } - if (volumeMesh) { - volumeMesh.update(); - // Apply light transform - Matrix4.multiply(volumeMesh.worldTransform, light.worldTransform, volumeMesh.worldTransform); - var hasShadow = this.shadowMapPass && light.castShadow; - volumeMesh.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); + if (nodeInfo.defines && node.pass) { + for (var name in nodeInfo.defines) { + var val = nodeInfo.defines[name]; + node.pass.material.define('fragment', name, val); + } } - }, + } + return node; +} - _renderVolumeMeshList: (function () { - var worldViewProjection = new Matrix4(); - var worldView = new Matrix4(); - var preZMaterial = new Material({ - shader: new Shader(Shader.source('clay.prez.vertex'), Shader.source('clay.prez.fragment')) +function convertParameter(paramInfo) { + var param = {}; + if (!paramInfo) { + return param; + } + ['type', 'minFilter', 'magFilter', 'wrapS', 'wrapT', 'flipY', 'useMipmap'] + .forEach(function(name) { + var val = paramInfo[name]; + if (val != null) { + // Convert string to enum + if (typeof val === 'string') { + val = Texture[val]; + } + param[name] = val; + } }); - return function (renderer, camera, volumeMeshList) { - var gl = renderer.gl; - - gl.enable(gl.DEPTH_TEST); - gl.disable(gl.CULL_FACE); - gl.blendEquation(gl.FUNC_ADD); - gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE); - gl.depthFunc(gl.LEQUAL); - - gl.clear(gl.DEPTH_BUFFER_BIT); - - var viewport = renderer.viewport; - var dpr = viewport.devicePixelRatio; - var viewportUniform = [ - viewport.x * dpr, viewport.y * dpr, - viewport.width * dpr, viewport.height * dpr - ]; - - var windowSizeUniform = [ - this._lightAccumTex.width, - this._lightAccumTex.height - ]; - - for (var i = 0; i < volumeMeshList.length; i++) { - var volumeMesh = volumeMeshList[i]; - - // Frustum culling - Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); - if (renderer.isFrustumCulled( - volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array - )) { - continue; + ['width', 'height'] + .forEach(function(name) { + if (paramInfo[name] != null) { + var val = paramInfo[name]; + if (typeof val === 'string') { + val = val.trim(); + param[name] = createSizeParser( + name, tryConvertExpr(val) + ); } + else { + param[name] = val; + } + } + }); + if (paramInfo.useMipmap != null) { + param.useMipmap = paramInfo.useMipmap; + } + return param; +} - // Use prez to avoid one pixel rendered twice - gl.colorMask(false, false, false, false); - gl.depthMask(true); - // depthMask must be enabled before clear DEPTH_BUFFER - gl.clear(gl.DEPTH_BUFFER_BIT); - - Matrix4.multiply(worldViewProjection, camera.projectionMatrix, worldView); - - var preZProgram = renderer.getProgram(volumeMesh, preZMaterial); - volumeMesh.__program = preZProgram; - renderer.validateProgram(preZProgram); - preZProgram.bind(renderer); - - var semanticInfo = preZMaterial.shader.matrixSemantics.WORLDVIEWPROJECTION; - preZProgram.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); - volumeMesh.render(renderer, preZMaterial, preZProgram); - - // Render light - gl.colorMask(true, true, true, true); - gl.depthMask(false); - var program = renderer.getProgram(volumeMesh, volumeMesh.material); - volumeMesh.__program = program; - renderer.validateProgram(program); - program.bind(renderer); - - var semanticInfo = volumeMesh.material.shader.matrixSemantics.WORLDVIEWPROJECTION; - // Set some common uniforms - program.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); - program.setUniformOfSemantic(gl, 'WINDOW_SIZE', windowSizeUniform); - program.setUniformOfSemantic(gl, 'VIEWPORT', viewportUniform); +function loadTextures(json, lib, opts, callback) { + if (!json.textures) { + callback({}); + return; + } + var textures = {}; + var loading = 0; - volumeMesh.material.bind(renderer, program); - volumeMesh.render(renderer, volumeMesh.material, program); + var cbd = false; + var textureRootPath = opts.textureRootPath; + util$1.each(json.textures, function(textureInfo, name) { + var texture; + var path = textureInfo.path; + var parameters = convertParameter(textureInfo.parameters); + if (Array.isArray(path) && path.length === 6) { + if (textureRootPath) { + path = path.map(function(item) { + return util$1.relative2absolute(item, textureRootPath); + }); } + texture = new TextureCube(parameters); + } + else if(typeof path === 'string') { + if (textureRootPath) { + path = util$1.relative2absolute(path, textureRootPath); + } + texture = new Texture2D(parameters); + } + else { + return; + } - gl.depthFunc(gl.LESS); - }; - })(), - - /** - * @param {clay.Renderer} renderer - */ - dispose: function (renderer) { - this._gBuffer.dispose(renderer); + texture.load(path); + loading++; + texture.once('success', function() { + textures[name] = texture; + loading--; + if (loading === 0) { + callback(textures); + cbd = true; + } + }); + }); - this._lightAccumFrameBuffer.dispose(renderer); - this._lightAccumTex.dispose(renderer); + if (loading === 0 && !cbd) { + callback(textures); + } +} - this._lightConeGeo.dispose(renderer); - this._lightCylinderGeo.dispose(renderer); - this._lightSphereGeo.dispose(renderer); +function createSizeSetHandler(name, exprFunc) { + return function (renderer) { + // PENDING viewport size or window size + var dpr = renderer.getDevicePixelRatio(); + // PENDING If multiply dpr ? + var width = renderer.getWidth(); + var height = renderer.getHeight(); + var result = exprFunc(width, height, dpr); + this.setParameter(name, result); + }; +} - this._fullQuadPass.dispose(renderer); - this._outputPass.dispose(renderer); +function createSizeParser(name, exprFunc) { + return function (renderer) { + var dpr = renderer.getDevicePixelRatio(); + var width = renderer.getWidth(); + var height = renderer.getHeight(); + return exprFunc(width, height, dpr); + }; +} - this._directionalLightMat.dispose(renderer); +function tryConvertExpr(string) { + // PENDING + var exprRes = /^expr\((.*)\)$/.exec(string); + if (exprRes) { + try { + var func = new Function('width', 'height', 'dpr', 'return ' + exprRes[1]); + // Try run t + func(1, 1); - this.shadowMapPass.dispose(renderer); + return func; + } + catch (e) { + throw new Error('Invalid expression.'); + } } -}); +} /** * @constructor clay.light.Sphere @@ -34275,7 +34642,7 @@ function copyIfNecessary(arr, shallow) { /** * @name clay.version */ -var version = '1.0.0-rc.1'; +var version = '1.0.0'; var outputEssl$1 = "@export clay.vr.disorter.output.vertex\nattribute vec2 texcoord: TEXCOORD_0;\nattribute vec3 position: POSITION;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n v_Texcoord = texcoord;\n gl_Position = vec4(position.xy, 0.5, 1.0);\n}\n@end\n@export clay.vr.disorter.output.fragment\nuniform sampler2D texture;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n gl_FragColor = texture2D(texture, v_Texcoord);\n}\n@end"; @@ -34649,6 +35016,7 @@ var geometry = { Cone : Cone$1, Cube : Cube$1, Cylinder : Cylinder$1, + ParametricSurface : ParametricSurface$1, Plane : Plane$3, Sphere : Sphere$1 }; @@ -34733,4 +35101,3 @@ var vr = { }; export { animation, application, async, Camera, camera, canvas, compositor, core, deferred, dep, FrameBuffer, Geometry, geometry, gpu, Joint, Light, light, loader, Material, math, Mesh, Node, particle, picking, plugin, prePass, Renderable, Renderer, Scene, Shader, shader, Skeleton, StandardMaterial, StaticGeometry, Texture, Texture2D, TextureCube, util, version, vr }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xheWdsLmVzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvYW5pbWF0aW9uL2Vhc2luZy5qcyIsIi4uL3NyYy9hbmltYXRpb24vQ2xpcC5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0b3IuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0JsZW5kMURDbGlwLmpzIiwiLi4vc3JjL3V0aWwvZGVsYXVuYXkuanMiLCIuLi9zcmMvZGVwL2dsbWF0cml4LmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMi5qcyIsIi4uL3NyYy9hbmltYXRpb24vQmxlbmQyRENsaXAuanMiLCIuLi9zcmMvYW5pbWF0aW9uL1RyYW5zZm9ybVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9TYW1wbGVyVHJhY2suanMiLCIuLi9zcmMvY29yZS9taXhpbi9leHRlbmQuanMiLCIuLi9zcmMvY29yZS9taXhpbi9ub3RpZmllci5qcyIsIi4uL3NyYy9jb3JlL3V0aWwuanMiLCIuLi9zcmMvY29yZS9CYXNlLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9UaW1lbGluZS5qcyIsIi4uL3NyYy9hbmltYXRpb24vVHJhY2tDbGlwLmpzIiwiLi4vc3JjL2NvcmUvR0xJbmZvLmpzIiwiLi4vc3JjL2NvcmUvZ2xlbnVtLmpzIiwiLi4vc3JjL2NvcmUvdmVuZG9yLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMy5qcyIsIi4uL3NyYy9tYXRoL0JvdW5kaW5nQm94LmpzIiwiLi4vc3JjL21hdGgvTWF0cml4NC5qcyIsIi4uL3NyYy9jb3JlL0NhY2hlLmpzIiwiLi4vc3JjL1RleHR1cmUuanMiLCIuLi9zcmMvY29yZS9MaW5rZWRMaXN0LmpzIiwiLi4vc3JjL2NvcmUvTFJVLmpzIiwiLi4vc3JjL2NvcmUvY29sb3IuanMiLCIuLi9zcmMvTWF0ZXJpYWwuanMiLCIuLi9zcmMvZ3B1L0dMUHJvZ3JhbS5qcyIsIi4uL3NyYy9ncHUvUHJvZ3JhbU1hbmFnZXIuanMiLCIuLi9zcmMvU2hhZGVyLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvaGVhZGVyL2NhbGNBbWJpZW50U0hMaWdodC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvaGVhZGVyL2xpZ2h0LmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvcHJlei5nbHNsLmpzIiwiLi4vc3JjL1JlbmRlcmVyLmpzIiwiLi4vc3JjL21hdGgvUXVhdGVybmlvbi5qcyIsIi4uL3NyYy9Ob2RlLmpzIiwiLi4vc3JjL0xpZ2h0LmpzIiwiLi4vc3JjL21hdGgvUGxhbmUuanMiLCIuLi9zcmMvbWF0aC9GcnVzdHVtLmpzIiwiLi4vc3JjL21hdGgvUmF5LmpzIiwiLi4vc3JjL0NhbWVyYS5qcyIsIi4uL3NyYy9TY2VuZS5qcyIsIi4uL3NyYy9HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyeS9QbGFuZS5qcyIsIi4uL3NyYy9nZW9tZXRyeS9DdWJlLmpzIiwiLi4vc3JjL2dlb21ldHJ5L1NwaGVyZS5qcyIsIi4uL3NyYy9tYXRoL3V0aWwuanMiLCIuLi9zcmMvVGV4dHVyZTJELmpzIiwiLi4vc3JjL3NoYWRlci9saWJyYXJ5LmpzIiwiLi4vc3JjL1JlbmRlcmFibGUuanMiLCIuLi9zcmMvTWVzaC5qcyIsIi4uL3NyYy9jYW1lcmEvUGVyc3BlY3RpdmUuanMiLCIuLi9zcmMvY2FtZXJhL09ydGhvZ3JhcGhpYy5qcyIsIi4uL3NyYy9jb3JlL3JlcXVlc3QuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9zdGFuZGFyZC5nbHNsLmpzIiwiLi4vc3JjL1N0YW5kYXJkTWF0ZXJpYWwuanMiLCIuLi9zcmMvSm9pbnQuanMiLCIuLi9zcmMvU2tlbGV0b24uanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS91dGlsLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9iYXNpYy5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvbGFtYmVydC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2Uvd2lyZWZyYW1lLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9za3lib3guZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvY29sb3JhZGp1c3QuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvYmx1ci5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9sdW0uZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvbHV0Lmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL3ZpZ25ldHRlLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL291dHB1dC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9icmlnaHQuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvZG93bnNhbXBsZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci91cHNhbXBsZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9oZHIuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvZG9mLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL2xlbnNmbGFyZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9ibGVuZC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9meGFhLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL2Z4YWEzLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL2J1aWx0aW4uanMiLCIuLi9zcmMvbG9hZGVyL0dMVEYuanMiLCIuLi9zcmMvbGlnaHQvRGlyZWN0aW9uYWwuanMiLCIuLi9zcmMvbGlnaHQvUG9pbnQuanMiLCIuLi9zcmMvbGlnaHQvU3BvdC5qcyIsIi4uL3NyYy9saWdodC9BbWJpZW50LmpzIiwiLi4vc3JjL1RleHR1cmVDdWJlLmpzIiwiLi4vc3JjL0ZyYW1lQnVmZmVyLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL1Bhc3MuanMiLCIuLi9zcmMvcGx1Z2luL1NreWJveC5qcyIsIi4uL3NyYy9wcmVQYXNzL0Vudmlyb25tZW50TWFwLmpzIiwiLi4vc3JjL3BsdWdpbi9Ta3lkb21lLmpzIiwiLi4vc3JjL3V0aWwvZGRzLmpzIiwiLi4vc3JjL3V0aWwvaGRyLmpzIiwiLi4vc3JjL3V0aWwvdGV4dHVyZS5qcyIsIi4uL3NyYy91dGlsL3NoYWRlci9pbnRlZ3JhdGVCUkRGLmdsc2wuanMiLCIuLi9zcmMvdXRpbC9zaGFkZXIvcHJlZmlsdGVyLmdsc2wuanMiLCIuLi9zcmMvdXRpbC9jdWJlbWFwLmpzIiwiLi4vc3JjL2xpZ2h0L0FtYmllbnRDdWJlbWFwLmpzIiwiLi4vc3JjL2xpZ2h0L0FtYmllbnRTSC5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL1RleHR1cmVQb29sLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2Uvc2hhZG93bWFwLmdsc2wuanMiLCIuLi9zcmMvcHJlUGFzcy9TaGFkb3dNYXAuanMiLCIuLi9zcmMvcGlja2luZy9SYXlQaWNraW5nLmpzIiwiLi4vc3JjL3V0aWwvc2guanMiLCIuLi9zcmMvYXBwbGljYXRpb24uanMiLCIuLi9zcmMvYXN5bmMvVGFzay5qcyIsIi4uL3NyYy9hc3luYy9UYXNrR3JvdXAuanMiLCIuLi9zcmMvY2FudmFzL01hdGVyaWFsLmpzIiwiLi4vc3JjL2NhbnZhcy9SZW5kZXJlci5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL05vZGUuanMiLCIuLi9zcmMvY29tcG9zaXRvci9HcmFwaC5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL0NvbXBvc2l0b3IuanMiLCIuLi9zcmMvY29tcG9zaXRvci9TY2VuZU5vZGUuanMiLCIuLi9zcmMvY29tcG9zaXRvci9UZXh0dXJlTm9kZS5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL0ZpbHRlck5vZGUuanMiLCIuLi9zcmMvY29tcG9zaXRvci9jcmVhdGVDb21wb3NpdG9yLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvZ2J1ZmZlci5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvY2h1bmsuZ2xzbC5qcyIsIi4uL3NyYy9kZWZlcnJlZC9HQnVmZmVyLmpzIiwiLi4vc3JjL2dlb21ldHJ5L0NvbmUuanMiLCIuLi9zcmMvZ2VvbWV0cnkvQ3lsaW5kZXIuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9saWdodHZvbHVtZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvc3BvdC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvZGlyZWN0aW9uYWwuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnQuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnRzaC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvYW1iaWVudGN1YmVtYXAuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL3BvaW50Lmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9zcGhlcmUuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL3R1YmUuZ2xzbC5qcyIsIi4uL3NyYy9kZWZlcnJlZC9SZW5kZXJlci5qcyIsIi4uL3NyYy9saWdodC9TcGhlcmUuanMiLCIuLi9zcmMvbGlnaHQvVHViZS5qcyIsIi4uL3NyYy9sb2FkZXIvRlguanMiLCIuLi9zcmMvbWF0aC9NYXRyaXgyLmpzIiwiLi4vc3JjL21hdGgvTWF0cml4MmQuanMiLCIuLi9zcmMvbWF0aC9NYXRyaXgzLmpzIiwiLi4vc3JjL21hdGgvVmFsdWUuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3I0LmpzIiwiLi4vc3JjL3BhcnRpY2xlL1BhcnRpY2xlLmpzIiwiLi4vc3JjL3BhcnRpY2xlL0VtaXR0ZXIuanMiLCIuLi9zcmMvcGFydGljbGUvRmllbGQuanMiLCIuLi9zcmMvcGFydGljbGUvRm9yY2VGaWVsZC5qcyIsIi4uL3NyYy9wYXJ0aWNsZS9wYXJ0aWNsZS5nbHNsLmpzIiwiLi4vc3JjL3BhcnRpY2xlL1BhcnRpY2xlUmVuZGVyYWJsZS5qcyIsIi4uL3NyYy9waWNraW5nL2NvbG9yLmdsc2wuanMiLCIuLi9zcmMvcGlja2luZy9QaXhlbFBpY2tpbmcuanMiLCIuLi9zcmMvcGx1Z2luL0ZyZWVDb250cm9sLmpzIiwiLi4vc3JjL3BsdWdpbi9HZXN0dXJlTWdyLmpzIiwiLi4vc3JjL3BsdWdpbi9JbmZpbml0ZVBsYW5lLmpzIiwiLi4vc3JjL3BsdWdpbi9PcmJpdENvbnRyb2wuanMiLCIuLi9zcmMvU3RhdGljR2VvbWV0cnkuanMiLCIuLi9zcmMvdXRpbC9tZXNoLmpzIiwiLi4vc3JjL3V0aWwvdHJhbnNmZXJhYmxlLmpzIiwiLi4vc3JjL3ZlcnNpb24uanMiLCIuLi9zcmMvdnIvb3V0cHV0Lmdsc2wuanMiLCIuLi9zcmMvdnIvQ2FyZGJvYXJkRGlzdG9ydGVyLmpzIiwiLi4vc3JjL3ZyL1N0ZXJlb0NhbWVyYS5qcyIsIi4uL3NyYy9jbGF5Z2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8g57yT5Yqo5Ye95pWw5p2l6IeqIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xlL3R3ZWVuLmpzL2Jsb2IvbWFzdGVyL3NyYy9Ud2Vlbi5qc1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgY2xheS5hbmltYXRpb24uZWFzaW5nXG4gKi9cbnZhciBlYXNpbmcgPSB7XG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5saW5lYXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsaW5lYXI6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGs7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnF1YWRyYXRpY0luXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgcXVhZHJhdGljSW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgKiBrO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWFkcmF0aWNPdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBxdWFkcmF0aWNPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgKiAoMiAtIGspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWFkcmF0aWNJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1YWRyYXRpY0luT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiBrICogaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLSAwLjUgKiAoLS1rICogKGsgLSAyKSAtIDEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5jdWJpY0luXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgY3ViaWNJbjogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gayAqIGsgKiBrO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5jdWJpY091dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGN1YmljT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHJldHVybiAtLWsgKiBrICogayArIDE7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmN1YmljSW5PdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBjdWJpY0luT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiBrICogayAqIGs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgoayAtPSAyKSAqIGsgKiBrICsgMik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnF1YXJ0aWNJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1YXJ0aWNJbjogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gayAqIGsgKiBrICogaztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcucXVhcnRpY091dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1YXJ0aWNPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIDEgLSAoLS1rICogayAqIGsgKiBrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcucXVhcnRpY0luT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgcXVhcnRpY0luT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiBrICogayAqIGsgKiBrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtIDAuNSAqICgoayAtPSAyKSAqIGsgKiBrICogayAtIDIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWludGljSW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBxdWludGljSW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgKiBrICogayAqIGsgKiBrO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWludGljT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgcXVpbnRpY091dDogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gLS1rICogayAqIGsgKiBrICogayArIDE7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnF1aW50aWNJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1aW50aWNJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoKGsgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMC41ICogayAqIGsgKiBrICogayAqIGs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgoayAtPSAyKSAqIGsgKiBrICogayAqIGsgKyAyKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuc2ludXNvaWRhbEluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2ludXNvaWRhbEluOiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHJldHVybiAxIC0gTWF0aC5jb3MoayAqIE1hdGguUEkgLyAyKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuc2ludXNvaWRhbE91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNpbnVzb2lkYWxPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc2luKGsgKiBNYXRoLlBJIC8gMik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnNpbnVzb2lkYWxJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNpbnVzb2lkYWxJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gMC41ICogKDEgLSBNYXRoLmNvcyhNYXRoLlBJICogaykpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5leHBvbmVudGlhbEluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZXhwb25lbnRpYWxJbjogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gayA9PT0gMCA/IDAgOiBNYXRoLnBvdygxMDI0LCBrIC0gMSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmV4cG9uZW50aWFsT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZXhwb25lbnRpYWxPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgPT09IDEgPyAxIDogMSAtIE1hdGgucG93KDIsIC0gMTAgKiBrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuZXhwb25lbnRpYWxJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGV4cG9uZW50aWFsSW5PdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKGsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGsgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMC41ICogTWF0aC5wb3coMTAyNCwgayAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwLjUgKiAoLSBNYXRoLnBvdygyLCAtIDEwICogKGsgLSAxKSkgKyAyKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuY2lyY3VsYXJJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNpcmN1bGFySW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnNxcnQoMSAtIGsgKiBrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuY2lyY3VsYXJPdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBjaXJjdWxhck91dDogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KDEgLSAoLS1rICogaykpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5jaXJjdWxhckluT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgY2lyY3VsYXJJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoKGsgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gLSAwLjUgKiAoTWF0aC5zcXJ0KDEgLSBrICogaykgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMC41ICogKE1hdGguc3FydCgxIC0gKGsgLT0gMikgKiBrKSArIDEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5lbGFzdGljSW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBlbGFzdGljSW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdmFyIHMsIGEgPSAwLjEsIHAgPSAwLjQ7XG4gICAgICAgIGlmIChrID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoayA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhIHx8IGEgPCAxKSB7XG4gICAgICAgICAgICBhID0gMTsgcyA9IHAgLyA0O1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHMgPSBwICogTWF0aC5hc2luKDEgLyBhKSAvICgyICogTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0gKGEgKiBNYXRoLnBvdygyLCAxMCAqIChrIC09IDEpKSAqXG4gICAgICAgICAgICAgICAgICAgIE1hdGguc2luKChrIC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5lbGFzdGljT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZWxhc3RpY091dDogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcywgYSA9IDAuMSwgcCA9IDAuNDtcbiAgICAgICAgaWYgKGsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWEgfHwgYSA8IDEpIHtcbiAgICAgICAgICAgIGEgPSAxOyBzID0gcCAvIDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHMgPSBwICogTWF0aC5hc2luKDEgLyBhKSAvICgyICogTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhICogTWF0aC5wb3coMiwgLSAxMCAqIGspICpcbiAgICAgICAgICAgICAgICBNYXRoLnNpbigoayAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApICsgMSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmVsYXN0aWNJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGVsYXN0aWNJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcywgYSA9IDAuMSwgcCA9IDAuNDtcbiAgICAgICAgaWYgKGsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWEgfHwgYSA8IDEpIHtcbiAgICAgICAgICAgIGEgPSAxOyBzID0gcCAvIDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHMgPSBwICogTWF0aC5hc2luKDEgLyBhKSAvICgyICogTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChrICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0gMC41ICogKGEgKiBNYXRoLnBvdygyLCAxMCAqIChrIC09IDEpKVxuICAgICAgICAgICAgICAgICogTWF0aC5zaW4oKGsgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGEgKiBNYXRoLnBvdygyLCAtMTAgKiAoayAtPSAxKSlcbiAgICAgICAgICAgICAgICAqIE1hdGguc2luKChrIC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkgKiAwLjUgKyAxO1xuXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmJhY2tJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJhY2tJbjogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiBrICogayAqICgocyArIDEpICogayAtIHMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5iYWNrT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgYmFja091dDogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiAtLWsgKiBrICogKChzICsgMSkgKiBrICsgcykgKyAxO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5iYWNrSW5PdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBiYWNrSW5PdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdmFyIHMgPSAxLjcwMTU4ICogMS41MjU7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiAoayAqIGsgKiAoKHMgKyAxKSAqIGsgLSBzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgoayAtPSAyKSAqIGsgKiAoKHMgKyAxKSAqIGsgKyBzKSArIDIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5ib3VuY2VJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJvdW5jZUluOiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHJldHVybiAxIC0gZWFzaW5nLmJvdW5jZU91dCgxIC0gayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmJvdW5jZU91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJvdW5jZU91dDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoayA8ICgxIC8gMi43NSkpIHtcbiAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiBrICogaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrIDwgKDIgLyAyLjc1KSkge1xuICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChrIC09ICgxLjUgLyAyLjc1KSkgKiBrICsgMC43NTtcbiAgICAgICAgfSBlbHNlIGlmIChrIDwgKDIuNSAvIDIuNzUpKSB7XG4gICAgICAgICAgICByZXR1cm4gNy41NjI1ICogKGsgLT0gKDIuMjUgLyAyLjc1KSkgKiBrICsgMC45Mzc1O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChrIC09ICgyLjYyNSAvIDIuNzUpKSAqIGsgKyAwLjk4NDM3NTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5ib3VuY2VJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJvdW5jZUluT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmIChrIDwgMC41KSB7XG4gICAgICAgICAgICByZXR1cm4gZWFzaW5nLmJvdW5jZUluKGsgKiAyKSAqIDAuNTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWFzaW5nLmJvdW5jZU91dChrICogMiAtIDEpICogMC41ICsgMC41O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGVhc2luZztcbiIsImltcG9ydCBFYXNpbmcgZnJvbSAnLi9lYXNpbmcnO1xuXG5mdW5jdGlvbiBub29wICgpIHt9XG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLkNsaXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubGlmZV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5kZWxheV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5nYXBdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucGxheWJhY2tSYXRlXVxuICogQHBhcmFtIHtib29sZWFufG51bWJlcn0gW29wdHMubG9vcF0gSWYgbG9vcCBpcyBhIG51bWJlciwgaXQgaW5kaWNhdGUgdGhlIGxvb3AgY291bnQgb2YgYW5pbWF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gW29wdHMuZWFzaW5nXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25mcmFtZV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLm9uZmluaXNoXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25yZXN0YXJ0XVxuICovXG52YXIgQ2xpcCA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gb3B0cy5uYW1lIHx8ICcnO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IG9wdHMudGFyZ2V0O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxpZmUgPSBvcHRzLmxpZmUgfHwgMTAwMDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kZWxheSA9IG9wdHMuZGVsYXkgfHwgMDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5nYXAgPSBvcHRzLmdhcCB8fCAwO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBsYXliYWNrUmF0ZSA9IG9wdHMucGxheWJhY2tSYXRlIHx8IDE7XG5cblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9lbGFwc2VkVGltZSA9IDA7XG5cbiAgICB0aGlzLl9sb29wID0gb3B0cy5sb29wID09IG51bGwgPyBmYWxzZSA6IG9wdHMubG9vcDtcbiAgICB0aGlzLnNldExvb3AodGhpcy5fbG9vcCk7XG5cbiAgICBpZiAob3B0cy5lYXNpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldEVhc2luZyhvcHRzLmVhc2luZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMub25mcmFtZSA9IG9wdHMub25mcmFtZSB8fCBub29wO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMub25maW5pc2ggPSBvcHRzLm9uZmluaXNoIHx8IG5vb3A7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICovXG4gICAgdGhpcy5vbnJlc3RhcnQgPSBvcHRzLm9ucmVzdGFydCB8fCBub29wO1xuXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG59O1xuXG5DbGlwLnByb3RvdHlwZSA9IHtcblxuICAgIGdhcDogMCxcblxuICAgIGxpZmU6IDAsXG5cbiAgICBkZWxheTogMCxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IGxvb3BcbiAgICAgKi9cbiAgICBzZXRMb29wOiBmdW5jdGlvbiAobG9vcCkge1xuICAgICAgICB0aGlzLl9sb29wID0gbG9vcDtcbiAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YobG9vcCkgPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb29wUmVtYWluZWQgPSBsb29wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9vcFJlbWFpbmVkID0gMWU4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBlYXNpbmdcbiAgICAgKi9cbiAgICBzZXRFYXNpbmc6IGZ1bmN0aW9uIChlYXNpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZihlYXNpbmcpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZWFzaW5nID0gRWFzaW5nW2Vhc2luZ107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lYXNpbmcgPSBlYXNpbmc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gdGltZVxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGVwOiBmdW5jdGlvbiAodGltZSwgZGVsdGFUaW1lLCBzaWxlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gdGltZSArIHRoaXMuZGVsYXk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlbHRhVGltZSA9IHRpbWUgLSB0aGlzLl9jdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdXJyZW50VGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuICdwYXVzZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWUgPCB0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBFTkRJR04gU3luYyA/XG4gICAgICAgIHRoaXMuX2VsYXBzZSh0aW1lLCBkZWx0YVRpbWUpO1xuXG4gICAgICAgIHZhciBwZXJjZW50ID0gTWF0aC5taW4odGhpcy5fZWxhcHNlZFRpbWUgLyB0aGlzLmxpZmUsIDEpO1xuXG4gICAgICAgIGlmIChwZXJjZW50IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNjaGVkdWxlO1xuICAgICAgICBpZiAodGhpcy5lYXNpbmcpIHtcbiAgICAgICAgICAgIHNjaGVkdWxlID0gdGhpcy5lYXNpbmcocGVyY2VudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzY2hlZHVsZSA9IHBlcmNlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdmcmFtZScsIHNjaGVkdWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJjZW50ID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbG9vcCAmJiB0aGlzLl9sb29wUmVtYWluZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzdGFydEluTG9vcCh0aW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb29wUmVtYWluZWQtLTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Jlc3RhcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayB0aGlzIGNsaXAgdG8gYmUgZGVsZXRlZFxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBhbmltYXRpb24udXBkYXRlXG4gICAgICAgICAgICAgICAgdGhpcy5fbmVlZHNSZW1vdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaW5pc2gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB0aW1lXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNldFRpbWU6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXAodGltZSArIHRoaXMuX3N0YXJ0VGltZSk7XG4gICAgfSxcblxuICAgIHJlc3RhcnQ6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIC8vIElmIHVzZXIgbGVhdmUgdGhlIHBhZ2UgZm9yIGEgd2hpbGUsIHdoZW4gaGUgZ2V0cyBiYWNrXG4gICAgICAgIC8vIEFsbCBjbGlwcyBtYXkgYmUgZXhwaXJlZCBhbmQgYWxsIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyB2YWx1ZShwb3NpdGlvbilcbiAgICAgICAgLy8gSXQgaXMgY2xlYXJseSB3cm9uZywgc28gd2UgdXNlIHJlbWFpbmRlciB0byBhZGQgYSBvZmZzZXRcblxuICAgICAgICB2YXIgcmVtYWluZGVyID0gMDtcbiAgICAgICAgLy8gUmVtYWluZGVyIGlnbm9yZWQgaWYgcmVzdGFydCBpcyBpbnZva2VkIG1hbnVhbGx5XG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9lbGFwc2UodGltZSk7XG4gICAgICAgICAgICByZW1haW5kZXIgPSB0aGlzLl9lbGFwc2VkVGltZSAlIHRoaXMubGlmZTtcbiAgICAgICAgfVxuICAgICAgICB0aW1lID0gdGltZSB8fCBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWUgLSByZW1haW5kZXIgKyB0aGlzLmRlbGF5O1xuICAgICAgICB0aGlzLl9lbGFwc2VkVGltZSA9IDA7XG5cbiAgICAgICAgdGhpcy5fbmVlZHNSZW1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGdldEVsYXBzZWRUaW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGFwc2VkVGltZTtcbiAgICB9LFxuXG4gICAgX3Jlc3RhcnRJbkxvb3A6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWUgKyB0aGlzLmdhcDtcbiAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUgPSAwO1xuICAgIH0sXG5cbiAgICBfZWxhcHNlOiBmdW5jdGlvbiAodGltZSwgZGVsdGFUaW1lKSB7XG4gICAgICAgIHRoaXMuX2VsYXBzZWRUaW1lICs9IGRlbHRhVGltZSAqIHRoaXMucGxheWJhY2tSYXRlO1xuICAgIH0sXG5cbiAgICBmaXJlOiBmdW5jdGlvbiAoZXZlbnRUeXBlLCBhcmcpIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudFR5cGU7XG4gICAgICAgIGlmICh0aGlzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXNbZXZlbnROYW1lXSh0aGlzLnRhcmdldCwgYXJnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xpcCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgIGNsaXAubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgY2xpcC5fbG9vcCA9IHRoaXMuX2xvb3A7XG4gICAgICAgIGNsaXAuX2xvb3BSZW1haW5lZCA9IHRoaXMuX2xvb3BSZW1haW5lZDtcblxuICAgICAgICBjbGlwLmxpZmUgPSB0aGlzLmxpZmU7XG4gICAgICAgIGNsaXAuZ2FwID0gdGhpcy5nYXA7XG4gICAgICAgIGNsaXAuZGVsYXkgPSB0aGlzLmRlbGF5O1xuXG4gICAgICAgIHJldHVybiBjbGlwO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIGNsaXAuXG4gICAgICovXG4gICAgcGF1c2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBjbGlwLlxuICAgICAqL1xuICAgIHJlc3VtZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICB9XG59O1xuQ2xpcC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGlwO1xuXG5leHBvcnQgZGVmYXVsdCBDbGlwO1xuIiwiLyoqXG4gKiBAbW9kdWxlIGVjaGFydHMvYW5pbWF0aW9uL0FuaW1hdG9yXG4gKi9cbmltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5cbnZhciBhcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5mdW5jdGlvbiBkZWZhdWx0R2V0dGVyKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldO1xufVxuZnVuY3Rpb24gZGVmYXVsdFNldHRlcih0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlcihwMCwgcDEsIHBlcmNlbnQpIHtcbiAgICByZXR1cm4gKHAxIC0gcDApICogcGVyY2VudCArIHAwO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5KHAwLCBwMSwgcGVyY2VudCwgb3V0LCBhcnJEaW0pIHtcbiAgICB2YXIgbGVuID0gcDAubGVuZ3RoO1xuICAgIGlmIChhcnJEaW0gPT0gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBpbnRlcnBvbGF0ZU51bWJlcihwMFtpXSwgcDFbaV0sIHBlcmNlbnQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxlbjIgPSBwMFswXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuMjsgaisrKSB7XG4gICAgICAgICAgICAgICAgb3V0W2ldW2pdID0gaW50ZXJwb2xhdGVOdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgIHAwW2ldW2pdLCBwMVtpXVtqXSwgcGVyY2VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mKGRhdGEpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZihkYXRhLmxlbmd0aCkgPT0gJ251bWJlcic7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICB2YXIgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWVbMF0pKSB7XG4gICAgICAgICAgICB2YXIgcmV0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmV0LnB1c2goYXJyYXlTbGljZS5jYWxsKHZhbHVlW2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYXRtdWxsUm9tSW50ZXJwb2xhdGVBcnJheShcbiAgICBwMCwgcDEsIHAyLCBwMywgdCwgdDIsIHQzLCBvdXQsIGFyckRpbVxuKSB7XG4gICAgdmFyIGxlbiA9IHAwLmxlbmd0aDtcbiAgICBpZiAoYXJyRGltID09IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gY2F0bXVsbFJvbUludGVycG9sYXRlKFxuICAgICAgICAgICAgICAgIHAwW2ldLCBwMVtpXSwgcDJbaV0sIHAzW2ldLCB0LCB0MiwgdDNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbGVuMiA9IHAwWzBdLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW4yOyBqKyspIHtcbiAgICAgICAgICAgICAgICBvdXRbaV1bal0gPSBjYXRtdWxsUm9tSW50ZXJwb2xhdGUoXG4gICAgICAgICAgICAgICAgICAgIHAwW2ldW2pdLCBwMVtpXVtqXSwgcDJbaV1bal0sIHAzW2ldW2pdLFxuICAgICAgICAgICAgICAgICAgICB0LCB0MiwgdDNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYXRtdWxsUm9tSW50ZXJwb2xhdGUocDAsIHAxLCBwMiwgcDMsIHQsIHQyLCB0Mykge1xuICAgIHZhciB2MCA9IChwMiAtIHAwKSAqIDAuNTtcbiAgICB2YXIgdjEgPSAocDMgLSBwMSkgKiAwLjU7XG4gICAgcmV0dXJuICgyICogKHAxIC0gcDIpICsgdjAgKyB2MSkgKiB0M1xuICAgICAgICAgICAgKyAoLSAzICogKHAxIC0gcDIpIC0gMiAqIHYwIC0gdjEpICogdDJcbiAgICAgICAgICAgICsgdjAgKiB0ICsgcDE7XG59XG5cbi8vIGFycjAgaXMgc291cmNlIGFycmF5LCBhcnIxIGlzIHRhcmdldCBhcnJheS5cbi8vIERvIHNvbWUgcHJlcHJvY2VzcyB0byBhdm9pZCBlcnJvciBoYXBwZW5lZCB3aGVuIGludGVycG9sYXRpbmcgZnJvbSBhcnIwIHRvIGFycjFcbmZ1bmN0aW9uIGZpbGxBcnIoYXJyMCwgYXJyMSwgYXJyRGltKSB7XG4gICAgdmFyIGFycjBMZW4gPSBhcnIwLmxlbmd0aDtcbiAgICB2YXIgYXJyMUxlbiA9IGFycjEubGVuZ3RoO1xuICAgIGlmIChhcnIwTGVuICE9PSBhcnIxTGVuKSB7XG4gICAgICAgIC8vIEZJWE1FIE5vdCB3b3JrIGZvciBUeXBlZEFycmF5XG4gICAgICAgIHZhciBpc1ByZXZpb3VzTGFyZ2VyID0gYXJyMExlbiA+IGFycjFMZW47XG4gICAgICAgIGlmIChpc1ByZXZpb3VzTGFyZ2VyKSB7XG4gICAgICAgICAgICAvLyBDdXQgdGhlIHByZXZpb3VzXG4gICAgICAgICAgICBhcnIwLmxlbmd0aCA9IGFycjFMZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWxsIHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGFycjBMZW47IGkgPCBhcnIxTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcnIwLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGFyckRpbSA9PT0gMSA/IGFycjFbaV0gOiBhcnJheVNsaWNlLmNhbGwoYXJyMVtpXSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhhbmRsaW5nIE5hTiB2YWx1ZVxuICAgIHZhciBsZW4yID0gYXJyMFswXSAmJiBhcnIwWzBdLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycjAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFyckRpbSA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKGFycjBbaV0pKSB7XG4gICAgICAgICAgICAgICAgYXJyMFtpXSA9IGFycjFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihhcnIwW2ldW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBhcnIwW2ldW2pdID0gYXJyMVtpXVtqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlTYW1lKGFycjAsIGFycjEsIGFyckRpbSkge1xuICAgIGlmIChhcnIwID09PSBhcnIxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgbGVuID0gYXJyMC5sZW5ndGg7XG4gICAgaWYgKGxlbiAhPT0gYXJyMS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXJyRGltID09PSAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcnIwW2ldICE9PSBhcnIxW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGVuMiA9IGFycjBbMF0ubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChhcnIwW2ldW2pdICE9PSBhcnIxW2ldW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyYWNrQ2xpcChhbmltYXRvciwgZWFzaW5nLCBvbmVUcmFja0RvbmUsIGtleWZyYW1lcywgcHJvcE5hbWUsIGludGVycG9sYXRlcikge1xuICAgIHZhciBnZXR0ZXIgPSBhbmltYXRvci5fZ2V0dGVyO1xuICAgIHZhciBzZXR0ZXIgPSBhbmltYXRvci5fc2V0dGVyO1xuICAgIHZhciB1c2VTcGxpbmUgPSBlYXNpbmcgPT09ICdzcGxpbmUnO1xuXG4gICAgdmFyIHRyYWNrTGVuID0ga2V5ZnJhbWVzLmxlbmd0aDtcbiAgICBpZiAoIXRyYWNrTGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR3Vlc3MgZGF0YSB0eXBlXG4gICAgdmFyIGZpcnN0VmFsID0ga2V5ZnJhbWVzWzBdLnZhbHVlO1xuICAgIHZhciBpc1ZhbHVlQXJyYXkgPSBpc0FycmF5TGlrZShmaXJzdFZhbCk7XG5cbiAgICAvLyBGb3IgdmVydGljZXMgbW9ycGhpbmdcbiAgICB2YXIgYXJyRGltID0gKFxuICAgICAgICAgICAgaXNWYWx1ZUFycmF5XG4gICAgICAgICAgICAmJiBpc0FycmF5TGlrZShmaXJzdFZhbFswXSlcbiAgICAgICAgKVxuICAgICAgICA/IDIgOiAxO1xuICAgIC8vIFNvcnQga2V5ZnJhbWUgYXMgYXNjZW5kaW5nXG4gICAga2V5ZnJhbWVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgIH0pO1xuXG4gICAgdmFyIHRyYWNrTWF4VGltZSA9IGtleWZyYW1lc1t0cmFja0xlbiAtIDFdLnRpbWU7XG4gICAgLy8gUGVyY2VudHMgb2YgZWFjaCBrZXlmcmFtZVxuICAgIHZhciBrZlBlcmNlbnRzID0gW107XG4gICAgLy8gVmFsdWUgb2YgZWFjaCBrZXlmcmFtZVxuICAgIHZhciBrZlZhbHVlcyA9IFtdO1xuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGtleWZyYW1lc1swXS52YWx1ZTtcbiAgICB2YXIgaXNBbGxWYWx1ZUVxdWFsID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGVuOyBpKyspIHtcbiAgICAgICAga2ZQZXJjZW50cy5wdXNoKGtleWZyYW1lc1tpXS50aW1lIC8gdHJhY2tNYXhUaW1lKTtcblxuICAgICAgICAvLyBBc3N1bWUgdmFsdWUgaXMgYSBjb2xvciB3aGVuIGl0IGlzIGEgc3RyaW5nXG4gICAgICAgIHZhciB2YWx1ZSA9IGtleWZyYW1lc1tpXS52YWx1ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBlcXVhbCwgZGVlcCBjaGVjayBpZiB2YWx1ZSBpcyBhcnJheVxuICAgICAgICBpZiAoISgoaXNWYWx1ZUFycmF5ICYmIGlzQXJyYXlTYW1lKHZhbHVlLCBwcmV2VmFsdWUsIGFyckRpbSkpXG4gICAgICAgICAgICB8fCAoIWlzVmFsdWVBcnJheSAmJiB2YWx1ZSA9PT0gcHJldlZhbHVlKSkpIHtcbiAgICAgICAgICAgIGlzQWxsVmFsdWVFcXVhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGtmVmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNBbGxWYWx1ZUVxdWFsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbGFzdFZhbHVlID0ga2ZWYWx1ZXNbdHJhY2tMZW4gLSAxXTtcbiAgICAvLyBQb2x5ZmlsbCBhcnJheSBhbmQgTmFOIHZhbHVlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja0xlbiAtIDE7IGkrKykge1xuICAgICAgICBpZiAoaXNWYWx1ZUFycmF5KSB7XG4gICAgICAgICAgICBmaWxsQXJyKGtmVmFsdWVzW2ldLCBsYXN0VmFsdWUsIGFyckRpbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4oa2ZWYWx1ZXNbaV0pICYmICFpc05hTihsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAga2ZWYWx1ZXNbaV0gPSBsYXN0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNWYWx1ZUFycmF5ICYmIGZpbGxBcnIoZ2V0dGVyKGFuaW1hdG9yLl90YXJnZXQsIHByb3BOYW1lKSwgbGFzdFZhbHVlLCBhcnJEaW0pO1xuXG4gICAgLy8gQ2FjaGUgdGhlIGtleSBvZiBsYXN0IGZyYW1lIHRvIHNwZWVkIHVwIHdoZW5cbiAgICAvLyBhbmltYXRpb24gcGxheWJhY2sgaXMgc2VxdWVuY3lcbiAgICB2YXIgY2FjaGVLZXkgPSAwO1xuICAgIHZhciBjYWNoZVBlcmNlbnQgPSAwO1xuICAgIHZhciBzdGFydDtcbiAgICB2YXIgaSwgdztcbiAgICB2YXIgcDAsIHAxLCBwMiwgcDM7XG5cbiAgICB2YXIgb25mcmFtZSA9IGZ1bmN0aW9uKHRhcmdldCwgcGVyY2VudCkge1xuICAgICAgICAvLyBGaW5kIHRoZSByYW5nZSBrZXlmcmFtZXNcbiAgICAgICAgLy8ga2YxLS0tLS1rZjItLS0tLS0tLS1jdXJyZW50LS0tLS0tLS1rZjNcbiAgICAgICAgLy8gZmluZCBrZjIoaSkgYW5kIGtmMyhpKzEpIGFuZCBkbyBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGlmIChwZXJjZW50IDwgY2FjaGVQZXJjZW50KSB7XG4gICAgICAgICAgICAvLyBTdGFydCBmcm9tIG5leHQga2V5XG4gICAgICAgICAgICBzdGFydCA9IE1hdGgubWluKGNhY2hlS2V5ICsgMSwgdHJhY2tMZW4gLSAxKTtcbiAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChrZlBlcmNlbnRzW2ldIDw9IHBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRyYWNrTGVuLTIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChpID0gY2FjaGVLZXk7IGkgPCB0cmFja0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtmUGVyY2VudHNbaV0gPiBwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLTEsIHRyYWNrTGVuLTIpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlS2V5ID0gaTtcbiAgICAgICAgY2FjaGVQZXJjZW50ID0gcGVyY2VudDtcblxuICAgICAgICB2YXIgcmFuZ2UgPSAoa2ZQZXJjZW50c1tpKzFdIC0ga2ZQZXJjZW50c1tpXSk7XG4gICAgICAgIGlmIChyYW5nZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdyA9IChwZXJjZW50IC0ga2ZQZXJjZW50c1tpXSkgLyByYW5nZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlU3BsaW5lKSB7XG4gICAgICAgICAgICBwMSA9IGtmVmFsdWVzW2ldO1xuICAgICAgICAgICAgcDAgPSBrZlZhbHVlc1tpID09PSAwID8gaSA6IGkgLSAxXTtcbiAgICAgICAgICAgIHAyID0ga2ZWYWx1ZXNbaSA+IHRyYWNrTGVuIC0gMiA/IHRyYWNrTGVuIC0gMSA6IGkgKyAxXTtcbiAgICAgICAgICAgIHAzID0ga2ZWYWx1ZXNbaSA+IHRyYWNrTGVuIC0gMyA/IHRyYWNrTGVuIC0gMSA6IGkgKyAyXTtcbiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZXIpIHtcbiAgICAgICAgICAgICAgICBzZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcih0YXJnZXQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAwLCBwMSwgcDIsIHAzLCB3XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBjYXRtdWxsUm9tSW50ZXJwb2xhdGVBcnJheShcbiAgICAgICAgICAgICAgICAgICAgcDAsIHAxLCBwMiwgcDMsIHcsIHcqdywgdyp3KncsXG4gICAgICAgICAgICAgICAgICAgIGdldHRlcih0YXJnZXQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgYXJyRGltXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjYXRtdWxsUm9tSW50ZXJwb2xhdGUocDAsIHAxLCBwMiwgcDMsIHcsIHcqdywgdyp3KncpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZXIpIHtcbiAgICAgICAgICAgICAgICBzZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcih0YXJnZXQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtmVmFsdWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAga2ZWYWx1ZXNbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVmFsdWVBcnJheSkge1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRlQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgIGtmVmFsdWVzW2ldLCBrZlZhbHVlc1tpKzFdLCB3LFxuICAgICAgICAgICAgICAgICAgICBnZXR0ZXIodGFyZ2V0LCBwcm9wTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIGFyckRpbVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldHRlcihcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVOdW1iZXIoa2ZWYWx1ZXNbaV0sIGtmVmFsdWVzW2krMV0sIHcpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY2xpcCA9IG5ldyBDbGlwKHtcbiAgICAgICAgdGFyZ2V0OiBhbmltYXRvci5fdGFyZ2V0LFxuICAgICAgICBsaWZlOiB0cmFja01heFRpbWUsXG4gICAgICAgIGxvb3A6IGFuaW1hdG9yLl9sb29wLFxuICAgICAgICBkZWxheTogYW5pbWF0b3IuX2RlbGF5LFxuICAgICAgICBvbmZyYW1lOiBvbmZyYW1lLFxuICAgICAgICBvbmZpbmlzaDogb25lVHJhY2tEb25lXG4gICAgfSk7XG5cbiAgICBpZiAoZWFzaW5nICYmIGVhc2luZyAhPT0gJ3NwbGluZScpIHtcbiAgICAgICAgY2xpcC5zZXRFYXNpbmcoZWFzaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQW5pbWF0b3Igb2JqZWN0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgQW5pbWF0aW9uLnByb3RvdHlwZS5hbmltYXRlIG1ldGhvZC5cbiAqIEFmdGVyIGNyZWF0ZWQsIHdlIGNhbiB1c2Uge0BsaW5rIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yI3doZW59IHRvIGFkZCBhbGwga2V5ZnJhbWVzIGFuZCB7QGxpbmsgY2xheS5hbmltYXRpb24uQW5pbWF0b3Ijc3RhcnR9IGl0LlxuICogQ2xpcHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBhbmltYXRpb24gaW5zdGFuY2Ugd2hpY2ggY3JlYXRlZCB0aGlzIGRlZmVycmVkIG9iamVjdC5cbiAqXG4gKiBAY29uc3RydWN0b3IgY2xheS5hbmltYXRpb24uQW5pbWF0b3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvb3BcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcnBvbGF0ZXJcbiAqL1xuZnVuY3Rpb24gQW5pbWF0b3IodGFyZ2V0LCBsb29wLCBnZXR0ZXIsIHNldHRlciwgaW50ZXJwb2xhdGVyKSB7XG4gICAgdGhpcy5fdHJhY2tzID0ge307XG4gICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgdGhpcy5fbG9vcCA9IGxvb3AgfHwgZmFsc2U7XG5cbiAgICB0aGlzLl9nZXR0ZXIgPSBnZXR0ZXIgfHwgZGVmYXVsdEdldHRlcjtcbiAgICB0aGlzLl9zZXR0ZXIgPSBzZXR0ZXIgfHwgZGVmYXVsdFNldHRlcjtcblxuICAgIHRoaXMuX2ludGVycG9sYXRlciA9IGludGVycG9sYXRlciB8fCBudWxsO1xuXG4gICAgdGhpcy5fZGVsYXkgPSAwO1xuXG4gICAgdGhpcy5fZG9uZUxpc3QgPSBbXTtcblxuICAgIHRoaXMuX29uZnJhbWVMaXN0ID0gW107XG5cbiAgICB0aGlzLl9jbGlwTGlzdCA9IFtdO1xufVxuXG5BbmltYXRvci5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogQW5pbWF0b3IsXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRpbWUgS2V5ZnJhbWUgdGltZSB1c2luZyBtaWxsaXNlY29uZFxuICAgICAqIEBwYXJhbSAge09iamVjdH0gcHJvcHMgQSBrZXktdmFsdWUgb2JqZWN0LiBWYWx1ZSBjYW4gYmUgbnVtYmVyLCAxZCBhbmQgMmQgYXJyYXlcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5BbmltYXRvcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5hbmltYXRpb24uQW5pbWF0b3IucHJvdG90eXBlXG4gICAgICovXG4gICAgd2hlbjogZnVuY3Rpb24gKHRpbWUsIHByb3BzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RyYWNrc1twcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFja3NbcHJvcE5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgLy8gSWYgdGltZSBpcyAwXG4gICAgICAgICAgICAgICAgLy8gIFRoZW4gcHJvcHMgaXMgZ2l2ZW4gaW5pdGlhbGl6ZSB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vIEVsc2VcbiAgICAgICAgICAgICAgICAvLyAgSW5pdGlhbGl6ZSB2YWx1ZSBmcm9tIGN1cnJlbnQgcHJvcCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmICh0aW1lICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrc1twcm9wTmFtZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNsb25lVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0dGVyKHRoaXMuX3RhcmdldCwgcHJvcE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RyYWNrc1twcm9wTmFtZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgdGltZTogcGFyc2VJbnQodGltZSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBjYWxsYmFjayB3aGVuIHJ1bm5pbmcgYW5pbWF0aW9uXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxiYWNrIGhhdmUgdHdvIGFyZ3MsIGFuaW1hdGluZyB0YXJnZXQgYW5kIGN1cnJlbnQgcGVyY2VudFxuICAgICAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkFuaW1hdG9yfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmFuaW1hdGlvbi5BbmltYXRvci5wcm90b3R5cGVcbiAgICAgKi9cbiAgICBkdXJpbmc6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbmZyYW1lTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kb25lQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIHRyYWNrc1xuICAgICAgICB0aGlzLl90cmFja3MgPSB7fTtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGNsaXBzXG4gICAgICAgIHRoaXMuX2NsaXBMaXN0Lmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdmFyIGRvbmVMaXN0ID0gdGhpcy5fZG9uZUxpc3Q7XG4gICAgICAgIHZhciBsZW4gPSBkb25lTGlzdC5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGRvbmVMaXN0W2ldLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd8RnVuY3Rpb259IGVhc2luZ1xuICAgICAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkFuaW1hdG9yfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmFuaW1hdGlvbi5BbmltYXRvci5wcm90b3R5cGVcbiAgICAgKi9cbiAgICBzdGFydDogZnVuY3Rpb24gKGVhc2luZykge1xuXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGNsaXBDb3VudCA9IDA7XG5cbiAgICAgICAgdmFyIG9uZVRyYWNrRG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xpcENvdW50LS07XG4gICAgICAgICAgICBpZiAoY2xpcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5fZG9uZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGxhc3RDbGlwO1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB0aGlzLl90cmFja3MpIHtcbiAgICAgICAgICAgIHZhciBjbGlwID0gY3JlYXRlVHJhY2tDbGlwKFxuICAgICAgICAgICAgICAgIHRoaXMsIGVhc2luZywgb25lVHJhY2tEb25lLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrc1twcm9wTmFtZV0sIHByb3BOYW1lLCBzZWxmLl9pbnRlcnBvbGF0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2xpcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NsaXBMaXN0LnB1c2goY2xpcCk7XG4gICAgICAgICAgICAgICAgY2xpcENvdW50Kys7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBzdGFydCBhZnRlciBhZGRlZCB0byBhbmltYXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb24uYWRkQ2xpcChjbGlwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXN0Q2xpcCA9IGNsaXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZHVyaW5nIGNhbGxiYWNrIG9uIHRoZSBsYXN0IGNsaXBcbiAgICAgICAgaWYgKGxhc3RDbGlwKSB7XG4gICAgICAgICAgICB2YXIgb2xkT25GcmFtZSA9IGxhc3RDbGlwLm9uZnJhbWU7XG4gICAgICAgICAgICBsYXN0Q2xpcC5vbmZyYW1lID0gZnVuY3Rpb24gKHRhcmdldCwgcGVyY2VudCkge1xuICAgICAgICAgICAgICAgIG9sZE9uRnJhbWUodGFyZ2V0LCBwZXJjZW50KTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5fb25mcmFtZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb25mcmFtZUxpc3RbaV0odGFyZ2V0LCBwZXJjZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjbGlwQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvbmVDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHRoZSBhbmltYXRpb25cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5hbmltYXRpb24uQW5pbWF0b3IucHJvdG90eXBlXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NsaXBMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2xpcCA9IHRoaXMuX2NsaXBMaXN0W2ldO1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb24ucmVtb3ZlQ2xpcChjbGlwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbGlwTGlzdCA9IFtdO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVsYXkgZ2l2ZW4gbWlsbGlzZWNvbmRzXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB0aW1lXG4gICAgICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uQW5pbWF0b3J9XG4gICAgICogQG1lbWJlck9mIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGRlbGF5OiBmdW5jdGlvbiAodGltZSl7XG4gICAgICAgIHRoaXMuX2RlbGF5ID0gdGltZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBhZnRlciBhbmltYXRpb24gZmluaXNoZWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uQW5pbWF0b3J9XG4gICAgICogQG1lbWJlck9mIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGRvbmU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgIGlmIChmdW5jKSB7XG4gICAgICAgICAgICB0aGlzLl9kb25lTGlzdC5wdXNoKGZ1bmMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBjbGlwcyBjcmVhdGVkIGluIHN0YXJ0IG1ldGhvZC5cbiAgICAgKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5DbGlwW119XG4gICAgICogQG1lbWJlck9mIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGdldENsaXBzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGlwTGlzdDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRvcjtcbiIsIi8vIDFEIEJsZW5kIGNsaXAgb2YgYmxlbmQgdHJlZVxuLy8gaHR0cDovL2RvY3MudW5pdHkzZC5jb20vRG9jdW1lbnRhdGlvbi9NYW51YWwvMURCbGVuZGluZy5odG1sXG5cbmltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5cbnZhciBjbGlwU29ydEZ1bmMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhLnBvc2l0aW9uIDwgYi5wb3NpdGlvbjtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gY2xheS5hbmltYXRpb24uQmxlbmQxRENsaXAuSUNsaXBJbnB1dFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGNsaXBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKipcbiAqIDFkIGJsZW5kaW5nIG5vZGUgaW4gYW5pbWF0aW9uIGJsZW5kIHRyZWUuXG4gKiBvdXRwdXQgY2xpcCBtdXN0IGhhdmUgYmxlbmQxRCBhbmQgY29weSBtZXRob2RcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLkJsZW5kMURDbGlwXG4gKiBAZXh0ZW5kcyBjbGF5LmFuaW1hdGlvbi5DbGlwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm5hbWVdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxpZmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZGVsYXldXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZ2FwXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnBsYXliYWNrUmF0aW9dXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbb3B0cy5sb29wXSBJZiBsb29wIGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZSB0aGUgbG9vcCBjb3VudCBvZiBhbmltYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBbb3B0cy5lYXNpbmddXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbmZyYW1lXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25maW5pc2hdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbnJlc3RhcnRdXG4gKiBAcGFyYW0ge29iamVjdFtdfSBbb3B0cy5pbnB1dHNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucG9zaXRpb25dXG4gKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLkNsaXB9IFtvcHRzLm91dHB1dF1cbiAqL1xudmFyIEJsZW5kMURDbGlwID0gZnVuY3Rpb24gKG9wdHMpIHtcblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgQ2xpcC5jYWxsKHRoaXMsIG9wdHMpO1xuICAgIC8qKlxuICAgICAqIE91dHB1dCBjbGlwIG11c3QgaGF2ZSBibGVuZDFEIGFuZCBjb3B5IG1ldGhvZFxuICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5DbGlwfVxuICAgICAqL1xuICAgIHRoaXMub3V0cHV0ID0gb3B0cy5vdXRwdXQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5hbmltYXRpb24uQmxlbmQxRENsaXAuSUNsaXBJbnB1dFtdfVxuICAgICAqL1xuICAgIHRoaXMuaW5wdXRzID0gb3B0cy5pbnB1dHMgfHwgW107XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcblxuICAgIHRoaXMuX2NhY2hlS2V5ID0gMDtcbiAgICB0aGlzLl9jYWNoZVBvc2l0aW9uID0gLUluZmluaXR5O1xuXG4gICAgdGhpcy5pbnB1dHMuc29ydChjbGlwU29ydEZ1bmMpO1xufTtcblxuQmxlbmQxRENsaXAucHJvdG90eXBlID0gbmV3IENsaXAoKTtcbkJsZW5kMURDbGlwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJsZW5kMURDbGlwO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvblxuICogQHBhcmFtIHtjbGF5LmFuaW1hdGlvbi5DbGlwfSBpbnB1dENsaXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0XVxuICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uQmxlbmQxRENsaXAuSUNsaXBJbnB1dH1cbiAqL1xuQmxlbmQxRENsaXAucHJvdG90eXBlLmFkZElucHV0ID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBpbnB1dENsaXAsIG9mZnNldCkge1xuICAgIHZhciBvYmogPSB7XG4gICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgY2xpcDogaW5wdXRDbGlwLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCB8fCAwXG4gICAgfTtcbiAgICB0aGlzLmxpZmUgPSBNYXRoLm1heChpbnB1dENsaXAubGlmZSwgdGhpcy5saWZlKTtcblxuICAgIGlmICghdGhpcy5pbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRzLnB1c2gob2JqKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgdmFyIGxlbiA9IHRoaXMuaW5wdXRzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pbnB1dHNbMF0ucG9zaXRpb24gPiBwb3NpdGlvbikge1xuICAgICAgICB0aGlzLmlucHV0cy51bnNoaWZ0KG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0c1tsZW4gLSAxXS5wb3NpdGlvbiA8PSBwb3NpdGlvbikge1xuICAgICAgICB0aGlzLmlucHV0cy5wdXNoKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuX2ZpbmRLZXkocG9zaXRpb24pO1xuICAgICAgICB0aGlzLmlucHV0cy5zcGxpY2Uoa2V5LCBvYmopO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG5CbGVuZDFEQ2xpcC5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICh0aW1lLCBkVGltZSwgc2lsZW50KSB7XG5cbiAgICB2YXIgcmV0ID0gQ2xpcC5wcm90b3R5cGUuc3RlcC5jYWxsKHRoaXMsIHRpbWUpO1xuXG4gICAgaWYgKHJldCAhPT0gJ2ZpbmlzaCcpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSk7XG4gICAgfVxuXG4gICAgLy8gUEVORElORyBTY2hlZHVsZVxuICAgIGlmICghc2lsZW50ICYmIHJldCAhPT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgdGhpcy5maXJlKCdmcmFtZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxuQmxlbmQxRENsaXAucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgdmFyIGlucHV0cyA9IHRoaXMuaW5wdXRzO1xuICAgIHZhciBsZW4gPSBpbnB1dHMubGVuZ3RoO1xuICAgIHZhciBtaW4gPSBpbnB1dHNbMF0ucG9zaXRpb247XG4gICAgdmFyIG1heCA9IGlucHV0c1tsZW4tMV0ucG9zaXRpb247XG5cbiAgICBpZiAocG9zaXRpb24gPD0gbWluIHx8IHBvc2l0aW9uID49IG1heCkge1xuICAgICAgICB2YXIgaW4wID0gcG9zaXRpb24gPD0gbWluID8gaW5wdXRzWzBdIDogaW5wdXRzW2xlbi0xXTtcbiAgICAgICAgdmFyIGNsaXAgPSBpbjAuY2xpcDtcbiAgICAgICAgdmFyIG9mZnNldCA9IGluMC5vZmZzZXQ7XG4gICAgICAgIGNsaXAuc2V0VGltZSgodGltZSArIG9mZnNldCkgJSBjbGlwLmxpZmUpO1xuICAgICAgICAvLyBJbnB1dCBjbGlwIGlzIGEgYmxlbmQgY2xpcFxuICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgIGlmIChjbGlwLm91dHB1dCBpbnN0YW5jZW9mIENsaXApIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0LmNvcHkoY2xpcC5vdXRwdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXQuY29weShjbGlwKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9maW5kS2V5KHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIGluMSA9IGlucHV0c1trZXldO1xuICAgICAgICB2YXIgaW4yID0gaW5wdXRzW2tleSArIDFdO1xuICAgICAgICB2YXIgY2xpcDEgPSBpbjEuY2xpcDtcbiAgICAgICAgdmFyIGNsaXAyID0gaW4yLmNsaXA7XG4gICAgICAgIC8vIFNldCB0aW1lIG9uIGlucHV0IGNsaXBzXG4gICAgICAgIGNsaXAxLnNldFRpbWUoKHRpbWUgKyBpbjEub2Zmc2V0KSAlIGNsaXAxLmxpZmUpO1xuICAgICAgICBjbGlwMi5zZXRUaW1lKCh0aW1lICsgaW4yLm9mZnNldCkgJSBjbGlwMi5saWZlKTtcblxuICAgICAgICB2YXIgdyA9ICh0aGlzLnBvc2l0aW9uIC0gaW4xLnBvc2l0aW9uKSAvIChpbjIucG9zaXRpb24gLSBpbjEucG9zaXRpb24pO1xuXG4gICAgICAgIHZhciBjMSA9IGNsaXAxLm91dHB1dCBpbnN0YW5jZW9mIENsaXAgPyBjbGlwMS5vdXRwdXQgOiBjbGlwMTtcbiAgICAgICAgdmFyIGMyID0gY2xpcDIub3V0cHV0IGluc3RhbmNlb2YgQ2xpcCA/IGNsaXAyLm91dHB1dCA6IGNsaXAyO1xuICAgICAgICB0aGlzLm91dHB1dC5ibGVuZDFEKGMxLCBjMiwgdyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbG9uZSBhIG5ldyBCbGVuZDFEIGNsaXBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xvbmVJbnB1dHMgVHJ1ZSBpZiBjbG9uZSB0aGUgaW5wdXQgY2xpcHNcbiAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkJsZW5kMURDbGlwfVxuICovXG5CbGVuZDFEQ2xpcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY2xvbmVJbnB1dHMpIHtcbiAgICB2YXIgY2xpcCA9IENsaXAucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgY2xpcC5vdXRwdXQgPSB0aGlzLm91dHB1dC5jbG9uZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlucHV0Q2xpcCA9IGNsb25lSW5wdXRzID8gdGhpcy5pbnB1dHNbaV0uY2xpcC5jbG9uZSh0cnVlKSA6IHRoaXMuaW5wdXRzW2ldLmNsaXA7XG4gICAgICAgIGNsaXAuYWRkSW5wdXQodGhpcy5pbnB1dHNbaV0ucG9zaXRpb24sIGlucHV0Q2xpcCwgdGhpcy5pbnB1dHNbaV0ub2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaXA7XG59O1xuXG4vLyBGaW5kIHRoZSBrZXkgd2hlcmUgcG9zaXRpb24gaW4gcmFuZ2UgW2lucHV0c1trZXldLnBvc2l0aW9uLCBpbnB1dHNba2V5KzFdLnBvc2l0aW9uKVxuQmxlbmQxRENsaXAucHJvdG90eXBlLl9maW5kS2V5ID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgdmFyIGtleSA9IC0xO1xuICAgIHZhciBpbnB1dHMgPSB0aGlzLmlucHV0cztcbiAgICB2YXIgbGVuID0gaW5wdXRzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5fY2FjaGVQb3NpdGlvbiA8IHBvc2l0aW9uKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9jYWNoZUtleTsgaSA8IGxlbi0xOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBpbnB1dHNbaV0ucG9zaXRpb24gJiYgcG9zaXRpb24gPCBpbnB1dHNbaSsxXS5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIGtleSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcyA9IE1hdGgubWluKGxlbi0yLCB0aGlzLl9jYWNoZUtleSk7XG4gICAgICAgIGZvciAodmFyIGkgPSBzOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IGlucHV0c1tpXS5wb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGlucHV0c1tpKzFdLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID49IDApIHtcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuX2NhY2hlUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmxlbmQxRENsaXA7IiwiLy8gRGVsYXVuYXkgVHJpYW5ndWxhdGlvblxuLy8gTW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vaXJvbndhbGxhYnkvZGVsYXVuYXlcbnZhciBFUFNJTE9OID0gMS4wIC8gMTA0ODU3Ni4wO1xuXG5mdW5jdGlvbiBzdXBlcnRyaWFuZ2xlKHZlcnRpY2VzKSB7XG4gICAgdmFyIHhtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHltaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHhtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHltYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIGksIGR4LCBkeSwgZG1heCwgeG1pZCwgeW1pZDtcblxuICAgIGZvciAoaSA9IHZlcnRpY2VzLmxlbmd0aDsgaS0tOyApIHtcbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzBdIDwgeG1pbikgeyB4bWluID0gdmVydGljZXNbaV1bMF07IH1cbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzBdID4geG1heCkgeyB4bWF4ID0gdmVydGljZXNbaV1bMF07IH1cbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzFdIDwgeW1pbikgeyB5bWluID0gdmVydGljZXNbaV1bMV07IH1cbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzFdID4geW1heCkgeyB5bWF4ID0gdmVydGljZXNbaV1bMV07IH1cbiAgICB9XG5cbiAgICBkeCA9IHhtYXggLSB4bWluO1xuICAgIGR5ID0geW1heCAtIHltaW47XG4gICAgZG1heCA9IE1hdGgubWF4KGR4LCBkeSk7XG4gICAgeG1pZCA9IHhtaW4gKyBkeCAqIDAuNTtcbiAgICB5bWlkID0geW1pbiArIGR5ICogMC41O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgW3htaWQgLSAyMCAqIGRtYXgsIHltaWQgLSAgICAgIGRtYXhdLFxuICAgICAgICBbeG1pZCAgICAgICAgICAgICwgeW1pZCArIDIwICogZG1heF0sXG4gICAgICAgIFt4bWlkICsgMjAgKiBkbWF4LCB5bWlkIC0gICAgICBkbWF4XVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNpcmN1bWNpcmNsZSh2ZXJ0aWNlcywgaSwgaiwgaykge1xuICAgIHZhciB4MSA9IHZlcnRpY2VzW2ldWzBdLFxuICAgICAgICAgICAgeTEgPSB2ZXJ0aWNlc1tpXVsxXSxcbiAgICAgICAgICAgIHgyID0gdmVydGljZXNbal1bMF0sXG4gICAgICAgICAgICB5MiA9IHZlcnRpY2VzW2pdWzFdLFxuICAgICAgICAgICAgeDMgPSB2ZXJ0aWNlc1trXVswXSxcbiAgICAgICAgICAgIHkzID0gdmVydGljZXNba11bMV0sXG4gICAgICAgICAgICBmYWJzeTF5MiA9IE1hdGguYWJzKHkxIC0geTIpLFxuICAgICAgICAgICAgZmFic3kyeTMgPSBNYXRoLmFicyh5MiAtIHkzKSxcbiAgICAgICAgICAgIHhjLCB5YywgbTEsIG0yLCBteDEsIG14MiwgbXkxLCBteTIsIGR4LCBkeTtcblxuICAgIC8qIENoZWNrIGZvciBjb2luY2lkZW50IHBvaW50cyAqL1xuICAgIGlmIChmYWJzeTF5MiA8IEVQU0lMT04gJiYgZmFic3kyeTMgPCBFUFNJTE9OKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRWVrISBDb2luY2lkZW50IHBvaW50cyEnKTtcbiAgICB9XG5cbiAgICBpZiAoZmFic3kxeTIgPCBFUFNJTE9OKSB7XG4gICAgICAgIG0yICA9IC0oKHgzIC0geDIpIC8gKHkzIC0geTIpKTtcbiAgICAgICAgbXgyID0gKHgyICsgeDMpIC8gMi4wO1xuICAgICAgICBteTIgPSAoeTIgKyB5MykgLyAyLjA7XG4gICAgICAgIHhjICA9ICh4MiArIHgxKSAvIDIuMDtcbiAgICAgICAgeWMgID0gbTIgKiAoeGMgLSBteDIpICsgbXkyO1xuICAgIH1cblxuICAgIGVsc2UgaWYgKGZhYnN5MnkzIDwgRVBTSUxPTikge1xuICAgICAgICBtMSAgPSAtKCh4MiAtIHgxKSAvICh5MiAtIHkxKSk7XG4gICAgICAgIG14MSA9ICh4MSArIHgyKSAvIDIuMDtcbiAgICAgICAgbXkxID0gKHkxICsgeTIpIC8gMi4wO1xuICAgICAgICB4YyAgPSAoeDMgKyB4MikgLyAyLjA7XG4gICAgICAgIHljICA9IG0xICogKHhjIC0gbXgxKSArIG15MTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgICAgbTEgID0gLSgoeDIgLSB4MSkgLyAoeTIgLSB5MSkpO1xuICAgICAgICBtMiAgPSAtKCh4MyAtIHgyKSAvICh5MyAtIHkyKSk7XG4gICAgICAgIG14MSA9ICh4MSArIHgyKSAvIDIuMDtcbiAgICAgICAgbXgyID0gKHgyICsgeDMpIC8gMi4wO1xuICAgICAgICBteTEgPSAoeTEgKyB5MikgLyAyLjA7XG4gICAgICAgIG15MiA9ICh5MiArIHkzKSAvIDIuMDtcbiAgICAgICAgeGMgID0gKG0xICogbXgxIC0gbTIgKiBteDIgKyBteTIgLSBteTEpIC8gKG0xIC0gbTIpO1xuICAgICAgICB5YyAgPSAoZmFic3kxeTIgPiBmYWJzeTJ5MykgP1xuICAgICAgICAgICAgbTEgKiAoeGMgLSBteDEpICsgbXkxIDpcbiAgICAgICAgICAgIG0yICogKHhjIC0gbXgyKSArIG15MjtcbiAgICB9XG5cbiAgICBkeCA9IHgyIC0geGM7XG4gICAgZHkgPSB5MiAtIHljO1xuICAgIHJldHVybiB7aTogaSwgajogaiwgazogaywgeDogeGMsIHk6IHljLCByOiBkeCAqIGR4ICsgZHkgKiBkeX07XG59XG5cbmZ1bmN0aW9uIGRlZHVwKGVkZ2VzKSB7XG4gICAgdmFyIGksIGosIGEsIGIsIG0sIG47XG5cbiAgICBmb3IgKGogPSBlZGdlcy5sZW5ndGg7IGo7ICkge1xuICAgICAgICBiID0gZWRnZXNbLS1qXTtcbiAgICAgICAgYSA9IGVkZ2VzWy0tal07XG5cbiAgICAgICAgZm9yIChpID0gajsgaTsgKSB7XG4gICAgICAgICAgICBuID0gZWRnZXNbLS1pXTtcbiAgICAgICAgICAgIG0gPSBlZGdlc1stLWldO1xuXG4gICAgICAgICAgICBpZiAoKGEgPT09IG0gJiYgYiA9PT0gbikgfHwgKGEgPT09IG4gJiYgYiA9PT0gbSkpIHtcbiAgICAgICAgICAgICAgICBlZGdlcy5zcGxpY2UoaiwgMik7XG4gICAgICAgICAgICAgICAgZWRnZXMuc3BsaWNlKGksIDIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgZGVsYXVuYXkgPSB7XG4gICAgdHJpYW5ndWxhdGU6IGZ1bmN0aW9uKHZlcnRpY2VzLCBrZXkpIHtcbiAgICAgICAgdmFyIG4gPSB2ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIHZhciBpLCBqLCBpbmRpY2VzLCBzdCwgb3BlbiwgY2xvc2VkLCBlZGdlcywgZHgsIGR5LCBhLCBiLCBjO1xuXG4gICAgICAgIC8qIEJhaWwgaWYgdGhlcmUgYXJlbid0IGVub3VnaCB2ZXJ0aWNlcyB0byBmb3JtIGFueSB0cmlhbmdsZXMuICovXG4gICAgICAgIGlmIChuIDwgMykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2xpY2Ugb3V0IHRoZSBhY3R1YWwgdmVydGljZXMgZnJvbSB0aGUgcGFzc2VkIG9iamVjdHMuIChEdXBsaWNhdGUgdGhlXG4gICAgICAgICAgICAqIGFycmF5IGV2ZW4gaWYgd2UgZG9uJ3QsIHRob3VnaCwgc2luY2Ugd2UgbmVlZCB0byBtYWtlIGEgc3VwZXJ0cmlhbmdsZVxuICAgICAgICAgICAgKiBsYXRlciBvbiEpICovXG4gICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMuc2xpY2UoMCk7XG5cbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgZm9yIChpID0gbjsgaS0tOyApIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHZlcnRpY2VzW2ldW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYWtlIGFuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgdmVydGV4IGFycmF5LCBzb3J0ZWQgYnkgdGhlXG4gICAgICAgICAgICAqIHZlcnRpY2VzJyB4LXBvc2l0aW9uLiBGb3JjZSBzdGFibGUgc29ydGluZyBieSBjb21wYXJpbmcgaW5kaWNlcyBpZlxuICAgICAgICAgICAgKiB0aGUgeC1wb3NpdGlvbnMgYXJlIGVxdWFsLiAqL1xuICAgICAgICBpbmRpY2VzID0gbmV3IEFycmF5KG4pO1xuXG4gICAgICAgIGZvciAoaSA9IG47IGktLTsgKSB7XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGljZXMuc29ydChmdW5jdGlvbihpLCBqKSB7XG4gICAgICAgICAgICB2YXIgZGlmZiA9IHZlcnRpY2VzW2pdWzBdIC0gdmVydGljZXNbaV1bMF07XG4gICAgICAgICAgICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBpIC0gajtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTmV4dCwgZmluZCB0aGUgdmVydGljZXMgb2YgdGhlIHN1cGVydHJpYW5nbGUgKHdoaWNoIGNvbnRhaW5zIGFsbCBvdGhlclxuICAgICAgICAgICAgKiB0cmlhbmdsZXMpLCBhbmQgYXBwZW5kIHRoZW0gb250byB0aGUgZW5kIG9mIGEgKGNvcHkgb2YpIHRoZSB2ZXJ0ZXhcbiAgICAgICAgICAgICogYXJyYXkuICovXG4gICAgICAgIHN0ID0gc3VwZXJ0cmlhbmdsZSh2ZXJ0aWNlcyk7XG4gICAgICAgIHZlcnRpY2VzLnB1c2goc3RbMF0sIHN0WzFdLCBzdFsyXSk7XG5cbiAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgb3BlbiBsaXN0IChjb250YWluaW5nIHRoZSBzdXBlcnRyaWFuZ2xlIGFuZCBub3RoaW5nXG4gICAgICAgICAgICAqIGVsc2UpIGFuZCB0aGUgY2xvc2VkIGxpc3QgKHdoaWNoIGlzIGVtcHR5IHNpbmNlIHdlIGhhdm4ndCBwcm9jZXNzZWRcbiAgICAgICAgICAgICogYW55IHRyaWFuZ2xlcyB5ZXQpLiAqL1xuICAgICAgICBvcGVuICAgPSBbY2lyY3VtY2lyY2xlKHZlcnRpY2VzLCBuICsgMCwgbiArIDEsIG4gKyAyKV07XG4gICAgICAgIGNsb3NlZCA9IFtdO1xuICAgICAgICBlZGdlcyAgPSBbXTtcblxuICAgICAgICAvKiBJbmNyZW1lbnRhbGx5IGFkZCBlYWNoIHZlcnRleCB0byB0aGUgbWVzaC4gKi9cbiAgICAgICAgZm9yIChpID0gaW5kaWNlcy5sZW5ndGg7IGktLTsgZWRnZXMubGVuZ3RoID0gMCkge1xuICAgICAgICAgICAgYyA9IGluZGljZXNbaV07XG5cbiAgICAgICAgICAgIC8qIEZvciBlYWNoIG9wZW4gdHJpYW5nbGUsIGNoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCBwb2ludCBpc1xuICAgICAgICAgICAgICAgICogaW5zaWRlIGl0J3MgY2lyY3VtY2lyY2xlLiBJZiBpdCBpcywgcmVtb3ZlIHRoZSB0cmlhbmdsZSBhbmQgYWRkXG4gICAgICAgICAgICAgICAgKiBpdCdzIGVkZ2VzIHRvIGFuIGVkZ2UgbGlzdC4gKi9cbiAgICAgICAgICAgIGZvciAoaiA9IG9wZW4ubGVuZ3RoOyBqLS07ICkge1xuICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgcG9pbnQgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoaXMgdHJpYW5nbGUncyBjaXJjdW1jaXJjbGUsXG4gICAgICAgICAgICAgICAgICAgICogdGhlbiB0aGlzIHRyaWFuZ2xlIHNob3VsZCBuZXZlciBnZXQgY2hlY2tlZCBhZ2Fpbi4gUmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgb3BlbiBsaXN0LCBhZGQgaXQgdG8gdGhlIGNsb3NlZCBsaXN0LCBhbmQgc2tpcC4gKi9cbiAgICAgICAgICAgICAgICBkeCA9IHZlcnRpY2VzW2NdWzBdIC0gb3BlbltqXS54O1xuICAgICAgICAgICAgICAgIGlmIChkeCA+IDAuMCAmJiBkeCAqIGR4ID4gb3BlbltqXS5yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlZC5wdXNoKG9wZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICBvcGVuLnNwbGljZShqLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogSWYgd2UncmUgb3V0c2lkZSB0aGUgY2lyY3VtY2lyY2xlLCBza2lwIHRoaXMgdHJpYW5nbGUuICovXG4gICAgICAgICAgICAgICAgZHkgPSB2ZXJ0aWNlc1tjXVsxXSAtIG9wZW5bal0ueTtcbiAgICAgICAgICAgICAgICBpZiAoZHggKiBkeCArIGR5ICogZHkgLSBvcGVuW2pdLnIgPiBFUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGUgdHJpYW5nbGUgYW5kIGFkZCBpdCdzIGVkZ2VzIHRvIHRoZSBlZGdlIGxpc3QuICovXG4gICAgICAgICAgICAgICAgZWRnZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgb3BlbltqXS5pLCBvcGVuW2pdLmosXG4gICAgICAgICAgICAgICAgICAgIG9wZW5bal0uaiwgb3BlbltqXS5rLFxuICAgICAgICAgICAgICAgICAgICBvcGVuW2pdLmssIG9wZW5bal0uaVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgb3Blbi5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFJlbW92ZSBhbnkgZG91YmxlZCBlZGdlcy4gKi9cbiAgICAgICAgICAgIGRlZHVwKGVkZ2VzKTtcblxuICAgICAgICAgICAgLyogQWRkIGEgbmV3IHRyaWFuZ2xlIGZvciBlYWNoIGVkZ2UuICovXG4gICAgICAgICAgICBmb3IgKGogPSBlZGdlcy5sZW5ndGg7IGo7ICkge1xuICAgICAgICAgICAgICAgIGIgPSBlZGdlc1stLWpdO1xuICAgICAgICAgICAgICAgIGEgPSBlZGdlc1stLWpdO1xuICAgICAgICAgICAgICAgIG9wZW4ucHVzaChjaXJjdW1jaXJjbGUodmVydGljZXMsIGEsIGIsIGMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIENvcHkgYW55IHJlbWFpbmluZyBvcGVuIHRyaWFuZ2xlcyB0byB0aGUgY2xvc2VkIGxpc3QsIGFuZCB0aGVuXG4gICAgICAgICAgICAqIHJlbW92ZSBhbnkgdHJpYW5nbGVzIHRoYXQgc2hhcmUgYSB2ZXJ0ZXggd2l0aCB0aGUgc3VwZXJ0cmlhbmdsZSxcbiAgICAgICAgICAgICogYnVpbGRpbmcgYSBsaXN0IG9mIHRyaXBsZXRzIHRoYXQgcmVwcmVzZW50IHRyaWFuZ2xlcy4gKi9cbiAgICAgICAgZm9yIChpID0gb3Blbi5sZW5ndGg7IGktLTsgKSB7XG4gICAgICAgICAgICBjbG9zZWQucHVzaChvcGVuW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgZm9yIChpID0gY2xvc2VkLmxlbmd0aDsgaS0tOyApIHtcbiAgICAgICAgICAgIGlmIChjbG9zZWRbaV0uaSA8IG4gJiYgY2xvc2VkW2ldLmogPCBuICYmIGNsb3NlZFtpXS5rIDwgbikge1xuICAgICAgICAgICAgICAgIG9wZW4ucHVzaChjbG9zZWRbaV0uaSwgY2xvc2VkW2ldLmosIGNsb3NlZFtpXS5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFlheSwgd2UncmUgZG9uZSEgKi9cbiAgICAgICAgcmV0dXJuIG9wZW47XG4gICAgfSxcbiAgICBjb250YWluczogZnVuY3Rpb24odHJpLCBwKSB7XG4gICAgICAgIC8qIEJvdW5kaW5nIGJveCB0ZXN0IGZpcnN0LCBmb3IgcXVpY2sgcmVqZWN0aW9ucy4gKi9cbiAgICAgICAgaWYgKChwWzBdIDwgdHJpWzBdWzBdICYmIHBbMF0gPCB0cmlbMV1bMF0gJiYgcFswXSA8IHRyaVsyXVswXSkgfHxcbiAgICAgICAgICAgICAgICAocFswXSA+IHRyaVswXVswXSAmJiBwWzBdID4gdHJpWzFdWzBdICYmIHBbMF0gPiB0cmlbMl1bMF0pIHx8XG4gICAgICAgICAgICAgICAgKHBbMV0gPCB0cmlbMF1bMV0gJiYgcFsxXSA8IHRyaVsxXVsxXSAmJiBwWzFdIDwgdHJpWzJdWzFdKSB8fFxuICAgICAgICAgICAgICAgIChwWzFdID4gdHJpWzBdWzFdICYmIHBbMV0gPiB0cmlbMV1bMV0gJiYgcFsxXSA+IHRyaVsyXVsxXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGEgPSB0cmlbMV1bMF0gLSB0cmlbMF1bMF07XG4gICAgICAgIHZhciBiID0gdHJpWzJdWzBdIC0gdHJpWzBdWzBdO1xuICAgICAgICB2YXIgYyA9IHRyaVsxXVsxXSAtIHRyaVswXVsxXTtcbiAgICAgICAgdmFyIGQgPSB0cmlbMl1bMV0gLSB0cmlbMF1bMV07XG4gICAgICAgIHZhciBpID0gYSAqIGQgLSBiICogYztcblxuICAgICAgICAvKiBEZWdlbmVyYXRlIHRyaS4gKi9cbiAgICAgICAgaWYgKGkgPT09IDAuMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdSA9IChkICogKHBbMF0gLSB0cmlbMF1bMF0pIC0gYiAqIChwWzFdIC0gdHJpWzBdWzFdKSkgLyBpLFxuICAgICAgICAgICAgICAgIHYgPSAoYSAqIChwWzFdIC0gdHJpWzBdWzFdKSAtIGMgKiAocFswXSAtIHRyaVswXVswXSkpIC8gaTtcblxuICAgICAgICAvKiBJZiB3ZSdyZSBvdXRzaWRlIHRoZSB0cmksIGZhaWwuICovXG4gICAgICAgIGlmICh1IDwgMC4wIHx8IHYgPCAwLjAgfHwgKHUgKyB2KSA+IDEuMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3UsIHZdO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlbGF1bmF5O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGdsLW1hdHJpeCAtIEhpZ2ggcGVyZm9ybWFuY2UgbWF0cml4IGFuZCB2ZWN0b3Igb3BlcmF0aW9uc1xuICogQGF1dGhvciBCcmFuZG9uIEpvbmVzXG4gKiBAYXV0aG9yIENvbGluIE1hY0tlbnppZSBJVlxuICogQHZlcnNpb24gMi4yLjJcbiAqL1xuXG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuXG4oZnVuY3Rpb24oX2dsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgc2hpbSA9IHt9O1xuICBpZiAodHlwZW9mKGV4cG9ydHMpID09PSAndW5kZWZpbmVkJykge1xuICAgIGlmKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICBzaGltLmV4cG9ydHMgPSB7fTtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNoaW0uZXhwb3J0cztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBnbC1tYXRyaXggbGl2ZXMgaW4gYSBicm93c2VyLCBkZWZpbmUgaXRzIG5hbWVzcGFjZXMgaW4gZ2xvYmFsXG4gICAgICBzaGltLmV4cG9ydHMgPSB0eXBlb2Yod2luZG93KSAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBfZ2xvYmFsO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICAvLyBnbC1tYXRyaXggbGl2ZXMgaW4gY29tbW9uanMsIGRlZmluZSBpdHMgbmFtZXNwYWNlcyBpbiBleHBvcnRzXG4gICAgc2hpbS5leHBvcnRzID0gZXhwb3J0cztcbiAgfVxuXG4gIChmdW5jdGlvbihleHBvcnRzKSB7XG4gICAgLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cblxuaWYoIUdMTUFUX0VQU0lMT04pIHtcbiAgICB2YXIgR0xNQVRfRVBTSUxPTiA9IDAuMDAwMDAxO1xufVxuXG5pZighR0xNQVRfQVJSQVlfVFlQRSkge1xuICAgIHZhciBHTE1BVF9BUlJBWV9UWVBFID0gKHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKSA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xufVxuXG5pZighR0xNQVRfUkFORE9NKSB7XG4gICAgdmFyIEdMTUFUX1JBTkRPTSA9IE1hdGgucmFuZG9tO1xufVxuXG4vKipcbiAqIEBjbGFzcyBDb21tb24gdXRpbGl0aWVzXG4gKiBAbmFtZSBnbE1hdHJpeFxuICovXG52YXIgZ2xNYXRyaXggPSB7fTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcbiAqXG4gKiBAcGFyYW0ge1R5cGV9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcbiAqL1xuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlID0gZnVuY3Rpb24odHlwZSkge1xuICAgIEdMTUFUX0FSUkFZX1RZUEUgPSB0eXBlO1xufVxuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5nbE1hdHJpeCA9IGdsTWF0cml4O1xufVxuXG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcblxuLyoqXG4qIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxuKlxuKiBAcGFyYW0ge051bWJlcn0gQW5nbGUgaW4gRGVncmVlc1xuKi9cbmdsTWF0cml4LnRvUmFkaWFuID0gZnVuY3Rpb24oYSl7XG4gICAgIHJldHVybiBhICogZGVncmVlO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDIgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMyXG4gKi9cblxudmFyIHZlYzIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDIpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSkge1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zdWIgPSB2ZWMyLnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLm11bCA9IHZlYzIubXVsdGlwbHk7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmRpdmlkZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5kaXYgPSB2ZWMyLmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgb3V0WzBdID0gYVswXSArIChiWzBdICogc2NhbGUpO1xuICAgIG91dFsxXSA9IGFbMV0gKyAoYlsxXSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjMi5kaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5kaXN0ID0gdmVjMi5kaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuc3F1YXJlZERpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgICByZXR1cm4geCp4ICsgeSp5O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuc3FyRGlzdCA9IHZlYzIuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzIubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLmxlbiA9IHZlYzIubGVuZ3RoO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cbnZlYzIuc3F1YXJlZExlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4geCp4ICsgeSp5O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckxlbiA9IHZlYzIuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IC1hWzBdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuaW52ZXJzZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMyLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59O1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMi5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV07XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICAgIHZhciByID0gR0xNQVRfUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDIgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHk7XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0MmQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDMgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMycy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMyLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjMnMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMi5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoY291bnQpIHtcbiAgICAgICAgICAgIGwgPSBNYXRoLm1pbigoY291bnQgKiBzdHJpZGUpICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICAgICAgICB2ZWNbMF0gPSBhW2ldOyB2ZWNbMV0gPSBhW2krMV07XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnKSc7XG59O1xuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy52ZWMyID0gdmVjMjtcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAzIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjM1xuICovXG5cbnZhciB2ZWMzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3ViID0gdmVjMy5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5tdWwgPSB2ZWMzLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGl2ID0gdmVjMy5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGlzdCA9IHZlYzMuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyRGlzdCA9IHZlYzMuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzMubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5sZW4gPSB2ZWMzLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMzLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6Kno7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyTGVuID0gdmVjMy5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJhbmRvbSA9IGZ1bmN0aW9uIChvdXQsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG5cbiAgICB2YXIgciA9IEdMTUFUX1JBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICB2YXIgeiA9IChHTE1BVF9SQU5ET00oKSAqIDIuMCkgLSAxLjA7XG4gICAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAteip6KSAqIHNjYWxlO1xuXG4gICAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gICAgb3V0WzJdID0geiAqIHNjYWxlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV07XG4gICAgdyA9IHcgfHwgMS4wO1xuICAgIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3O1xuICAgIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3O1xuICAgIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnRyYW5zZm9ybU1hdDMgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gICAgb3V0WzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIHogKiBtWzddO1xuICAgIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1RdWF0ID0gZnVuY3Rpb24ob3V0LCBhLCBxKSB7XG4gICAgLy8gYmVuY2htYXJrczogaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnNcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM10sXG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcbiAgICAgICAgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHksXG4gICAgICAgIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6LFxuICAgICAgICBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeCxcbiAgICAgICAgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuICAgIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gICAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgICBvdXRbMl0gPSBpeiAqIHF3ICsgaXcgKiAtcXogKyBpeCAqIC1xeSAtIGl5ICogLXF4O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVggPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgdmFyIHAgPSBbXSwgcj1bXTtcbiAgICAgIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgICAgIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgICAgIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICBwWzJdID0gYVsyXSAtIGJbMl07XG5cbiAgICAgIC8vcGVyZm9ybSByb3RhdGlvblxuICAgICAgclswXSA9IHBbMF07XG4gICAgICByWzFdID0gcFsxXSpNYXRoLmNvcyhjKSAtIHBbMl0qTWF0aC5zaW4oYyk7XG4gICAgICByWzJdID0gcFsxXSpNYXRoLnNpbihjKSArIHBbMl0qTWF0aC5jb3MoYyk7XG5cbiAgICAgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgICAgIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICAgICAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gICAgICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgIHZhciBwID0gW10sIHI9W107XG4gICAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICAgIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBwWzFdID0gYVsxXSAtIGJbMV07XG4gICAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gICAgLy9wZXJmb3JtIHJvdGF0aW9uXG4gICAgclswXSA9IHBbMl0qTWF0aC5zaW4oYykgKyBwWzBdKk1hdGguY29zKGMpO1xuICAgIHJbMV0gPSBwWzFdO1xuICAgIHJbMl0gPSBwWzJdKk1hdGguY29zKGMpIC0gcFswXSpNYXRoLnNpbihjKTtcblxuICAgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVogPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgIHZhciBwID0gW10sIHI9W107XG4gICAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICAgIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBwWzFdID0gYVsxXSAtIGJbMV07XG4gICAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gICAgLy9wZXJmb3JtIHJvdGF0aW9uXG4gICAgclswXSA9IHBbMF0qTWF0aC5jb3MoYykgLSBwWzFdKk1hdGguc2luKGMpO1xuICAgIHJbMV0gPSBwWzBdKk1hdGguc2luKGMpICsgcFsxXSpNYXRoLmNvcyhjKTtcbiAgICByWzJdID0gcFsyXTtcblxuICAgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDM7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoY291bnQpIHtcbiAgICAgICAgICAgIGwgPSBNYXRoLm1pbigoY291bnQgKiBzdHJpZGUpICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICAgICAgICB2ZWNbMF0gPSBhW2ldOyB2ZWNbMV0gPSBhW2krMV07IHZlY1syXSA9IGFbaSsyXTtcbiAgICAgICAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgICAgICAgYVtpXSA9IHZlY1swXTsgYVtpKzFdID0gdmVjWzFdOyBhW2krMl0gPSB2ZWNbMl07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xudmVjMy5hbmdsZSA9IGZ1bmN0aW9uKGEsIGIpIHtcblxuICAgIHZhciB0ZW1wQSA9IHZlYzMuZnJvbVZhbHVlcyhhWzBdLCBhWzFdLCBhWzJdKTtcbiAgICB2YXIgdGVtcEIgPSB2ZWMzLmZyb21WYWx1ZXMoYlswXSwgYlsxXSwgYlsyXSk7XG5cbiAgICB2ZWMzLm5vcm1hbGl6ZSh0ZW1wQSwgdGVtcEEpO1xuICAgIHZlYzMubm9ybWFsaXplKHRlbXBCLCB0ZW1wQik7XG5cbiAgICB2YXIgY29zaW5lID0gdmVjMy5kb3QodGVtcEEsIHRlbXBCKTtcblxuICAgIGlmKGNvc2luZSA+IDEuMCl7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcpJztcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLnZlYzMgPSB2ZWMzO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDQgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWM0XG4gKi9cblxudmFyIHZlYzQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XG4gKlxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xudmVjNC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoNCk7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xudmVjNC5mcm9tVmFsdWVzID0gZnVuY3Rpb24oeCwgeSwgeiwgdykge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWM0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6LCB3KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgb3V0WzNdID0gdztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSArIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zdWIgPSB2ZWM0LnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0Lm11bCA9IHZlYzQubXVsdGlwbHk7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmRpdmlkZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLyBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLyBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5kaXYgPSB2ZWM0LmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICAgIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgb3V0WzJdID0gYVsyXSAqIGI7XG4gICAgb3V0WzNdID0gYVszXSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgb3V0WzBdID0gYVswXSArIChiWzBdICogc2NhbGUpO1xuICAgIG91dFsxXSA9IGFbMV0gKyAoYlsxXSAqIHNjYWxlKTtcbiAgICBvdXRbMl0gPSBhWzJdICsgKGJbMl0gKiBzY2FsZSk7XG4gICAgb3V0WzNdID0gYVszXSArIChiWzNdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWM0LmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdLFxuICAgICAgICB3ID0gYlszXSAtIGFbM107XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnogKyB3KncpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5kaXN0ID0gdmVjNC5kaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzQuc3F1YXJlZERpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdLFxuICAgICAgICB3ID0gYlszXSAtIGFbM107XG4gICAgcmV0dXJuIHgqeCArIHkqeSArIHoqeiArIHcqdztcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnNxckRpc3QgPSB2ZWM0LnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWM0Lmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6ICsgdyp3KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmxlbiA9IHZlYzQubGVuZ3RoO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cbnZlYzQuc3F1YXJlZExlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuc3FyTGVuID0gdmVjNC5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgb3V0WzNdID0gLWFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIG91dFszXSA9IDEuMCAvIGFbM107XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgdmFyIGxlbiA9IHgqeCArIHkqeSArIHoqeiArIHcqdztcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW47XG4gICAgICAgIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gICAgICAgIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gICAgICAgIG91dFszXSA9IGFbM10gKiBsZW47XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xudmVjNC5kb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXSxcbiAgICAgICAgYXcgPSBhWzNdO1xuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICAgIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICAgIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQucmFuZG9tID0gZnVuY3Rpb24gKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcblxuICAgIC8vVE9ETzogVGhpcyBpcyBhIHByZXR0eSBhd2Z1bCB3YXkgb2YgZG9pbmcgdGhpcy4gRmluZCBzb21ldGhpbmcgYmV0dGVyLlxuICAgIG91dFswXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIG91dFsxXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIG91dFsyXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIG91dFszXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIHZlYzQubm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICB2ZWM0LnNjYWxlKG91dCwgb3V0LCBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLCB3ID0gYVszXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSAqIHc7XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICAgIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gICAgb3V0WzNdID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdICogdztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC50cmFuc2Zvcm1RdWF0ID0gZnVuY3Rpb24ob3V0LCBhLCBxKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sXG4gICAgICAgIHF4ID0gcVswXSwgcXkgPSBxWzFdLCBxeiA9IHFbMl0sIHF3ID0gcVszXSxcblxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY1xuICAgICAgICBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeSxcbiAgICAgICAgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHosXG4gICAgICAgIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4LFxuICAgICAgICBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cbiAgICAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG4gICAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgICBvdXRbMV0gPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6O1xuICAgIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWM0LmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gNDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdOyB2ZWNbM10gPSBhW2krM107XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTsgYVtpKzJdID0gdmVjWzJdOyBhW2krM10gPSB2ZWNbM107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSB2ZWMgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xudmVjNC5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAndmVjNCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLnZlYzQgPSB2ZWM0O1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDJ4MiBNYXRyaXhcbiAqIEBuYW1lIG1hdDJcbiAqL1xuXG52YXIgbWF0MiA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxuICpcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xubWF0Mi5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoNCk7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDIgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gICAgaWYgKG91dCA9PT0gYSkge1xuICAgICAgICB2YXIgYTEgPSBhWzFdO1xuICAgICAgICBvdXRbMV0gPSBhWzJdO1xuICAgICAgICBvdXRbMl0gPSBhMTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbMF0gPSBhWzBdO1xuICAgICAgICBvdXRbMV0gPSBhWzJdO1xuICAgICAgICBvdXRbMl0gPSBhWzFdO1xuICAgICAgICBvdXRbM10gPSBhWzNdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSAgYTMgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWExICogZGV0O1xuICAgIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgICBvdXRbM10gPSAgYTAgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgICB2YXIgYTAgPSBhWzBdO1xuICAgIG91dFswXSA9ICBhWzNdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9ICBhMDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM107XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0Mi5tdWwgPSBtYXQyLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cbm1hdDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBtYXQgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xubWF0Mi5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MignICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cbm1hdDIuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSkpXG59O1xuXG4vKipcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gTCB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGlucHV0IG1hdHJpeCB0byBmYWN0b3JpemVcbiAqL1xuXG5tYXQyLkxEVSA9IGZ1bmN0aW9uIChMLCBELCBVLCBhKSB7XG4gICAgTFsyXSA9IGFbMl0vYVswXTtcbiAgICBVWzBdID0gYVswXTtcbiAgICBVWzFdID0gYVsxXTtcbiAgICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdO1xuICAgIHJldHVybiBbTCwgRCwgVV07XG59O1xuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5tYXQyID0gbWF0Mjtcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAyeDMgTWF0cml4XG4gKiBAbmFtZSBtYXQyZFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHldXG4gKiA8L3ByZT5cbiAqIFRoaXMgaXMgYSBzaG9ydCBmb3JtIGZvciB0aGUgM3gzIG1hdHJpeDpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHksXG4gKiAgMCwgMCwgMV1cbiAqIDwvcHJlPlxuICogVGhlIGxhc3Qgcm93IGlzIGlnbm9yZWQgc28gdGhlIGFycmF5IGlzIHNob3J0ZXIgYW5kIG9wZXJhdGlvbnMgYXJlIGZhc3Rlci5cbiAqL1xuXG52YXIgbWF0MmQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXG4gKlxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cbm1hdDJkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDJkIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5tYXQyZC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pZGVudGl0eSA9IGZ1bmN0aW9uKG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGFhID0gYVswXSwgYWIgPSBhWzFdLCBhYyA9IGFbMl0sIGFkID0gYVszXSxcbiAgICAgICAgYXR4ID0gYVs0XSwgYXR5ID0gYVs1XTtcblxuICAgIHZhciBkZXQgPSBhYSAqIGFkIC0gYWIgKiBhYztcbiAgICBpZighZGV0KXtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IGFkICogZGV0O1xuICAgIG91dFsxXSA9IC1hYiAqIGRldDtcbiAgICBvdXRbMl0gPSAtYWMgKiBkZXQ7XG4gICAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGFjICogYXR5IC0gYWQgKiBhdHgpICogZGV0O1xuICAgIG91dFs1XSA9IChhYiAqIGF0eCAtIGFhICogYXR5KSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyZC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICAgIG91dFs1XSA9IGExICogYjQgKyBhMyAqIGI1ICsgYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyZC5tdWwgPSBtYXQyZC5tdWx0aXBseTtcblxuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyZCBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5yb3RhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgb3V0WzRdID0gYTQ7XG4gICAgb3V0WzVdID0gYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIG91dFs0XSA9IGE0O1xuICAgIG91dFs1XSA9IGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgICBvdXRbNV0gPSBhMSAqIHYwICsgYTMgKiB2MSArIGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xubWF0MmQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDJkKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0MmQuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyAxKSlcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLm1hdDJkID0gbWF0MmQ7XG59XG47XG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgM3gzIE1hdHJpeFxuICogQG5hbWUgbWF0M1xuICovXG5cbnZhciBtYXQzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQzXG4gKlxuICogQHJldHVybnMge21hdDN9IGEgbmV3IDN4MyBtYXRyaXhcbiAqL1xubWF0My5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoOSk7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cHBlci1sZWZ0IDN4MyB2YWx1ZXMgaW50byB0aGUgZ2l2ZW4gbWF0My5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIDN4MyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSAgIHRoZSBzb3VyY2UgNHg0IG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmZyb21NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVs0XTtcbiAgICBvdXRbNF0gPSBhWzVdO1xuICAgIG91dFs1XSA9IGFbNl07XG4gICAgb3V0WzZdID0gYVs4XTtcbiAgICBvdXRbN10gPSBhWzldO1xuICAgIG91dFs4XSA9IGFbMTBdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cbm1hdDMuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDE7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGExMiA9IGFbNV07XG4gICAgICAgIG91dFsxXSA9IGFbM107XG4gICAgICAgIG91dFsyXSA9IGFbNl07XG4gICAgICAgIG91dFszXSA9IGEwMTtcbiAgICAgICAgb3V0WzVdID0gYVs3XTtcbiAgICAgICAgb3V0WzZdID0gYTAyO1xuICAgICAgICBvdXRbN10gPSBhMTI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVszXTtcbiAgICAgICAgb3V0WzJdID0gYVs2XTtcbiAgICAgICAgb3V0WzNdID0gYVsxXTtcbiAgICAgICAgb3V0WzRdID0gYVs0XTtcbiAgICAgICAgb3V0WzVdID0gYVs3XTtcbiAgICAgICAgb3V0WzZdID0gYVsyXTtcbiAgICAgICAgb3V0WzddID0gYVs1XTtcbiAgICAgICAgb3V0WzhdID0gYVs4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjEsXG4gICAgICAgIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjAsXG4gICAgICAgIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMCxcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMTtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSBiMDEgKiBkZXQ7XG4gICAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICAgIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICAgIG91dFszXSA9IGIxMSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gICAgb3V0WzZdID0gYjIxICogZGV0O1xuICAgIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdO1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGEyMiAtIGExMiAqIGEyMSk7XG4gICAgb3V0WzFdID0gKGEwMiAqIGEyMSAtIGEwMSAqIGEyMik7XG4gICAgb3V0WzJdID0gKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XG4gICAgb3V0WzNdID0gKGExMiAqIGEyMCAtIGExMCAqIGEyMik7XG4gICAgb3V0WzRdID0gKGEwMCAqIGEyMiAtIGEwMiAqIGEyMCk7XG4gICAgb3V0WzVdID0gKGEwMiAqIGExMCAtIGEwMCAqIGExMik7XG4gICAgb3V0WzZdID0gKGExMCAqIGEyMSAtIGExMSAqIGEyMCk7XG4gICAgb3V0WzddID0gKGEwMSAqIGEyMCAtIGEwMCAqIGEyMSk7XG4gICAgb3V0WzhdID0gKGEwMCAqIGExMSAtIGEwMSAqIGExMCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDMuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdO1xuXG4gICAgcmV0dXJuIGEwMCAqIChhMjIgKiBhMTEgLSBhMTIgKiBhMjEpICsgYTAxICogKC1hMjIgKiBhMTAgKyBhMTIgKiBhMjApICsgYTAyICogKGEyMSAqIGExMCAtIGExMSAqIGEyMCk7XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDMnc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBiMDAgPSBiWzBdLCBiMDEgPSBiWzFdLCBiMDIgPSBiWzJdLFxuICAgICAgICBiMTAgPSBiWzNdLCBiMTEgPSBiWzRdLCBiMTIgPSBiWzVdLFxuICAgICAgICBiMjAgPSBiWzZdLCBiMjEgPSBiWzddLCBiMjIgPSBiWzhdO1xuXG4gICAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICAgIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTtcbiAgICBvdXRbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XG5cbiAgICBvdXRbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7XG4gICAgb3V0WzRdID0gYjEwICogYTAxICsgYjExICogYTExICsgYjEyICogYTIxO1xuICAgIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcblxuICAgIG91dFs2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMDtcbiAgICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gICAgb3V0WzhdID0gYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0My5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQzLm11bCA9IG1hdDMubXVsdGlwbHk7XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcbiAgICAgICAgeCA9IHZbMF0sIHkgPSB2WzFdO1xuXG4gICAgb3V0WzBdID0gYTAwO1xuICAgIG91dFsxXSA9IGEwMTtcbiAgICBvdXRbMl0gPSBhMDI7XG5cbiAgICBvdXRbM10gPSBhMTA7XG4gICAgb3V0WzRdID0gYTExO1xuICAgIG91dFs1XSA9IGExMjtcblxuICAgIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICAgIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICAgIG91dFs4XSA9IHggKiBhMDIgKyB5ICogYTEyICsgYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYyAqIGEwMCArIHMgKiBhMTA7XG4gICAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gICAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XG5cbiAgICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTtcbiAgICBvdXRbNV0gPSBjICogYTEyIC0gcyAqIGEwMjtcblxuICAgIG91dFs2XSA9IGEyMDtcbiAgICBvdXRbN10gPSBhMjE7XG4gICAgb3V0WzhdID0gYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MyBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5tYXQzLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXTtcblxuICAgIG91dFswXSA9IHggKiBhWzBdO1xuICAgIG91dFsxXSA9IHggKiBhWzFdO1xuICAgIG91dFsyXSA9IHggKiBhWzJdO1xuXG4gICAgb3V0WzNdID0geSAqIGFbM107XG4gICAgb3V0WzRdID0geSAqIGFbNF07XG4gICAgb3V0WzVdID0geSAqIGFbNV07XG5cbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGEgbWF0MmQgaW50byBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNvcHlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cbm1hdDMuZnJvbU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSBhWzJdO1xuICAgIG91dFs0XSA9IGFbM107XG4gICAgb3V0WzVdID0gMDtcblxuICAgIG91dFs2XSA9IGFbNF07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7cXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xubWF0My5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFszXSA9IHl4IC0gd3o7XG4gICAgb3V0WzZdID0genggKyB3eTtcblxuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzRdID0gMSAtIHh4IC0geno7XG4gICAgb3V0WzddID0genkgLSB3eDtcblxuICAgIG91dFsyXSA9IHp4IC0gd3k7XG4gICAgb3V0WzVdID0genkgKyB3eDtcbiAgICBvdXRbOF0gPSAxIC0geHggLSB5eTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5tYXQzLm5vcm1hbEZyb21NYXQ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzIsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgICBpZiAoIWRldCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG5cbiAgICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcblxuICAgIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICsgYVs4XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cbm1hdDMuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyBNYXRoLnBvdyhhWzZdLCAyKSArIE1hdGgucG93KGFbN10sIDIpICsgTWF0aC5wb3coYVs4XSwgMikpKVxufTtcblxuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5tYXQzID0gbWF0Mztcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyA0eDQgTWF0cml4XG4gKiBAbmFtZSBtYXQ0XG4gKi9cblxudmFyIG1hdDQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDRcbiAqXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5tYXQ0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5tYXQ0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gICAgaWYgKG91dCA9PT0gYSkge1xuICAgICAgICB2YXIgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgICAgIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgICAgICBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMV0gPSBhWzRdO1xuICAgICAgICBvdXRbMl0gPSBhWzhdO1xuICAgICAgICBvdXRbM10gPSBhWzEyXTtcbiAgICAgICAgb3V0WzRdID0gYTAxO1xuICAgICAgICBvdXRbNl0gPSBhWzldO1xuICAgICAgICBvdXRbN10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzhdID0gYTAyO1xuICAgICAgICBvdXRbOV0gPSBhMTI7XG4gICAgICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzEyXSA9IGEwMztcbiAgICAgICAgb3V0WzEzXSA9IGExMztcbiAgICAgICAgb3V0WzE0XSA9IGEyMztcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbMF0gPSBhWzBdO1xuICAgICAgICBvdXRbMV0gPSBhWzRdO1xuICAgICAgICBvdXRbMl0gPSBhWzhdO1xuICAgICAgICBvdXRbM10gPSBhWzEyXTtcbiAgICAgICAgb3V0WzRdID0gYVsxXTtcbiAgICAgICAgb3V0WzVdID0gYVs1XTtcbiAgICAgICAgb3V0WzZdID0gYVs5XTtcbiAgICAgICAgb3V0WzddID0gYVsxM107XG4gICAgICAgIG91dFs4XSA9IGFbMl07XG4gICAgICAgIG91dFs5XSA9IGFbNl07XG4gICAgICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICAgICAgb3V0WzExXSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTJdID0gYVszXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbN107XG4gICAgICAgIG91dFsxNF0gPSBhWzExXTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzIsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgICBpZiAoIWRldCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICAgIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xuICAgIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgb3V0WzBdICA9ICAoYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgICBvdXRbMV0gID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICAgIG91dFsyXSAgPSAgKGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzNdICA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbNF0gID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICAgIG91dFs1XSAgPSAgKGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gICAgb3V0WzZdICA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbN10gID0gIChhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICAgIG91dFs4XSAgPSAgKGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSk7XG4gICAgb3V0WzldICA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgICBvdXRbMTBdID0gIChhMDAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICAgIG91dFsxMV0gPSAtKGEwMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKSk7XG4gICAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgICBvdXRbMTNdID0gIChhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkpO1xuICAgIG91dFsxNF0gPSAtKGEwMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gICAgb3V0WzE1XSA9ICAoYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xubWF0NC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV0sXG5cbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICByZXR1cm4gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHkgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG5cbiAgICAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcbiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gYWZmaW5lIG1hdDQnc1xuICogQWRkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9waXNzYW5nXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHlBZmZpbmUgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdO1xuICAgIG91dFswXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMDtcbiAgICBvdXRbMV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjE7XG4gICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyO1xuICAgIC8vIG91dFszXSA9IDA7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdO1xuICAgIG91dFs0XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMDtcbiAgICBvdXRbNV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjE7XG4gICAgb3V0WzZdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyO1xuICAgIC8vIG91dFs3XSA9IDA7XG5cbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTtcbiAgICBvdXRbOF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjA7XG4gICAgb3V0WzldID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxO1xuICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjI7XG4gICAgLy8gb3V0WzExXSA9IDA7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBhMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYTMyO1xuICAgIC8vIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQ0Lm11bCA9IG1hdDQubXVsdGlwbHk7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5QWZmaW5lfVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDQubXVsQWZmaW5lID0gbWF0NC5tdWx0aXBseUFmZmluZTtcbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC50cmFuc2xhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbm1hdDQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXTtcblxuICAgIG91dFswXSA9IGFbMF0gKiB4O1xuICAgIG91dFsxXSA9IGFbMV0gKiB4O1xuICAgIG91dFsyXSA9IGFbMl0gKiB4O1xuICAgIG91dFszXSA9IGFbM10gKiB4O1xuICAgIG91dFs0XSA9IGFbNF0gKiB5O1xuICAgIG91dFs1XSA9IGFbNV0gKiB5O1xuICAgIG91dFs2XSA9IGFbNl0gKiB5O1xuICAgIG91dFs3XSA9IGFbN10gKiB5O1xuICAgIG91dFs4XSA9IGFbOF0gKiB6O1xuICAgIG91dFs5XSA9IGFbOV0gKiB6O1xuICAgIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gICAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7dmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gICAgdmFyIHggPSBheGlzWzBdLCB5ID0gYXhpc1sxXSwgeiA9IGF4aXNbMl0sXG4gICAgICAgIGxlbiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopLFxuICAgICAgICBzLCBjLCB0LFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzLFxuICAgICAgICBiMDAsIGIwMSwgYjAyLFxuICAgICAgICBiMTAsIGIxMSwgYjEyLFxuICAgICAgICBiMjAsIGIyMSwgYjIyO1xuXG4gICAgaWYgKE1hdGguYWJzKGxlbikgPCBHTE1BVF9FUFNJTE9OKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHggKj0gbGVuO1xuICAgIHkgKj0gbGVuO1xuICAgIHogKj0gbGVuO1xuXG4gICAgcyA9IE1hdGguc2luKHJhZCk7XG4gICAgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgdCA9IDEgLSBjO1xuXG4gICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdOyBhMTEgPSBhWzVdOyBhMTIgPSBhWzZdOyBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZWxlbWVudHMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeFxuICAgIGIwMCA9IHggKiB4ICogdCArIGM7IGIwMSA9IHkgKiB4ICogdCArIHogKiBzOyBiMDIgPSB6ICogeCAqIHQgLSB5ICogcztcbiAgICBiMTAgPSB4ICogeSAqIHQgLSB6ICogczsgYjExID0geSAqIHkgKiB0ICsgYzsgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gICAgYjIwID0geCAqIHogKiB0ICsgeSAqIHM7IGIyMSA9IHkgKiB6ICogdCAtIHggKiBzOyBiMjIgPSB6ICogeiAqIHQgKyBjO1xuXG4gICAgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gICAgb3V0WzFdID0gYTAxICogYjAwICsgYTExICogYjAxICsgYTIxICogYjAyO1xuICAgIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjtcbiAgICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gICAgb3V0WzRdID0gYTAwICogYjEwICsgYTEwICogYjExICsgYTIwICogYjEyO1xuICAgIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjtcbiAgICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gICAgb3V0WzddID0gYTAzICogYjEwICsgYTEzICogYjExICsgYTIzICogYjEyO1xuICAgIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjtcbiAgICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gICAgb3V0WzEwXSA9IGEwMiAqIGIyMCArIGExMiAqIGIyMSArIGEyMiAqIGIyMjtcbiAgICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5yb3RhdGVYID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTEwID0gYVs0XSxcbiAgICAgICAgYTExID0gYVs1XSxcbiAgICAgICAgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSxcbiAgICAgICAgYTIxID0gYVs5XSxcbiAgICAgICAgYTIyID0gYVsxMF0sXG4gICAgICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgICAgIG91dFswXSAgPSBhWzBdO1xuICAgICAgICBvdXRbMV0gID0gYVsxXTtcbiAgICAgICAgb3V0WzJdICA9IGFbMl07XG4gICAgICAgIG91dFszXSAgPSBhWzNdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xuICAgIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICAgIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xuICAgIG91dFs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xuICAgIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICAgIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xuICAgIG91dFsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcbiAgICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMDAgPSBhWzBdLFxuICAgICAgICBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdLFxuICAgICAgICBhMjAgPSBhWzhdLFxuICAgICAgICBhMjEgPSBhWzldLFxuICAgICAgICBhMjIgPSBhWzEwXSxcbiAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICAgICAgb3V0WzRdICA9IGFbNF07XG4gICAgICAgIG91dFs1XSAgPSBhWzVdO1xuICAgICAgICBvdXRbNl0gID0gYVs2XTtcbiAgICAgICAgb3V0WzddICA9IGFbN107XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XG4gICAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gICAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gICAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XG4gICAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gICAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gICAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xuICAgIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlWiA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGEwMCA9IGFbMF0sXG4gICAgICAgIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sXG4gICAgICAgIGExMSA9IGFbNV0sXG4gICAgICAgIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgICAgIG91dFs4XSAgPSBhWzhdO1xuICAgICAgICBvdXRbOV0gID0gYVs5XTtcbiAgICAgICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgICAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gICAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gICAgb3V0WzJdID0gYTAyICogYyArIGExMiAqIHM7XG4gICAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gICAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gICAgb3V0WzVdID0gYTExICogYyAtIGEwMSAqIHM7XG4gICAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gICAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiBhbmQgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIHZhciBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvbiA9IGZ1bmN0aW9uIChvdXQsIHEsIHYpIHtcbiAgICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHh5ID0geCAqIHkyLFxuICAgICAgICB4eiA9IHggKiB6MixcbiAgICAgICAgeXkgPSB5ICogeTIsXG4gICAgICAgIHl6ID0geSAqIHoyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gICAgb3V0WzFdID0geHkgKyB3ejtcbiAgICBvdXRbMl0gPSB4eiAtIHd5O1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geHkgLSB3ejtcbiAgICBvdXRbNV0gPSAxIC0gKHh4ICsgenopO1xuICAgIG91dFs2XSA9IHl6ICsgd3g7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4eiArIHd5O1xuICAgIG91dFs5XSA9IHl6IC0gd3g7XG4gICAgb3V0WzEwXSA9IDEgLSAoeHggKyB5eSk7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IHZbMF07XG4gICAgb3V0WzEzXSA9IHZbMV07XG4gICAgb3V0WzE0XSA9IHZbMl07XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxubWF0NC5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzJdID0genggLSB3eTtcbiAgICBvdXRbM10gPSAwO1xuXG4gICAgb3V0WzRdID0geXggLSB3ejtcbiAgICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgICBvdXRbNl0gPSB6eSArIHd4O1xuICAgIG91dFs3XSA9IDA7XG5cbiAgICBvdXRbOF0gPSB6eCArIHd5O1xuICAgIG91dFs5XSA9IHp5IC0gd3g7XG4gICAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICAgIG91dFsxMV0gPSAwO1xuXG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcnVzdHVtID0gZnVuY3Rpb24gKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCksXG4gICAgICAgIHRiID0gMSAvICh0b3AgLSBib3R0b20pLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gKG5lYXIgKiAyKSAqIHJsO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gKG5lYXIgKiAyKSAqIHRiO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICAgIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKGZhciAqIG5lYXIgKiAyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucGVyc3BlY3RpdmUgPSBmdW5jdGlvbiAob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGY7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoMiAqIGZhciAqIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5vcnRobyA9IGZ1bmN0aW9uIChvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpLFxuICAgICAgICBidCA9IDEgLyAoYm90dG9tIC0gdG9wKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IC0yICogbHI7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAtMiAqIGJ0O1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gKGxlZnQgKyByaWdodCkgKiBscjtcbiAgICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lmxvb2tBdCA9IGZ1bmN0aW9uIChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW4sXG4gICAgICAgIGV5ZXggPSBleWVbMF0sXG4gICAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgICB1cHkgPSB1cFsxXSxcbiAgICAgICAgdXB6ID0gdXBbMl0sXG4gICAgICAgIGNlbnRlcnggPSBjZW50ZXJbMF0sXG4gICAgICAgIGNlbnRlcnkgPSBjZW50ZXJbMV0sXG4gICAgICAgIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgR0xNQVRfRVBTSUxPTiAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBHTE1BVF9FUFNJTE9OICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IEdMTUFUX0VQU0lMT04pIHtcbiAgICAgICAgcmV0dXJuIG1hdDQuaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQ0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQ0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVs4XSArICcsICcgKyBhWzldICsgJywgJyArIGFbMTBdICsgJywgJyArIGFbMTFdICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIGFbMTJdICsgJywgJyArIGFbMTNdICsgJywgJyArIGFbMTRdICsgJywgJyArIGFbMTVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0NC5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSArIE1hdGgucG93KGFbOV0sIDIpICsgTWF0aC5wb3coYVsxMF0sIDIpICsgTWF0aC5wb3coYVsxMV0sIDIpICsgTWF0aC5wb3coYVsxMl0sIDIpICsgTWF0aC5wb3coYVsxM10sIDIpICsgTWF0aC5wb3coYVsxNF0sIDIpICsgTWF0aC5wb3coYVsxNV0sIDIpICkpXG59O1xuXG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLm1hdDQgPSBtYXQ0O1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIFF1YXRlcm5pb25cbiAqIEBuYW1lIHF1YXRcbiAqL1xuXG52YXIgcXVhdCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxuICpcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKi9cbnF1YXQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxuICogdmVjdG9yIHRvIGFub3RoZXIuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRpb25UbyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG1wdmVjMyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLDAsMCk7XG4gICAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLDEsMCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcbiAgICAgICAgaWYgKGRvdCA8IC0wLjk5OTk5OSkge1xuICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB4VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgaWYgKHZlYzMubGVuZ3RoKHRtcHZlYzMpIDwgMC4wMDAwMDEpXG4gICAgICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICAgICAgICBxdWF0LnNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgICAgICAgb3V0WzBdID0gMDtcbiAgICAgICAgICAgIG91dFsxXSA9IDA7XG4gICAgICAgICAgICBvdXRbMl0gPSAwO1xuICAgICAgICAgICAgb3V0WzNdID0gMTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIGEsIGIpO1xuICAgICAgICAgICAgb3V0WzBdID0gdG1wdmVjM1swXTtcbiAgICAgICAgICAgIG91dFsxXSA9IHRtcHZlYzNbMV07XG4gICAgICAgICAgICBvdXRbMl0gPSB0bXB2ZWMzWzJdO1xuICAgICAgICAgICAgb3V0WzNdID0gMSArIGRvdDtcbiAgICAgICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSByaWdodCB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJyaWdodFwiIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnNldEF4ZXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgICAgIG1hdHJbMF0gPSByaWdodFswXTtcbiAgICAgICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgICAgICBtYXRyWzZdID0gcmlnaHRbMl07XG5cbiAgICAgICAgbWF0clsxXSA9IHVwWzBdO1xuICAgICAgICBtYXRyWzRdID0gdXBbMV07XG4gICAgICAgIG1hdHJbN10gPSB1cFsyXTtcblxuICAgICAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICAgICAgbWF0cls4XSA9IC12aWV3WzJdO1xuXG4gICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIHF1YXQuZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY2xvbmUgPSB2ZWM0LmNsb25lO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY29weSA9IHZlYzQuY29weTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zZXQgPSB2ZWM0LnNldDtcblxuLyoqXG4gKiBTZXQgYSBxdWF0IHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIGFyb3VuZCB3aGljaCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqKi9cbnF1YXQuc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24ob3V0LCBheGlzLCByYWQpIHtcbiAgICByYWQgPSByYWQgKiAwLjU7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIG91dFswXSA9IHMgKiBheGlzWzBdO1xuICAgIG91dFsxXSA9IHMgKiBheGlzWzFdO1xuICAgIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICAgIG91dFszXSA9IE1hdGguY29zKHJhZCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmFkZCA9IHZlYzQuYWRkO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lm11bCA9IHF1YXQubXVsdGlwbHk7XG5cbi8qKlxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zY2FsZSA9IHZlYzQuc2NhbGU7XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41O1xuXG4gICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXSxcbiAgICAgICAgYnggPSBNYXRoLnNpbihyYWQpLCBidyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieDtcbiAgICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHJhZCAqPSAwLjU7XG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieSA9IE1hdGguc2luKHJhZCksIGJ3ID0gTWF0aC5jb3MocmFkKTtcblxuICAgIG91dFswXSA9IGF4ICogYncgLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5O1xuICAgIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICAgIG91dFszXSA9IGF3ICogYncgLSBheSAqIGJ5O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWiBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5yb3RhdGVaID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgcmFkICo9IDAuNTtcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ6ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gICAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYno7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXG4gKiBBc3N1bWVzIHRoYXQgcXVhdGVybmlvbiBpcyAxIHVuaXQgaW4gbGVuZ3RoLlxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG5cbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZG90ID0gdmVjNC5kb3Q7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVycCA9IHZlYzQubGVycDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5zbGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICAvLyBiZW5jaG1hcmtzOlxuICAgIC8vICAgIGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tc2xlcnAtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICB2YXIgICAgICAgIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxO1xuXG4gICAgLy8gY2FsYyBjb3NpbmVcbiAgICBjb3NvbSA9IGF4ICogYnggKyBheSAqIGJ5ICsgYXogKiBieiArIGF3ICogYnc7XG4gICAgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG4gICAgaWYgKCBjb3NvbSA8IDAuMCApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICggKDEuMCAtIGNvc29tKSA+IDAuMDAwMDAxICkge1xuICAgICAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcbiAgICAgICAgb21lZ2EgID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICAgICAgc2lub20gID0gTWF0aC5zaW4ob21lZ2EpO1xuICAgICAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICAgICAgc2NhbGUxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFwiZnJvbVwiIGFuZCBcInRvXCIgcXVhdGVybmlvbnMgYXJlIHZlcnkgY2xvc2VcbiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgICAgICBzY2FsZTEgPSB0O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzXG4gICAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgICBvdXRbMV0gPSBzY2FsZTAgKiBheSArIHNjYWxlMSAqIGJ5O1xuICAgIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7XG4gICAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIGRvdCA9IGEwKmEwICsgYTEqYTEgKyBhMiphMiArIGEzKmEzLFxuICAgICAgICBpbnZEb3QgPSBkb3QgPyAxLjAvZG90IDogMDtcblxuICAgIC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgICBvdXRbMF0gPSAtYTAqaW52RG90O1xuICAgIG91dFsxXSA9IC1hMSppbnZEb3Q7XG4gICAgb3V0WzJdID0gLWEyKmludkRvdDtcbiAgICBvdXRbM10gPSBhMyppbnZEb3Q7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgcXVhdFxuICogSWYgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0LmludmVyc2UgYW5kIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5jb25qdWdhdGUgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVuZ3RoID0gdmVjNC5sZW5ndGg7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmxlbiA9IHF1YXQubGVuZ3RoO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zcXVhcmVkTGVuZ3RoID0gdmVjNC5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuc3FyTGVuID0gcXVhdC5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubm9ybWFsaXplID0gdmVjNC5ub3JtYWxpemU7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gM3gzIHJvdGF0aW9uIG1hdHJpeC5cbiAqXG4gKiBOT1RFOiBUaGUgcmVzdWx0YW50IHF1YXRlcm5pb24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIHlvdSBzaG91bGQgYmUgc3VyZVxuICogdG8gcmVub3JtYWxpemUgdGhlIHF1YXRlcm5pb24geW91cnNlbGYgd2hlcmUgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHttYXQzfSBtIHJvdGF0aW9uIG1hdHJpeFxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZnJvbU1hdDMgPSBmdW5jdGlvbihvdXQsIG0pIHtcbiAgICAvLyBBbGdvcml0aG0gaW4gS2VuIFNob2VtYWtlJ3MgYXJ0aWNsZSBpbiAxOTg3IFNJR0dSQVBIIGNvdXJzZSBub3Rlc1xuICAgIC8vIGFydGljbGUgXCJRdWF0ZXJuaW9uIENhbGN1bHVzIGFuZCBGYXN0IEFuaW1hdGlvblwiLlxuICAgIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gICAgdmFyIGZSb290O1xuXG4gICAgaWYgKCBmVHJhY2UgPiAwLjAgKSB7XG4gICAgICAgIC8vIHx3fCA+IDEvMiwgbWF5IGFzIHdlbGwgY2hvb3NlIHcgPiAxLzJcbiAgICAgICAgZlJvb3QgPSBNYXRoLnNxcnQoZlRyYWNlICsgMS4wKTsgIC8vIDJ3XG4gICAgICAgIG91dFszXSA9IDAuNSAqIGZSb290O1xuICAgICAgICBmUm9vdCA9IDAuNS9mUm9vdDsgIC8vIDEvKDR3KVxuICAgICAgICBvdXRbMF0gPSAobVs1XS1tWzddKSpmUm9vdDtcbiAgICAgICAgb3V0WzFdID0gKG1bNl0tbVsyXSkqZlJvb3Q7XG4gICAgICAgIG91dFsyXSA9IChtWzFdLW1bM10pKmZSb290O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHx3fCA8PSAxLzJcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICBpZiAoIG1bNF0gPiBtWzBdIClcbiAgICAgICAgICBpID0gMTtcbiAgICAgICAgaWYgKCBtWzhdID4gbVtpKjMraV0gKVxuICAgICAgICAgIGkgPSAyO1xuICAgICAgICB2YXIgaiA9IChpKzEpJTM7XG4gICAgICAgIHZhciBrID0gKGkrMiklMztcblxuICAgICAgICBmUm9vdCA9IE1hdGguc3FydChtW2kqMytpXS1tW2oqMytqXS1tW2sqMytrXSArIDEuMCk7XG4gICAgICAgIG91dFtpXSA9IDAuNSAqIGZSb290O1xuICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290O1xuICAgICAgICBvdXRbM10gPSAobVtqKjMra10gLSBtW2sqMytqXSkgKiBmUm9vdDtcbiAgICAgICAgb3V0W2pdID0gKG1baiozK2ldICsgbVtpKjMral0pICogZlJvb3Q7XG4gICAgICAgIG91dFtrXSA9IChtW2sqMytpXSArIG1baSozK2tdKSAqIGZSb290O1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBxdWF0ZW5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5xdWF0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdxdWF0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxuaWYodHlwZW9mKGV4cG9ydHMpICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMucXVhdCA9IHF1YXQ7XG59XG47XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgfSkoc2hpbS5leHBvcnRzKTtcbn0pKHRoaXMpOyIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHZlYzIgPSBnbE1hdHJpeC52ZWMyO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5WZWN0b3IyXG4gKiBAcGFyYW0ge251bWJlcn0geFxuICogQHBhcmFtIHtudW1iZXJ9IHlcbiAqL1xudmFyIFZlY3RvcjIgPSBmdW5jdGlvbih4LCB5KSB7XG5cbiAgICB4ID0geCB8fCAwO1xuICAgIHkgPSB5IHx8IDA7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIFZlY3RvcjIsIHJlYWQgYW5kIHdyaXRlIG9mIHgsIHkgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhcnJheVxuICAgICAqIEFsbCBtZXRob2RzIGFsc28gb3BlcmF0ZSBvbiB0aGUgYXJyYXkgaW5zdGVhZCBvZiB4LCB5IGNvbXBvbmVudHNcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3IyI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSB2ZWMyLmZyb21WYWx1ZXMoeCwgeSk7XG5cbiAgICAvKipcbiAgICAgKiBEaXJ0eSBmbGFnIGlzIHVzZWQgYnkgdGhlIE5vZGUgdG8gZGV0ZXJtaW5lXG4gICAgICogaWYgdGhlIG1hdHJpeCBpcyB1cGRhdGVkIHRvIGxhdGVzdFxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguVmVjdG9yMiNcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG59O1xuXG5WZWN0b3IyLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBWZWN0b3IyLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGIgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIuYWRkKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgeCBhbmQgeSBjb21wb25lbnRzXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgeFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHlcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IHg7XG4gICAgICAgIHRoaXMuYXJyYXlbMV0gPSB5O1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgeCBhbmQgeSBjb21wb25lbnRzIGZyb20gYXJyYXlcbiAgICAgKiBAcGFyYW0gIHtGbG9hdDMyQXJyYXl8bnVtYmVyW119IGFyclxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIHNldEFycmF5OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IGFyclswXTtcbiAgICAgICAgdGhpcy5hcnJheVsxXSA9IGFyclsxXTtcblxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBWZWN0b3IyXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IHgsIHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIuY29weSh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3Jvc3MgcHJvZHVjdCBvZiBzZWxmIGFuZCBiLCB3cml0dGVuIHRvIGEgVmVjdG9yMyBvdXRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBjcm9zczogZnVuY3Rpb24ob3V0LCBiKSB7XG4gICAgICAgIHZlYzIuY3Jvc3Mob3V0LmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGlzdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLmRpc3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3RhbmNlIGJldHdlZW4gc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRpc3RhbmNlOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLmRpc3RhbmNlKHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGl2aWRlXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBkaXY6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjMi5kaXYodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSBzZWxmIGJ5IGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIGRpdmlkZTogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWMyLmRpdmlkZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRG90IHByb2R1Y3Qgb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRvdDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjMi5kb3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmVjMi5sZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLmxlbmd0aCh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBhIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBsZXJwOiBmdW5jdGlvbihhLCBiLCB0KSB7XG4gICAgICAgIHZlYzIubGVycCh0aGlzLmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBtaW46IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjMi5taW4odGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgbWF4OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIubWF4KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgbXVsdGlwbHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIG11bDogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWMyLm11bCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0aXBseSBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBtdWx0aXBseTogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWMyLm11bHRpcGx5KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGUgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIG5lZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZlYzIubmVnYXRlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZlYzIubm9ybWFsaXplKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSByYW5kb20geCwgeSBjb21wb25lbnRzIHdpdGggYSBnaXZlbiBzY2FsZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICByYW5kb206IGZ1bmN0aW9uKHNjYWxlKSB7XG4gICAgICAgIHZlYzIucmFuZG9tKHRoaXMuYXJyYXksIHNjYWxlKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgc2VsZlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc2NhbGU6IGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgdmVjMi5zY2FsZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBzKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgYiBhbmQgYWRkIHRvIHNlbGZcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc2NhbGVBbmRBZGQ6IGZ1bmN0aW9uKGIsIHMpIHtcbiAgICAgICAgdmVjMi5zY2FsZUFuZEFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5LCBzKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHNxdWFyZWREaXN0YW5jZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckRpc3Q6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHZlYzIuc3FyRGlzdCh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzcXVhcmVkRGlzdGFuY2U6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHZlYzIuc3F1YXJlZERpc3RhbmNlKHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Igc3F1YXJlZExlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzcXJMZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmVjMi5zcXJMZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgbGVuZ3RoIG9mIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZExlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLnNxdWFyZWRMZW5ndGgodGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzdWJ0cmFjdFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc3ViOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIuc3ViKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCBiIGZyb20gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc3VidHJhY3Q6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjMi5zdWJ0cmFjdCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIE1hdHJpeDIgbVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MjogZnVuY3Rpb24obSkge1xuICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDIodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgbS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBzZWxmIHdpdGggYSBNYXRyaXgyZCBtXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MmQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmVjMi50cmFuc2Zvcm1NYXQyZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBtLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIE1hdHJpeDMgbVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MzogZnVuY3Rpb24obSkge1xuICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDModGhpcy5hcnJheSwgdGhpcy5hcnJheSwgbS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBzZWxmIHdpdGggYSBNYXRyaXg0IG1cbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIHRyYW5zZm9ybU1hdDQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmVjMi50cmFuc2Zvcm1NYXQ0KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIG0uYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnWycgKyBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHRoaXMuYXJyYXksICcsJykgKyAnXSc7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpO1xuICAgIH1cbn07XG5cbi8vIEdldHRlciBhbmQgU2V0dGVyXG5pZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG5cbiAgICB2YXIgcHJvdG8gPSBWZWN0b3IyLnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBAbmFtZSB4XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICd4Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzBdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVswXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSB5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICd5Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzFdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVsxXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIFN1cHBseSBtZXRob2RzIHRoYXQgYXJlIG5vdCBpbiBwbGFjZVxuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMi5hZGQob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB5XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHkpIHtcbiAgICB2ZWMyLnNldChvdXQuYXJyYXksIHgsIHkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBiKSB7XG4gICAgdmVjMi5jb3B5KG91dC5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzIuY3Jvc3Mob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjIuZGlzdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gdmVjMi5kaXN0YW5jZShhLmFycmF5LCBiLmFycmF5KTtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjIuZGlzdGFuY2UgPSBWZWN0b3IyLmRpc3Q7XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuZGl2ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMi5kaXZpZGUob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLmRpdmlkZSA9IFZlY3RvcjIuZGl2O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMi5kb3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIHZlYzIuZG90KGEuYXJyYXksIGIuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IyLmxlbiA9IGZ1bmN0aW9uKGIpIHtcbiAgICByZXR1cm4gdmVjMi5sZW5ndGgoYi5hcnJheSk7XG59O1xuXG4vLyBWZWN0b3IyLmxlbmd0aCA9IFZlY3RvcjIubGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIubGVycCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgdCkge1xuICAgIHZlYzIubGVycChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzIubWluKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMyLm1heChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLm11bCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzIubXVsdGlwbHkob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLm11bHRpcGx5ID0gVmVjdG9yMi5tdWw7XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2ZWMyLm5lZ2F0ZShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmVjMi5ub3JtYWxpemUob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLnJhbmRvbSA9IGZ1bmN0aW9uKG91dCwgc2NhbGUpIHtcbiAgICB2ZWMyLnJhbmRvbShvdXQuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgc2NhbGUpIHtcbiAgICB2ZWMyLnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgc2NhbGUpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5zY2FsZUFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICB2ZWMyLnNjYWxlQW5kQWRkKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSwgc2NhbGUpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMi5zcXJEaXN0ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWMyLnNxckRpc3QoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IyLnNxdWFyZWREaXN0YW5jZSA9IFZlY3RvcjIuc3FyRGlzdDtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IyLnNxckxlbiA9IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gdmVjMi5zcXJMZW4oYS5hcnJheSk7XG59O1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjIuc3F1YXJlZExlbmd0aCA9IFZlY3RvcjIuc3FyTGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuc3ViID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMi5zdWJ0cmFjdChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuc3VidHJhY3QgPSBWZWN0b3IyLnN1Yjtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi50cmFuc2Zvcm1NYXQyID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMi50cmFuc2Zvcm1NYXQyKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gIGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gbVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIudHJhbnNmb3JtTWF0MmQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2ZWMyLnRyYW5zZm9ybU1hdDJkKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtNYXRyaXgzfSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMi50cmFuc2Zvcm1NYXQzKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZlYzIudHJhbnNmb3JtTWF0NChvdXQuYXJyYXksIGEuYXJyYXksIG0uYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWZWN0b3IyO1xuIiwiLy8gMkQgQmxlbmQgY2xpcCBvZiBibGVuZCB0cmVlXG4vLyBodHRwOi8vZG9jcy51bml0eTNkLmNvbS9Eb2N1bWVudGF0aW9uL01hbnVhbC8yREJsZW5kaW5nLmh0bWxcbmltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5pbXBvcnQgZGVsYXVuYXkgZnJvbSAnLi4vdXRpbC9kZWxhdW5heSc7XG5pbXBvcnQgVmVjdG9yMiBmcm9tICcuLi9tYXRoL1ZlY3RvcjInO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGNsYXkuYW5pbWF0aW9uLkJsZW5kMkRDbGlwLklDbGlwSW5wdXRcbiAqIEBwcm9wZXJ0eSB7Y2xheS5tYXRoLlZlY3RvcjJ9IHBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGNsaXBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKipcbiAqIDJkIGJsZW5kaW5nIG5vZGUgaW4gYW5pbWF0aW9uIGJsZW5kIHRyZWUuXG4gKiBvdXRwdXQgY2xpcCBtdXN0IGhhdmUgYmxlbmQyRCBtZXRob2RcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLkJsZW5kMkRDbGlwXG4gKiBAZXh0ZW5kcyBjbGF5LmFuaW1hdGlvbi5DbGlwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm5hbWVdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxpZmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZGVsYXldXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZ2FwXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnBsYXliYWNrUmF0aW9dXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbb3B0cy5sb29wXSBJZiBsb29wIGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZSB0aGUgbG9vcCBjb3VudCBvZiBhbmltYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBbb3B0cy5lYXNpbmddXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbmZyYW1lXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25maW5pc2hdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbnJlc3RhcnRdXG4gKiBAcGFyYW0ge29iamVjdFtdfSBbb3B0cy5pbnB1dHNdXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IyfSBbb3B0cy5wb3NpdGlvbl1cbiAqIEBwYXJhbSB7Y2xheS5hbmltYXRpb24uQ2xpcH0gW29wdHMub3V0cHV0XVxuICovXG52YXIgQmxlbmQyRENsaXAgPSBmdW5jdGlvbiAob3B0cykge1xuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICBDbGlwLmNhbGwodGhpcywgb3B0cyk7XG4gICAgLyoqXG4gICAgICogT3V0cHV0IGNsaXAgbXVzdCBoYXZlIGJsZW5kMkQgbWV0aG9kXG4gICAgICogQHR5cGUge2NsYXkuYW5pbWF0aW9uLkNsaXB9XG4gICAgICovXG4gICAgdGhpcy5vdXRwdXQgPSBvcHRzLm91dHB1dCB8fCBudWxsO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5CbGVuZDJEQ2xpcC5JQ2xpcElucHV0W119XG4gICAgICovXG4gICAgdGhpcy5pbnB1dHMgPSBvcHRzLmlucHV0cyB8fCBbXTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBWZWN0b3IyKCk7XG5cbiAgICB0aGlzLl9jYWNoZVRyaWFuZ2xlID0gbnVsbDtcblxuICAgIHRoaXMuX3RyaWFuZ2xlcyA9IFtdO1xuXG4gICAgdGhpcy5fdXBkYXRlVHJpYW5nbGVzKCk7XG59O1xuXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUgPSBuZXcgQ2xpcCgpO1xuQmxlbmQyRENsaXAucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmxlbmQyRENsaXA7XG4vKipcbiAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjJ9IHBvc2l0aW9uXG4gKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGlucHV0Q2xpcFxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRdXG4gKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5CbGVuZDJEQ2xpcC5JQ2xpcElucHV0fVxuICovXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuYWRkSW5wdXQgPSBmdW5jdGlvbiAocG9zaXRpb24sIGlucHV0Q2xpcCwgb2Zmc2V0KSB7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgICAgcG9zaXRpb24gOiBwb3NpdGlvbixcbiAgICAgICAgY2xpcCA6IGlucHV0Q2xpcCxcbiAgICAgICAgb2Zmc2V0IDogb2Zmc2V0IHx8IDBcbiAgICB9O1xuICAgIHRoaXMuaW5wdXRzLnB1c2gob2JqKTtcbiAgICB0aGlzLmxpZmUgPSBNYXRoLm1heChpbnB1dENsaXAubGlmZSwgdGhpcy5saWZlKTtcbiAgICAvLyBUT0RPIENoYW5nZSB0byBpbmNyZW1lbnRhbGx5IGFkZGluZ1xuICAgIHRoaXMuX3VwZGF0ZVRyaWFuZ2xlcygpO1xuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIERlbGF1bmF5IHRyaWFuZ3VsYXRlXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuX3VwZGF0ZVRyaWFuZ2xlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXRzID0gdGhpcy5pbnB1dHMubWFwKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBhLnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIHRoaXMuX3RyaWFuZ2xlcyA9IGRlbGF1bmF5LnRyaWFuZ3VsYXRlKGlucHV0cywgJ2FycmF5Jyk7XG59O1xuXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICh0aW1lLCBkVGltZSwgc2lsZW50KSB7XG5cbiAgICB2YXIgcmV0ID0gQ2xpcC5wcm90b3R5cGUuc3RlcC5jYWxsKHRoaXMsIHRpbWUpO1xuXG4gICAgaWYgKHJldCAhPT0gJ2ZpbmlzaCcpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSk7XG4gICAgfVxuXG4gICAgLy8gUEVORElORyBTY2hlZHVsZVxuICAgIGlmICghc2lsZW50ICYmIHJldCAhPT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgdGhpcy5maXJlKCdmcmFtZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxuQmxlbmQyRENsaXAucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHZhciByZXMgPSB0aGlzLl9maW5kVHJpYW5nbGUodGhpcy5wb3NpdGlvbik7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJbiBCYXJ5Y2VudHJpY1xuICAgIHZhciBhID0gcmVzWzFdOyAvLyBQZXJjZW50IG9mIGNsaXAyXG4gICAgdmFyIGIgPSByZXNbMl07IC8vIFBlcmNlbnQgb2YgY2xpcDNcblxuICAgIHZhciB0cmkgPSByZXNbMF07XG5cbiAgICB2YXIgaW4xID0gdGhpcy5pbnB1dHNbdHJpLmluZGljZXNbMF1dO1xuICAgIHZhciBpbjIgPSB0aGlzLmlucHV0c1t0cmkuaW5kaWNlc1sxXV07XG4gICAgdmFyIGluMyA9IHRoaXMuaW5wdXRzW3RyaS5pbmRpY2VzWzJdXTtcbiAgICB2YXIgY2xpcDEgPSBpbjEuY2xpcDtcbiAgICB2YXIgY2xpcDIgPSBpbjIuY2xpcDtcbiAgICB2YXIgY2xpcDMgPSBpbjMuY2xpcDtcblxuICAgIGNsaXAxLnNldFRpbWUoKHRpbWUgKyBpbjEub2Zmc2V0KSAlIGNsaXAxLmxpZmUpO1xuICAgIGNsaXAyLnNldFRpbWUoKHRpbWUgKyBpbjIub2Zmc2V0KSAlIGNsaXAyLmxpZmUpO1xuICAgIGNsaXAzLnNldFRpbWUoKHRpbWUgKyBpbjMub2Zmc2V0KSAlIGNsaXAzLmxpZmUpO1xuXG4gICAgdmFyIGMxID0gY2xpcDEub3V0cHV0IGluc3RhbmNlb2YgQ2xpcCA/IGNsaXAxLm91dHB1dCA6IGNsaXAxO1xuICAgIHZhciBjMiA9IGNsaXAyLm91dHB1dCBpbnN0YW5jZW9mIENsaXAgPyBjbGlwMi5vdXRwdXQgOiBjbGlwMjtcbiAgICB2YXIgYzMgPSBjbGlwMy5vdXRwdXQgaW5zdGFuY2VvZiBDbGlwID8gY2xpcDMub3V0cHV0IDogY2xpcDM7XG5cbiAgICB0aGlzLm91dHB1dC5ibGVuZDJEKGMxLCBjMiwgYzMsIGEsIGIpO1xufTtcblxuLyoqXG4gKiBDbG9uZSBhIG5ldyBCbGVuZDJEIGNsaXBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xvbmVJbnB1dHMgVHJ1ZSBpZiBjbG9uZSB0aGUgaW5wdXQgY2xpcHNcbiAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkJsZW5kMkRDbGlwfVxuICovXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY2xvbmVJbnB1dHMpIHtcbiAgICB2YXIgY2xpcCA9IENsaXAucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgY2xpcC5vdXRwdXQgPSB0aGlzLm91dHB1dC5jbG9uZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlucHV0Q2xpcCA9IGNsb25lSW5wdXRzID8gdGhpcy5pbnB1dHNbaV0uY2xpcC5jbG9uZSh0cnVlKSA6IHRoaXMuaW5wdXRzW2ldLmNsaXA7XG4gICAgICAgIGNsaXAuYWRkSW5wdXQodGhpcy5pbnB1dHNbaV0ucG9zaXRpb24sIGlucHV0Q2xpcCwgdGhpcy5pbnB1dHNbaV0ub2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaXA7XG59O1xuXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuX2ZpbmRUcmlhbmdsZSA9IGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgIGlmICh0aGlzLl9jYWNoZVRyaWFuZ2xlKSB7XG4gICAgICAgIHZhciByZXMgPSBkZWxhdW5heS5jb250YWlucyh0aGlzLl9jYWNoZVRyaWFuZ2xlLnZlcnRpY2VzLCBwb3NpdGlvbi5hcnJheSk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5fY2FjaGVUcmlhbmdsZSwgcmVzWzBdLCByZXNbMV1dO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdHJpYW5nbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmkgPSB0aGlzLl90cmlhbmdsZXNbaV07XG4gICAgICAgIHZhciByZXMgPSBkZWxhdW5heS5jb250YWlucyh0cmkudmVydGljZXMsIHRoaXMucG9zaXRpb24uYXJyYXkpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZVRyaWFuZ2xlID0gdHJpO1xuICAgICAgICAgICAgcmV0dXJuIFt0cmksIHJlc1swXSwgcmVzWzFdXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJsZW5kMkRDbGlwOyIsImltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG5mdW5jdGlvbiBrZXlmcmFtZVNvcnQoYSwgYikge1xuICAgIHJldHVybiBhLnRpbWUgLSBiLnRpbWU7XG59XG5cbnZhciBUcmFuc2Zvcm1UcmFjayA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICB0aGlzLm5hbWUgPSBvcHRzLm5hbWUgfHwgJyc7XG4gICAgLy9be1xuICAgIC8vICB0aW1lOiAvL21zXG4gICAgLy8gIHBvc2l0aW9uOiAgLy8gb3B0aW9uYWxcbiAgICAvLyAgcm90YXRpb246ICAvLyBvcHRpb25hbFxuICAgIC8vICBzY2FsZTogICAgIC8vIG9wdGlvbmFsXG4gICAgLy99XVxuICAgIHRoaXMua2V5RnJhbWVzID0gW107XG4gICAgaWYgKG9wdHMua2V5RnJhbWVzKSB7XG4gICAgICAgIHRoaXMuYWRkS2V5RnJhbWVzKG9wdHMua2V5RnJhbWVzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHRoaXMucm90YXRpb24gPSBxdWF0LmNyZWF0ZSgpO1xuXG4gICAgdGhpcy5zY2FsZSA9IHZlYzMuZnJvbVZhbHVlcygxLCAxLCAxKTtcblxuICAgIHRoaXMuX2NhY2hlS2V5ID0gMDtcbiAgICB0aGlzLl9jYWNoZVRpbWUgPSAwO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGlwLnByb3RvdHlwZSk7XG5cblRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRyYW5zZm9ybVRyYWNrO1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICh0aW1lLCBkVGltZSwgc2lsZW50KSB7XG5cbiAgICB2YXIgcmV0ID0gQ2xpcC5wcm90b3R5cGUuc3RlcC5jYWxsKHRoaXMsIHRpbWUsIGRUaW1lLCB0cnVlKTtcblxuICAgIGlmIChyZXQgIT09ICdmaW5pc2gnKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh0aGlzLmdldEVsYXBzZWRUaW1lKCkpO1xuICAgIH1cblxuICAgIC8vIFBFTkRJTkcgU2NoZWR1bGVcbiAgICBpZiAoIXNpbGVudCAmJiByZXQgIT09ICdwYXVzZWQnKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZnJhbWUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHRoaXMuX2ludGVycG9sYXRlRmllbGQodGltZSwgJ3Bvc2l0aW9uJyk7XG4gICAgdGhpcy5faW50ZXJwb2xhdGVGaWVsZCh0aW1lLCAncm90YXRpb24nKTtcbiAgICB0aGlzLl9pbnRlcnBvbGF0ZUZpZWxkKHRpbWUsICdzY2FsZScpO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLmdldE1heFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtmID0gdGhpcy5rZXlGcmFtZXNbdGhpcy5rZXlGcmFtZXMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGtmID8ga2YudGltZSA6IDA7XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYWRkS2V5RnJhbWUgPSBmdW5jdGlvbiAoa2YpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMua2V5RnJhbWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICB2YXIgcHJldkZyYW1lID0gdGhpcy5rZXlGcmFtZXNbaV07XG4gICAgICAgIHZhciBuZXh0RnJhbWUgPSB0aGlzLmtleUZyYW1lc1tpICsgMV07XG4gICAgICAgIGlmIChwcmV2RnJhbWUudGltZSA8PSBrZi50aW1lICYmIG5leHRGcmFtZS50aW1lID49IGtmLnRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMua2V5RnJhbWVzLnNwbGljZShpLCAwLCBrZik7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGlmZSA9IGtmLnRpbWU7XG4gICAgdGhpcy5rZXlGcmFtZXMucHVzaChrZik7XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYWRkS2V5RnJhbWVzID0gZnVuY3Rpb24gKGtmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2ZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMua2V5RnJhbWVzLnB1c2goa2ZzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLmtleUZyYW1lcy5zb3J0KGtleWZyYW1lU29ydCk7XG5cbiAgICB0aGlzLmxpZmUgPSB0aGlzLmtleUZyYW1lc1t0aGlzLmtleUZyYW1lcy5sZW5ndGggLSAxXS50aW1lO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUZpZWxkID0gZnVuY3Rpb24gKHRpbWUsIGZpZWxkTmFtZSkge1xuICAgIHZhciBrZnMgPSB0aGlzLmtleUZyYW1lcztcbiAgICB2YXIgbGVuID0ga2ZzLmxlbmd0aDtcbiAgICB2YXIgc3RhcnQ7XG4gICAgdmFyIGVuZDtcblxuICAgIGlmICgha2ZzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aW1lIDwga2ZzWzBdLnRpbWUgfHwgdGltZSA+IGtmc1trZnMubGVuZ3RoLTFdLnRpbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGltZSA8IHRoaXMuX2NhY2hlVGltZSkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuX2NhY2hlS2V5ID49IGxlbi0xID8gbGVuLTEgOiB0aGlzLl9jYWNoZUtleSsxO1xuICAgICAgICBmb3IgKHZhciBpID0gczsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChrZnNbaV0udGltZSA8PSB0aW1lICYmIGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBrZnNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlVGltZSA9IHRpbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgZW5kID0ga2ZzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX2NhY2hlS2V5OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChrZnNbaV0udGltZSA8PSB0aW1lICYmIGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBrZnNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlVGltZSA9IHRpbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgZW5kID0ga2ZzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgICB2YXIgcGVyY2VudCA9ICh0aW1lIC0gc3RhcnQudGltZSkgLyAoZW5kLnRpbWUgLSBzdGFydC50aW1lKTtcbiAgICAgICAgcGVyY2VudCA9IE1hdGgubWF4KE1hdGgubWluKHBlcmNlbnQsIDEpLCAwKTtcbiAgICAgICAgaWYgKGZpZWxkTmFtZSA9PT0gJ3JvdGF0aW9uJykge1xuICAgICAgICAgICAgcXVhdC5zbGVycCh0aGlzW2ZpZWxkTmFtZV0sIHN0YXJ0W2ZpZWxkTmFtZV0sIGVuZFtmaWVsZE5hbWVdLCBwZXJjZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlYzMubGVycCh0aGlzW2ZpZWxkTmFtZV0sIHN0YXJ0W2ZpZWxkTmFtZV0sIGVuZFtmaWVsZE5hbWVdLCBwZXJjZW50KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gMDtcbiAgICAgICAgdGhpcy5fY2FjaGVUaW1lID0gMDtcbiAgICB9XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYmxlbmQxRCA9IGZ1bmN0aW9uICh0MSwgdDIsIHcpIHtcbiAgICB2ZWMzLmxlcnAodGhpcy5wb3NpdGlvbiwgdDEucG9zaXRpb24sIHQyLnBvc2l0aW9uLCB3KTtcbiAgICB2ZWMzLmxlcnAodGhpcy5zY2FsZSwgdDEuc2NhbGUsIHQyLnNjYWxlLCB3KTtcbiAgICBxdWF0LnNsZXJwKHRoaXMucm90YXRpb24sIHQxLnJvdGF0aW9uLCB0Mi5yb3RhdGlvbiwgdyk7XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYmxlbmQyRCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHExID0gcXVhdC5jcmVhdGUoKTtcbiAgICB2YXIgcTIgPSBxdWF0LmNyZWF0ZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiAodDEsIHQyLCB0MywgZiwgZykge1xuICAgICAgICB2YXIgYSA9IDEgLSBmIC0gZztcblxuICAgICAgICB0aGlzLnBvc2l0aW9uWzBdID0gdDEucG9zaXRpb25bMF0gKiBhICsgdDIucG9zaXRpb25bMF0gKiBmICsgdDMucG9zaXRpb25bMF0gKiBnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uWzFdID0gdDEucG9zaXRpb25bMV0gKiBhICsgdDIucG9zaXRpb25bMV0gKiBmICsgdDMucG9zaXRpb25bMV0gKiBnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uWzJdID0gdDEucG9zaXRpb25bMl0gKiBhICsgdDIucG9zaXRpb25bMl0gKiBmICsgdDMucG9zaXRpb25bMl0gKiBnO1xuXG4gICAgICAgIHRoaXMuc2NhbGVbMF0gPSB0MS5zY2FsZVswXSAqIGEgKyB0Mi5zY2FsZVswXSAqIGYgKyB0My5zY2FsZVswXSAqIGc7XG4gICAgICAgIHRoaXMuc2NhbGVbMV0gPSB0MS5zY2FsZVsxXSAqIGEgKyB0Mi5zY2FsZVsxXSAqIGYgKyB0My5zY2FsZVsxXSAqIGc7XG4gICAgICAgIHRoaXMuc2NhbGVbMl0gPSB0MS5zY2FsZVsyXSAqIGEgKyB0Mi5zY2FsZVsyXSAqIGYgKyB0My5zY2FsZVsyXSAqIGc7XG5cbiAgICAgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9iYjIwNTQwMyh2PXZzLjg1KS5hc3B4XG4gICAgICAgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbWljcm9zb2Z0LmRpcmVjdHhfc2RrLnF1YXRlcm5pb24ueG1xdWF0ZXJuaW9uYmFyeWNlbnRyaWModj12cy44NSkuYXNweFxuICAgICAgICB2YXIgcyA9IGYgKyBnO1xuICAgICAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICAgICAgcXVhdC5jb3B5KHRoaXMucm90YXRpb24sIHQxLnJvdGF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YXQuc2xlcnAocTEsIHQxLnJvdGF0aW9uLCB0Mi5yb3RhdGlvbiwgcyk7XG4gICAgICAgICAgICBxdWF0LnNsZXJwKHEyLCB0MS5yb3RhdGlvbiwgYzMucm90YXRpb24sIHMpO1xuICAgICAgICAgICAgcXVhdC5zbGVycCh0aGlzLnJvdGF0aW9uLCBxMSwgcTIsIGcgLyBzKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYWRkaXRpdmVCbGVuZCA9IGZ1bmN0aW9uICh0MSwgdDIpIHtcbiAgICB2ZWMzLmFkZCh0aGlzLnBvc2l0aW9uLCB0MS5wb3NpdGlvbiwgdDIucG9zaXRpb24pO1xuICAgIHZlYzMuYWRkKHRoaXMuc2NhbGUsIHQxLnNjYWxlLCB0Mi5zY2FsZSk7XG4gICAgcXVhdC5tdWx0aXBseSh0aGlzLnJvdGF0aW9uLCB0Mi5yb3RhdGlvbiwgdDEucm90YXRpb24pO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLnN1YnRyYWN0aXZlQmxlbmQgPSBmdW5jdGlvbiAodDEsIHQyKSB7XG4gICAgdmVjMy5zdWIodGhpcy5wb3NpdGlvbiwgdDEucG9zaXRpb24sIHQyLnBvc2l0aW9uKTtcbiAgICB2ZWMzLnN1Yih0aGlzLnNjYWxlLCB0MS5zY2FsZSwgdDIuc2NhbGUpO1xuICAgIHF1YXQuaW52ZXJ0KHRoaXMucm90YXRpb24sIHQyLnJvdGF0aW9uKTtcbiAgICBxdWF0Lm11bHRpcGx5KHRoaXMucm90YXRpb24sIHRoaXMucm90YXRpb24sIHQxLnJvdGF0aW9uKTtcbn07XG5cblRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5nZXRTdWJDbGlwID0gZnVuY3Rpb24gKHN0YXJ0VGltZSwgZW5kVGltZSkge1xuICAgIC8vIFRPRE9cbiAgICBjb25zb2xlLndhcm4oJ1RPRE8nKTtcbn07XG5cblRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdHJhY2sgPSBUcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICB0cmFjay5rZXlGcmFtZXMgPSB0aGlzLmtleUZyYW1lcztcblxuICAgIHZlYzMuY29weSh0cmFjay5wb3NpdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgcXVhdC5jb3B5KHRyYWNrLnJvdGF0aW9uLCB0aGlzLnJvdGF0aW9uKTtcbiAgICB2ZWMzLmNvcHkodHJhY2suc2NhbGUsIHRoaXMuc2NhbGUpO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2Zvcm1UcmFjaztcbiIsIi8vIFNhbXBsZXIgY2xpcCBpcyBlc3BlY2lhbGx5IGZvciB0aGUgYW5pbWF0aW9uIHNhbXBsZXIgaW4gZ2xURlxuLy8gVXNlIFR5cGVkIEFycmF5IGNhbiByZWR1Y2UgYSBsb3Qgb2YgaGVhcCBtZW1vcnlcbi8vXG4vLyBUT0RPIFN5bmMgdGFyZ2V0IHRyYW5zZm9ybVxuXG5pbXBvcnQgVHJhbnNmb3JtVHJhY2sgZnJvbSAnLi9UcmFuc2Zvcm1UcmFjayc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG4vLyBsZXJwIGZ1bmN0aW9uIHdpdGggb2Zmc2V0IGluIGxhcmdlIGFycmF5XG5mdW5jdGlvbiB2ZWMzbGVycChvdXQsIGEsIGIsIHQsIG9hLCBvYikge1xuICAgIHZhciBheCA9IGFbb2FdO1xuICAgIHZhciBheSA9IGFbb2EgKyAxXTtcbiAgICB2YXIgYXogPSBhW29hICsgMl07XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbb2JdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiW29iICsgMV0gLSBheSk7XG4gICAgb3V0WzJdID0gYXogKyB0ICogKGJbb2IgKyAyXSAtIGF6KTtcblxuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHF1YXRTbGVycChvdXQsIGEsIGIsIHQsIG9hLCBvYikge1xuICAgIC8vIGJlbmNobWFya3M6XG4gICAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcblxuICAgIHZhciBheCA9IGFbMCArIG9hXSwgYXkgPSBhWzEgKyBvYV0sIGF6ID0gYVsyICsgb2FdLCBhdyA9IGFbMyArIG9hXSxcbiAgICAgICAgYnggPSBiWzAgKyBvYl0sIGJ5ID0gYlsxICsgb2JdLCBieiA9IGJbMiArIG9iXSwgYncgPSBiWzMgKyBvYl07XG5cbiAgICB2YXIgb21lZ2EsIGNvc29tLCBzaW5vbSwgc2NhbGUwLCBzY2FsZTE7XG5cbiAgICAvLyBjYWxjIGNvc2luZVxuICAgIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidztcbiAgICAvLyBhZGp1c3Qgc2lnbnMgKGlmIG5lY2Vzc2FyeSlcbiAgICBpZiAoY29zb20gPCAwLjApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICgoMS4wIC0gY29zb20pID4gMC4wMDAwMDEpIHtcbiAgICAgICAgLy8gc3RhbmRhcmQgY2FzZSAoc2xlcnApXG4gICAgICAgIG9tZWdhICA9IE1hdGguYWNvcyhjb3NvbSk7XG4gICAgICAgIHNpbm9tICA9IE1hdGguc2luKG9tZWdhKTtcbiAgICAgICAgc2NhbGUwID0gTWF0aC5zaW4oKDEuMCAtIHQpICogb21lZ2EpIC8gc2lub207XG4gICAgICAgIHNjYWxlMSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vICdmcm9tJyBhbmQgJ3RvJyBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgICAgICAvLyAgLi4uIHNvIHdlIGNhbiBkbyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgICAgIHNjYWxlMCA9IDEuMCAtIHQ7XG4gICAgICAgIHNjYWxlMSA9IHQ7XG4gICAgfVxuICAgIC8vIGNhbGN1bGF0ZSBmaW5hbCB2YWx1ZXNcbiAgICBvdXRbMF0gPSBzY2FsZTAgKiBheCArIHNjYWxlMSAqIGJ4O1xuICAgIG91dFsxXSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7XG4gICAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgICBvdXRbM10gPSBzY2FsZTAgKiBhdyArIHNjYWxlMSAqIGJ3O1xuXG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTYW1wbGVyVHJhY2sgbWFuYWdlcyBgcG9zaXRpb25gLCBgcm90YXRpb25gLCBgc2NhbGVgIHRyYWNrcyBpbiBhbmltYXRpb24gb2Ygc2luZ2xlIHNjZW5lIG5vZGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2tcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5uYW1lXSBUcmFjayBuYW1lXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW29wdHMudGFyZ2V0XSBUYXJnZXQgbm9kZSdzIHRyYW5zZm9ybSB3aWxsIHVwZGF0ZWQgYXV0b21hdGljYWxseVxuICovXG52YXIgU2FtcGxlclRyYWNrID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIHRoaXMubmFtZSA9IG9wdHMubmFtZSB8fCAnJztcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IG9wdHMudGFyZ2V0IHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLnBvc2l0aW9uID0gdmVjMy5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBSb3RhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIHF1YXRlcm5pb25cbiAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxuICAgICAqL1xuICAgIHRoaXMucm90YXRpb24gPSBxdWF0LmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5zY2FsZSA9IHZlYzMuZnJvbVZhbHVlcygxLCAxLCAxKTtcblxuICAgIHRoaXMuY2hhbm5lbHMgPSB7XG4gICAgICAgIHRpbWU6IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgICByb3RhdGlvbjogbnVsbCxcbiAgICAgICAgc2NhbGU6IG51bGxcbiAgICB9O1xuXG4gICAgdGhpcy5fY2FjaGVLZXkgPSAwO1xuICAgIHRoaXMuX2NhY2hlVGltZSA9IDA7XG59O1xuXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIGlmICghdGhpcy5jaGFubmVscy50aW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNoYW5uZWxzID0gdGhpcy5jaGFubmVscztcbiAgICB2YXIgbGVuID0gY2hhbm5lbHMudGltZS5sZW5ndGg7XG4gICAgdmFyIGtleSA9IC0xO1xuICAgIC8vIE9ubHkgb25lIGZyYW1lXG4gICAgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICBpZiAoY2hhbm5lbHMucm90YXRpb24pIHtcbiAgICAgICAgICAgIHF1YXQuY29weSh0aGlzLnJvdGF0aW9uLCBjaGFubmVscy5yb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5uZWxzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICB2ZWMzLmNvcHkodGhpcy5wb3NpdGlvbiwgY2hhbm5lbHMucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5zY2FsZSkge1xuICAgICAgICAgICAgdmVjMy5jb3B5KHRoaXMuc2NhbGUsIGNoYW5uZWxzLnNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENsYW1wXG4gICAgZWxzZSBpZiAodGltZSA8PSBjaGFubmVscy50aW1lWzBdKSB7XG4gICAgICAgIHRpbWUgPSBjaGFubmVscy50aW1lWzBdO1xuICAgICAgICBrZXkgPSAwO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aW1lID49IGNoYW5uZWxzLnRpbWVbbGVuIC0gMV0pIHtcbiAgICAgICAgdGltZSA9IGNoYW5uZWxzLnRpbWVbbGVuIC0gMV07XG4gICAgICAgIGtleSA9IGxlbiAtIDI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodGltZSA8IHRoaXMuX2NhY2hlVGltZSkge1xuICAgICAgICAgICAgdmFyIHMgPSBNYXRoLm1pbihsZW4gLSAxLCB0aGlzLl9jYWNoZUtleSArIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHM7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzLnRpbWVbaSAtIDFdIDw9IHRpbWUgJiYgY2hhbm5lbHMudGltZVtpXSA+IHRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9jYWNoZUtleTsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjaGFubmVscy50aW1lW2ldIDw9IHRpbWUgJiYgY2hhbm5lbHMudGltZVtpICsgMV0gPiB0aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID4gLTEpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuX2NhY2hlVGltZSA9IHRpbWU7XG4gICAgICAgIHZhciBzdGFydCA9IGtleTtcbiAgICAgICAgdmFyIGVuZCA9IGtleSArIDE7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBjaGFubmVscy50aW1lW3N0YXJ0XTtcbiAgICAgICAgdmFyIGVuZFRpbWUgPSBjaGFubmVscy50aW1lW2VuZF07XG4gICAgICAgIHZhciByYW5nZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICAgIHZhciBwZXJjZW50ID0gcmFuZ2UgPT09IDAgPyAwIDogKHRpbWUgLSBzdGFydFRpbWUpIC8gcmFuZ2U7XG5cbiAgICAgICAgaWYgKGNoYW5uZWxzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBxdWF0U2xlcnAodGhpcy5yb3RhdGlvbiwgY2hhbm5lbHMucm90YXRpb24sIGNoYW5uZWxzLnJvdGF0aW9uLCBwZXJjZW50LCBzdGFydCAqIDQsIGVuZCAqIDQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdmVjM2xlcnAodGhpcy5wb3NpdGlvbiwgY2hhbm5lbHMucG9zaXRpb24sIGNoYW5uZWxzLnBvc2l0aW9uLCBwZXJjZW50LCBzdGFydCAqIDMsIGVuZCAqIDMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5zY2FsZSkge1xuICAgICAgICAgICAgdmVjM2xlcnAodGhpcy5zY2FsZSwgY2hhbm5lbHMuc2NhbGUsIGNoYW5uZWxzLnNjYWxlLCBwZXJjZW50LCBzdGFydCAqIDMsIGVuZCAqIDMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIExvb3AgaGFuZGxpbmdcbiAgICBpZiAoa2V5ID09IGxlbiAtIDIpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSAwO1xuICAgICAgICB0aGlzLl9jYWNoZVRpbWUgPSAwO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSB0cmFuc2Zvcm0gb2YgdGFyZ2V0IG5vZGUgbWFudWFsbHlcbiAqL1xuU2FtcGxlclRyYWNrLnByb3RvdHlwZS51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoYW5uZWxzID0gdGhpcy5jaGFubmVscztcbiAgICBpZiAodGhpcy50YXJnZXQpIHtcbiAgICAgICAgLy8gT25seSB1cGRhdGUgdGFyZ2V0IHByb3AgaWYgaGF2ZSBkYXRhLlxuICAgICAgICBpZiAoY2hhbm5lbHMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc2l0aW9uLnNldEFycmF5KHRoaXMucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5yb3RhdGlvbikge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQucm90YXRpb24uc2V0QXJyYXkodGhpcy5yb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5uZWxzLnNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5zY2FsZS5zZXRBcnJheSh0aGlzLnNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLmdldE1heFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbHMudGltZVt0aGlzLmNoYW5uZWxzLnRpbWUubGVuZ3RoIC0gMV07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFRpbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRUaW1lXG4gKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t9XG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuZ2V0U3ViVHJhY2sgPSBmdW5jdGlvbiAoc3RhcnRUaW1lLCBlbmRUaW1lKSB7XG5cbiAgICB2YXIgc3ViQ2xpcCA9IG5ldyBTYW1wbGVyVHJhY2soe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWVcbiAgICB9KTtcbiAgICB2YXIgbWluVGltZSA9IHRoaXMuY2hhbm5lbHMudGltZVswXTtcbiAgICBzdGFydFRpbWUgPSBNYXRoLm1pbihNYXRoLm1heChzdGFydFRpbWUsIG1pblRpbWUpLCB0aGlzLmxpZmUpO1xuICAgIGVuZFRpbWUgPSBNYXRoLm1pbihNYXRoLm1heChlbmRUaW1lLCBtaW5UaW1lKSwgdGhpcy5saWZlKTtcblxuICAgIHZhciByYW5nZVN0YXJ0ID0gdGhpcy5fZmluZFJhbmdlKHN0YXJ0VGltZSk7XG4gICAgdmFyIHJhbmdlRW5kID0gdGhpcy5fZmluZFJhbmdlKGVuZFRpbWUpO1xuXG4gICAgdmFyIGNvdW50ID0gcmFuZ2VFbmRbMF0gLSByYW5nZVN0YXJ0WzBdICsgMTtcbiAgICBpZiAocmFuZ2VTdGFydFsxXSA9PT0gMCAmJiByYW5nZUVuZFsxXSA9PT0gMCkge1xuICAgICAgICBjb3VudCAtPSAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy5yb3RhdGlvbikge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnJvdGF0aW9uID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy5wb3NpdGlvbikge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy5zY2FsZSkge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnNjYWxlID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy50aW1lKSB7XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMudGltZSA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQpO1xuICAgIH1cbiAgICAvLyBDbGlwIGF0IHRoZSBzdGFydFxuICAgIHRoaXMuc2V0VGltZShzdGFydFRpbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMucm90YXRpb25baV0gPSB0aGlzLnJvdGF0aW9uW2ldO1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnBvc2l0aW9uW2ldID0gdGhpcy5wb3NpdGlvbltpXTtcbiAgICAgICAgc3ViQ2xpcC5jaGFubmVscy5zY2FsZVtpXSA9IHRoaXMuc2NhbGVbaV07XG4gICAgfVxuICAgIHN1YkNsaXAuY2hhbm5lbHMudGltZVswXSA9IDA7XG4gICAgc3ViQ2xpcC5jaGFubmVscy5yb3RhdGlvblszXSA9IHRoaXMucm90YXRpb25bM107XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNvdW50LTE7IGkrKykge1xuICAgICAgICB2YXIgaTI7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICBpMiA9IHJhbmdlU3RhcnRbMF0gKyBpO1xuICAgICAgICAgICAgc3ViQ2xpcC5jaGFubmVscy5yb3RhdGlvbltpICogNCArIGpdID0gdGhpcy5jaGFubmVscy5yb3RhdGlvbltpMiAqIDQgKyBqXTtcbiAgICAgICAgICAgIHN1YkNsaXAuY2hhbm5lbHMucG9zaXRpb25baSAqIDMgKyBqXSA9IHRoaXMuY2hhbm5lbHMucG9zaXRpb25baTIgKiAzICsgal07XG4gICAgICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnNjYWxlW2kgKiAzICsgal0gPSB0aGlzLmNoYW5uZWxzLnNjYWxlW2kyICogMyArIGpdO1xuICAgICAgICB9XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMudGltZVtpXSA9IHRoaXMuY2hhbm5lbHMudGltZVtpMl0gLSBzdGFydFRpbWU7XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMucm90YXRpb25baSAqIDQgKyAzXSA9IHRoaXMuY2hhbm5lbHMucm90YXRpb25baTIgKiA0ICsgM107XG4gICAgfVxuICAgIC8vIENsaXAgYXQgdGhlIGVuZFxuICAgIHRoaXMuc2V0VGltZShlbmRUaW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnJvdGF0aW9uWyhjb3VudCAtIDEpICogNCArIGldID0gdGhpcy5yb3RhdGlvbltpXTtcbiAgICAgICAgc3ViQ2xpcC5jaGFubmVscy5wb3NpdGlvblsoY291bnQgLSAxKSAqIDMgKyBpXSA9IHRoaXMucG9zaXRpb25baV07XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMuc2NhbGVbKGNvdW50IC0gMSkgKiAzICsgaV0gPSB0aGlzLnNjYWxlW2ldO1xuICAgIH1cbiAgICBzdWJDbGlwLmNoYW5uZWxzLnRpbWVbKGNvdW50IC0gMSldID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICBzdWJDbGlwLmNoYW5uZWxzLnJvdGF0aW9uWyhjb3VudCAtIDEpICogNCArIDNdID0gdGhpcy5yb3RhdGlvblszXTtcblxuICAgIC8vIFRPRE8gc2V0IGJhY2sgP1xuICAgIHN1YkNsaXAubGlmZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgcmV0dXJuIHN1YkNsaXA7XG59O1xuXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLl9maW5kUmFuZ2UgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHZhciBjaGFubmVscyA9IHRoaXMuY2hhbm5lbHM7XG4gICAgdmFyIGxlbiA9IGNoYW5uZWxzLnRpbWUubGVuZ3RoO1xuICAgIHZhciBzdGFydCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChjaGFubmVscy50aW1lW2ldIDw9IHRpbWUgJiYgY2hhbm5lbHMudGltZVtpKzFdID4gdGltZSkge1xuICAgICAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBwZXJjZW50ID0gMDtcbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gY2hhbm5lbHMudGltZVtzdGFydF07XG4gICAgICAgIHZhciBlbmRUaW1lID0gY2hhbm5lbHMudGltZVtzdGFydCsxXTtcbiAgICAgICAgdmFyIHBlcmNlbnQgPSAodGltZS1zdGFydFRpbWUpIC8gKGVuZFRpbWUtc3RhcnRUaW1lKTtcbiAgICB9XG4gICAgLy8gUGVyY2VudCBbMCwgMSlcbiAgICByZXR1cm4gW3N0YXJ0LCBwZXJjZW50XTtcbn07XG5cbi8qKlxuICogMUQgYmxlbmRpbmcgYmV0d2VlbiB0d28gY2xpcHNcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfGNsYXkuYW5pbWF0aW9uLlRyYW5zZm9ybVRyYWNrfSBjMVxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfGNsYXkuYW5pbWF0aW9uLlRyYW5zZm9ybVRyYWNrfSBjMlxuICogQHBhcmFtICB7bnVtYmVyfSB3XG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuYmxlbmQxRCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5ibGVuZDFEO1xuLyoqXG4gKiAyRCBibGVuZGluZyBiZXR3ZWVuIHRocmVlIGNsaXBzXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja3xjbGF5LmFuaW1hdGlvbi5UcmFuc2Zvcm1UcmFja30gYzFcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja3xjbGF5LmFuaW1hdGlvbi5UcmFuc2Zvcm1UcmFja30gYzJcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja3xjbGF5LmFuaW1hdGlvbi5UcmFuc2Zvcm1UcmFja30gYzNcbiAqIEBwYXJhbSAge251bWJlcn0gZlxuICogQHBhcmFtICB7bnVtYmVyfSBnXG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuYmxlbmQyRCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5ibGVuZDJEO1xuLyoqXG4gKiBBZGRpdGl2ZSBibGVuZGluZyBiZXR3ZWVuIHR3byBjbGlwc1xuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMxXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMyXG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuYWRkaXRpdmVCbGVuZCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5hZGRpdGl2ZUJsZW5kO1xuLyoqXG4gKiBTdWJ0cmFjdGl2ZSBibGVuZGluZyBiZXR3ZWVuIHR3byBjbGlwc1xuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMxXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMyXG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuc3VidHJhY3RpdmVCbGVuZCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5zdWJ0cmFjdGl2ZUJsZW5kO1xuXG4vKipcbiAqIENsb25lIGEgbmV3IFNhbXBsZXJUcmFja1xuICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfVxuICovXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0cmFjayA9IFNhbXBsZXJUcmFjay5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICB0cmFjay5jaGFubmVscyA9IHtcbiAgICAgICAgdGltZTogdGhpcy5jaGFubmVscy50aW1lIHx8IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmNoYW5uZWxzLnBvc2l0aW9uIHx8IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLmNoYW5uZWxzLnJvdGF0aW9uIHx8IG51bGwsXG4gICAgICAgIHNjYWxlOiB0aGlzLmNoYW5uZWxzLnNjYWxlIHx8IG51bGxcbiAgICB9O1xuICAgIHZlYzMuY29weSh0cmFjay5wb3NpdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgcXVhdC5jb3B5KHRyYWNrLnJvdGF0aW9uLCB0aGlzLnJvdGF0aW9uKTtcbiAgICB2ZWMzLmNvcHkodHJhY2suc2NhbGUsIHRoaXMuc2NhbGUpO1xuXG4gICAgdHJhY2sudGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG4gICAgdHJhY2sudXBkYXRlVGFyZ2V0KCk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNhbXBsZXJUcmFjaztcbiIsIi8qKlxuICogRXh0ZW5kIGEgc3ViIGNsYXNzIGZyb20gYmFzZSBjbGFzc1xuICogQHBhcmFtIHtvYmplY3R8RnVuY3Rpb259IG1ha2VEZWZhdWx0T3B0IGRlZmF1bHQgb3B0aW9uIG9mIHRoaXMgc3ViIGNsYXNzLCBtZXRob2Qgb2YgdGhlIHN1YiBjYW4gdXNlIHRoaXMueHh4IHRvIGFjY2VzcyB0aGlzIG9wdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2luaXRpYWxpemVdIEluaXRpYWxpemUgYWZ0ZXIgdGhlIHN1YiBjbGFzcyBpcyBpbnN0YW50aWF0ZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvdG9dIFByb3RvdHlwZSBtZXRob2RzL3Byb3BlcnRpZXMgb2YgdGhlIHN1YiBjbGFzc1xuICogQG1lbWJlck9mIGNsYXkuY29yZS5taXhpbi5leHRlbmRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZXJpdmUobWFrZURlZmF1bHRPcHQsIGluaXRpYWxpemUvKm9wdGlvbmFsKi8sIHByb3RvLypvcHRpb25hbCovKSB7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxpemUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcHJvdG8gPSBpbml0aWFsaXplO1xuICAgICAgICBpbml0aWFsaXplID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgX3N1cGVyID0gdGhpcztcblxuICAgIHZhciBwcm9wTGlzdDtcbiAgICBpZiAoIShtYWtlRGVmYXVsdE9wdCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBPcHRpbWl6ZSB0aGUgcHJvcGVydHkgaXRlcmF0ZSBpZiBpdCBoYXZlIGJlZW4gZml4ZWRcbiAgICAgICAgcHJvcExpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gbWFrZURlZmF1bHRPcHQpIHtcbiAgICAgICAgICAgIGlmIChtYWtlRGVmYXVsdE9wdC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wTGlzdC5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdWIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICAgICAgLy8gY2FsbCBzdXBlciBjb25zdHJ1Y3RvclxuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICBpZiAobWFrZURlZmF1bHRPcHQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgLy8gSW52b2tlIG1ha2VEZWZhdWx0T3B0IGVhY2ggdGltZSBpZiBpdCBpcyBhIGZ1bmN0aW9uLCBTbyB3ZSBjYW4gbWFrZSBzdXJlIGVhY2hcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGluIHRoZSBvYmplY3Qgd2lsbCBub3QgYmUgc2hhcmVkIGJ5IG11dGlwbGUgaW5zdGFuY2VzXG4gICAgICAgICAgICBleHRlbmQodGhpcywgbWFrZURlZmF1bHRPcHQuY2FsbCh0aGlzLCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHRlbmRXaXRoUHJvcExpc3QodGhpcywgbWFrZURlZmF1bHRPcHQsIHByb3BMaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBzdWIpIHtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIG9mIGluaGVyaXRcbiAgICAgICAgICAgIHZhciBpbml0aWFsaXplcnMgPSBzdWIuX19pbml0aWFsaXplcnNfXztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIHNhdmUgc3VwZXIgY29uc3RydWN0b3JcbiAgICBzdWIuX19zdXBlcl9fID0gX3N1cGVyO1xuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBpcyBjYWxsZWRcbiAgICBpZiAoIV9zdXBlci5fX2luaXRpYWxpemVyc19fKSB7XG4gICAgICAgIHN1Yi5fX2luaXRpYWxpemVyc19fID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3ViLl9faW5pdGlhbGl6ZXJzX18gPSBfc3VwZXIuX19pbml0aWFsaXplcnNfXy5zbGljZSgpO1xuICAgIH1cbiAgICBpZiAoaW5pdGlhbGl6ZSkge1xuICAgICAgICBzdWIuX19pbml0aWFsaXplcnNfXy5wdXNoKGluaXRpYWxpemUpO1xuICAgIH1cblxuICAgIHZhciBDdG9yID0gZnVuY3Rpb24oKSB7fTtcbiAgICBDdG9yLnByb3RvdHlwZSA9IF9zdXBlci5wcm90b3R5cGU7XG4gICAgc3ViLnByb3RvdHlwZSA9IG5ldyBDdG9yKCk7XG4gICAgc3ViLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YjtcbiAgICBleHRlbmQoc3ViLnByb3RvdHlwZSwgcHJvdG8pO1xuXG4gICAgLy8gZXh0ZW5kIHRoZSBkZXJpdmUgbWV0aG9kIGFzIGEgc3RhdGljIG1ldGhvZDtcbiAgICBzdWIuZXh0ZW5kID0gX3N1cGVyLmV4dGVuZDtcblxuICAgIC8vIERFUENSQVRFRFxuICAgIHN1Yi5kZXJpdmUgPSBfc3VwZXIuZXh0ZW5kO1xuXG4gICAgcmV0dXJuIHN1Yjtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV4dGVuZFdpdGhQcm9wTGlzdCh0YXJnZXQsIHNvdXJjZSwgcHJvcExpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BMaXN0W2ldO1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICB9XG59XG5cbi8qKlxuICogQGFsaWFzIGNsYXkuY29yZS5taXhpbi5leHRlbmRcbiAqIEBtaXhpblxuICovXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgICBleHRlbmQ6IGRlcml2ZSxcblxuICAgIC8vIERFUENSQVRFRFxuICAgIGRlcml2ZTogZGVyaXZlXG59O1xuIiwiZnVuY3Rpb24gSGFuZGxlcihhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xufVxuLyoqXG4gKiBAbWl4aW5cbiAqIEBhbGlhcyBjbGF5LmNvcmUubWl4aW4ubm90aWZpZXJcbiAqL1xudmFyIG5vdGlmaWVyID0ge1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgZXZlbnRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKi9cbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19oYW5kbGVyc19fJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX19oYW5kbGVyc19fLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGRscyA9IHRoaXMuX19oYW5kbGVyc19fW25hbWVdO1xuICAgICAgICB2YXIgbCA9IGhkbHMubGVuZ3RoLCBpID0gLTEsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIC8vIE9wdGltaXplIGFkdmlzZSBmcm9tIGJhY2tib25lXG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaGRsc1tpXS5hY3Rpb24uYXBwbHkoaGRsc1tpXS5jb250ZXh0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgZXZlbnQgaGFuZGxlclxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBhY3Rpb25cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IFtjb250ZXh0XVxuICAgICAqIEBjaGFpbmFibGVcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24obmFtZSwgYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fX2hhbmRsZXJzX18gfHwgKHRoaXMuX19oYW5kbGVyc19fPXt9KTtcbiAgICAgICAgaWYgKCFoYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgaGFuZGxlcnNbbmFtZV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhuYW1lLCBhY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoYWN0aW9uLCBjb250ZXh0IHx8IHRoaXMpO1xuICAgICAgICBoYW5kbGVyc1tuYW1lXS5wdXNoKGhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBldmVudCwgZXZlbnQgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBvbmNlIGFuZCB0aGVuIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gYWN0aW9uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbY29udGV4dF1cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24obmFtZSwgYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICAgICAgc2VsZi5vZmYobmFtZSwgd3JhcHBlcik7XG4gICAgICAgICAgICBhY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbihuYW1lLCB3cmFwcGVyLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2Ygb25jZSgnYmVmb3JlJyArIG5hbWUpXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGFjdGlvblxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHRdXG4gICAgICogQGNoYWluYWJsZVxuICAgICAqL1xuICAgIGJlZm9yZTogZnVuY3Rpb24obmFtZSwgYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmFtZSA9ICdiZWZvcmUnICsgbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMub24obmFtZSwgYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2Ygb25jZSgnYWZ0ZXInICsgbmFtZSlcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gYWN0aW9uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbY29udGV4dF1cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uKG5hbWUsIGFjdGlvbiwgY29udGV4dCkge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5hbWUgPSAnYWZ0ZXInICsgbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMub24obmFtZSwgYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2Ygb24oJ3N1Y2Nlc3MnKVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBhY3Rpb25cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IFtjb250ZXh0XVxuICAgICAqIEBjaGFpbmFibGVcbiAgICAgKi9cbiAgICBzdWNjZXNzOiBmdW5jdGlvbihhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25jZSgnc3VjY2VzcycsIGFjdGlvbiwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIG9uKCdlcnJvcicpXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGFjdGlvblxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHRdXG4gICAgICogQGNoYWluYWJsZVxuICAgICAqL1xuICAgIGVycm9yOiBmdW5jdGlvbihhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25jZSgnZXJyb3InLCBhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gYWN0aW9uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbY29udGV4dF1cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihuYW1lLCBhY3Rpb24pIHtcblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9faGFuZGxlcnNfXyB8fCAodGhpcy5fX2hhbmRsZXJzX189e30pO1xuXG4gICAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tuYW1lXSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgdmFyIGhkbHMgPSBoYW5kbGVyc1tuYW1lXTtcbiAgICAgICAgICAgIHZhciByZXRhaW5zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhkbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICYmIGhkbHNbaV0uYWN0aW9uICE9PSBhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWlucy5wdXNoKGhkbHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXJzW25hbWVdID0gcmV0YWlucztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiByZWdpc3RlcmVkIHRoZSBldmVudCBoYW5kbGVyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgYWN0aW9uXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXM6IGZ1bmN0aW9uKG5hbWUsIGFjdGlvbikge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9faGFuZGxlcnNfXztcblxuICAgICAgICBpZiAoISBoYW5kbGVycyB8fFxuICAgICAgICAgICAgISBoYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoZGxzID0gaGFuZGxlcnNbbmFtZV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGRscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGhkbHNbaV0uYWN0aW9uID09PSBhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG5vdGlmaWVyOyIsInZhciBndWlkID0gMDtcblxudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG52YXIgbmF0aXZlRm9yRWFjaCA9IEFycmF5UHJvdG8uZm9yRWFjaDtcblxuLyoqXG4gKiBVdGlsIGZ1bmN0aW9uc1xuICogQG5hbWVzcGFjZSBjbGF5LmNvcmUudXRpbFxuICovXG52YXIgdXRpbCA9IHtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIEdVSURcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZ2VuR1VJRDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKytndWlkO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVsYXRpdmUgcGF0aCB0byBhYnNvbHV0ZSBwYXRoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBiYXNlUGF0aFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5jb3JlLnV0aWxcbiAgICAgKi9cbiAgICByZWxhdGl2ZTJhYnNvbHV0ZTogZnVuY3Rpb24gKHBhdGgsIGJhc2VQYXRoKSB7XG4gICAgICAgIGlmICghYmFzZVBhdGggfHwgcGF0aC5tYXRjaCgvXlxcLy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aFBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICB2YXIgYmFzZVBhdGhQYXJ0cyA9IGJhc2VQYXRoLnNwbGl0KCcvJyk7XG5cbiAgICAgICAgdmFyIGl0ZW0gPSBwYXRoUGFydHNbMF07XG4gICAgICAgIHdoaWxlKGl0ZW0gPT09ICcuJyB8fCBpdGVtID09PSAnLi4nKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoUGFydHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRoUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGl0ZW0gPSBwYXRoUGFydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VQYXRoUGFydHMuam9pbignLycpICsgJy8nICsgcGF0aFBhcnRzLmpvaW4oJy8nKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIHRhcmdldCB3aXRoIHNvdXJjZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0XG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZXh0ZW5kOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIHByb3BlcnRpZXMgdG8gdGFyZ2V0IGlmIG5vdCBleGlzdC5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICAgICAqIEBwYXJhbSAge09iamVjdH0gc291cmNlXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmNvcmUudXRpbFxuICAgICAqL1xuICAgIGRlZmF1bHRzOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEV4dGVuZCBwcm9wZXJ0aWVzIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBsaXN0IHRvIGF2b2lkIGZvci4uaW4uLiBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB0YXJnZXRcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHNvdXJjZVxuICAgICAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcm9wTGlzdFxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5jb3JlLnV0aWxcbiAgICAgKi9cbiAgICBleHRlbmRXaXRoUHJvcExpc3Q6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgcHJvcExpc3QpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BMaXN0W2ldO1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFeHRlbmQgcHJvcGVydGllcyB0byB0YXJnZXQgaWYgbm90IGV4aXN0LiBXaXRoIGEgZ2l2ZW4gcHJvcGVydHkgbGlzdCBhdm9pZCBmb3IuLmluLi4gaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0XG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcHJvcExpc3RcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZGVmYXVsdHNXaXRoUHJvcExpc3Q6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgcHJvcExpc3QpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BMaXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R8QXJyYXl9IG9ialxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBpdGVyYXRvclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHRdXG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZWFjaDogZnVuY3Rpb24gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCEob2JqICYmIGl0ZXJhdG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmouZm9yRWFjaCAmJiBvYmouZm9yRWFjaCA9PT0gbmF0aXZlRm9yRWFjaCkge1xuICAgICAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iai5sZW5ndGggPT09ICsgb2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElzIG9iamVjdFxuICAgICAqIEBwYXJhbSAge30gIG9ialxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElzIGFycmF5ID9cbiAgICAgKiBAcGFyYW0gIHt9ICBvYmpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmNvcmUudXRpbFxuICAgICAqL1xuICAgIGlzQXJyYXk6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSXMgYXJyYXkgbGlrZSwgd2hpY2ggaGF2ZSBhIGxlbmd0aCBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSAge30gIG9ialxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgaXNBcnJheUxpa2U6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvYmoubGVuZ3RoID09PSArIG9iai5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7fSBvYmpcbiAgICAgKiBAcmV0dXJuIHt9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKCF1dGlsLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXRpbC5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1dGlsLmlzQXJyYXlMaWtlKG9iaikpIHsgLy8gaXMgdHlwZWQgYXJyYXlcbiAgICAgICAgICAgIHZhciByZXQgPSBuZXcgb2JqLmNvbnN0cnVjdG9yKG9iai5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXRbaV0gPSBvYmpbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHt9LCBvYmopO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbDtcbiIsImltcG9ydCBleHRlbmRNaXhpbiBmcm9tICcuL21peGluL2V4dGVuZCc7XG5pbXBvcnQgbm90aWZpZXJNaXhpbiBmcm9tICcuL21peGluL25vdGlmaWVyJztcbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBvZiBhbGwgb2JqZWN0c1xuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5jb3JlLkJhc2VcbiAqIEBtaXhlcyBjbGF5LmNvcmUubWl4aW4ubm90aWZpZXJcbiAqL1xudmFyIEJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLl9fdWlkX18gPSB1dGlsLmdlbkdVSUQoKTtcbn07XG5cbkJhc2UuX19pbml0aWFsaXplcnNfXyA9IFtcbiAgICBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB1dGlsLmV4dGVuZCh0aGlzLCBvcHRzKTtcbiAgICB9XG5dO1xuXG51dGlsLmV4dGVuZChCYXNlLCBleHRlbmRNaXhpbik7XG51dGlsLmV4dGVuZChCYXNlLnByb3RvdHlwZSwgbm90aWZpZXJNaXhpbik7XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2U7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IEFuaW1hdG9yIGZyb20gJy4vQW5pbWF0b3InO1xuXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZnVuY3Rpb24gKGZ1bmMpeyBzZXRUaW1lb3V0KGZ1bmMsIDE2KTsgfTtcblxuLyoqXG4gKiBBbmltYXRpb24gaXMgZ2xvYmFsIHRpbWVsaW5lIHRoYXQgc2NoZWR1bGUgYWxsIGNsaXBzLiBlYWNoIGZyYW1lIGFuaW1hdGlvbiB3aWxsIHNldCB0aGUgdGltZSBvZiBjbGlwcyB0byBjdXJyZW50IGFuZCB1cGRhdGUgdGhlIHN0YXRlcyBvZiBjbGlwc1xuICogQGNvbnN0cnVjdG9yIGNsYXkuYW5pbWF0aW9uLkFuaW1hdGlvblxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIGFuaW1hdGlvbiA9IG5ldyBjbGF5LmFuaW1hdGlvbi5BbmltYXRpb24oKTtcbiAqIHZhciBub2RlID0gbmV3IGNsYXkuTm9kZSgpO1xuICogYW5pbWF0aW9uLmFuaW1hdGUobm9kZS5wb3NpdGlvbilcbiAqICAgICAud2hlbigxMDAwLCB7XG4gKiAgICAgICAgIHg6IDUwMCxcbiAqICAgICAgICAgeTogNTAwXG4gKiAgICAgfSlcbiAqICAgICAud2hlbigyMDAwLCB7XG4gKiAgICAgICAgIHg6IDEwMCxcbiAqICAgICAgICAgeTogMTAwXG4gKiAgICAgfSlcbiAqICAgICAud2hlbigzMDAwLCB7XG4gKiAgICAgICAgIHo6IDEwXG4gKiAgICAgfSlcbiAqICAgICAuc3RhcnQoJ3NwbGluZScpO1xuICovXG52YXIgVGltZWxpbmUgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5hbmltYXRpb24uVGltZWxpbmUjICove1xuICAgICAgICAvKipcbiAgICAgICAgICogc3RhZ2UgaXMgYW4gb2JqZWN0IHdpdGggcmVuZGVyIG1ldGhvZCwgZWFjaCBmcmFtZSBpZiB0aGVyZSBleGlzdHMgYW55IGFuaW1hdGluZyBjbGlwcywgc3RhZ2UucmVuZGVyIHdpbGwgYmUgY2FsbGVkXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBzdGFnZTogbnVsbCxcblxuICAgICAgICBfY2xpcHM6IFtdLFxuXG4gICAgICAgIF9ydW5uaW5nOiBmYWxzZSxcblxuICAgICAgICBfdGltZTogMCxcblxuICAgICAgICBfcGF1c2VkOiBmYWxzZSxcblxuICAgICAgICBfcGF1c2VkVGltZTogMFxuICAgIH07XG59LFxuLyoqIEBsZW5kcyBjbGF5LmFuaW1hdGlvbi5UaW1lbGluZS5wcm90b3R5cGUgKi9cbntcblxuICAgIC8qKlxuICAgICAqIEFkZCBhbmltYXRvclxuICAgICAqIEBwYXJhbSB7Y2xheS5hbmltYXRlLkFuaW1hdG9yfSBhbmltYXRvclxuICAgICAqL1xuICAgIGFkZEFuaW1hdG9yOiBmdW5jdGlvbiAoYW5pbWF0b3IpIHtcbiAgICAgICAgYW5pbWF0b3IuYW5pbWF0aW9uID0gdGhpcztcbiAgICAgICAgdmFyIGNsaXBzID0gYW5pbWF0b3IuZ2V0Q2xpcHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGlwKGNsaXBzW2ldKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGNsaXBcbiAgICAgKi9cbiAgICBhZGRDbGlwOiBmdW5jdGlvbiAoY2xpcCkge1xuICAgICAgICBpZiAodGhpcy5fY2xpcHMuaW5kZXhPZihjbGlwKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaXBzLnB1c2goY2xpcCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uQ2xpcH0gY2xpcFxuICAgICAqL1xuICAgIHJlbW92ZUNsaXA6IGZ1bmN0aW9uIChjbGlwKSB7XG4gICAgICAgIHZhciBpZHggPSB0aGlzLl9jbGlwcy5pbmRleE9mKGNsaXApO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaXBzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbmltYXRvclxuICAgICAqIEBwYXJhbSB7Y2xheS5hbmltYXRlLkFuaW1hdG9yfSBhbmltYXRvclxuICAgICAqL1xuICAgIHJlbW92ZUFuaW1hdG9yOiBmdW5jdGlvbiAoYW5pbWF0b3IpIHtcbiAgICAgICAgdmFyIGNsaXBzID0gYW5pbWF0b3IuZ2V0Q2xpcHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGlwKGNsaXBzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBhbmltYXRvci5hbmltYXRpb24gPSBudWxsO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpIC0gdGhpcy5fcGF1c2VkVGltZTtcbiAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMuX3RpbWU7XG4gICAgICAgIHZhciBjbGlwcyA9IHRoaXMuX2NsaXBzO1xuICAgICAgICB2YXIgbGVuID0gY2xpcHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBkZWZlcnJlZEV2ZW50cyA9IFtdO1xuICAgICAgICB2YXIgZGVmZXJyZWRDbGlwcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2xpcCA9IGNsaXBzW2ldO1xuICAgICAgICAgICAgdmFyIGUgPSBjbGlwLnN0ZXAodGltZSwgZGVsdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIFRocm93IG91dCB0aGUgZXZlbnRzIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyXG4gICAgICAgICAgICAvLyBzdGFnZS5yZW5kZXIsIGxpa2UgZmluaXNoXG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgIGRlZmVycmVkRXZlbnRzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWRDbGlwcy5wdXNoKGNsaXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBmaW5pc2hlZCBjbGlwXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOykge1xuICAgICAgICAgICAgaWYgKGNsaXBzW2ldLl9uZWVkc1JlbW92ZSkge1xuICAgICAgICAgICAgICAgIGNsaXBzW2ldID0gY2xpcHNbbGVuLTFdO1xuICAgICAgICAgICAgICAgIGNsaXBzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZW4gPSBkZWZlcnJlZEV2ZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGRlZmVycmVkQ2xpcHNbaV0uZmlyZShkZWZlcnJlZEV2ZW50c1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90aW1lID0gdGltZTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2ZyYW1lJywgZGVsdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YWdlICYmIHRoaXMuc3RhZ2UucmVuZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWdlLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTdGFydCBydW5uaW5nIGFuaW1hdGlvblxuICAgICAqL1xuICAgIHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdGhpcy5fcGF1c2VkVGltZSA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gc3RlcCgpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9ydW5uaW5nKSB7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX3BhdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7XG5cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFN0b3AgcnVubmluZyBhbmltYXRpb25cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGF1c2VcbiAgICAgKi9cbiAgICBwYXVzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc3VtZVxuICAgICAqL1xuICAgIHJlc3VtZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZWRUaW1lICs9IERhdGUubm93KCkgLSB0aGlzLl9wYXVzZVN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBjbGlwc1xuICAgICAqL1xuICAgIHJlbW92ZUNsaXBzQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NsaXBzID0gW107XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBhbmltYXRvclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0XG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbb3B0aW9ucy5sb29wXVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZXR0ZXJdXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtvcHRpb25zLnNldHRlcl1cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW29wdGlvbnMuaW50ZXJwb2xhdGVyXVxuICAgICAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkFuaW1hdG9yfVxuICAgICAqL1xuICAgIGFuaW1hdGU6IGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciBhbmltYXRvciA9IG5ldyBBbmltYXRvcihcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG9wdGlvbnMubG9vcCxcbiAgICAgICAgICAgIG9wdGlvbnMuZ2V0dGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmludGVycG9sYXRlclxuICAgICAgICApO1xuICAgICAgICBhbmltYXRvci5hbmltYXRpb24gPSB0aGlzO1xuICAgICAgICByZXR1cm4gYW5pbWF0b3I7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWVsaW5lO1xuIiwiaW1wb3J0IENsaXAgZnJvbSAnLi9DbGlwJztcblxuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgcXVhdCA9IGdsTWF0cml4LnF1YXQ7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICpcbiAqIEFuaW1hdGlvbiBjbGlwIHRoYXQgbWFuYWdlIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgY2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfVxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5hbmltYXRpb24uVHJhY2tDbGlwXG4gKlxuICogQGV4dGVuZHMgY2xheS5hbmltYXRpb24uQ2xpcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm5hbWVdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxpZmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZGVsYXldXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZ2FwXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnBsYXliYWNrUmF0aW9dXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbb3B0cy5sb29wXSBJZiBsb29wIGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZSB0aGUgbG9vcCBjb3VudCBvZiBhbmltYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBbb3B0cy5lYXNpbmddXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbmZyYW1lXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25maW5pc2hdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbnJlc3RhcnRdXG4gKiBAcGFyYW0ge0FycmF5LjxjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2s+fSBbb3B0cy50cmFja3NdXG4gKi9cbnZhciBUcmFja0NsaXAgPSBmdW5jdGlvbiAob3B0cykge1xuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICBDbGlwLmNhbGwodGhpcywgb3B0cyk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IG9wdHMudHJhY2tzIHx8IFtdO1xufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xpcC5wcm90b3R5cGUpO1xuXG5UcmFja0NsaXAucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHJhY2tDbGlwO1xuXG5UcmFja0NsaXAucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAodGltZSwgZFRpbWUsIHNpbGVudCkge1xuXG4gICAgdmFyIHJldCA9IENsaXAucHJvdG90eXBlLnN0ZXAuY2FsbCh0aGlzLCB0aW1lLCBkVGltZSwgdHJ1ZSk7XG5cbiAgICBpZiAocmV0ICE9PSAnZmluaXNoJykge1xuICAgICAgICB2YXIgdGltZSA9IHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcbiAgICAgICAgLy8gVE9ETyBsaWZlIG1heSBiZSBjaGFuZ2VkLlxuICAgICAgICBpZiAodGhpcy5fcmFuZ2UpIHtcbiAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9yYW5nZVswXSArIHRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUaW1lKHRpbWUpO1xuICAgIH1cblxuICAgIC8vIFBFTkRJTkcgU2NoZWR1bGVcbiAgICBpZiAoIXNpbGVudCAmJiByZXQgIT09ICdwYXVzZWQnKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZnJhbWUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByYW5nZVxuICovXG5UcmFja0NsaXAucHJvdG90eXBlLnNldFJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgdGhpcy5jYWxjTGlmZUZyb21UcmFja3MoKTtcbiAgICB0aGlzLl9yYW5nZSA9IHJhbmdlO1xuICAgIGlmIChyYW5nZSkge1xuICAgICAgICByYW5nZVsxXSA9IE1hdGgubWluKHJhbmdlWzFdLCB0aGlzLmxpZmUpO1xuICAgICAgICByYW5nZVswXSA9IE1hdGgubWluKHJhbmdlWzBdLCB0aGlzLmxpZmUpO1xuICAgICAgICB0aGlzLmxpZmUgPSAocmFuZ2VbMV0gLSByYW5nZVswXSk7XG4gICAgfVxufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZS5zZXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudHJhY2tzW2ldLnNldFRpbWUodGltZSk7XG4gICAgfVxufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZS5jYWxjTGlmZUZyb21UcmFja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5saWZlID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMubGlmZSA9IE1hdGgubWF4KHRoaXMubGlmZSwgdGhpcy50cmFja3NbaV0uZ2V0TWF4VGltZSgpKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfSBqb2ludENsaXBcbiAqL1xuVHJhY2tDbGlwLnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uICh0cmFjaykge1xuICAgIHRoaXMudHJhY2tzLnB1c2godHJhY2spO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja30gam9pbnRDbGlwXG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUucmVtb3ZlVGFyY2sgPSBmdW5jdGlvbiAodHJhY2spIHtcbiAgICB2YXIgaWR4ID0gdGhpcy50cmFja3MuaW5kZXhPZih0cmFjayk7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0VGltZVxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFRpbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMb29wXG4gKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5UcmFja0NsaXB9XG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUuZ2V0U3ViQ2xpcCA9IGZ1bmN0aW9uIChzdGFydFRpbWUsIGVuZFRpbWUsIGlzTG9vcCkge1xuICAgIHZhciBzdWJDbGlwID0gbmV3IFRyYWNrQ2xpcCh7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3ViVHJhY2sgPSB0aGlzLnRyYWNrc1tpXS5nZXRTdWJUcmFjayhzdGFydFRpbWUsIGVuZFRpbWUpO1xuICAgICAgICBzdWJDbGlwLmFkZFRyYWNrKHN1YlRyYWNrKTtcbiAgICB9XG5cbiAgICBpZiAoaXNMb29wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3ViQ2xpcC5zZXRMb29wKGlzTG9vcCk7XG4gICAgfVxuXG4gICAgc3ViQ2xpcC5saWZlID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIHJldHVybiBzdWJDbGlwO1xufTtcblxuLyoqXG4gKiAxZCBibGVuZGluZyBmcm9tIHR3byBza2lubmluZyBjbGlwc1xuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMVxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMlxuICogQHBhcmFtICB7bnVtYmVyfSB3XG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUuYmxlbmQxRCA9IGZ1bmN0aW9uIChjbGlwMSwgY2xpcDIsIHcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjMSA9IGNsaXAxLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIGMyID0gY2xpcDIudHJhY2tzW2ldO1xuICAgICAgICB2YXIgdENsaXAgPSB0aGlzLnRyYWNrc1tpXTtcblxuICAgICAgICB0Q2xpcC5ibGVuZDFEKGMxLCBjMiwgdyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGRpdGl2ZSBibGVuZGluZyBmcm9tIHR3byBza2lubmluZyBjbGlwc1xuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMVxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMlxuICovXG5UcmFja0NsaXAucHJvdG90eXBlLmFkZGl0aXZlQmxlbmQgPSBmdW5jdGlvbiAoY2xpcDEsIGNsaXAyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYzEgPSBjbGlwMS50cmFja3NbaV07XG4gICAgICAgIHZhciBjMiA9IGNsaXAyLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIHRDbGlwID0gdGhpcy50cmFja3NbaV07XG5cbiAgICAgICAgdENsaXAuYWRkaXRpdmVCbGVuZChjMSwgYzIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogU3VidHJhY3RpdmUgYmxlbmRpbmcgZnJvbSB0d28gc2tpbm5pbmcgY2xpcHNcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDFcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDJcbiAqL1xuVHJhY2tDbGlwLnByb3RvdHlwZS5zdWJ0cmFjdGl2ZUJsZW5kID0gZnVuY3Rpb24gKGNsaXAxLCBjbGlwMikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMxID0gY2xpcDEudHJhY2tzW2ldO1xuICAgICAgICB2YXIgYzIgPSBjbGlwMi50cmFja3NbaV07XG4gICAgICAgIHZhciB0Q2xpcCA9IHRoaXMudHJhY2tzW2ldO1xuXG4gICAgICAgIHRDbGlwLnN1YnRyYWN0aXZlQmxlbmQoYzEsIGMyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIDJEIGJsZW5kaW5nIGZyb20gdGhyZWUgc2tpbm5pbmcgY2xpcHNcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDFcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDJcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDNcbiAqIEBwYXJhbSAge251bWJlcn0gZlxuICogQHBhcmFtICB7bnVtYmVyfSBnXG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUuYmxlbmQyRCA9IGZ1bmN0aW9uIChjbGlwMSwgY2xpcDIsIGNsaXAzLCBmLCBnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYzEgPSBjbGlwMS50cmFja3NbaV07XG4gICAgICAgIHZhciBjMiA9IGNsaXAyLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIGMzID0gY2xpcDMudHJhY2tzW2ldO1xuICAgICAgICB2YXIgdENsaXAgPSB0aGlzLnRyYWNrc1tpXTtcblxuICAgICAgICB0Q2xpcC5ibGVuZDJEKGMxLCBjMiwgYzMsIGYsIGcpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ29weSBTUlQgb2YgYWxsIGpvaW50cyBjbGlwcyBmcm9tIGFub3RoZXIgVHJhY2tDbGlwXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5UcmFja0NsaXB9IGNsaXBcbiAqL1xuVHJhY2tDbGlwLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKGNsaXApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzVHJhY2sgPSBjbGlwLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIHRUcmFjayA9IHRoaXMudHJhY2tzW2ldO1xuXG4gICAgICAgIHZlYzMuY29weSh0VHJhY2sucG9zaXRpb24sIHNUcmFjay5wb3NpdGlvbik7XG4gICAgICAgIHZlYzMuY29weSh0VHJhY2suc2NhbGUsIHNUcmFjay5zY2FsZSk7XG4gICAgICAgIHF1YXQuY29weSh0VHJhY2sucm90YXRpb24sIHNUcmFjay5yb3RhdGlvbik7XG4gICAgfVxufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2xpcCA9IENsaXAucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbGlwLmFkZFRyYWNrKHRoaXMudHJhY2tzW2ldLmNsb25lKCkpO1xuICAgIH1cbiAgICBjbGlwLmxpZmUgPSB0aGlzLmxpZmU7XG4gICAgcmV0dXJuIGNsaXA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUcmFja0NsaXA7XG4iLCJ2YXIgRVhURU5TSU9OX0xJU1QgPSBbXG4gICAgJ09FU190ZXh0dXJlX2Zsb2F0JyxcbiAgICAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcsXG4gICAgJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicsXG4gICAgJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyxcbiAgICAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyxcbiAgICAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnLFxuICAgICdPRVNfZWxlbWVudF9pbmRleF91aW50JyxcbiAgICAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnLFxuICAgICdXRUJHTF9kZXB0aF90ZXh0dXJlJyxcbiAgICAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyxcbiAgICAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcsXG4gICAgJ1dFQkdMX2RyYXdfYnVmZmVycycsXG4gICAgJ0VYVF9mcmFnX2RlcHRoJyxcbiAgICAnRVhUX3NSR0InXG5dO1xuXG52YXIgUEFSQU1FVEVSX05BTUVTID0gW1xuICAgICdNQVhfVEVYVFVSRV9TSVpFJyxcbiAgICAnTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSdcbl07XG5cbmZ1bmN0aW9uIEdMSW5mbyhfZ2wpIHtcbiAgICB2YXIgZXh0ZW5zaW9ucyA9IHt9O1xuICAgIHZhciBwYXJhbWV0ZXJzID0ge307XG5cbiAgICAvLyBHZXQgd2ViZ2wgZXh0ZW5zaW9uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBFWFRFTlNJT05fTElTVC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXh0TmFtZSA9IEVYVEVOU0lPTl9MSVNUW2ldO1xuICAgICAgICBjcmVhdGVFeHRlbnNpb24oZXh0TmFtZSk7XG4gICAgfVxuICAgIC8vIEdldCBwYXJhbWV0ZXJzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQQVJBTUVURVJfTkFNRVMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBQQVJBTUVURVJfTkFNRVNbaV07XG4gICAgICAgIHBhcmFtZXRlcnNbbmFtZV0gPSBfZ2wuZ2V0UGFyYW1ldGVyKF9nbFtuYW1lXSk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRFeHRlbnNpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAoIShuYW1lIGluIGV4dGVuc2lvbnMpKSB7XG4gICAgICAgICAgICBjcmVhdGVFeHRlbnNpb24obmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnNbbmFtZV07XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0UGFyYW1ldGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnNbbmFtZV07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgICAgIHZhciBleHQgPSBfZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpO1xuICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgZXh0ID0gX2dsLmdldEV4dGVuc2lvbignTU9aXycgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgZXh0ID0gX2dsLmdldEV4dGVuc2lvbignV0VCS0lUXycgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBleHRlbnNpb25zW25hbWVdID0gZXh0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR0xJbmZvO1xuIiwiLyoqXG4gKiBAbmFtZXNwYWNlIGNsYXkuY29yZS5nbGVudW1cbiAqIEBzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9zcGVjcy9sYXRlc3QvMS4wLyM1LjE0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvKiBDbGVhckJ1ZmZlck1hc2sgKi9cbiAgICBERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgOiAweDAwMDAwMTAwLFxuICAgIFNURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICA6IDB4MDAwMDA0MDAsXG4gICAgQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDogMHgwMDAwNDAwMCxcblxuICAgIC8qIEJlZ2luTW9kZSAqL1xuICAgIFBPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDAwMCxcbiAgICBMSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDAwMDEsXG4gICAgTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDogMHgwMDAyLFxuICAgIExJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICA6IDB4MDAwMyxcbiAgICBUUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgOiAweDAwMDQsXG4gICAgVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDogMHgwMDA1LFxuICAgIFRSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICA6IDB4MDAwNixcblxuICAgIC8qIEFscGhhRnVuY3Rpb24gKG5vdCBzdXBwb3J0ZWQgaW4gRVMyMCkgKi9cbiAgICAvKiAgICAgIE5FVkVSICovXG4gICAgLyogICAgICBMRVNTICovXG4gICAgLyogICAgICBFUVVBTCAqL1xuICAgIC8qICAgICAgTEVRVUFMICovXG4gICAgLyogICAgICBHUkVBVEVSICovXG4gICAgLyogICAgICBOT1RFUVVBTCAqL1xuICAgIC8qICAgICAgR0VRVUFMICovXG4gICAgLyogICAgICBBTFdBWVMgKi9cblxuICAgIC8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqL1xuICAgIFpFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMSxcbiAgICBTUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgOiAweDAzMDAsXG4gICAgT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDogMHgwMzAxLFxuICAgIFNSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICA6IDB4MDMwMixcbiAgICBPTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgOiAweDAzMDMsXG4gICAgRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDogMHgwMzA0LFxuICAgIE9ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICA6IDB4MDMwNSxcblxuICAgIC8qIEJsZW5kaW5nRmFjdG9yU3JjICovXG4gICAgLyogICAgICBaRVJPICovXG4gICAgLyogICAgICBPTkUgKi9cbiAgICBEU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgOiAweDAzMDYsXG4gICAgT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDogMHgwMzA3LFxuICAgIFNSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICA6IDB4MDMwOCxcbiAgICAvKiAgICAgIFNSQ19BTFBIQSAqL1xuICAgIC8qICAgICAgT05FX01JTlVTX1NSQ19BTFBIQSAqL1xuICAgIC8qICAgICAgRFNUX0FMUEhBICovXG4gICAgLyogICAgICBPTkVfTUlOVVNfRFNUX0FMUEhBICovXG5cbiAgICAvKiBCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKi9cbiAgICBGVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgOiAweDgwMDYsXG4gICAgQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgIDogMHg4MDA5LFxuICAgIEJMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICA6IDB4ODAwOSwgLyogc2FtZSBhcyBCTEVORF9FUVVBVElPTiAqL1xuICAgIEJMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICA6IDB4ODgzRCxcblxuICAgIC8qIEJsZW5kU3VidHJhY3QgKi9cbiAgICBGVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgOiAweDgwMEEsXG4gICAgRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgIDogMHg4MDBCLFxuXG4gICAgLyogU2VwYXJhdGUgQmxlbmQgRnVuY3Rpb25zICovXG4gICAgQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDogMHg4MEM4LFxuICAgIEJMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICA6IDB4ODBDOSxcbiAgICBCTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgOiAweDgwQ0EsXG4gICAgQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDogMHg4MENCLFxuICAgIENPTlNUQU5UX0NPTE9SICAgICAgICAgICAgICAgICA6IDB4ODAwMSxcbiAgICBPTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgOiAweDgwMDIsXG4gICAgQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgIDogMHg4MDAzLFxuICAgIE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAgICAgICA6IDB4ODAwNCxcbiAgICBCTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgOiAweDgwMDUsXG5cbiAgICAvKiBCdWZmZXIgT2JqZWN0cyAqL1xuICAgIEFSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICA6IDB4ODg5MixcbiAgICBFTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgOiAweDg4OTMsXG4gICAgQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgIDogMHg4ODk0LFxuICAgIEVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICA6IDB4ODg5NSxcblxuICAgIFNUUkVBTV9EUkFXICAgICAgICAgICAgICAgICAgICA6IDB4ODhFMCxcbiAgICBTVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgOiAweDg4RTQsXG4gICAgRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDogMHg4OEU4LFxuXG4gICAgQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDogMHg4NzY0LFxuICAgIEJVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICA6IDB4ODc2NSxcblxuICAgIENVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICA6IDB4ODYyNixcblxuICAgIC8qIEN1bGxGYWNlTW9kZSAqL1xuICAgIEZST05UICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDQwNCxcbiAgICBCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDA0MDUsXG4gICAgRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDogMHgwNDA4LFxuXG4gICAgLyogRGVwdGhGdW5jdGlvbiAqL1xuICAgIC8qICAgICAgTkVWRVIgKi9cbiAgICAvKiAgICAgIExFU1MgKi9cbiAgICAvKiAgICAgIEVRVUFMICovXG4gICAgLyogICAgICBMRVFVQUwgKi9cbiAgICAvKiAgICAgIEdSRUFURVIgKi9cbiAgICAvKiAgICAgIE5PVEVRVUFMICovXG4gICAgLyogICAgICBHRVFVQUwgKi9cbiAgICAvKiAgICAgIEFMV0FZUyAqL1xuXG4gICAgLyogRW5hYmxlQ2FwICovXG4gICAgLyogVEVYVFVSRV8yRCAqL1xuICAgIENVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICA6IDB4MEI0NCxcbiAgICBCTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDBCRTIsXG4gICAgRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwQkQwLFxuICAgIFNURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICA6IDB4MEI5MCxcbiAgICBERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgOiAweDBCNzEsXG4gICAgU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDogMHgwQzExLFxuICAgIFBPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICA6IDB4ODAzNyxcbiAgICBTQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgOiAweDgwOUUsXG4gICAgU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDogMHg4MEEwLFxuXG4gICAgLyogRXJyb3JDb2RlICovXG4gICAgTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICBJTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgOiAweDA1MDAsXG4gICAgSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDogMHgwNTAxLFxuICAgIElOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICA6IDB4MDUwMixcbiAgICBPVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgOiAweDA1MDUsXG5cbiAgICAvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi9cbiAgICBDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDA5MDAsXG4gICAgQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwOTAxLFxuXG4gICAgLyogR2V0UE5hbWUgKi9cbiAgICBMSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOiAweDBCMjEsXG4gICAgQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDogMHg4NDZELFxuICAgIEFMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICA6IDB4ODQ2RSxcbiAgICBDVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgOiAweDBCNDUsXG4gICAgRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgIDogMHgwQjQ2LFxuICAgIERFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICA6IDB4MEI3MCxcbiAgICBERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgOiAweDBCNzIsXG4gICAgREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDogMHgwQjczLFxuICAgIERFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICA6IDB4MEI3NCxcbiAgICBTVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgOiAweDBCOTEsXG4gICAgU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgIDogMHgwQjkyLFxuICAgIFNURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICA6IDB4MEI5NCxcbiAgICBTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAgICAgICAgOiAweDBCOTUsXG4gICAgU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgIDogMHgwQjk2LFxuICAgIFNURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICA6IDB4MEI5NyxcbiAgICBTVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgOiAweDBCOTMsXG4gICAgU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgIDogMHgwQjk4LFxuICAgIFNURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICA6IDB4ODgwMCxcbiAgICBTVEVOQ0lMX0JBQ0tfRkFJTCAgICAgICAgICAgICAgOiAweDg4MDEsXG4gICAgU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCAgIDogMHg4ODAyLFxuICAgIFNURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICA6IDB4ODgwMyxcbiAgICBTVEVOQ0lMX0JBQ0tfUkVGICAgICAgICAgICAgICAgOiAweDhDQTMsXG4gICAgU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgICAgICAgIDogMHg4Q0E0LFxuICAgIFNURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICA6IDB4OENBNSxcbiAgICBWSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgOiAweDBCQTIsXG4gICAgU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgIDogMHgwQzEwLFxuICAgIC8qICAgICAgU0NJU1NPUl9URVNUICovXG4gICAgQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDogMHgwQzIyLFxuICAgIENPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICA6IDB4MEMyMyxcbiAgICBVTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgOiAweDBDRjUsXG4gICAgUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDogMHgwRDA1LFxuICAgIE1BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICA6IDB4MEQzMyxcbiAgICBNQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgOiAweDBEM0EsXG4gICAgU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDogMHgwRDUwLFxuICAgIFJFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICA6IDB4MEQ1MixcbiAgICBHUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgOiAweDBENTMsXG4gICAgQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDogMHgwRDU0LFxuICAgIEFMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICA6IDB4MEQ1NSxcbiAgICBERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgOiAweDBENTYsXG4gICAgU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDogMHgwRDU3LFxuICAgIFBPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICA6IDB4MkEwMCxcbiAgICAvKiAgICAgIFBPTFlHT05fT0ZGU0VUX0ZJTEwgKi9cbiAgICBQT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgOiAweDgwMzgsXG4gICAgVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgIDogMHg4MDY5LFxuICAgIFNBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICA6IDB4ODBBOCxcbiAgICBTQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgOiAweDgwQTksXG4gICAgU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgIDogMHg4MEFBLFxuICAgIFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICA6IDB4ODBBQixcblxuICAgIC8qIEdldFRleHR1cmVQYXJhbWV0ZXIgKi9cbiAgICAvKiAgICAgIFRFWFRVUkVfTUFHX0ZJTFRFUiAqL1xuICAgIC8qICAgICAgVEVYVFVSRV9NSU5fRklMVEVSICovXG4gICAgLyogICAgICBURVhUVVJFX1dSQVBfUyAqL1xuICAgIC8qICAgICAgVEVYVFVSRV9XUkFQX1QgKi9cblxuICAgIENPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICA6IDB4ODZBMyxcblxuICAgIC8qIEhpbnRNb2RlICovXG4gICAgRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDogMHgxMTAwLFxuICAgIEZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTEwMSxcbiAgICBOSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDExMDIsXG5cbiAgICAvKiBIaW50VGFyZ2V0ICovXG4gICAgR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICA6IDB4ODE5MixcblxuICAgIC8qIERhdGFUeXBlICovXG4gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxNDAwLFxuICAgIFVOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICA6IDB4MTQwMSxcbiAgICBTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDE0MDIsXG4gICAgVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDogMHgxNDAzLFxuICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTQwNCxcbiAgICBVTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgOiAweDE0MDUsXG4gICAgRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxNDA2LFxuXG4gICAgLyogUGl4ZWxGb3JtYXQgKi9cbiAgICBERVBUSF9DT01QT05FTlQgICAgICAgICAgICAgICAgOiAweDE5MDIsXG4gICAgQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxOTA2LFxuICAgIFJHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTkwNyxcbiAgICBSR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDE5MDgsXG4gICAgTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDogMHgxOTA5LFxuICAgIExVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICA6IDB4MTkwQSxcblxuICAgIC8qIFBpeGVsVHlwZSAqL1xuICAgIC8qICAgICAgVU5TSUdORURfQllURSAqL1xuICAgIFVOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICA6IDB4ODAzMyxcbiAgICBVTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgOiAweDgwMzQsXG4gICAgVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDogMHg4MzYzLFxuXG4gICAgLyogU2hhZGVycyAqL1xuICAgIEZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAgIDogMHg4QjMwLFxuICAgIFZFUlRFWF9TSEFERVIgICAgICAgICAgICAgICAgICAgIDogMHg4QjMxLFxuICAgIE1BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAgIDogMHg4ODY5LFxuICAgIE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICAgICAgIDogMHg4REZCLFxuICAgIE1BWF9WQVJZSU5HX1ZFQ1RPUlMgICAgICAgICAgICAgIDogMHg4REZDLFxuICAgIE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDogMHg4QjRELFxuICAgIE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgIDogMHg4QjRDLFxuICAgIE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAgIDogMHg4ODcyLFxuICAgIE1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAgIDogMHg4REZELFxuICAgIFNIQURFUl9UWVBFICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjRGLFxuICAgIERFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDogMHg4QjgwLFxuICAgIExJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjgyLFxuICAgIFZBTElEQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgIDogMHg4QjgzLFxuICAgIEFUVEFDSEVEX1NIQURFUlMgICAgICAgICAgICAgICAgIDogMHg4Qjg1LFxuICAgIEFDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAgIDogMHg4Qjg2LFxuICAgIEFDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAgIDogMHg4Qjg5LFxuICAgIFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAgICAgICAgIDogMHg4QjhDLFxuICAgIENVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAgIDogMHg4QjhELFxuXG4gICAgLyogU3RlbmNpbEZ1bmN0aW9uICovXG4gICAgTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwMjAwLFxuICAgIExFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDIwMSxcbiAgICBFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDAyMDIsXG4gICAgTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwMjAzLFxuICAgIEdSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDIwNCxcbiAgICBOT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgOiAweDAyMDUsXG4gICAgR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwMjA2LFxuICAgIEFMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDIwNyxcblxuICAgIC8qIFN0ZW5jaWxPcCAqL1xuICAgIC8qICAgICAgWkVSTyAqL1xuICAgIEtFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MUUwMCxcbiAgICBSRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgOiAweDFFMDEsXG4gICAgSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxRTAyLFxuICAgIERFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MUUwMyxcbiAgICBJTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDE1MEEsXG4gICAgSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDogMHg4NTA3LFxuICAgIERFQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICA6IDB4ODUwOCxcblxuICAgIC8qIFN0cmluZ05hbWUgKi9cbiAgICBWRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDFGMDAsXG4gICAgUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDogMHgxRjAxLFxuICAgIFZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICA6IDB4MUYwMixcblxuICAgIC8qIFRleHR1cmVNYWdGaWx0ZXIgKi9cbiAgICBORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgOiAweDI2MDAsXG4gICAgTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgyNjAxLFxuXG4gICAgLyogVGV4dHVyZU1pbkZpbHRlciAqL1xuICAgIC8qICAgICAgTkVBUkVTVCAqL1xuICAgIC8qICAgICAgTElORUFSICovXG4gICAgTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDogMHgyNzAwLFxuICAgIExJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICA6IDB4MjcwMSxcbiAgICBORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgOiAweDI3MDIsXG4gICAgTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDogMHgyNzAzLFxuXG4gICAgLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi9cbiAgICBURVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgOiAweDI4MDAsXG4gICAgVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDogMHgyODAxLFxuICAgIFRFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICA6IDB4MjgwMixcbiAgICBURVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgOiAweDI4MDMsXG5cbiAgICAvKiBUZXh0dXJlVGFyZ2V0ICovXG4gICAgVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDogMHgwREUxLFxuICAgIFRFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTcwMixcblxuICAgIFRFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICA6IDB4ODUxMyxcbiAgICBURVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgOiAweDg1MTQsXG4gICAgVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgIDogMHg4NTE1LFxuICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICA6IDB4ODUxNixcbiAgICBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgOiAweDg1MTcsXG4gICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgIDogMHg4NTE4LFxuICAgIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICA6IDB4ODUxOSxcbiAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgOiAweDg1MUEsXG4gICAgTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgIDogMHg4NTFDLFxuXG4gICAgLyogVGV4dHVyZVVuaXQgKi9cbiAgICBURVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzAsXG4gICAgVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEMxLFxuICAgIFRFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDMixcbiAgICBURVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzMsXG4gICAgVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEM0LFxuICAgIFRFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDNSxcbiAgICBURVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzYsXG4gICAgVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEM3LFxuICAgIFRFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDOCxcbiAgICBURVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzksXG4gICAgVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDogMHg4NENBLFxuICAgIFRFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDQixcbiAgICBURVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgOiAweDg0Q0MsXG4gICAgVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDogMHg4NENELFxuICAgIFRFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDRSxcbiAgICBURVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgOiAweDg0Q0YsXG4gICAgVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQwLFxuICAgIFRFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICA6IDB4ODREMSxcbiAgICBURVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgOiAweDg0RDIsXG4gICAgVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQzLFxuICAgIFRFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRENCxcbiAgICBURVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgOiAweDg0RDUsXG4gICAgVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQ2LFxuICAgIFRFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRENyxcbiAgICBURVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgOiAweDg0RDgsXG4gICAgVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQ5LFxuICAgIFRFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICA6IDB4ODREQSxcbiAgICBURVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgOiAweDg0REIsXG4gICAgVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NERDLFxuICAgIFRFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRERCxcbiAgICBURVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0REUsXG4gICAgVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDogMHg4NERGLFxuICAgIEFDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICA6IDB4ODRFMCxcblxuICAgIC8qIFRleHR1cmVXcmFwTW9kZSAqL1xuICAgIFJFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MjkwMSxcbiAgICBDTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgOiAweDgxMkYsXG4gICAgTUlSUk9SRURfUkVQRUFUICAgICAgICAgICAgICAgIDogMHg4MzcwLFxuXG4gICAgLyogVW5pZm9ybSBUeXBlcyAqL1xuICAgIEZMT0FUX1ZFQzIgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1MCxcbiAgICBGTE9BVF9WRUMzICAgICAgICAgICAgICAgICAgICAgOiAweDhCNTEsXG4gICAgRkxPQVRfVkVDNCAgICAgICAgICAgICAgICAgICAgIDogMHg4QjUyLFxuICAgIElOVF9WRUMyICAgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1MyxcbiAgICBJTlRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgOiAweDhCNTQsXG4gICAgSU5UX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjU1LFxuICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1NixcbiAgICBCT09MX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgOiAweDhCNTcsXG4gICAgQk9PTF9WRUMzICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjU4LFxuICAgIEJPT0xfVkVDNCAgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1OSxcbiAgICBGTE9BVF9NQVQyICAgICAgICAgICAgICAgICAgICAgOiAweDhCNUEsXG4gICAgRkxPQVRfTUFUMyAgICAgICAgICAgICAgICAgICAgIDogMHg4QjVCLFxuICAgIEZMT0FUX01BVDQgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1QyxcbiAgICBTQU1QTEVSXzJEICAgICAgICAgICAgICAgICAgICAgOiAweDhCNUUsXG4gICAgU0FNUExFUl9DVUJFICAgICAgICAgICAgICAgICAgIDogMHg4QjYwLFxuXG4gICAgLyogVmVydGV4IEFycmF5cyAqL1xuICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAgICAgICAgOiAweDg2MjIsXG4gICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFICAgICAgICAgICA6IDB4ODYyMyxcbiAgICBWRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSAgICAgICAgIDogMHg4NjI0LFxuICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAgICAgICAgICAgOiAweDg2MjUsXG4gICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEICAgICA6IDB4ODg2QSxcbiAgICBWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIgICAgICAgIDogMHg4NjQ1LFxuICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgOiAweDg4OUYsXG5cbiAgICAvKiBTaGFkZXIgU291cmNlICovXG4gICAgQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgICAgIDogMHg4QjgxLFxuXG4gICAgLyogU2hhZGVyIFByZWNpc2lvbi1TcGVjaWZpZWQgVHlwZXMgKi9cbiAgICBMT1dfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgOiAweDhERjAsXG4gICAgTUVESVVNX0ZMT0FUICAgICAgICAgICAgICAgICAgIDogMHg4REYxLFxuICAgIEhJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICA6IDB4OERGMixcbiAgICBMT1dfSU5UICAgICAgICAgICAgICAgICAgICAgICAgOiAweDhERjMsXG4gICAgTUVESVVNX0lOVCAgICAgICAgICAgICAgICAgICAgIDogMHg4REY0LFxuICAgIEhJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICA6IDB4OERGNSxcblxuICAgIC8qIEZyYW1lYnVmZmVyIE9iamVjdC4gKi9cbiAgICBGUkFNRUJVRkZFUiAgICAgICAgICAgICAgICAgICAgOiAweDhENDAsXG4gICAgUkVOREVSQlVGRkVSICAgICAgICAgICAgICAgICAgIDogMHg4RDQxLFxuXG4gICAgUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg4MDU2LFxuICAgIFJHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODA1NyxcbiAgICBSR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDhENjIsXG4gICAgREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgIDogMHg4MUE1LFxuICAgIFNURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICA6IDB4MTkwMSxcbiAgICBTVEVOQ0lMX0lOREVYOCAgICAgICAgICAgICAgICAgOiAweDhENDgsXG4gICAgREVQVEhfU1RFTkNJTCAgICAgICAgICAgICAgICAgIDogMHg4NEY5LFxuXG4gICAgUkVOREVSQlVGRkVSX1dJRFRIICAgICAgICAgICAgIDogMHg4RDQyLFxuICAgIFJFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICA6IDB4OEQ0MyxcbiAgICBSRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUICAgOiAweDhENDQsXG4gICAgUkVOREVSQlVGRkVSX1JFRF9TSVpFICAgICAgICAgIDogMHg4RDUwLFxuICAgIFJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICA6IDB4OEQ1MSxcbiAgICBSRU5ERVJCVUZGRVJfQkxVRV9TSVpFICAgICAgICAgOiAweDhENTIsXG4gICAgUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUgICAgICAgIDogMHg4RDUzLFxuICAgIFJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICA6IDB4OEQ1NCxcbiAgICBSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFICAgICAgOiAweDhENTUsXG5cbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFICAgICAgICAgICA6IDB4OENEMCxcbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FICAgICAgICAgICA6IDB4OENEMSxcbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgICAgICAgICA6IDB4OENEMixcbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRSA6IDB4OENEMyxcblxuICAgIENPTE9SX0FUVEFDSE1FTlQwICAgICAgICAgICAgICA6IDB4OENFMCxcbiAgICBERVBUSF9BVFRBQ0hNRU5UICAgICAgICAgICAgICAgOiAweDhEMDAsXG4gICAgU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgICAgICAgIDogMHg4RDIwLFxuICAgIERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCAgICAgICA6IDB4ODIxQSxcblxuICAgIE5PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG5cbiAgICBGUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICA6IDB4OENENSxcbiAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQgICAgICAgICA6IDB4OENENixcbiAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCA6IDB4OENENyxcbiAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgICAgICAgICA6IDB4OENEOSxcbiAgICBGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICA6IDB4OENERCxcblxuICAgIEZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA6IDB4OENBNixcbiAgICBSRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgOiAweDhDQTcsXG4gICAgTUFYX1JFTkRFUkJVRkZFUl9TSVpFICAgICAgICAgIDogMHg4NEU4LFxuXG4gICAgSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gIDogMHgwNTA2LFxuXG4gICAgLyogV2ViR0wtc3BlY2lmaWMgZW51bXMgKi9cbiAgICBVTlBBQ0tfRkxJUF9ZX1dFQkdMICAgICAgICAgICAgOiAweDkyNDAsXG4gICAgVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIDogMHg5MjQxLFxuICAgIENPTlRFWFRfTE9TVF9XRUJHTCAgICAgICAgICAgICA6IDB4OTI0MixcbiAgICBVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMIDogMHg5MjQzLFxuICAgIEJST1dTRVJfREVGQVVMVF9XRUJHTCAgICAgICAgICA6IDB4OTI0NCxcbn07XG4iLCJ2YXIgc3VwcG9ydFdlYkdMID0gdHJ1ZTtcbnRyeSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbn0gY2F0Y2ggKGUpIHtcbiAgICBzdXBwb3J0V2ViR0wgPSBmYWxzZTtcbn1cblxudmFyIHZlbmRvciA9IHt9O1xuXG4vKipcbiAqIElmIHN1cHBvcnQgV2ViR0xcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnZlbmRvci5zdXBwb3J0V2ViR0wgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRXZWJHTDtcbn07XG5cblxudmVuZG9yLkludDhBcnJheSA9IHR5cGVvZiBJbnQ4QXJyYXkgPT0gJ3VuZGVmaW5lZCcgPyBBcnJheSA6IEludDhBcnJheTtcblxudmVuZG9yLlVpbnQ4QXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PSAndW5kZWZpbmVkJyA/IEFycmF5IDogVWludDhBcnJheTtcblxudmVuZG9yLlVpbnQxNkFycmF5ID0gdHlwZW9mIFVpbnQxNkFycmF5ID09ICd1bmRlZmluZWQnID8gQXJyYXkgOiBVaW50MTZBcnJheTtcblxudmVuZG9yLlVpbnQzMkFycmF5ID0gdHlwZW9mIFVpbnQzMkFycmF5ID09ICd1bmRlZmluZWQnID8gQXJyYXkgOiBVaW50MzJBcnJheTtcblxudmVuZG9yLkludDE2QXJyYXkgPSB0eXBlb2YgSW50MTZBcnJheSA9PSAndW5kZWZpbmVkJyA/IEFycmF5IDogSW50MTZBcnJheTtcblxudmVuZG9yLkZsb2F0MzJBcnJheSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT0gJ3VuZGVmaW5lZCcgPyBBcnJheSA6IEZsb2F0MzJBcnJheTtcblxudmVuZG9yLkZsb2F0NjRBcnJheSA9IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT0gJ3VuZGVmaW5lZCcgPyBBcnJheSA6IEZsb2F0NjRBcnJheTtcblxuZXhwb3J0IGRlZmF1bHQgdmVuZG9yO1xuIiwiaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlZlY3RvcjNcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IHpcbiAqL1xudmFyIFZlY3RvcjMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG5cbiAgICB4ID0geCB8fCAwO1xuICAgIHkgPSB5IHx8IDA7XG4gICAgeiA9IHogfHwgMDtcblxuICAgIC8qKlxuICAgICAqIFN0b3JhZ2Ugb2YgVmVjdG9yMywgcmVhZCBhbmQgd3JpdGUgb2YgeCwgeSwgeiB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIGluIGFycmF5XG4gICAgICogQWxsIG1ldGhvZHMgYWxzbyBvcGVyYXRlIG9uIHRoZSBhcnJheSBpbnN0ZWFkIG9mIHgsIHksIHogY29tcG9uZW50c1xuICAgICAqIEBuYW1lIGFycmF5XG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjMjXG4gICAgICovXG4gICAgdGhpcy5hcnJheSA9IHZlYzMuZnJvbVZhbHVlcyh4LCB5LCB6KTtcblxuICAgIC8qKlxuICAgICAqIERpcnR5IGZsYWcgaXMgdXNlZCBieSB0aGUgTm9kZSB0byBkZXRlcm1pbmVcbiAgICAgKiBpZiB0aGUgbWF0cml4IGlzIHVwZGF0ZWQgdG8gbGF0ZXN0XG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3IzI1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cblZlY3RvcjMucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBWZWN0b3IzLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGIgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAoYikge1xuICAgICAgICB2ZWMzLmFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHgsIHkgYW5kIHogY29tcG9uZW50c1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB5XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgelxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gKHgsIHksIHopIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IHg7XG4gICAgICAgIHRoaXMuYXJyYXlbMV0gPSB5O1xuICAgICAgICB0aGlzLmFycmF5WzJdID0gejtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHgsIHkgYW5kIHogY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICB0aGlzLmFycmF5WzBdID0gYXJyWzBdO1xuICAgICAgICB0aGlzLmFycmF5WzFdID0gYXJyWzFdO1xuICAgICAgICB0aGlzLmFycmF5WzJdID0gYXJyWzJdO1xuXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IFZlY3RvcjNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAoYikge1xuICAgICAgICB2ZWMzLmNvcHkodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyb3NzIHByb2R1Y3Qgb2Ygc2VsZiBhbmQgYiwgd3JpdHRlbiB0byBhIFZlY3RvcjMgb3V0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGNyb3NzOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICB2ZWMzLmNyb3NzKHRoaXMuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGlzdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gdmVjMy5kaXN0KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXN0YW5jZSBiZXR3ZWVuIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0YW5jZTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZGlzdGFuY2UodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBkaXZpZGVcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGRpdjogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5kaXYodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSBzZWxmIGJ5IGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGRpdmlkZTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5kaXZpZGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERvdCBwcm9kdWN0IG9mIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkb3Q6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmRvdCh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2YgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5sZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5sZW5ndGgodGhpcy5hcnJheSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGxlcnA6IGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIHZlYzMubGVycCh0aGlzLmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBtaW46IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHZlYzMubWluKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIG1heDogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5tYXgodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdWx0aXBseVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgbXVsOiBmdW5jdGlvbiAoYikge1xuICAgICAgICB2ZWMzLm11bCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0aXBseSBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBtdWx0aXBseTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5tdWx0aXBseSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTmVnYXRlIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBuZWdhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmVjMy5uZWdhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSBzZWxmXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZlYzMubm9ybWFsaXplKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSByYW5kb20geCwgeSwgeiBjb21wb25lbnRzIHdpdGggYSBnaXZlbiBzY2FsZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICByYW5kb206IGZ1bmN0aW9uIChzY2FsZSkge1xuICAgICAgICB2ZWMzLnJhbmRvbSh0aGlzLmFycmF5LCBzY2FsZSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHNlbGZcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbiAocykge1xuICAgICAgICB2ZWMzLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHMpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTY2FsZSBiIGFuZCBhZGQgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzY2FsZUFuZEFkZDogZnVuY3Rpb24gKGIsIHMpIHtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5LCBzKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHNxdWFyZWREaXN0YW5jZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckRpc3Q6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLnNxckRpc3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZERpc3RhbmNlOiBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gdmVjMy5zcXVhcmVkRGlzdGFuY2UodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzcXVhcmVkTGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5zcXJMZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgbGVuZ3RoIG9mIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZExlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5zcXVhcmVkTGVuZ3RoKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Igc3VidHJhY3RcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHN1YjogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5zdWIodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IGIgZnJvbSBzZWxmXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5zdWJ0cmFjdCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIE1hdHJpeDMgbVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MzogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQzKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIG0uYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gc2VsZiB3aXRoIGEgTWF0cml4NCBtXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1NYXQ0OiBmdW5jdGlvbiAobSkge1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgbS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gc2VsZiB3aXRoIGEgUXVhdGVybmlvbiBxXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1RdWF0OiBmdW5jdGlvbiAocSkge1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybVF1YXQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYXNuZm9ybSBzZWxmIGludG8gcHJvamVjdGlvbiBzcGFjZSB3aXRoIG1cbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLmFycmF5O1xuICAgICAgICBtID0gbS5hcnJheTtcblxuICAgICAgICAvLyBQZXJzcGVjdGl2ZSBwcm9qZWN0aW9uXG4gICAgICAgIGlmIChtWzE1XSA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHcgPSAtMSAvIHZbMl07XG4gICAgICAgICAgICB2WzBdID0gbVswXSAqIHZbMF0gKiB3O1xuICAgICAgICAgICAgdlsxXSA9IG1bNV0gKiB2WzFdICogdztcbiAgICAgICAgICAgIHZbMl0gPSAobVsxMF0gKiB2WzJdICsgbVsxNF0pICogdztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZbMF0gPSBtWzBdICogdlswXSArIG1bMTJdO1xuICAgICAgICAgICAgdlsxXSA9IG1bNV0gKiB2WzFdICsgbVsxM107XG4gICAgICAgICAgICB2WzJdID0gbVsxMF0gKiB2WzJdICsgbVsxNF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBldWxlckZyb21RdWF0OiBmdW5jdGlvbihxLCBvcmRlcikge1xuICAgICAgICBWZWN0b3IzLmV1bGVyRnJvbVF1YXQodGhpcywgcSwgb3JkZXIpO1xuICAgIH0sXG5cbiAgICBldWxlckZyb21NYXQzOiBmdW5jdGlvbiAobSwgb3JkZXIpIHtcbiAgICAgICAgVmVjdG9yMy5ldWxlckZyb21NYXQzKHRoaXMsIG0sIG9yZGVyKTtcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ1snICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbCh0aGlzLmFycmF5LCAnLCcpICsgJ10nO1xuICAgIH0sXG5cbiAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KTtcbiAgICB9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBHZXR0ZXIgYW5kIFNldHRlclxuaWYgKGRlZmluZVByb3BlcnR5KSB7XG5cbiAgICB2YXIgcHJvdG8gPSBWZWN0b3IzLnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBAbmFtZSB4XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3gnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbMF07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzBdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguVmVjdG9yM1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgelxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3IzXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd6Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzJdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVsyXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cblxuLy8gU3VwcGx5IG1ldGhvZHMgdGhhdCBhcmUgbm90IGluIHBsYWNlXG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLmFkZChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge251bWJlcn0gIHhcbiAqIEBwYXJhbSAge251bWJlcn0gIHlcbiAqIEBwYXJhbSAge251bWJlcn0gIHpcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSwgeikge1xuICAgIHZlYzMuc2V0KG91dC5hcnJheSwgeCwgeSwgeik7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5jb3B5ID0gZnVuY3Rpb24ob3V0LCBiKSB7XG4gICAgdmVjMy5jb3B5KG91dC5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzMuY3Jvc3Mob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5kaXN0ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWMzLmRpc3RhbmNlKGEuYXJyYXksIGIuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IzLmRpc3RhbmNlID0gVmVjdG9yMy5kaXN0O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuZGl2ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMy5kaXZpZGUob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuZGl2aWRlID0gVmVjdG9yMy5kaXY7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjMuZG90ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWMzLmRvdChhLmFycmF5LCBiLmFycmF5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5sZW4gPSBmdW5jdGlvbihiKSB7XG4gICAgcmV0dXJuIHZlYzMubGVuZ3RoKGIuYXJyYXkpO1xufTtcblxuLy8gVmVjdG9yMy5sZW5ndGggPSBWZWN0b3IzLmxlbjtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAqIEBwYXJhbSAge251bWJlcn0gIHRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLmxlcnAgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHQpIHtcbiAgICB2ZWMzLmxlcnAob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLm1pbihvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMy5tYXgob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5tdWwgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLm11bHRpcGx5KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5tdWx0aXBseSA9IFZlY3RvcjMubXVsO1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmVjMy5uZWdhdGUob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZlYzMubm9ybWFsaXplKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5yYW5kb20gPSBmdW5jdGlvbihvdXQsIHNjYWxlKSB7XG4gICAgdmVjMy5yYW5kb20ob3V0LmFycmF5LCBzY2FsZSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHNjYWxlKSB7XG4gICAgdmVjMy5zY2FsZShvdXQuYXJyYXksIGEuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjMuc3FyRGlzdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gdmVjMy5zcXJEaXN0KGEuYXJyYXksIGIuYXJyYXkpO1xufTtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5zcXVhcmVkRGlzdGFuY2UgPSBWZWN0b3IzLnNxckRpc3Q7XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjMuc3FyTGVuID0gZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiB2ZWMzLnNxckxlbihhLmFycmF5KTtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5zcXVhcmVkTGVuZ3RoID0gVmVjdG9yMy5zcXJMZW47XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5zdWIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLnN1YnRyYWN0KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5zdWJ0cmFjdCA9IFZlY3RvcjMuc3ViO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtNYXRyaXgzfSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMy50cmFuc2Zvcm1NYXQzKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMy50cmFuc2Zvcm1NYXQ0KG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gcVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZlYzMudHJhbnNmb3JtUXVhdChvdXQuYXJyYXksIGEuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5mdW5jdGlvbiBjbGFtcCh2YWwsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIHZhbCA8IG1pbiA/IG1pbiA6ICh2YWwgPiBtYXggPyBtYXggOiB2YWwpO1xufVxudmFyIGF0YW4yID0gTWF0aC5hdGFuMjtcbnZhciBhc2luID0gTWF0aC5hc2luO1xudmFyIGFicyA9IE1hdGguYWJzO1xuLyoqXG4gKiBDb252ZXJ0IHF1YXRlcm5pb24gdG8gZXVsZXIgYW5nbGVcbiAqIFF1YXRlcm5pb24gbXVzdCBiZSBub3JtYWxpemVkXG4gKiBGcm9tIHRocmVlLmpzXG4gKi9cblZlY3RvcjMuZXVsZXJGcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEsIG9yZGVyKSB7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcSA9IHEuYXJyYXk7XG5cbiAgICB2YXIgdGFyZ2V0ID0gb3V0LmFycmF5O1xuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXTtcbiAgICB2YXIgeDIgPSB4ICogeDtcbiAgICB2YXIgeTIgPSB5ICogeTtcbiAgICB2YXIgejIgPSB6ICogejtcbiAgICB2YXIgdzIgPSB3ICogdztcblxuICAgIHZhciBvcmRlciA9IChvcmRlciB8fCAnWFlaJykudG9VcHBlckNhc2UoKTtcblxuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgICAgY2FzZSAnWFlaJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKDIgKiAoeCAqIHcgLSB5ICogeiksICh3MiAtIHgyIC0geTIgKyB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbihjbGFtcCgyICogKHggKiB6ICsgeSAqIHcpLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKDIgKiAoeiAqIHcgLSB4ICogeSksICh3MiArIHgyIC0geTIgLSB6MikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1lYWic6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBhc2luKGNsYW1wKDIgKiAoeCAqIHcgLSB5ICogeiksIC0gMSwgMSkpO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIoMiAqICh4ICogeiArIHkgKiB3KSwgKHcyIC0geDIgLSB5MiArIHoyKSk7XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBhdGFuMigyICogKHggKiB5ICsgeiAqIHcpLCAodzIgLSB4MiArIHkyIC0gejIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdaWFknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXNpbihjbGFtcCgyICogKHggKiB3ICsgeSAqIHopLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGF0YW4yKDIgKiAoeSAqIHcgLSB6ICogeCksICh3MiAtIHgyIC0geTIgKyB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYXRhbjIoMiAqICh6ICogdyAtIHggKiB5KSwgKHcyIC0geDIgKyB5MiAtIHoyKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWllYJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKDIgKiAoeCAqIHcgKyB6ICogeSksICh3MiAtIHgyIC0geTIgKyB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbihjbGFtcCgyICogKHkgKiB3IC0geCAqIHopLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKDIgKiAoeCAqIHkgKyB6ICogdyksICh3MiArIHgyIC0geTIgLSB6MikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1laWCc6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBhdGFuMigyICogKHggKiB3IC0geiAqIHkpLCAodzIgLSB4MiArIHkyIC0gejIpKTtcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGF0YW4yKDIgKiAoeSAqIHcgLSB4ICogeiksICh3MiArIHgyIC0geTIgLSB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYXNpbihjbGFtcCgyICogKHggKiB5ICsgeiAqIHcpLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdYWlknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIoMiAqICh4ICogdyArIHkgKiB6KSwgKHcyIC0geDIgKyB5MiAtIHoyKSk7XG4gICAgICAgICAgICB0YXJnZXRbMV0gPSBhdGFuMigyICogKHggKiB6ICsgeSAqIHcpLCAodzIgKyB4MiAtIHkyIC0gejIpKTtcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGFzaW4oY2xhbXAoMiAqICh6ICogdyAtIHggKiB5KSwgLSAxLCAxKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5rb3duIG9yZGVyOiAnICsgb3JkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHJvdGF0aW9uIG1hdHJpeCB0byBldWxlciBhbmdsZVxuICogZnJvbSB0aHJlZS5qc1xuICovXG5WZWN0b3IzLmV1bGVyRnJvbU1hdDMgPSBmdW5jdGlvbiAob3V0LCBtLCBvcmRlcikge1xuICAgIC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG4gICAgdmFyIHRlID0gbS5hcnJheTtcbiAgICB2YXIgbTExID0gdGVbMF0sIG0xMiA9IHRlWzNdLCBtMTMgPSB0ZVs2XTtcbiAgICB2YXIgbTIxID0gdGVbMV0sIG0yMiA9IHRlWzRdLCBtMjMgPSB0ZVs3XTtcbiAgICB2YXIgbTMxID0gdGVbMl0sIG0zMiA9IHRlWzVdLCBtMzMgPSB0ZVs4XTtcbiAgICB2YXIgdGFyZ2V0ID0gb3V0LmFycmF5O1xuXG4gICAgdmFyIG9yZGVyID0gKG9yZGVyIHx8ICdYWVonKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgICAgICBjYXNlICdYWVonOlxuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbihjbGFtcChtMTMsIC0xLCAxKSk7XG4gICAgICAgICAgICBpZiAoYWJzKG0xMykgPCAwLjk5OTk5KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIoLW0yMywgbTMzKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMl0gPSBhdGFuMigtbTEyLCBtMTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIobTMyLCBtMjIpO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVhaJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IGFzaW4oLWNsYW1wKG0yMywgLTEsIDEpKTtcbiAgICAgICAgICAgIGlmIChhYnMobTIzKSA8IDAuOTk5OTkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMV0gPSBhdGFuMihtMTMsIG0zMyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzJdID0gYXRhbjIobTIxLCBtMjIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIoLW0zMSwgbTExKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1pYWSc6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBhc2luKGNsYW1wKG0zMiwgLTEsIDEpKTtcbiAgICAgICAgICAgIGlmIChhYnMobTMyKSA8IDAuOTk5OTkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMV0gPSBhdGFuMigtbTMxLCBtMzMpO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKC1tMTIsIG0yMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMV0gPSAwO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKG0yMSwgbTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdaWVgnOlxuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbigtY2xhbXAobTMxLCAtMSwgMSkpO1xuICAgICAgICAgICAgaWYgKGFicyhtMzEpIDwgMC45OTk5OSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKG0zMiwgbTMzKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMl0gPSBhdGFuMihtMjEsIG0xMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMF0gPSAwO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKC1tMTIsIG0yMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVpYJzpcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGFzaW4oY2xhbXAobTIxLCAtMSwgMSkpO1xuICAgICAgICAgICAgaWYgKGFicyhtMjEpIDwgMC45OTk5OSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKC1tMjMsIG0yMik7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIoLW0zMSwgbTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IDA7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIobTEzLCBtMzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1haWSc6XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBhc2luKC1jbGFtcChtMTIsIC0xLCAxKSk7XG4gICAgICAgICAgICBpZiAoYWJzKG0xMikgPCAwLjk5OTk5KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIobTMyLCBtMjIpO1xuICAgICAgICAgICAgICAgIHRhcmdldFsxXSA9IGF0YW4yKG0xMywgbTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKC1tMjMsIG0zMyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtvd24gb3JkZXI6ICcgKyBvcmRlcik7XG4gICAgfVxuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8vIFRPRE8gcmV0dXJuIG5ldy5cbi8qKlxuICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLlBPU0lUSVZFX1ggPSBuZXcgVmVjdG9yMygxLCAwLCAwKTtcbi8qKlxuICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLk5FR0FUSVZFX1ggPSBuZXcgVmVjdG9yMygtMSwgMCwgMCk7XG4vKipcbiAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5QT1NJVElWRV9ZID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG4vKipcbiAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5ORUdBVElWRV9ZID0gbmV3IFZlY3RvcjMoMCwgLTEsIDApO1xuLyoqXG4gKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuUE9TSVRJVkVfWiA9IG5ldyBWZWN0b3IzKDAsIDAsIDEpO1xuLyoqXG4gKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuTkVHQVRJVkVfWiA9IG5ldyBWZWN0b3IzKDAsIDAsIC0xKTtcbi8qKlxuICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLlVQID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG4vKipcbiAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5aRVJPID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvcjM7XG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbnZhciB2ZWMzQ29weSA9IHZlYzMuY29weTtcbnZhciB2ZWMzU2V0ID0gdmVjMy5zZXQ7XG5cbi8qKlxuICogQXhpcyBhbGlnbmVkIGJvdW5kaW5nIGJveFxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLkJvdW5kaW5nQm94XG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbbWluXVxuICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gW21heF1cbiAqL1xudmFyIEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIGNvb3JkcyBvZiBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy5taW4gPSBtaW4gfHwgbmV3IFZlY3RvcjMoSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eSk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIGNvb3JkcyBvZiBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy5tYXggPSBtYXggfHwgbmV3IFZlY3RvcjMoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSk7XG59O1xuXG5Cb3VuZGluZ0JveC5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogQm91bmRpbmdCb3gsXG4gICAgLyoqXG4gICAgICogVXBkYXRlIG1pbiBhbmQgbWF4IGNvb3JkcyBmcm9tIGEgdmVydGljZXMgYXJyYXlcbiAgICAgKiBAcGFyYW0gIHthcnJheX0gdmVydGljZXNcbiAgICAgKi9cbiAgICB1cGRhdGVGcm9tVmVydGljZXM6IGZ1bmN0aW9uICh2ZXJ0aWNlcykge1xuICAgICAgICBpZiAodmVydGljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMubWluO1xuICAgICAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICAgICAgdmFyIG1pbkFyciA9IG1pbi5hcnJheTtcbiAgICAgICAgICAgIHZhciBtYXhBcnIgPSBtYXguYXJyYXk7XG4gICAgICAgICAgICB2ZWMzQ29weShtaW5BcnIsIHZlcnRpY2VzWzBdKTtcbiAgICAgICAgICAgIHZlYzNDb3B5KG1heEFyciwgdmVydGljZXNbMF0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhbMF0gPCBtaW5BcnJbMF0pIHsgbWluQXJyWzBdID0gdmVydGV4WzBdOyB9XG4gICAgICAgICAgICAgICAgaWYgKHZlcnRleFsxXSA8IG1pbkFyclsxXSkgeyBtaW5BcnJbMV0gPSB2ZXJ0ZXhbMV07IH1cbiAgICAgICAgICAgICAgICBpZiAodmVydGV4WzJdIDwgbWluQXJyWzJdKSB7IG1pbkFyclsyXSA9IHZlcnRleFsyXTsgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHZlcnRleFswXSA+IG1heEFyclswXSkgeyBtYXhBcnJbMF0gPSB2ZXJ0ZXhbMF07IH1cbiAgICAgICAgICAgICAgICBpZiAodmVydGV4WzFdID4gbWF4QXJyWzFdKSB7IG1heEFyclsxXSA9IHZlcnRleFsxXTsgfVxuICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhbMl0gPiBtYXhBcnJbMl0pIHsgbWF4QXJyWzJdID0gdmVydGV4WzJdOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1heC5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVuaW9uIG9wZXJhdGlvbiB3aXRoIGFub3RoZXIgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fSBiYm94XG4gICAgICovXG4gICAgdW5pb246IGZ1bmN0aW9uIChiYm94KSB7XG4gICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICB2ZWMzLm1pbihtaW4uYXJyYXksIG1pbi5hcnJheSwgYmJveC5taW4uYXJyYXkpO1xuICAgICAgICB2ZWMzLm1heChtYXguYXJyYXksIG1heC5hcnJheSwgYmJveC5tYXguYXJyYXkpO1xuICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcnNlY3Rpb24gb3BlcmF0aW9uIHdpdGggYW5vdGhlciBib3VuZGluZyBib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9IGJib3hcbiAgICAgKi9cbiAgICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIChiYm94KSB7XG4gICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICB2ZWMzLm1heChtaW4uYXJyYXksIG1pbi5hcnJheSwgYmJveC5taW4uYXJyYXkpO1xuICAgICAgICB2ZWMzLm1pbihtYXguYXJyYXksIG1heC5hcnJheSwgYmJveC5tYXguYXJyYXkpO1xuICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBpbnRlcnNlY3Qgd2l0aCBhbm90aGVyIGJvdW5kaW5nIGJveFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5Cb3VuZGluZ0JveH0gYmJveFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW50ZXJzZWN0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uIChiYm94KSB7XG4gICAgICAgIHZhciBfbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBfbWF4ID0gdGhpcy5tYXguYXJyYXk7XG5cbiAgICAgICAgdmFyIF9taW4yID0gYmJveC5taW4uYXJyYXk7XG4gICAgICAgIHZhciBfbWF4MiA9IGJib3gubWF4LmFycmF5O1xuXG4gICAgICAgIHJldHVybiAhIChfbWluWzBdID4gX21heDJbMF0gfHwgX21pblsxXSA+IF9tYXgyWzFdIHx8IF9taW5bMl0gPiBfbWF4MlsyXVxuICAgICAgICAgICAgfHwgX21heFswXSA8IF9taW4yWzBdIHx8IF9tYXhbMV0gPCBfbWluMlsxXSB8fCBfbWF4WzJdIDwgX21pbjJbMl0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBjb250YWluIGFub3RoZXIgYm91bmRpbmcgYm94IGVudGlyZWx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fSBiYm94XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb250YWluQm91bmRpbmdCb3g6IGZ1bmN0aW9uIChiYm94KSB7XG5cbiAgICAgICAgdmFyIF9taW4gPSB0aGlzLm1pbi5hcnJheTtcbiAgICAgICAgdmFyIF9tYXggPSB0aGlzLm1heC5hcnJheTtcblxuICAgICAgICB2YXIgX21pbjIgPSBiYm94Lm1pbi5hcnJheTtcbiAgICAgICAgdmFyIF9tYXgyID0gYmJveC5tYXguYXJyYXk7XG5cbiAgICAgICAgcmV0dXJuIF9taW5bMF0gPD0gX21pbjJbMF0gJiYgX21pblsxXSA8PSBfbWluMlsxXSAmJiBfbWluWzJdIDw9IF9taW4yWzJdXG4gICAgICAgICAgICAmJiBfbWF4WzBdID49IF9tYXgyWzBdICYmIF9tYXhbMV0gPj0gX21heDJbMV0gJiYgX21heFsyXSA+PSBfbWF4MlsyXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgY29udGFpbiBwb2ludCBlbnRpcmVseVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBwb2ludFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgY29udGFpblBvaW50OiBmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgX21pbiA9IHRoaXMubWluLmFycmF5O1xuICAgICAgICB2YXIgX21heCA9IHRoaXMubWF4LmFycmF5O1xuXG4gICAgICAgIHZhciBfcCA9IHAuYXJyYXk7XG5cbiAgICAgICAgcmV0dXJuIF9taW5bMF0gPD0gX3BbMF0gJiYgX21pblsxXSA8PSBfcFsxXSAmJiBfbWluWzJdIDw9IF9wWzJdXG4gICAgICAgICAgICAmJiBfbWF4WzBdID49IF9wWzBdICYmIF9tYXhbMV0gPj0gX3BbMV0gJiYgX21heFsyXSA+PSBfcFsyXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgYm91bmRpbmcgYm94IGlzIGZpbml0ZVxuICAgICAqL1xuICAgIGlzRmluaXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBfbWF4ID0gdGhpcy5tYXguYXJyYXk7XG4gICAgICAgIHJldHVybiBpc0Zpbml0ZShfbWluWzBdKSAmJiBpc0Zpbml0ZShfbWluWzFdKSAmJiBpc0Zpbml0ZShfbWluWzJdKVxuICAgICAgICAgICAgJiYgaXNGaW5pdGUoX21heFswXSkgJiYgaXNGaW5pdGUoX21heFsxXSkgJiYgaXNGaW5pdGUoX21heFsyXSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGFuIGFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHRvIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbWF0cml4XG4gICAgICovXG4gICAgYXBwbHlUcmFuc2Zvcm06IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGh0dHA6Ly9kZXYudGhlb21hZGVyLmNvbS90cmFuc2Zvcm0tYm91bmRpbmctYm94ZXMvXG4gICAgICAgIHZhciB4YSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB4YiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB5YSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB5YiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB6YSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB6YiA9IHZlYzMuY3JlYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtYXRyaXgpIHtcbiAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbi5hcnJheTtcbiAgICAgICAgICAgIHZhciBtYXggPSB0aGlzLm1heC5hcnJheTtcblxuICAgICAgICAgICAgdmFyIG0gPSBtYXRyaXguYXJyYXk7XG5cbiAgICAgICAgICAgIHhhWzBdID0gbVswXSAqIG1pblswXTsgeGFbMV0gPSBtWzFdICogbWluWzBdOyB4YVsyXSA9IG1bMl0gKiBtaW5bMF07XG4gICAgICAgICAgICB4YlswXSA9IG1bMF0gKiBtYXhbMF07IHhiWzFdID0gbVsxXSAqIG1heFswXTsgeGJbMl0gPSBtWzJdICogbWF4WzBdO1xuXG4gICAgICAgICAgICB5YVswXSA9IG1bNF0gKiBtaW5bMV07IHlhWzFdID0gbVs1XSAqIG1pblsxXTsgeWFbMl0gPSBtWzZdICogbWluWzFdO1xuICAgICAgICAgICAgeWJbMF0gPSBtWzRdICogbWF4WzFdOyB5YlsxXSA9IG1bNV0gKiBtYXhbMV07IHliWzJdID0gbVs2XSAqIG1heFsxXTtcblxuICAgICAgICAgICAgemFbMF0gPSBtWzhdICogbWluWzJdOyB6YVsxXSA9IG1bOV0gKiBtaW5bMl07IHphWzJdID0gbVsxMF0gKiBtaW5bMl07XG4gICAgICAgICAgICB6YlswXSA9IG1bOF0gKiBtYXhbMl07IHpiWzFdID0gbVs5XSAqIG1heFsyXTsgemJbMl0gPSBtWzEwXSAqIG1heFsyXTtcblxuICAgICAgICAgICAgbWluWzBdID0gTWF0aC5taW4oeGFbMF0sIHhiWzBdKSArIE1hdGgubWluKHlhWzBdLCB5YlswXSkgKyBNYXRoLm1pbih6YVswXSwgemJbMF0pICsgbVsxMl07XG4gICAgICAgICAgICBtaW5bMV0gPSBNYXRoLm1pbih4YVsxXSwgeGJbMV0pICsgTWF0aC5taW4oeWFbMV0sIHliWzFdKSArIE1hdGgubWluKHphWzFdLCB6YlsxXSkgKyBtWzEzXTtcbiAgICAgICAgICAgIG1pblsyXSA9IE1hdGgubWluKHhhWzJdLCB4YlsyXSkgKyBNYXRoLm1pbih5YVsyXSwgeWJbMl0pICsgTWF0aC5taW4oemFbMl0sIHpiWzJdKSArIG1bMTRdO1xuXG4gICAgICAgICAgICBtYXhbMF0gPSBNYXRoLm1heCh4YVswXSwgeGJbMF0pICsgTWF0aC5tYXgoeWFbMF0sIHliWzBdKSArIE1hdGgubWF4KHphWzBdLCB6YlswXSkgKyBtWzEyXTtcbiAgICAgICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHhhWzFdLCB4YlsxXSkgKyBNYXRoLm1heCh5YVsxXSwgeWJbMV0pICsgTWF0aC5tYXgoemFbMV0sIHpiWzFdKSArIG1bMTNdO1xuICAgICAgICAgICAgbWF4WzJdID0gTWF0aC5tYXgoeGFbMl0sIHhiWzJdKSArIE1hdGgubWF4KHlhWzJdLCB5YlsyXSkgKyBNYXRoLm1heCh6YVsyXSwgemJbMl0pICsgbVsxNF07XG5cbiAgICAgICAgICAgIHRoaXMubWluLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1heC5fZGlydHkgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBwcm9qZWN0aW9uIG1hdHJpeCB0byB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG1hdHJpeFxuICAgICAqL1xuICAgIGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKG1hdHJpeCkge1xuICAgICAgICB2YXIgbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heC5hcnJheTtcblxuICAgICAgICB2YXIgbSA9IG1hdHJpeC5hcnJheTtcbiAgICAgICAgLy8gbWluIGluIG1pbiB6XG4gICAgICAgIHZhciB2MTAgPSBtaW5bMF07XG4gICAgICAgIHZhciB2MTEgPSBtaW5bMV07XG4gICAgICAgIHZhciB2MTIgPSBtaW5bMl07XG4gICAgICAgIC8vIG1heCBpbiBtaW4gelxuICAgICAgICB2YXIgdjIwID0gbWF4WzBdO1xuICAgICAgICB2YXIgdjIxID0gbWF4WzFdO1xuICAgICAgICB2YXIgdjIyID0gbWluWzJdO1xuICAgICAgICAvLyBtYXggaW4gbWF4IHpcbiAgICAgICAgdmFyIHYzMCA9IG1heFswXTtcbiAgICAgICAgdmFyIHYzMSA9IG1heFsxXTtcbiAgICAgICAgdmFyIHYzMiA9IG1heFsyXTtcblxuICAgICAgICBpZiAobVsxNV0gPT09IDEpIHsgIC8vIE9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uXG4gICAgICAgICAgICBtaW5bMF0gPSBtWzBdICogdjEwICsgbVsxMl07XG4gICAgICAgICAgICBtaW5bMV0gPSBtWzVdICogdjExICsgbVsxM107XG4gICAgICAgICAgICBtYXhbMl0gPSBtWzEwXSAqIHYxMiArIG1bMTRdO1xuXG4gICAgICAgICAgICBtYXhbMF0gPSBtWzBdICogdjMwICsgbVsxMl07XG4gICAgICAgICAgICBtYXhbMV0gPSBtWzVdICogdjMxICsgbVsxM107XG4gICAgICAgICAgICBtaW5bMl0gPSBtWzEwXSAqIHYzMiArIG1bMTRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHcgPSAtMSAvIHYxMjtcbiAgICAgICAgICAgIG1pblswXSA9IG1bMF0gKiB2MTAgKiB3O1xuICAgICAgICAgICAgbWluWzFdID0gbVs1XSAqIHYxMSAqIHc7XG4gICAgICAgICAgICBtYXhbMl0gPSAobVsxMF0gKiB2MTIgKyBtWzE0XSkgKiB3O1xuXG4gICAgICAgICAgICB3ID0gLTEgLyB2MjI7XG4gICAgICAgICAgICBtYXhbMF0gPSBtWzBdICogdjIwICogdztcbiAgICAgICAgICAgIG1heFsxXSA9IG1bNV0gKiB2MjEgKiB3O1xuXG4gICAgICAgICAgICB3ID0gLTEgLyB2MzI7XG4gICAgICAgICAgICBtaW5bMl0gPSAobVsxMF0gKiB2MzIgKyBtWzE0XSkgKiB3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMubWF4Ll9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHVwZGF0ZVZlcnRpY2VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG4gICAgICAgIGlmICghdmVydGljZXMpIHtcbiAgICAgICAgICAgIC8vIEN1YmUgdmVydGljZXNcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHZlYzMuZnJvbVZhbHVlcygwLCAwLCAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBFaWdodCBjb29yZHMgb2YgYm91bmRpbmcgYm94XG4gICAgICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMudmVydGljZXMgPSB2ZXJ0aWNlcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heC5hcnJheTtcbiAgICAgICAgLy8tLS0gbWluIHpcbiAgICAgICAgLy8gbWluIHhcbiAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1swXSwgbWluWzBdLCBtaW5bMV0sIG1pblsyXSk7XG4gICAgICAgIHZlYzNTZXQodmVydGljZXNbMV0sIG1pblswXSwgbWF4WzFdLCBtaW5bMl0pO1xuICAgICAgICAvLyBtYXggeFxuICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzJdLCBtYXhbMF0sIG1pblsxXSwgbWluWzJdKTtcbiAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1szXSwgbWF4WzBdLCBtYXhbMV0sIG1pblsyXSk7XG5cbiAgICAgICAgLy8tLSBtYXggelxuICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzRdLCBtaW5bMF0sIG1pblsxXSwgbWF4WzJdKTtcbiAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1s1XSwgbWluWzBdLCBtYXhbMV0sIG1heFsyXSk7XG4gICAgICAgIHZlYzNTZXQodmVydGljZXNbNl0sIG1heFswXSwgbWluWzFdLCBtYXhbMl0pO1xuICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzddLCBtYXhbMF0sIG1heFsxXSwgbWF4WzJdKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENvcHkgdmFsdWVzIGZyb20gYW5vdGhlciBib3VuZGluZyBib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9IGJib3hcbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAoYmJveCkge1xuICAgICAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgdmVjM0NvcHkobWluLmFycmF5LCBiYm94Lm1pbi5hcnJheSk7XG4gICAgICAgIHZlYzNDb3B5KG1heC5hcnJheSwgYmJveC5tYXguYXJyYXkpO1xuICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBib3VuZGluZyBib3hcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIGJvdW5kaW5nQm94LmNvcHkodGhpcyk7XG4gICAgICAgIHJldHVybiBib3VuZGluZ0JveDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCb3VuZGluZ0JveDtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi9WZWN0b3IzJztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbnZhciBtYXQzID0gZ2xNYXRyaXgubWF0MztcbnZhciBxdWF0ID0gZ2xNYXRyaXgucXVhdDtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5Lm1hdGguTWF0cml4NFxuICovXG52YXIgTWF0cml4NCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdGhpcy5fYXhpc1ggPSBuZXcgVmVjdG9yMygpO1xuICAgIHRoaXMuX2F4aXNZID0gbmV3IFZlY3RvcjMoKTtcbiAgICB0aGlzLl9heGlzWiA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIE1hdHJpeDRcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXg0I1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBtYXQ0LmNyZWF0ZSgpO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXg0I1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cbk1hdHJpeDQucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IE1hdHJpeDQsXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbaV0gPSBhcnJbaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgYWRqdWdhdGUgb2Ygc2VsZiwgaW4tcGxhY2VcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBhZGpvaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWF0NC5hZGpvaW50KHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBNYXRyaXg0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKG5ldyBNYXRyaXg0KCkpLmNvcHkodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbihhKSB7XG4gICAgICAgIG1hdDQuY29weSh0aGlzLmFycmF5LCBhLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG1hdHJpeCBkZXRlcm1pbmFudFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkZXRlcm1pbmFudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtYXQ0LmRldGVybWluYW50KHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXBwZXIgM3gzIHBhcnQgZnJvbSBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBmcm9tUXVhdDogZnVuY3Rpb24ocSkge1xuICAgICAgICBtYXQ0LmZyb21RdWF0KHRoaXMuYXJyYXksIHEuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gdlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uOiBmdW5jdGlvbihxLCB2KSB7XG4gICAgICAgIG1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24odGhpcy5hcnJheSwgcS5hcnJheSwgdi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBmcm9tIE1hdHJpeDJkLCBpdCBpcyB1c2VkIHdoZW4gY29udmVydGluZyBhIDJkIHNoYXBlIHRvIDNkIHNwYWNlLlxuICAgICAqIEluIDNkIHNwYWNlIGl0IGlzIGVxdWl2YWxlbnQgdG8gcmFuc2xhdGUgb24geHkgcGxhbmUgYW5kIHJvdGF0ZSBhYm91dCB6IGF4aXNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IG0yZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGZyb21NYXQyZDogZnVuY3Rpb24obTJkKSB7XG4gICAgICAgIE1hdHJpeDQuZnJvbU1hdDJkKHRoaXMsIG0yZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZnJvbSBmcnVzdHVtIGJvdW5kc1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gbGVmdFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gcmlnaHRcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGJvdHRvbVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gdG9wXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBuZWFyXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBmYXJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBmcnVzdHVtOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICAgICAgbWF0NC5mcnVzdHVtKHRoaXMuYXJyYXksIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgaWRlbnRpdHkgbWF0cml4XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgaWRlbnRpdHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnZlcnQgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGludmVydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDQuaW52ZXJ0KHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgYXMgYSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gZXllXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGNlbnRlclxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSB1cFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGxvb2tBdDogZnVuY3Rpb24oZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgICAgIG1hdDQubG9va0F0KHRoaXMuYXJyYXksIGV5ZS5hcnJheSwgY2VudGVyLmFycmF5LCB1cC5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdXRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0NC5tdWwodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdWx0aXBseUxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIG11bExlZnQ6IGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgbWF0NC5tdWwodGhpcy5hcnJheSwgYS5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIG11bHRpcGx5OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDQubXVsdGlwbHkodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IGEgYW5kIHNlbGYsIGEgaXMgb24gdGhlIGxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICAgICAqL1xuICAgIG11bHRpcGx5TGVmdDogZnVuY3Rpb24oYSkge1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgYXMgYSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGxlZnRcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHJpZ2h0XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBib3R0b21cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRvcFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gbmVhclxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZmFyXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgb3J0aG86IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gICAgICAgIG1hdDQub3J0aG8odGhpcy5hcnJheSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2V0IGFzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGZvdnlcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGFzcGVjdFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gbmVhclxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZmFyXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgcGVyc3BlY3RpdmU6IGZ1bmN0aW9uKGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUodGhpcy5hcnJheSwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSByYWQgYWJvdXQgYXhpcy5cbiAgICAgKiBFcXVhbCB0byByaWdodC1tdWx0aXBseSBhIHJvdGFpb24gbWF0cml4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgIHJhZFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBheGlzXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgcm90YXRlOiBmdW5jdGlvbihyYWQsIGF4aXMpIHtcbiAgICAgICAgbWF0NC5yb3RhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkLCBheGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHNlbGYgYnkgYSBnaXZlbiByYWRpYW4gYWJvdXQgWCBheGlzLlxuICAgICAqIEVxdWFsIHRvIHJpZ2h0LW11bHRpcGx5IGEgcm90YWlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgcm90YXRlWDogZnVuY3Rpb24ocmFkKSB7XG4gICAgICAgIG1hdDQucm90YXRlWCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCByYWQpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSBhIGdpdmVuIHJhZGlhbiBhYm91dCBZIGF4aXMuXG4gICAgICogRXF1YWwgdG8gcmlnaHQtbXVsdGlwbHkgYSByb3RhaW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICByb3RhdGVZOiBmdW5jdGlvbihyYWQpIHtcbiAgICAgICAgbWF0NC5yb3RhdGVZKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBzZWxmIGJ5IGEgZ2l2ZW4gcmFkaWFuIGFib3V0IFogYXhpcy5cbiAgICAgKiBFcXVhbCB0byByaWdodC1tdWx0aXBseSBhIHJvdGFpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIHJvdGF0ZVo6IGZ1bmN0aW9uKHJhZCkge1xuICAgICAgICBtYXQ0LnJvdGF0ZVoodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgc2VsZiBieSBzXG4gICAgICogRXF1YWwgdG8gcmlnaHQtbXVsdGlwbHkgYSBzY2FsZSBtYXRyaXhcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gIHNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHYuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgc2VsZiBieSB2LlxuICAgICAqIEVxdWFsIHRvIHJpZ2h0LW11bHRpcGx5IGEgdHJhbnNsYXRlIG1hdHJpeFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSAgdlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCB2LmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNwb3NlIHNlbGYsIGluLXBsYWNlLlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIHRyYW5zcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDQudHJhbnNwb3NlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZWNvbXBvc2UgYSBtYXRyaXggdG8gU1JUXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gW3NjYWxlXVxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHJvdGF0aW9uXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yfSBwb3NpdGlvblxuICAgICAqIEBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21pY3Jvc29mdC54bmEuZnJhbWV3b3JrLm1hdHJpeC5kZWNvbXBvc2UuYXNweFxuICAgICAqL1xuICAgIGRlY29tcG9zZU1hdHJpeDogKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciB4ID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgdmFyIHkgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgICB2YXIgeiA9IHZlYzMuY3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIG0zID0gbWF0My5jcmVhdGUoKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NhbGUsIHJvdGF0aW9uLCBwb3NpdGlvbikge1xuXG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdmVjMy5zZXQoeCwgZWxbMF0sIGVsWzFdLCBlbFsyXSk7XG4gICAgICAgICAgICB2ZWMzLnNldCh5LCBlbFs0XSwgZWxbNV0sIGVsWzZdKTtcbiAgICAgICAgICAgIHZlYzMuc2V0KHosIGVsWzhdLCBlbFs5XSwgZWxbMTBdKTtcblxuICAgICAgICAgICAgdmFyIHN4ID0gdmVjMy5sZW5ndGgoeCk7XG4gICAgICAgICAgICB2YXIgc3kgPSB2ZWMzLmxlbmd0aCh5KTtcbiAgICAgICAgICAgIHZhciBzeiA9IHZlYzMubGVuZ3RoKHopO1xuXG4gICAgICAgICAgICAvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZVxuICAgICAgICAgICAgdmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcbiAgICAgICAgICAgIGlmIChkZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgc3ggPSAtc3g7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY2FsZSkge1xuICAgICAgICAgICAgICAgIHNjYWxlLnNldChzeCwgc3ksIHN6KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zaXRpb24uc2V0KGVsWzEyXSwgZWxbMTNdLCBlbFsxNF0pO1xuXG4gICAgICAgICAgICBtYXQzLmZyb21NYXQ0KG0zLCBlbCk7XG4gICAgICAgICAgICAvLyBOb3QgbGlrZSBtYXQ0LCBtYXQzIGluIGdsbWF0cml4IHNlZW1zIHRvIGJlIHJvdy1iYXNlZFxuICAgICAgICAgICAgLy8gU2VlbXMgZml4ZWQgaW4gZ2wtbWF0cml4IDIuMi4yXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXgvaXNzdWVzLzExNFxuICAgICAgICAgICAgLy8gbWF0My50cmFuc3Bvc2UobTMsIG0zKTtcblxuICAgICAgICAgICAgbTNbMF0gLz0gc3g7XG4gICAgICAgICAgICBtM1sxXSAvPSBzeDtcbiAgICAgICAgICAgIG0zWzJdIC89IHN4O1xuXG4gICAgICAgICAgICBtM1szXSAvPSBzeTtcbiAgICAgICAgICAgIG0zWzRdIC89IHN5O1xuICAgICAgICAgICAgbTNbNV0gLz0gc3k7XG5cbiAgICAgICAgICAgIG0zWzZdIC89IHN6O1xuICAgICAgICAgICAgbTNbN10gLz0gc3o7XG4gICAgICAgICAgICBtM1s4XSAvPSBzejtcblxuICAgICAgICAgICAgcXVhdC5mcm9tTWF0Myhyb3RhdGlvbi5hcnJheSwgbTMpO1xuICAgICAgICAgICAgcXVhdC5ub3JtYWxpemUocm90YXRpb24uYXJyYXksIHJvdGF0aW9uLmFycmF5KTtcblxuICAgICAgICAgICAgcm90YXRpb24uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHBvc2l0aW9uLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwodGhpcy5hcnJheSwgJywnKSArICddJztcbiAgICB9LFxuXG4gICAgdG9BcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSk7XG4gICAgfVxufTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5pZiAoZGVmaW5lUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvdG8gPSBNYXRyaXg0LnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBaIEF4aXMgb2YgbG9jYWwgdHJhbnNmb3JtXG4gICAgICogQG5hbWUgelxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLk1hdHJpeDRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3onLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5hcnJheTtcbiAgICAgICAgICAgIHRoaXMuX2F4aXNaLnNldChlbFs4XSwgZWxbOV0sIGVsWzEwXSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXhpc1o7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gSGVyZSBoYXMgYSBwcm9ibGVtXG4gICAgICAgICAgICAvLyBJZiBvbmx5IHNldCBhbiBpdGVtIG9mIHZlY3RvciB3aWxsIG5vdCB3b3JrXG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdiA9IHYuYXJyYXk7XG4gICAgICAgICAgICBlbFs4XSA9IHZbMF07XG4gICAgICAgICAgICBlbFs5XSA9IHZbMV07XG4gICAgICAgICAgICBlbFsxMF0gPSB2WzJdO1xuXG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFkgQXhpcyBvZiBsb2NhbCB0cmFuc2Zvcm1cbiAgICAgKiBAbmFtZSB5XG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4NFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdGhpcy5fYXhpc1kuc2V0KGVsWzRdLCBlbFs1XSwgZWxbNl0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F4aXNZO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdiA9IHYuYXJyYXk7XG4gICAgICAgICAgICBlbFs0XSA9IHZbMF07XG4gICAgICAgICAgICBlbFs1XSA9IHZbMV07XG4gICAgICAgICAgICBlbFs2XSA9IHZbMl07XG5cbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogWCBBeGlzIG9mIGxvY2FsIHRyYW5zZm9ybVxuICAgICAqIEBuYW1lIHhcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXg0XG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd4Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuYXJyYXk7XG4gICAgICAgICAgICB0aGlzLl9heGlzWC5zZXQoZWxbMF0sIGVsWzFdLCBlbFsyXSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXhpc1g7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuYXJyYXk7XG4gICAgICAgICAgICB2ID0gdi5hcnJheTtcbiAgICAgICAgICAgIGVsWzBdID0gdlswXTtcbiAgICAgICAgICAgIGVsWzFdID0gdlsxXTtcbiAgICAgICAgICAgIGVsWzJdID0gdlsyXTtcblxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG1hdDQuYWRqb2ludChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgbWF0NC5jb3B5KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuTWF0cml4NC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gbWF0NC5kZXRlcm1pbmFudChhLmFycmF5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBtYXQ0LmlkZW50aXR5KG91dC5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgbGVmdFxuICogQHBhcmFtICB7bnVtYmVyfSAgcmlnaHRcbiAqIEBwYXJhbSAge251bWJlcn0gIGJvdHRvbVxuICogQHBhcmFtICB7bnVtYmVyfSAgdG9wXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBuZWFyXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBmYXJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0Lm9ydGhvID0gZnVuY3Rpb24ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICAgIG1hdDQub3J0aG8ob3V0LmFycmF5LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcik7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgZm92eVxuICogQHBhcmFtICB7bnVtYmVyfSAgYXNwZWN0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBuZWFyXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBmYXJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnBlcnNwZWN0aXZlID0gZnVuY3Rpb24ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIG1hdDQucGVyc3BlY3RpdmUob3V0LmFycmF5LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcik7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGV5ZVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGNlbnRlclxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IHVwXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC5sb29rQXQgPSBmdW5jdGlvbihvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIG1hdDQubG9va0F0KG91dC5hcnJheSwgZXllLmFycmF5LCBjZW50ZXIuYXJyYXksIHVwLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgbWF0NC5pbnZlcnQob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0Lm11bCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG1hdDQubXVsKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0Lm11bHRpcGx5ID0gTWF0cml4NC5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9ICAgIG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LmZyb21RdWF0ID0gZnVuY3Rpb24ob3V0LCBxKSB7XG4gICAgbWF0NC5mcm9tUXVhdChvdXQuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSAgICBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBxXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gICAgdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24gPSBmdW5jdGlvbihvdXQsIHEsIHYpIHtcbiAgICBtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dC5hcnJheSwgcS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG00XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IG0yZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuZnJvbU1hdDJkID0gZnVuY3Rpb24obTQsIG0yZCkge1xuICAgIG00Ll9kaXJ0eSA9IHRydWU7XG4gICAgdmFyIG0yZCA9IG0yZC5hcnJheTtcbiAgICB2YXIgbTQgPSBtNC5hcnJheTtcblxuICAgIG00WzBdID0gbTJkWzBdO1xuICAgIG00WzRdID0gbTJkWzJdO1xuICAgIG00WzEyXSA9IG0yZFs0XTtcblxuICAgIG00WzFdID0gbTJkWzFdO1xuICAgIG00WzVdID0gbTJkWzNdO1xuICAgIG00WzEzXSA9IG0yZFs1XTtcblxuICAgIHJldHVybiBtNDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHJhZFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGF4aXNcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnJvdGF0ZSA9IGZ1bmN0aW9uKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gICAgbWF0NC5yb3RhdGUob3V0LmFycmF5LCBhLmFycmF5LCByYWQsIGF4aXMuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICByYWRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnJvdGF0ZVggPSBmdW5jdGlvbihvdXQsIGEsIHJhZCkge1xuICAgIG1hdDQucm90YXRlWChvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQucm90YXRlWSA9IGZ1bmN0aW9uKG91dCwgYSwgcmFkKSB7XG4gICAgbWF0NC5yb3RhdGVZKG91dC5hcnJheSwgYS5hcnJheSwgcmFkKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHBhcmFtICB7bnVtYmVyfSAgcmFkXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC5yb3RhdGVaID0gZnVuY3Rpb24ob3V0LCBhLCByYWQpIHtcbiAgICBtYXQ0LnJvdGF0ZVoob3V0LmFycmF5LCBhLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICBtYXQ0LnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG1hdDQudHJhbnNwb3NlKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSB2XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICBtYXQ0LnRyYW5zbGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXg0O1xuIiwidmFyIERJUlRZX1BSRUZJWCA9ICdfX2R0X18nO1xuXG52YXIgQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICB0aGlzLl9jb250ZXh0SWQgPSAwO1xuXG4gICAgdGhpcy5fY2FjaGVzID0gW107XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge307XG59O1xuXG5DYWNoZS5wcm90b3R5cGUgPSB7XG5cbiAgICB1c2U6IGZ1bmN0aW9uIChjb250ZXh0SWQsIGRvY3VtZW50U2NoZW1hKSB7XG4gICAgICAgIHZhciBjYWNoZXMgPSB0aGlzLl9jYWNoZXM7XG4gICAgICAgIGlmICghY2FjaGVzW2NvbnRleHRJZF0pIHtcbiAgICAgICAgICAgIGNhY2hlc1tjb250ZXh0SWRdID0ge307XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudFNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGNhY2hlc1tjb250ZXh0SWRdID0gZG9jdW1lbnRTY2hlbWEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSBjb250ZXh0SWQ7XG5cbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNhY2hlc1tjb250ZXh0SWRdO1xuICAgIH0sXG5cbiAgICBwdXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH0sXG5cbiAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICB9LFxuXG4gICAgZGlydHk6IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBmaWVsZCA9IGZpZWxkIHx8ICcnO1xuICAgICAgICB2YXIga2V5ID0gRElSVFlfUFJFRklYICsgZmllbGQ7XG4gICAgICAgIHRoaXMucHV0KGtleSwgdHJ1ZSk7XG4gICAgfSxcblxuICAgIGRpcnR5QWxsOiBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgZmllbGQgPSBmaWVsZCB8fCAnJztcbiAgICAgICAgdmFyIGtleSA9IERJUlRZX1BSRUZJWCArIGZpZWxkO1xuICAgICAgICB2YXIgY2FjaGVzID0gdGhpcy5fY2FjaGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhY2hlc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhY2hlc1tpXVtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmcmVzaDogZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGZpZWxkID0gZmllbGQgfHwgJyc7XG4gICAgICAgIHZhciBrZXkgPSBESVJUWV9QUkVGSVggKyBmaWVsZDtcbiAgICAgICAgdGhpcy5wdXQoa2V5LCBmYWxzZSk7XG4gICAgfSxcblxuICAgIGZyZXNoQWxsOiBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgZmllbGQgPSBmaWVsZCB8fCAnJztcbiAgICAgICAgdmFyIGtleSA9IERJUlRZX1BSRUZJWCArIGZpZWxkO1xuICAgICAgICB2YXIgY2FjaGVzID0gdGhpcy5fY2FjaGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhY2hlc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhY2hlc1tpXVtrZXldID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNEaXJ0eTogZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGZpZWxkID0gZmllbGQgfHwgJyc7XG4gICAgICAgIHZhciBrZXkgPSBESVJUWV9QUkVGSVggKyBmaWVsZDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9jb250ZXh0O1xuICAgICAgICByZXR1cm4gICFjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSlcbiAgICAgICAgICAgIHx8IGNvbnRleHRba2V5XSA9PT0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZGVsZXRlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHRJZCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fY2FjaGVzW2NvbnRleHRJZF07XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSB7fTtcbiAgICB9LFxuXG4gICAgZGVsZXRlOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgfSxcblxuICAgIGNsZWFyQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlcyA9IHt9O1xuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICAgIH0sXG5cbiAgICBlYWNoQ29udGV4dCA6IGZ1bmN0aW9uIChjYiwgY29udGV4dCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2NhY2hlcyk7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjYiAmJiBjYi5jYWxsKGNvbnRleHQsIGtleSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBtaXNzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIHRoaXMuX2NvbnRleHQuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgICB9XG59O1xuXG5DYWNoZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYWNoZTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FjaGU7XG4iLCIvKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0ZXh0dXJlcyBsaWtlIGNvbXByZXNzZWQgdGV4dHVyZSwgdGV4dHVyZTJkLCB0ZXh0dXJlY3ViZVxuICogVE9ETyBtYXBwaW5nXG4gKi9cbmltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgQ2FjaGUgZnJvbSAnLi9jb3JlL0NhY2hlJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LlRleHR1cmVcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBUZXh0dXJlID0gQmFzZS5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkuVGV4dHVyZSMgKi9cbntcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHdpZHRoLCByZWFkb25seSB3aGVuIHRoZSB0ZXh0dXJlIHNvdXJjZSBpcyBpbWFnZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgd2lkdGg6IDUxMixcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIGhlaWdodCwgcmVhZG9ubHkgd2hlbiB0aGUgdGV4dHVyZSBzb3VyY2UgaXMgaW1hZ2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodDogNTEyLFxuICAgIC8qKlxuICAgICAqIFRleGVsIGRhdGEgdHlwZS5cbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5VTlNJR05FRF9CWVRFfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuSEFMRl9GTE9BVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkZMT0FUfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5VTlNJR05FRF9JTlR9XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0eXBlOiBnbGVudW0uVU5TSUdORURfQllURSxcbiAgICAvKipcbiAgICAgKiBGb3JtYXQgb2YgdGV4ZWwgZGF0YVxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLlJHQkF9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5ERVBUSF9DT01QT05FTlR9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5ERVBUSF9TVEVOQ0lMfVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZm9ybWF0OiBnbGVudW0uUkdCQSxcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHdyYXAuIERlZmF1bHQgdG8gYmUgUkVQRUFULlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkNMQU1QX1RPX0VER0V9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5SRVBFQVR9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5NSVJST1JFRF9SRVBFQVR9XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB3cmFwUzogZ2xlbnVtLlJFUEVBVCxcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHdyYXAuIERlZmF1bHQgdG8gYmUgUkVQRUFULlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkNMQU1QX1RPX0VER0V9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5SRVBFQVR9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5NSVJST1JFRF9SRVBFQVR9XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB3cmFwVDogZ2xlbnVtLlJFUEVBVCxcbiAgICAvKipcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5ORUFSRVNUfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuTElORUFSfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkxJTkVBUl9NSVBNQVBfTkVBUkVTVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLk5FQVJFU1RfTUlQTUFQX0xJTkVBUn1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkxJTkVBUl9NSVBNQVBfTElORUFSfVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgbWluRmlsdGVyOiBnbGVudW0uTElORUFSX01JUE1BUF9MSU5FQVIsXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuTkVBUkVTVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkxJTkVBUn1cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIG1hZ0ZpbHRlcjogZ2xlbnVtLkxJTkVBUixcbiAgICAvKipcbiAgICAgKiBJZiBlbmFibGUgbWltYXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdXNlTWlwbWFwOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogQW5pc290cm9waWMgZmlsdGVyaW5nLCBlbmFibGVkIGlmIHZhbHVlIGlzIGxhcmdlciB0aGFuIDFcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGFuaXNvdHJvcGljOiAxLFxuICAgIC8vIHBpeGVsU3RvcmVpIHBhcmFtZXRlcnMsIG5vdCBhdmFpbGFibGUgd2hlbiB0ZXh0dXJlIGlzIHVzZWQgYXMgcmVuZGVyIHRhcmdldFxuICAgIC8vIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sXG4gICAgLyoqXG4gICAgICogSWYgZmxpcCBpbiB5IGF4aXMgZm9yIGdpdmVuIGltYWdlIHNvdXJjZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBmbGlwWTogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDRcbiAgICAgKi9cbiAgICB1bnBhY2tBbGlnbm1lbnQ6IDQsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwcmVtdWx0aXBseUFscGhhOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIER5bmFtaWMgb3B0aW9uIGZvciB0ZXh0dXJlIGxpa2UgdmlkZW9cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBkeW5hbWljOiBmYWxzZSxcblxuICAgIE5QT1Q6IGZhbHNlXG59LCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgQ2FjaGUoKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuVGV4dHVyZS5wcm90b3R5cGUgKi9cbntcblxuICAgIGdldFdlYkdMVGV4dHVyZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgICAgIGNhY2hlLnVzZShyZW5kZXJlci5fX3VpZF9fKTtcblxuICAgICAgICBpZiAoY2FjaGUubWlzcygnd2ViZ2xfdGV4dHVyZScpKSB7XG4gICAgICAgICAgICAvLyBJbiBhIG5ldyBnbCBjb250ZXh0LCBjcmVhdGUgbmV3IHRleHR1cmUgYW5kIHNldCBkaXJ0eSB0cnVlXG4gICAgICAgICAgICBjYWNoZS5wdXQoJ3dlYmdsX3RleHR1cmUnLCBfZ2wuY3JlYXRlVGV4dHVyZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5keW5hbWljKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShyZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2FjaGUuaXNEaXJ0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShyZW5kZXJlcik7XG4gICAgICAgICAgICBjYWNoZS5mcmVzaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldCgnd2ViZ2xfdGV4dHVyZScpO1xuICAgIH0sXG5cbiAgICBiaW5kOiBmdW5jdGlvbiAoKSB7fSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgLyoqXG4gICAgICogTWFyayB0ZXh0dXJlIGlzIGRpcnR5IGFuZCB1cGRhdGUgaW4gdGhlIG5leHQgZnJhbWVcbiAgICAgKi9cbiAgICBkaXJ0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5QWxsKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHt9LFxuXG4gICAgLy8gVXBkYXRlIHRoZSBjb21tb24gcGFyYW1ldGVycyBvZiB0ZXh0dXJlXG4gICAgdXBkYXRlQ29tbW9uOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRoaXMuZmxpcFkpO1xuICAgICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGhpcy5wcmVtdWx0aXBseUFscGhhKTtcbiAgICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfQUxJR05NRU5ULCB0aGlzLnVucGFja0FsaWdubWVudCk7XG5cbiAgICAgICAgLy8gVXNlIG9mIG5vbmUtcG93ZXIgb2YgdHdvIHRleHR1cmVcbiAgICAgICAgLy8gaHR0cDovL3d3dy5raHJvbm9zLm9yZy93ZWJnbC93aWtpL1dlYkdMX2FuZF9PcGVuR0xfRGlmZmVyZW5jZXNcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBnbGVudW0uREVQVEhfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICB0aGlzLnVzZU1pcG1hcCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNSR0JFeHQgPSByZW5kZXJlci5nZXRHTEV4dGVuc2lvbignRVhUX3NSR0InKTtcbiAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUZXh0dXJlLlNSR0IgJiYgIXNSR0JFeHQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0ID0gVGV4dHVyZS5SR0I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUZXh0dXJlLlNSR0JfQUxQSEEgJiYgIXNSR0JFeHQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0ID0gVGV4dHVyZS5SR0JBO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5OUE9UID0gIXRoaXMuaXNQb3dlck9mVHdvKCk7XG4gICAgfSxcblxuICAgIGdldEF2YWlsYWJsZVdyYXBTOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLk5QT1QpIHtcbiAgICAgICAgICAgIHJldHVybiBnbGVudW0uQ0xBTVBfVE9fRURHRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53cmFwUztcbiAgICB9LFxuICAgIGdldEF2YWlsYWJsZVdyYXBUOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLk5QT1QpIHtcbiAgICAgICAgICAgIHJldHVybiBnbGVudW0uQ0xBTVBfVE9fRURHRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53cmFwVDtcbiAgICB9LFxuICAgIGdldEF2YWlsYWJsZU1pbkZpbHRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWluRmlsdGVyID0gdGhpcy5taW5GaWx0ZXI7XG4gICAgICAgIGlmICh0aGlzLk5QT1QgfHwgIXRoaXMudXNlTWlwbWFwKSB7XG4gICAgICAgICAgICBpZiAobWluRmlsdGVyID09IGdsZW51bS5ORUFSRVNUX01JUE1BUF9ORUFSRVNUIHx8XG4gICAgICAgICAgICAgICAgbWluRmlsdGVyID09IGdsZW51bS5ORUFSRVNUX01JUE1BUF9MSU5FQVJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnbGVudW0uTkVBUkVTVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1pbkZpbHRlciA9PSBnbGVudW0uTElORUFSX01JUE1BUF9MSU5FQVIgfHxcbiAgICAgICAgICAgICAgICBtaW5GaWx0ZXIgPT0gZ2xlbnVtLkxJTkVBUl9NSVBNQVBfTkVBUkVTVFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdsZW51bS5MSU5FQVI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluRmlsdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1pbkZpbHRlcjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0QXZhaWxhYmxlTWFnRmlsdGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hZ0ZpbHRlcjtcbiAgICB9LFxuXG4gICAgbmV4dEhpZ2hlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoeCkge1xuICAgICAgICAtLXg7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMzI7IGkgPDw9IDEpIHtcbiAgICAgICAgICAgIHggPSB4IHwgeCA+PiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4ICsgMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuXG4gICAgICAgIHZhciB3ZWJnbFRleHR1cmUgPSBjYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKTtcbiAgICAgICAgaWYgKHdlYmdsVGV4dHVyZSl7XG4gICAgICAgICAgICByZW5kZXJlci5nbC5kZWxldGVUZXh0dXJlKHdlYmdsVGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FjaGUuZGVsZXRlQ29udGV4dChyZW5kZXJlci5fX3VpZF9fKTtcblxuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBpbWFnZSBvZiB0ZXh0dXJlIGlzIHZhbGlkIGFuZCBsb2FkZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1JlbmRlcmFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgLyoqXG4gICAgICogVGVzdCBpZiB0ZXh0dXJlIHNpemUgaXMgcG93ZXIgb2YgdHdvXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICgpIHt9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHR1cmUucHJvdG90eXBlLCAnd2lkdGgnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XG4gICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dHVyZS5wcm90b3R5cGUsICdoZWlnaHQnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICB9XG59KTtcblxuLyogRGF0YVR5cGUgKi9cblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkJZVEUgPSBnbGVudW0uQllURTtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5VTlNJR05FRF9CWVRFID0gZ2xlbnVtLlVOU0lHTkVEX0JZVEU7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuU0hPUlQgPSBnbGVudW0uU0hPUlQ7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuVU5TSUdORURfU0hPUlQgPSBnbGVudW0uVU5TSUdORURfU0hPUlQ7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuSU5UID0gZ2xlbnVtLklOVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5VTlNJR05FRF9JTlQgPSBnbGVudW0uVU5TSUdORURfSU5UO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkZMT0FUID0gZ2xlbnVtLkZMT0FUO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkhBTEZfRkxPQVQgPSAweDhENjE7XG5cbi8qKlxuICogVU5TSUdORURfSU5UXzI0XzhfV0VCR0wgZm9yIFdFQkdMX2RlcHRoX3RleHR1cmUgZXh0ZW5zaW9uXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMID0gMzQwNDI7XG5cbi8qIFBpeGVsRm9ybWF0ICovXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuREVQVEhfQ09NUE9ORU5UID0gZ2xlbnVtLkRFUFRIX0NPTVBPTkVOVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5ERVBUSF9TVEVOQ0lMID0gZ2xlbnVtLkRFUFRIX1NURU5DSUw7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuQUxQSEEgPSBnbGVudW0uQUxQSEE7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuUkdCID0gZ2xlbnVtLlJHQjtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5SR0JBID0gZ2xlbnVtLlJHQkE7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTFVNSU5BTkNFID0gZ2xlbnVtLkxVTUlOQU5DRTtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5MVU1JTkFOQ0VfQUxQSEEgPSBnbGVudW0uTFVNSU5BTkNFX0FMUEhBO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9FWFRfc1JHQi9cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuU1JHQiA9IDB4OEM0MDtcbi8qKlxuICogQHNlZSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL0VYVF9zUkdCL1xuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5TUkdCX0FMUEhBID0gMHg4QzQyO1xuXG4vKiBDb21wcmVzc2VkIFRleHR1cmUgKi9cblRleHR1cmUuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCA9IDB4ODNGMDtcblRleHR1cmUuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgPSAweDgzRjE7XG5UZXh0dXJlLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUID0gMHg4M0YyO1xuVGV4dHVyZS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCA9IDB4ODNGMztcblxuLyogVGV4dHVyZU1hZ0ZpbHRlciAqL1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLk5FQVJFU1QgPSBnbGVudW0uTkVBUkVTVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5MSU5FQVIgPSBnbGVudW0uTElORUFSO1xuXG4vKiBUZXh0dXJlTWluRmlsdGVyICovXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCA9IGdsZW51bS5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCA9IGdsZW51bS5MSU5FQVJfTUlQTUFQX05FQVJFU1Q7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTkVBUkVTVF9NSVBNQVBfTElORUFSID0gZ2xlbnVtLk5FQVJFU1RfTUlQTUFQX0xJTkVBUjtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IGdsZW51bS5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuLyogVGV4dHVyZVdyYXBNb2RlICovXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuUkVQRUFUID0gZ2xlbnVtLlJFUEVBVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5DTEFNUF9UT19FREdFID0gZ2xlbnVtLkNMQU1QX1RPX0VER0U7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTUlSUk9SRURfUkVQRUFUID0gZ2xlbnVtLk1JUlJPUkVEX1JFUEVBVDtcblxuXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlO1xuIiwiLyoqXG4gKiBTaW1wbGUgZG91YmxlIGxpbmtlZCBsaXN0LiBDb21wYXJlZCB3aXRoIGFycmF5LCBpdCBoYXMgTygxKSByZW1vdmUgb3BlcmF0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5jb3JlLkxpbmtlZExpc3RcbiAqL1xudmFyIExpbmtlZExpc3QgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5jb3JlLkxpbmtlZExpc3QuRW50cnl9XG4gICAgICovXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LmNvcmUuTGlua2VkTGlzdC5FbnRyeX1cbiAgICAgKi9cbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuXG4gICAgdGhpcy5fbGVuZ3RoID0gMDtcbn07XG5cbi8qKlxuICogSW5zZXJ0IGEgbmV3IHZhbHVlIGF0IHRoZSB0YWlsXG4gKiBAcGFyYW0gIHt9IHZhbFxuICogQHJldHVybiB7Y2xheS5jb3JlLkxpbmtlZExpc3QuRW50cnl9XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgZW50cnkgPSBuZXcgTGlua2VkTGlzdC5FbnRyeSh2YWwpO1xuICAgIHRoaXMuaW5zZXJ0RW50cnkoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbn07XG5cbi8qKlxuICogSW5zZXJ0IGEgbmV3IHZhbHVlIGF0IGlkeFxuICogQHBhcmFtIHtudW1iZXJ9IGlkeFxuICogQHBhcmFtICB7fSB2YWxcbiAqIEByZXR1cm4ge2NsYXkuY29yZS5MaW5rZWRMaXN0LkVudHJ5fVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5pbnNlcnRBdCA9IGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5leHQgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGN1cnNvciA9IDA7XG4gICAgd2hpbGUgKG5leHQgJiYgY3Vyc29yICE9IGlkeCkge1xuICAgICAgICBuZXh0ID0gbmV4dC5uZXh0O1xuICAgICAgICBjdXJzb3IrKztcbiAgICB9XG4gICAgaWYgKG5leHQpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gbmV3IExpbmtlZExpc3QuRW50cnkodmFsKTtcbiAgICAgICAgdmFyIHByZXYgPSBuZXh0LnByZXY7XG4gICAgICAgIGlmICghcHJldikgeyAvL25leHQgaXMgaGVhZFxuICAgICAgICAgICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5LnByZXYgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5Lm5leHQgPSBuZXh0O1xuICAgICAgICBuZXh0LnByZXYgPSBlbnRyeTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHZhbCk7XG4gICAgfVxufTtcblxuTGlua2VkTGlzdC5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlRW50cnkgPSBmdW5jdGlvbiAodmFsLCBuZXh0KSB7XG4gICAgdmFyIGVudHJ5ID0gbmV3IExpbmtlZExpc3QuRW50cnkodmFsKTtcbiAgICB2YXIgcHJldiA9IG5leHQucHJldjtcbiAgICBpZiAoIXByZXYpIHsgLy9uZXh0IGlzIGhlYWRcbiAgICAgICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcmV2Lm5leHQgPSBlbnRyeTtcbiAgICAgICAgZW50cnkucHJldiA9IHByZXY7XG4gICAgfVxuICAgIGVudHJ5Lm5leHQgPSBuZXh0O1xuICAgIG5leHQucHJldiA9IGVudHJ5O1xuXG4gICAgdGhpcy5fbGVuZ3RoKys7XG59O1xuXG4vKipcbiAqIEluc2VydCBhbiBlbnRyeSBhdCB0aGUgdGFpbFxuICogQHBhcmFtICB7Y2xheS5jb3JlLkxpbmtlZExpc3QuRW50cnl9IGVudHJ5XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmluc2VydEVudHJ5ID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gZW50cnk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O1xuICAgICAgICBlbnRyeS5wcmV2ID0gdGhpcy50YWlsO1xuICAgICAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoKys7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBlbnRyeS5cbiAqIEBwYXJhbSAge2NsYXkuY29yZS5MaW5rZWRMaXN0LkVudHJ5fSBlbnRyeVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICB2YXIgcHJldiA9IGVudHJ5LnByZXY7XG4gICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYubmV4dCA9IG5leHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJcyBoZWFkXG4gICAgICAgIHRoaXMuaGVhZCA9IG5leHQ7XG4gICAgfVxuICAgIGlmIChuZXh0KSB7XG4gICAgICAgIG5leHQucHJldiA9IHByZXY7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJcyB0YWlsXG4gICAgICAgIHRoaXMudGFpbCA9IHByZXY7XG4gICAgfVxuICAgIGVudHJ5Lm5leHQgPSBlbnRyeS5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLl9sZW5ndGgtLTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGVudHJ5IGF0IGluZGV4LlxuICogQHBhcmFtICB7bnVtYmVyfSBpZHhcbiAqIEByZXR1cm4ge31cbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUucmVtb3ZlQXQgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VyciA9IHRoaXMuaGVhZDtcbiAgICB2YXIgY3Vyc29yID0gMDtcbiAgICB3aGlsZSAoY3VyciAmJiBjdXJzb3IgIT0gaWR4KSB7XG4gICAgICAgIGN1cnIgPSBjdXJyLm5leHQ7XG4gICAgICAgIGN1cnNvcisrO1xuICAgIH1cbiAgICBpZiAoY3Vycikge1xuICAgICAgICB0aGlzLnJlbW92ZShjdXJyKTtcbiAgICAgICAgcmV0dXJuIGN1cnIudmFsdWU7XG4gICAgfVxufTtcbi8qKlxuICogR2V0IGhlYWQgdmFsdWVcbiAqIEByZXR1cm4ge31cbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuZ2V0SGVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5oZWFkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWQudmFsdWU7XG4gICAgfVxufTtcbi8qKlxuICogR2V0IHRhaWwgdmFsdWVcbiAqIEByZXR1cm4ge31cbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuZ2V0VGFpbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy50YWlsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhaWwudmFsdWU7XG4gICAgfVxufTtcbi8qKlxuICogR2V0IHZhbHVlIGF0IGlkeFxuICogQHBhcmFtIHtudW1iZXJ9IGlkeFxuICogQHJldHVybiB7fVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5nZXRBdCA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjdXJyID0gdGhpcy5oZWFkO1xuICAgIHZhciBjdXJzb3IgPSAwO1xuICAgIHdoaWxlIChjdXJyICYmIGN1cnNvciAhPSBpZHgpIHtcbiAgICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgfVxuICAgIHJldHVybiBjdXJyLnZhbHVlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHt9IHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgY3VyciA9IHRoaXMuaGVhZDtcbiAgICB2YXIgY3Vyc29yID0gMDtcbiAgICB3aGlsZSAoY3Vycikge1xuICAgICAgICBpZiAoY3Vyci52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJzb3I7XG4gICAgICAgIH1cbiAgICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xufTtcblxuLyoqXG4gKiBJZiBsaXN0IGlzIGVtcHR5XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xlbmd0aCA9PT0gMDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0gIHt9IGNvbnRleHRcbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYiwgY29udGV4dCkge1xuICAgIHZhciBjdXJyID0gdGhpcy5oZWFkO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBoYXZlQ29udGV4dCA9IHR5cGVvZihjb250ZXh0KSAhPSAndW5kZWZpbmVkJztcbiAgICB3aGlsZSAoY3Vycikge1xuICAgICAgICBpZiAoaGF2ZUNvbnRleHQpIHtcbiAgICAgICAgICAgIGNiLmNhbGwoY29udGV4dCwgY3Vyci52YWx1ZSwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNiKGN1cnIudmFsdWUsIGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICAgICAgaWR4Kys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgbGlzdFxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRhaWwgPSB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG59O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHt9IHZhbFxuICovXG5MaW5rZWRMaXN0LkVudHJ5ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHt9XG4gICAgICovXG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LmNvcmUuTGlua2VkTGlzdC5FbnRyeX1cbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkuY29yZS5MaW5rZWRMaXN0LkVudHJ5fVxuICAgICAqL1xuICAgIHRoaXMucHJldiA9IG51bGw7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMaW5rZWRMaXN0O1xuIiwiaW1wb3J0IExpbmtlZExpc3QgZnJvbSAnLi9MaW5rZWRMaXN0JztcblxuLyoqXG4gKiBMUlUgQ2FjaGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuY29yZS5MUlVcbiAqL1xudmFyIExSVSA9IGZ1bmN0aW9uKG1heFNpemUpIHtcblxuICAgIHRoaXMuX2xpc3QgPSBuZXcgTGlua2VkTGlzdCgpO1xuXG4gICAgdGhpcy5fbWFwID0ge307XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZSB8fCAxMDtcbn07XG5cbi8qKlxuICogU2V0IGNhY2hlIG1heCBzaXplXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG5MUlUucHJvdG90eXBlLnNldE1heFNpemUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5fbWF4U2l6ZSA9IHNpemU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0gIHt9IHZhbHVlXG4gKi9cbkxSVS5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YodGhpcy5fbWFwW2tleV0pID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLl9saXN0Lmxlbmd0aCgpO1xuICAgICAgICBpZiAobGVuID49IHRoaXMuX21heFNpemUgJiYgbGVuID4gMCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkXG4gICAgICAgICAgICB2YXIgbGVhc3RVc2VkRW50cnkgPSB0aGlzLl9saXN0LmhlYWQ7XG4gICAgICAgICAgICB0aGlzLl9saXN0LnJlbW92ZShsZWFzdFVzZWRFbnRyeSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwW2xlYXN0VXNlZEVudHJ5LmtleV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9saXN0Lmluc2VydCh2YWx1ZSk7XG4gICAgICAgIGVudHJ5LmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5fbWFwW2tleV0gPSBlbnRyeTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHt9XG4gKi9cbkxSVS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwW2tleV07XG4gICAgaWYgKHR5cGVvZihlbnRyeSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gUHV0IHRoZSBsYXRlc3QgdXNlZCBlbnRyeSBpbiB0aGUgdGFpbFxuICAgICAgICBpZiAoZW50cnkgIT09IHRoaXMuX2xpc3QudGFpbCkge1xuICAgICAgICAgICAgdGhpcy5fbGlzdC5yZW1vdmUoZW50cnkpO1xuICAgICAgICAgICAgdGhpcy5fbGlzdC5pbnNlcnRFbnRyeShlbnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cbkxSVS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwW2tleV07XG4gICAgaWYgKHR5cGVvZihlbnRyeSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX21hcFtrZXldO1xuICAgICAgICB0aGlzLl9saXN0LnJlbW92ZShlbnRyeSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgY2FjaGVcbiAqL1xuTFJVLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpc3QuY2xlYXIoKTtcbiAgICB0aGlzLl9tYXAgPSB7fTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExSVTtcbiIsImltcG9ydCBMUlUgZnJvbSAnLi4vY29yZS9MUlUnO1xuXG52YXIgY29sb3JVdGlsID0ge307XG5cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgICAndHJhbnNwYXJlbnQnOiBbMCwwLDAsMF0sICdhbGljZWJsdWUnOiBbMjQwLDI0OCwyNTUsMV0sXG4gICAgJ2FudGlxdWV3aGl0ZSc6IFsyNTAsMjM1LDIxNSwxXSwgJ2FxdWEnOiBbMCwyNTUsMjU1LDFdLFxuICAgICdhcXVhbWFyaW5lJzogWzEyNywyNTUsMjEyLDFdLCAnYXp1cmUnOiBbMjQwLDI1NSwyNTUsMV0sXG4gICAgJ2JlaWdlJzogWzI0NSwyNDUsMjIwLDFdLCAnYmlzcXVlJzogWzI1NSwyMjgsMTk2LDFdLFxuICAgICdibGFjayc6IFswLDAsMCwxXSwgJ2JsYW5jaGVkYWxtb25kJzogWzI1NSwyMzUsMjA1LDFdLFxuICAgICdibHVlJzogWzAsMCwyNTUsMV0sICdibHVldmlvbGV0JzogWzEzOCw0MywyMjYsMV0sXG4gICAgJ2Jyb3duJzogWzE2NSw0Miw0MiwxXSwgJ2J1cmx5d29vZCc6IFsyMjIsMTg0LDEzNSwxXSxcbiAgICAnY2FkZXRibHVlJzogWzk1LDE1OCwxNjAsMV0sICdjaGFydHJldXNlJzogWzEyNywyNTUsMCwxXSxcbiAgICAnY2hvY29sYXRlJzogWzIxMCwxMDUsMzAsMV0sICdjb3JhbCc6IFsyNTUsMTI3LDgwLDFdLFxuICAgICdjb3JuZmxvd2VyYmx1ZSc6IFsxMDAsMTQ5LDIzNywxXSwgJ2Nvcm5zaWxrJzogWzI1NSwyNDgsMjIwLDFdLFxuICAgICdjcmltc29uJzogWzIyMCwyMCw2MCwxXSwgJ2N5YW4nOiBbMCwyNTUsMjU1LDFdLFxuICAgICdkYXJrYmx1ZSc6IFswLDAsMTM5LDFdLCAnZGFya2N5YW4nOiBbMCwxMzksMTM5LDFdLFxuICAgICdkYXJrZ29sZGVucm9kJzogWzE4NCwxMzQsMTEsMV0sICdkYXJrZ3JheSc6IFsxNjksMTY5LDE2OSwxXSxcbiAgICAnZGFya2dyZWVuJzogWzAsMTAwLDAsMV0sICdkYXJrZ3JleSc6IFsxNjksMTY5LDE2OSwxXSxcbiAgICAnZGFya2toYWtpJzogWzE4OSwxODMsMTA3LDFdLCAnZGFya21hZ2VudGEnOiBbMTM5LDAsMTM5LDFdLFxuICAgICdkYXJrb2xpdmVncmVlbic6IFs4NSwxMDcsNDcsMV0sICdkYXJrb3JhbmdlJzogWzI1NSwxNDAsMCwxXSxcbiAgICAnZGFya29yY2hpZCc6IFsxNTMsNTAsMjA0LDFdLCAnZGFya3JlZCc6IFsxMzksMCwwLDFdLFxuICAgICdkYXJrc2FsbW9uJzogWzIzMywxNTAsMTIyLDFdLCAnZGFya3NlYWdyZWVuJzogWzE0MywxODgsMTQzLDFdLFxuICAgICdkYXJrc2xhdGVibHVlJzogWzcyLDYxLDEzOSwxXSwgJ2RhcmtzbGF0ZWdyYXknOiBbNDcsNzksNzksMV0sXG4gICAgJ2RhcmtzbGF0ZWdyZXknOiBbNDcsNzksNzksMV0sICdkYXJrdHVycXVvaXNlJzogWzAsMjA2LDIwOSwxXSxcbiAgICAnZGFya3Zpb2xldCc6IFsxNDgsMCwyMTEsMV0sICdkZWVwcGluayc6IFsyNTUsMjAsMTQ3LDFdLFxuICAgICdkZWVwc2t5Ymx1ZSc6IFswLDE5MSwyNTUsMV0sICdkaW1ncmF5JzogWzEwNSwxMDUsMTA1LDFdLFxuICAgICdkaW1ncmV5JzogWzEwNSwxMDUsMTA1LDFdLCAnZG9kZ2VyYmx1ZSc6IFszMCwxNDQsMjU1LDFdLFxuICAgICdmaXJlYnJpY2snOiBbMTc4LDM0LDM0LDFdLCAnZmxvcmFsd2hpdGUnOiBbMjU1LDI1MCwyNDAsMV0sXG4gICAgJ2ZvcmVzdGdyZWVuJzogWzM0LDEzOSwzNCwxXSwgJ2Z1Y2hzaWEnOiBbMjU1LDAsMjU1LDFdLFxuICAgICdnYWluc2Jvcm8nOiBbMjIwLDIyMCwyMjAsMV0sICdnaG9zdHdoaXRlJzogWzI0OCwyNDgsMjU1LDFdLFxuICAgICdnb2xkJzogWzI1NSwyMTUsMCwxXSwgJ2dvbGRlbnJvZCc6IFsyMTgsMTY1LDMyLDFdLFxuICAgICdncmF5JzogWzEyOCwxMjgsMTI4LDFdLCAnZ3JlZW4nOiBbMCwxMjgsMCwxXSxcbiAgICAnZ3JlZW55ZWxsb3cnOiBbMTczLDI1NSw0NywxXSwgJ2dyZXknOiBbMTI4LDEyOCwxMjgsMV0sXG4gICAgJ2hvbmV5ZGV3JzogWzI0MCwyNTUsMjQwLDFdLCAnaG90cGluayc6IFsyNTUsMTA1LDE4MCwxXSxcbiAgICAnaW5kaWFucmVkJzogWzIwNSw5Miw5MiwxXSwgJ2luZGlnbyc6IFs3NSwwLDEzMCwxXSxcbiAgICAnaXZvcnknOiBbMjU1LDI1NSwyNDAsMV0sICdraGFraSc6IFsyNDAsMjMwLDE0MCwxXSxcbiAgICAnbGF2ZW5kZXInOiBbMjMwLDIzMCwyNTAsMV0sICdsYXZlbmRlcmJsdXNoJzogWzI1NSwyNDAsMjQ1LDFdLFxuICAgICdsYXduZ3JlZW4nOiBbMTI0LDI1MiwwLDFdLCAnbGVtb25jaGlmZm9uJzogWzI1NSwyNTAsMjA1LDFdLFxuICAgICdsaWdodGJsdWUnOiBbMTczLDIxNiwyMzAsMV0sICdsaWdodGNvcmFsJzogWzI0MCwxMjgsMTI4LDFdLFxuICAgICdsaWdodGN5YW4nOiBbMjI0LDI1NSwyNTUsMV0sICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IFsyNTAsMjUwLDIxMCwxXSxcbiAgICAnbGlnaHRncmF5JzogWzIxMSwyMTEsMjExLDFdLCAnbGlnaHRncmVlbic6IFsxNDQsMjM4LDE0NCwxXSxcbiAgICAnbGlnaHRncmV5JzogWzIxMSwyMTEsMjExLDFdLCAnbGlnaHRwaW5rJzogWzI1NSwxODIsMTkzLDFdLFxuICAgICdsaWdodHNhbG1vbic6IFsyNTUsMTYwLDEyMiwxXSwgJ2xpZ2h0c2VhZ3JlZW4nOiBbMzIsMTc4LDE3MCwxXSxcbiAgICAnbGlnaHRza3libHVlJzogWzEzNSwyMDYsMjUwLDFdLCAnbGlnaHRzbGF0ZWdyYXknOiBbMTE5LDEzNiwxNTMsMV0sXG4gICAgJ2xpZ2h0c2xhdGVncmV5JzogWzExOSwxMzYsMTUzLDFdLCAnbGlnaHRzdGVlbGJsdWUnOiBbMTc2LDE5NiwyMjIsMV0sXG4gICAgJ2xpZ2h0eWVsbG93JzogWzI1NSwyNTUsMjI0LDFdLCAnbGltZSc6IFswLDI1NSwwLDFdLFxuICAgICdsaW1lZ3JlZW4nOiBbNTAsMjA1LDUwLDFdLCAnbGluZW4nOiBbMjUwLDI0MCwyMzAsMV0sXG4gICAgJ21hZ2VudGEnOiBbMjU1LDAsMjU1LDFdLCAnbWFyb29uJzogWzEyOCwwLDAsMV0sXG4gICAgJ21lZGl1bWFxdWFtYXJpbmUnOiBbMTAyLDIwNSwxNzAsMV0sICdtZWRpdW1ibHVlJzogWzAsMCwyMDUsMV0sXG4gICAgJ21lZGl1bW9yY2hpZCc6IFsxODYsODUsMjExLDFdLCAnbWVkaXVtcHVycGxlJzogWzE0NywxMTIsMjE5LDFdLFxuICAgICdtZWRpdW1zZWFncmVlbic6IFs2MCwxNzksMTEzLDFdLCAnbWVkaXVtc2xhdGVibHVlJzogWzEyMywxMDQsMjM4LDFdLFxuICAgICdtZWRpdW1zcHJpbmdncmVlbic6IFswLDI1MCwxNTQsMV0sICdtZWRpdW10dXJxdW9pc2UnOiBbNzIsMjA5LDIwNCwxXSxcbiAgICAnbWVkaXVtdmlvbGV0cmVkJzogWzE5OSwyMSwxMzMsMV0sICdtaWRuaWdodGJsdWUnOiBbMjUsMjUsMTEyLDFdLFxuICAgICdtaW50Y3JlYW0nOiBbMjQ1LDI1NSwyNTAsMV0sICdtaXN0eXJvc2UnOiBbMjU1LDIyOCwyMjUsMV0sXG4gICAgJ21vY2Nhc2luJzogWzI1NSwyMjgsMTgxLDFdLCAnbmF2YWpvd2hpdGUnOiBbMjU1LDIyMiwxNzMsMV0sXG4gICAgJ25hdnknOiBbMCwwLDEyOCwxXSwgJ29sZGxhY2UnOiBbMjUzLDI0NSwyMzAsMV0sXG4gICAgJ29saXZlJzogWzEyOCwxMjgsMCwxXSwgJ29saXZlZHJhYic6IFsxMDcsMTQyLDM1LDFdLFxuICAgICdvcmFuZ2UnOiBbMjU1LDE2NSwwLDFdLCAnb3JhbmdlcmVkJzogWzI1NSw2OSwwLDFdLFxuICAgICdvcmNoaWQnOiBbMjE4LDExMiwyMTQsMV0sICdwYWxlZ29sZGVucm9kJzogWzIzOCwyMzIsMTcwLDFdLFxuICAgICdwYWxlZ3JlZW4nOiBbMTUyLDI1MSwxNTIsMV0sICdwYWxldHVycXVvaXNlJzogWzE3NSwyMzgsMjM4LDFdLFxuICAgICdwYWxldmlvbGV0cmVkJzogWzIxOSwxMTIsMTQ3LDFdLCAncGFwYXlhd2hpcCc6IFsyNTUsMjM5LDIxMywxXSxcbiAgICAncGVhY2hwdWZmJzogWzI1NSwyMTgsMTg1LDFdLCAncGVydSc6IFsyMDUsMTMzLDYzLDFdLFxuICAgICdwaW5rJzogWzI1NSwxOTIsMjAzLDFdLCAncGx1bSc6IFsyMjEsMTYwLDIyMSwxXSxcbiAgICAncG93ZGVyYmx1ZSc6IFsxNzYsMjI0LDIzMCwxXSwgJ3B1cnBsZSc6IFsxMjgsMCwxMjgsMV0sXG4gICAgJ3JlZCc6IFsyNTUsMCwwLDFdLCAncm9zeWJyb3duJzogWzE4OCwxNDMsMTQzLDFdLFxuICAgICdyb3lhbGJsdWUnOiBbNjUsMTA1LDIyNSwxXSwgJ3NhZGRsZWJyb3duJzogWzEzOSw2OSwxOSwxXSxcbiAgICAnc2FsbW9uJzogWzI1MCwxMjgsMTE0LDFdLCAnc2FuZHlicm93bic6IFsyNDQsMTY0LDk2LDFdLFxuICAgICdzZWFncmVlbic6IFs0NiwxMzksODcsMV0sICdzZWFzaGVsbCc6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgICAnc2llbm5hJzogWzE2MCw4Miw0NSwxXSwgJ3NpbHZlcic6IFsxOTIsMTkyLDE5MiwxXSxcbiAgICAnc2t5Ymx1ZSc6IFsxMzUsMjA2LDIzNSwxXSwgJ3NsYXRlYmx1ZSc6IFsxMDYsOTAsMjA1LDFdLFxuICAgICdzbGF0ZWdyYXknOiBbMTEyLDEyOCwxNDQsMV0sICdzbGF0ZWdyZXknOiBbMTEyLDEyOCwxNDQsMV0sXG4gICAgJ3Nub3cnOiBbMjU1LDI1MCwyNTAsMV0sICdzcHJpbmdncmVlbic6IFswLDI1NSwxMjcsMV0sXG4gICAgJ3N0ZWVsYmx1ZSc6IFs3MCwxMzAsMTgwLDFdLCAndGFuJzogWzIxMCwxODAsMTQwLDFdLFxuICAgICd0ZWFsJzogWzAsMTI4LDEyOCwxXSwgJ3RoaXN0bGUnOiBbMjE2LDE5MSwyMTYsMV0sXG4gICAgJ3RvbWF0byc6IFsyNTUsOTksNzEsMV0sICd0dXJxdW9pc2UnOiBbNjQsMjI0LDIwOCwxXSxcbiAgICAndmlvbGV0JzogWzIzOCwxMzAsMjM4LDFdLCAnd2hlYXQnOiBbMjQ1LDIyMiwxNzksMV0sXG4gICAgJ3doaXRlJzogWzI1NSwyNTUsMjU1LDFdLCAnd2hpdGVzbW9rZSc6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgICAneWVsbG93JzogWzI1NSwyNTUsMCwxXSwgJ3llbGxvd2dyZWVuJzogWzE1NCwyMDUsNTAsMV1cbn07XG5cbmZ1bmN0aW9uIGNsYW1wQ3NzQnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICAgIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gICAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcENzc0FuZ2xlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAzNjAuXG4gICAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDM2MCA/IDM2MCA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wQ3NzRmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VDc3NJbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgICBpZiAoc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHN0ci5sZW5ndGggLSAxKSA9PT0gJyUnKSB7XG4gICAgICAgIHJldHVybiBjbGFtcENzc0J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYW1wQ3NzQnl0ZShwYXJzZUludChzdHIsIDEwKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3NzRmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgIGlmIChzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQoc3RyLmxlbmd0aCAtIDEpID09PSAnJScpIHtcbiAgICAgICAgcmV0dXJuIGNsYW1wQ3NzRmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYW1wQ3NzRmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzSHVlVG9SZ2IobTEsIG0yLCBoKSB7XG4gICAgaWYgKGggPCAwKSB7XG4gICAgICAgIGggKz0gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaCA+IDEpIHtcbiAgICAgICAgaCAtPSAxO1xuICAgIH1cblxuICAgIGlmIChoICogNiA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gICAgfVxuICAgIGlmIChoICogMiA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG0yO1xuICAgIH1cbiAgICBpZiAoaCAqIDMgPCAyKSB7XG4gICAgICAgIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gICAgfVxuICAgIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gbGVycE51bWJlcihhLCBiLCBwKSB7XG4gICAgcmV0dXJuIGEgKyAoYiAtIGEpICogcDtcbn1cblxuZnVuY3Rpb24gc2V0UmdiYShvdXQsIHIsIGcsIGIsIGEpIHtcbiAgICBvdXRbMF0gPSByOyBvdXRbMV0gPSBnOyBvdXRbMl0gPSBiOyBvdXRbM10gPSBhO1xuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBjb3B5UmdiYShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdOyBvdXRbMV0gPSBhWzFdOyBvdXRbMl0gPSBhWzJdOyBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbnZhciBjb2xvckNhY2hlID0gbmV3IExSVSgyMCk7XG52YXIgbGFzdFJlbW92ZWRBcnIgPSBudWxsO1xuXG5mdW5jdGlvbiBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKSB7XG4gICAgLy8gUmV1c2UgcmVtb3ZlZCBhcnJheVxuICAgIGlmIChsYXN0UmVtb3ZlZEFycikge1xuICAgICAgICBjb3B5UmdiYShsYXN0UmVtb3ZlZEFyciwgcmdiYUFycik7XG4gICAgfVxuICAgIGxhc3RSZW1vdmVkQXJyID0gY29sb3JDYWNoZS5wdXQoY29sb3JTdHIsIGxhc3RSZW1vdmVkQXJyIHx8IChyZ2JhQXJyLnNsaWNlKCkpKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTdHJcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IG91dFxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnpyZW5kZXIvdXRpbC9jb2xvclxuICovXG5jb2xvclV0aWwucGFyc2UgPSBmdW5jdGlvbiAoY29sb3JTdHIsIHJnYmFBcnIpIHtcbiAgICBpZiAoIWNvbG9yU3RyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmdiYUFyciA9IHJnYmFBcnIgfHwgW107XG5cbiAgICB2YXIgY2FjaGVkID0gY29sb3JDYWNoZS5nZXQoY29sb3JTdHIpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGNvcHlSZ2JhKHJnYmFBcnIsIGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gY29sb3JTdHIgbWF5IGJlIG5vdCBzdHJpbmdcbiAgICBjb2xvclN0ciA9IGNvbG9yU3RyICsgJyc7XG4gICAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gICAgdmFyIHN0ciA9IGNvbG9yU3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gICAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkge1xuICAgICAgICBjb3B5UmdiYShyZ2JhQXJyLCBrQ1NTQ29sb3JUYWJsZVtzdHJdKTtcbiAgICAgICAgcHV0VG9DYWNoZShjb2xvclN0ciwgcmdiYUFycik7XG4gICAgICAgIHJldHVybiByZ2JhQXJyO1xuICAgIH1cblxuICAgIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICAgIGlmIChzdHIuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHtcbiAgICAgICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsIDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIENvdmVycyBOYU4uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsXG4gICAgICAgICAgICAgICAgKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKTtcbiAgICAgICAgICAgIHJldHVybiByZ2JhQXJyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHtcbiAgICAgICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsIDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIENvdmVycyBOYU4uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsXG4gICAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHB1dFRvQ2FjaGUoY29sb3JTdHIsIHJnYmFBcnIpO1xuICAgICAgICAgICAgcmV0dXJuIHJnYmFBcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3AgKyAxLCBlcCAtIChvcCArIDEpKS5zcGxpdCgnLCcpO1xuICAgICAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICAgICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmdiYShyZ2JhQXJyLCAwLCAwLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbHBoYSA9IHBhcnNlQ3NzRmxvYXQocGFyYW1zLnBvcCgpKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICAgICAgICBjYXNlICdyZ2InOlxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFJnYmEocmdiYUFyciwgMCwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0UmdiYShyZ2JhQXJyLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNzc0ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNzc0ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNzc0ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcHV0VG9DYWNoZShjb2xvclN0ciwgcmdiYUFycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJnYmFBcnI7XG4gICAgICAgICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsIDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmFtc1szXSA9IHBhcnNlQ3NzRmxvYXQocGFyYW1zWzNdKTtcbiAgICAgICAgICAgICAgICBoc2xhMnJnYmEocGFyYW1zLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmdiYUFycjtcbiAgICAgICAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmdiYShyZ2JhQXJyLCAwLCAwLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoc2xhMnJnYmEocGFyYW1zLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmdiYUFycjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UmdiYShyZ2JhQXJyLCAwLCAwLCAwLCAxKTtcbiAgICByZXR1cm47XG59O1xuXG5jb2xvclV0aWwucGFyc2VUb0Zsb2F0ID0gZnVuY3Rpb24gKGNvbG9yU3RyLCByZ2JhQXJyKSB7XG4gICAgcmdiYUFyciA9IGNvbG9yVXRpbC5wYXJzZShjb2xvclN0ciwgcmdiYUFycik7XG4gICAgaWYgKCFyZ2JhQXJyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmdiYUFyclswXSAvPSAyNTU7XG4gICAgcmdiYUFyclsxXSAvPSAyNTU7XG4gICAgcmdiYUFyclsyXSAvPSAyNTU7XG4gICAgcmV0dXJuIHJnYmFBcnI7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gaHNsYVxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmdiYVxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IHJnYmFcbiAqL1xuZnVuY3Rpb24gaHNsYTJyZ2JhKGhzbGEsIHJnYmEpIHtcbiAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQoaHNsYVswXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgdmFyIHMgPSBwYXJzZUNzc0Zsb2F0KGhzbGFbMV0pO1xuICAgIHZhciBsID0gcGFyc2VDc3NGbG9hdChoc2xhWzJdKTtcbiAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuXG4gICAgcmdiYSA9IHJnYmEgfHwgW107XG4gICAgc2V0UmdiYShyZ2JhLFxuICAgICAgICBjbGFtcENzc0J5dGUoY3NzSHVlVG9SZ2IobTEsIG0yLCBoICsgMSAvIDMpICogMjU1KSxcbiAgICAgICAgY2xhbXBDc3NCeXRlKGNzc0h1ZVRvUmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICBjbGFtcENzc0J5dGUoY3NzSHVlVG9SZ2IobTEsIG0yLCBoIC0gMSAvIDMpICogMjU1KSxcbiAgICAgICAgMVxuICAgICk7XG5cbiAgICBpZiAoaHNsYS5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgcmdiYVszXSA9IGhzbGFbM107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmdiYVxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IGhzbGFcbiAqL1xuZnVuY3Rpb24gcmdiYTJoc2xhKHJnYmEpIHtcbiAgICBpZiAoIXJnYmEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJHQiBmcm9tIDAgdG8gMjU1XG4gICAgdmFyIFIgPSByZ2JhWzBdIC8gMjU1O1xuICAgIHZhciBHID0gcmdiYVsxXSAvIDI1NTtcbiAgICB2YXIgQiA9IHJnYmFbMl0gLyAyNTU7XG5cbiAgICB2YXIgdk1pbiA9IE1hdGgubWluKFIsIEcsIEIpOyAvLyBNaW4uIHZhbHVlIG9mIFJHQlxuICAgIHZhciB2TWF4ID0gTWF0aC5tYXgoUiwgRywgQik7IC8vIE1heC4gdmFsdWUgb2YgUkdCXG4gICAgdmFyIGRlbHRhID0gdk1heCAtIHZNaW47IC8vIERlbHRhIFJHQiB2YWx1ZVxuXG4gICAgdmFyIEwgPSAodk1heCArIHZNaW4pIC8gMjtcbiAgICB2YXIgSDtcbiAgICB2YXIgUztcbiAgICAvLyBIU0wgcmVzdWx0cyBmcm9tIDAgdG8gMVxuICAgIGlmIChkZWx0YSA9PT0gMCkge1xuICAgICAgICBIID0gMDtcbiAgICAgICAgUyA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoTCA8IDAuNSkge1xuICAgICAgICAgICAgUyA9IGRlbHRhIC8gKHZNYXggKyB2TWluKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFMgPSBkZWx0YSAvICgyIC0gdk1heCAtIHZNaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRlbHRhUiA9ICgoKHZNYXggLSBSKSAvIDYpICsgKGRlbHRhIC8gMikpIC8gZGVsdGE7XG4gICAgICAgIHZhciBkZWx0YUcgPSAoKCh2TWF4IC0gRykgLyA2KSArIChkZWx0YSAvIDIpKSAvIGRlbHRhO1xuICAgICAgICB2YXIgZGVsdGFCID0gKCgodk1heCAtIEIpIC8gNikgKyAoZGVsdGEgLyAyKSkgLyBkZWx0YTtcblxuICAgICAgICBpZiAoUiA9PT0gdk1heCkge1xuICAgICAgICAgICAgSCA9IGRlbHRhQiAtIGRlbHRhRztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChHID09PSB2TWF4KSB7XG4gICAgICAgICAgICBIID0gKDEgLyAzKSArIGRlbHRhUiAtIGRlbHRhQjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChCID09PSB2TWF4KSB7XG4gICAgICAgICAgICBIID0gKDIgLyAzKSArIGRlbHRhRyAtIGRlbHRhUjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChIIDwgMCkge1xuICAgICAgICAgICAgSCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEggPiAxKSB7XG4gICAgICAgICAgICBIIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaHNsYSA9IFtIICogMzYwLCBTLCBMXTtcblxuICAgIGlmIChyZ2JhWzNdICE9IG51bGwpIHtcbiAgICAgICAgaHNsYS5wdXNoKHJnYmFbM10pO1xuICAgIH1cblxuICAgIHJldHVybiBoc2xhO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnpyZW5kZXIvdXRpbC9jb2xvclxuICovXG5jb2xvclV0aWwubGlmdCA9IGZ1bmN0aW9uIChjb2xvciwgbGV2ZWwpIHtcbiAgICB2YXIgY29sb3JBcnIgPSBjb2xvclV0aWwucGFyc2UoY29sb3IpO1xuICAgIGlmIChjb2xvckFycikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbG9yQXJyW2ldID0gY29sb3JBcnJbaV0gKiAoMSAtIGxldmVsKSB8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2xvckFycltpXSA9ICgoMjU1IC0gY29sb3JBcnJbaV0pICogbGV2ZWwgKyBjb2xvckFycltpXSkgfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclV0aWwuc3RyaW5naWZ5KGNvbG9yQXJyLCBjb2xvckFyci5sZW5ndGggPT09IDQgPyAncmdiYScgOiAncmdiJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICogQHJldHVybiB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTp6cmVuZGVyL3V0aWwvY29sb3JcbiAqL1xuY29sb3JVdGlsLnRvSGV4ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIGNvbG9yQXJyID0gY29sb3JVdGlsLnBhcnNlKGNvbG9yKTtcbiAgICBpZiAoY29sb3JBcnIpIHtcbiAgICAgICAgcmV0dXJuICgoMSA8PCAyNCkgKyAoY29sb3JBcnJbMF0gPDwgMTYpICsgKGNvbG9yQXJyWzFdIDw8IDgpICsgKCtjb2xvckFyclsyXSkpLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcbiAgICB9XG59XG5cbi8qKlxuICogTWFwIHZhbHVlIHRvIGNvbG9yLiBGYXN0ZXIgdGhhbiBsZXJwIG1ldGhvZHMgYmVjYXVzZSBjb2xvciBpcyByZXByZXNlbnRlZCBieSByZ2JhIGFycmF5LlxuICogQHBhcmFtIHtudW1iZXJ9IG5vcm1hbGl6ZWRWYWx1ZSBBIGZsb2F0IGJldHdlZW4gMCBhbmQgMS5cbiAqIEBwYXJhbSB7QXJyYXkuPEFycmF5LjxudW1iZXI+Pn0gY29sb3JzIExpc3Qgb2YgcmdiYSBjb2xvciBhcnJheVxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gW291dF0gTWFwcGVkIGdiYSBjb2xvciBhcnJheVxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IHdpbGwgYmUgbnVsbC91bmRlZmluZWQgaWYgaW5wdXQgaWxsZWdhbC5cbiAqL1xuY29sb3JVdGlsLmZhc3RMZXJwID0gZnVuY3Rpb24gKG5vcm1hbGl6ZWRWYWx1ZSwgY29sb3JzLCBvdXQpIHtcbiAgICBpZiAoIShjb2xvcnMgJiYgY29sb3JzLmxlbmd0aClcbiAgICAgICAgfHwgIShub3JtYWxpemVkVmFsdWUgPj0gMCAmJiBub3JtYWxpemVkVmFsdWUgPD0gMSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG91dCA9IG91dCB8fCBbXTtcblxuICAgIHZhciB2YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZSAqIChjb2xvcnMubGVuZ3RoIC0gMSk7XG4gICAgdmFyIGxlZnRJbmRleCA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIHZhciByaWdodEluZGV4ID0gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICB2YXIgbGVmdENvbG9yID0gY29sb3JzW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0Q29sb3IgPSBjb2xvcnNbcmlnaHRJbmRleF07XG4gICAgdmFyIGR2ID0gdmFsdWUgLSBsZWZ0SW5kZXg7XG4gICAgb3V0WzBdID0gY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzBdLCByaWdodENvbG9yWzBdLCBkdikpO1xuICAgIG91dFsxXSA9IGNsYW1wQ3NzQnl0ZShsZXJwTnVtYmVyKGxlZnRDb2xvclsxXSwgcmlnaHRDb2xvclsxXSwgZHYpKTtcbiAgICBvdXRbMl0gPSBjbGFtcENzc0J5dGUobGVycE51bWJlcihsZWZ0Q29sb3JbMl0sIHJpZ2h0Q29sb3JbMl0sIGR2KSk7XG4gICAgb3V0WzNdID0gY2xhbXBDc3NGbG9hdChsZXJwTnVtYmVyKGxlZnRDb2xvclszXSwgcmlnaHRDb2xvclszXSwgZHYpKTtcblxuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuY29sb3JVdGlsLmZhc3RNYXBUb0NvbG9yID0gY29sb3JVdGlsLmZhc3RMZXJwO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBub3JtYWxpemVkVmFsdWUgQSBmbG9hdCBiZXR3ZWVuIDAgYW5kIDEuXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgQ29sb3IgbGlzdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGZ1bGxPdXRwdXQgRGVmYXVsdCBmYWxzZS5cbiAqIEByZXR1cm4geyhzdHJpbmd8T2JqZWN0KX0gUmVzdWx0IGNvbG9yLiBJZiBmdWxsT3V0cHV0LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiAuLi4sIGxlZnRJbmRleDogLi4uLCByaWdodEluZGV4OiAuLi4sIHZhbHVlOiAuLi59LFxuICogQG1lbWJlck9mIG1vZHVsZTp6cmVuZGVyL3V0aWwvY29sb3JcbiAqL1xuY29sb3JVdGlsLmxlcnAgPSBmdW5jdGlvbiAobm9ybWFsaXplZFZhbHVlLCBjb2xvcnMsIGZ1bGxPdXRwdXQpIHtcbiAgICBpZiAoIShjb2xvcnMgJiYgY29sb3JzLmxlbmd0aClcbiAgICAgICAgfHwgIShub3JtYWxpemVkVmFsdWUgPj0gMCAmJiBub3JtYWxpemVkVmFsdWUgPD0gMSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZSAqIChjb2xvcnMubGVuZ3RoIC0gMSk7XG4gICAgdmFyIGxlZnRJbmRleCA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIHZhciByaWdodEluZGV4ID0gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICB2YXIgbGVmdENvbG9yID0gY29sb3JVdGlsLnBhcnNlKGNvbG9yc1tsZWZ0SW5kZXhdKTtcbiAgICB2YXIgcmlnaHRDb2xvciA9IGNvbG9yVXRpbC5wYXJzZShjb2xvcnNbcmlnaHRJbmRleF0pO1xuICAgIHZhciBkdiA9IHZhbHVlIC0gbGVmdEluZGV4O1xuXG4gICAgdmFyIGNvbG9yID0gY29sb3JVdGlsLnN0cmluZ2lmeShcbiAgICAgICAgW1xuICAgICAgICAgICAgY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzBdLCByaWdodENvbG9yWzBdLCBkdikpLFxuICAgICAgICAgICAgY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzFdLCByaWdodENvbG9yWzFdLCBkdikpLFxuICAgICAgICAgICAgY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzJdLCByaWdodENvbG9yWzJdLCBkdikpLFxuICAgICAgICAgICAgY2xhbXBDc3NGbG9hdChsZXJwTnVtYmVyKGxlZnRDb2xvclszXSwgcmlnaHRDb2xvclszXSwgZHYpKVxuICAgICAgICBdLFxuICAgICAgICAncmdiYSdcbiAgICApO1xuXG4gICAgcmV0dXJuIGZ1bGxPdXRwdXRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICAgICAgICBsZWZ0SW5kZXg6IGxlZnRJbmRleCxcbiAgICAgICAgICAgIHJpZ2h0SW5kZXg6IHJpZ2h0SW5kZXgsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfVxuICAgICAgICA6IGNvbG9yO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmNvbG9yVXRpbC5tYXBUb0NvbG9yID0gY29sb3JVdGlsLmxlcnA7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gKiBAcGFyYW0ge251bWJlcj19IGggMCB+IDM2MCwgaWdub3JlIHdoZW4gbnVsbC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gcyAwIH4gMSwgaWdub3JlIHdoZW4gbnVsbC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gbCAwIH4gMSwgaWdub3JlIHdoZW4gbnVsbC5cbiAqIEByZXR1cm4ge3N0cmluZ30gQ29sb3Igc3RyaW5nIGluIHJnYmEgZm9ybWF0LlxuICogQG1lbWJlck9mIG1vZHVsZTp6cmVuZGVyL3V0aWwvY29sb3JcbiAqL1xuY29sb3JVdGlsLm1vZGlmeUhTTCA9IGZ1bmN0aW9uIChjb2xvciwgaCwgcywgbCkge1xuICAgIGNvbG9yID0gY29sb3JVdGlsLnBhcnNlKGNvbG9yKTtcblxuICAgIGlmIChjb2xvcikge1xuICAgICAgICBjb2xvciA9IHJnYmEyaHNsYShjb2xvcik7XG4gICAgICAgIGggIT0gbnVsbCAmJiAoY29sb3JbMF0gPSBjbGFtcENzc0FuZ2xlKGgpKTtcbiAgICAgICAgcyAhPSBudWxsICYmIChjb2xvclsxXSA9IHBhcnNlQ3NzRmxvYXQocykpO1xuICAgICAgICBsICE9IG51bGwgJiYgKGNvbG9yWzJdID0gcGFyc2VDc3NGbG9hdChsKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbG9yVXRpbC5zdHJpbmdpZnkoaHNsYTJyZ2JhKGNvbG9yKSwgJ3JnYmEnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gKiBAcGFyYW0ge251bWJlcj19IGFscGhhIDAgfiAxXG4gKiBAcmV0dXJuIHtzdHJpbmd9IENvbG9yIHN0cmluZyBpbiByZ2JhIGZvcm1hdC5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6enJlbmRlci91dGlsL2NvbG9yXG4gKi9cbmNvbG9yVXRpbC5tb2RpZnlBbHBoYSA9IGZ1bmN0aW9uIChjb2xvciwgYWxwaGEpIHtcbiAgICBjb2xvciA9IGNvbG9yVXRpbC5wYXJzZShjb2xvcik7XG5cbiAgICBpZiAoY29sb3IgJiYgYWxwaGEgIT0gbnVsbCkge1xuICAgICAgICBjb2xvclszXSA9IGNsYW1wQ3NzRmxvYXQoYWxwaGEpO1xuICAgICAgICByZXR1cm4gY29sb3JVdGlsLnN0cmluZ2lmeShjb2xvciwgJ3JnYmEnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyQ29sb3IgbGlrZSBbMTIsMzMsNDQsMC40XVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgJ3JnYmEnLCAnaHN2YScsIC4uLlxuICogQHJldHVybiB7c3RyaW5nfSBSZXN1bHQgY29sb3IuIChJZiBpbnB1dCBpbGxlZ2FsLCByZXR1cm4gdW5kZWZpbmVkKS5cbiAqL1xuY29sb3JVdGlsLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChhcnJDb2xvciwgdHlwZSkge1xuICAgIGlmICghYXJyQ29sb3IgfHwgIWFyckNvbG9yLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjb2xvclN0ciA9IGFyckNvbG9yWzBdICsgJywnICsgYXJyQ29sb3JbMV0gKyAnLCcgKyBhcnJDb2xvclsyXTtcbiAgICBpZiAodHlwZSA9PT0gJ3JnYmEnIHx8IHR5cGUgPT09ICdoc3ZhJyB8fCB0eXBlID09PSAnaHNsYScpIHtcbiAgICAgICAgY29sb3JTdHIgKz0gJywnICsgYXJyQ29sb3JbM107XG4gICAgfVxuICAgIHJldHVybiB0eXBlICsgJygnICsgY29sb3JTdHIgKyAnKSc7XG59O1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29sb3JVdGlsOyIsImltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vVGV4dHVyZSc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5pbXBvcnQgY29sb3JVdGlsIGZyb20gJy4vY29yZS9jb2xvcic7XG52YXIgcGFyc2VDb2xvciA9IGNvbG9yVXRpbC5wYXJzZVRvRmxvYXQ7XG5cbnZhciBwcm9ncmFtS2V5Q2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmaW5lQ29kZShkZWZpbmVzLCBsaWdodHNOdW1iZXJzLCBlbmFibGVkVGV4dHVyZXMpIHtcbiAgICB2YXIgZGVmaW5lS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluZXMpO1xuICAgIGRlZmluZUtleXMuc29ydCgpO1xuICAgIHZhciBkZWZpbmVTdHIgPSBbXTtcbiAgICAvLyBDdXN0b20gRGVmaW5lc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmaW5lS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gZGVmaW5lS2V5c1tpXTtcbiAgICAgICAgdmFyIHZhbHVlID0gZGVmaW5lc1trZXldO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlZmluZVN0ci5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGRlZmluZVN0ci5wdXNoKGtleSArICcgJyArIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVTdHIuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldFByb2dyYW1LZXkodmVydGV4RGVmaW5lcywgZnJhZ21lbnREZWZpbmVzLCBlbmFibGVkVGV4dHVyZXMpIHtcbiAgICBlbmFibGVkVGV4dHVyZXMuc29ydCgpO1xuICAgIHZhciBkZWZpbmVTdHIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuYWJsZWRUZXh0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3ltYm9sID0gZW5hYmxlZFRleHR1cmVzW2ldO1xuICAgICAgICBkZWZpbmVTdHIucHVzaChzeW1ib2wpO1xuICAgIH1cbiAgICB2YXIga2V5ID0gZ2V0RGVmaW5lQ29kZSh2ZXJ0ZXhEZWZpbmVzKSArICdcXG4nXG4gICAgICAgICsgZ2V0RGVmaW5lQ29kZShmcmFnbWVudERlZmluZXMpICsgJ1xcbidcbiAgICAgICAgKyBkZWZpbmVTdHIuam9pbignXFxuJyk7XG5cbiAgICBpZiAocHJvZ3JhbUtleUNhY2hlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW1LZXlDYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHZhciBpZCA9IHV0aWwuZ2VuR1VJRCgpO1xuICAgIHByb2dyYW1LZXlDYWNoZVtrZXldID0gaWQ7XG4gICAgcmV0dXJuIGlkO1xufVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lk1hdGVyaWFsXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgTWF0ZXJpYWwgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5NYXRlcmlhbCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgLy8gdW5pZm9ybXM6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlNoYWRlcn1cbiAgICAgICAgICovXG4gICAgICAgIC8vIHNoYWRlcjogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBkZXB0aFRlc3Q6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwdGhNYXNrOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zcGFyZW50OiBmYWxzZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsZW5kIGZ1bmMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBtYXRlcmlhbFxuICAgICAgICAgKiBoYXZlIGN1c3RvbSBibGVuZGluZ1xuICAgICAgICAgKiBUaGUgZ2wgY29udGV4dCB3aWxsIGJlIHRoZSBvbmx5IGFyZ3VtZW50IHBhc3NlZCBpbiB0aG8gdGhlXG4gICAgICAgICAqIGJsZW5kIGZ1bmN0aW9uXG4gICAgICAgICAqIERldGFpbCBvZiBibGVuZCBmdW5jdGlvbiBpbiBXZWJHTDpcbiAgICAgICAgICogaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL3NwZWNzLzIuMC9lc19mdWxsX3NwZWNfMi4wLjI1LnBkZlxuICAgICAgICAgKlxuICAgICAgICAgKiBFeGFtcGxlIDpcbiAgICAgICAgICogZnVuY3Rpb24oX2dsKSB7XG4gICAgICAgICAqICBfZ2wuYmxlbmRFcXVhdGlvbihfZ2wuRlVOQ19BREQpO1xuICAgICAgICAgKiAgX2dsLmJsZW5kRnVuYyhfZ2wuU1JDX0FMUEhBLCBfZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgICAqIH1cbiAgICAgICAgICovXG4gICAgICAgIGJsZW5kOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB1cGRhdGUgdGV4dHVyZSBzdGF0dXMgYXV0b21hdGljYWxseS5cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9VcGRhdGVUZXh0dXJlU3RhdHVzOiB0cnVlLFxuXG4gICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgdmVydGV4RGVmaW5lczoge30sXG4gICAgICAgIGZyYWdtZW50RGVmaW5lczoge30sXG4gICAgICAgIF90ZXh0dXJlU3RhdHVzOiB7fSxcblxuICAgICAgICAvLyBzaGFkb3dUcmFuc3BhcmVudE1hcCA6IG51bGxcblxuICAgICAgICAvLyBQRU5ESU5HIGVuYWJsZSB0aGUgdW5pZm9ybSB0aGF0IG9ubHkgdXNlZCBpbiBzaGFkZXIuXG4gICAgICAgIF9lbmFibGVkVW5pZm9ybXM6IG51bGwsXG4gICAgfTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMubmFtZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSAnTUFURVJJQUxfJyArIHRoaXMuX191aWRfXztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaGFkZXIpIHtcbiAgICAgICAgLy8gS2VlcCBzdGF0dXMsIG1haW5seSBwcmVzZXQgdW5pZm9ybXMsIHZlcnRleERlZmluZXMgYW5kIGZyYWdtZW50RGVmaW5lc1xuICAgICAgICB0aGlzLmF0dGFjaFNoYWRlcih0aGlzLnNoYWRlciwgdHJ1ZSk7XG4gICAgfVxufSxcbi8qKiBAbGVuZHMgY2xheS5NYXRlcmlhbC5wcm90b3R5cGUgKi9cbntcbiAgICBwcmVjaXNpb246ICdoaWdocCcsXG5cbiAgICBiaW5kOiBmdW5jdGlvbihyZW5kZXJlciwgcHJvZ3JhbSwgcHJldk1hdGVyaWFsLCBwcmV2UHJvZ3JhbSkge1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIC8vIFBFTkRJTkcgU2FtZSB0ZXh0dXJlIGluIGRpZmZlcmVudCBtYXRlcmlhbCB0YWtlIGRpZmZlcmVudCBzbG90P1xuXG4gICAgICAgIC8vIE1heSB1c2Ugc2hhZGVyIG9mIG90aGVyIG1hdGVyaWFsIGlmIHNoYWRlciBjb2RlIGFyZSBzYW1lXG5cbiAgICAgICAgLy8gdmFyIHNhbWVQcm9ncmFtID0gcHJldlByb2dyYW0gPT09IHByb2dyYW07XG5cbiAgICAgICAgdmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IHByb2dyYW0uY3VycmVudFRleHR1cmVTbG90KCk7XG5cbiAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCB0aGlzLl9lbmFibGVkVW5pZm9ybXMubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSB0aGlzLl9lbmFibGVkVW5pZm9ybXNbdV07XG4gICAgICAgICAgICB2YXIgdW5pZm9ybVZhbHVlID0gdGhpcy51bmlmb3Jtc1tzeW1ib2xdLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm1WYWx1ZSBpbnN0YW5jZW9mIFRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCBzbG90XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlLl9fc2xvdCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bmlmb3JtVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1WYWx1ZVtpXSBpbnN0YW5jZW9mIFRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZVtpXS5fX3Nsb3QgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdW5pZm9ybXNcbiAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCB0aGlzLl9lbmFibGVkVW5pZm9ybXMubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSB0aGlzLl9lbmFibGVkVW5pZm9ybXNbdV07XG4gICAgICAgICAgICB2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbc3ltYm9sXTtcbiAgICAgICAgICAgIHZhciB1bmlmb3JtVmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuICAgICAgICAgICAgLy8gUEVORElOR1xuICAgICAgICAgICAgLy8gV2hlbiBiaW5kaW5nIHR3byBtYXRlcmlhbHMgd2l0aCB0aGUgc2FtZSBzaGFkZXJcbiAgICAgICAgICAgIC8vIE1hbnkgdW5pZm9ybXMgd2lsbCBiZSBiZSBzZXQgdHdpY2UgZXZlbiBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgdmFsdWVcbiAgICAgICAgICAgIC8vIFNvIGFkZCBhIGV2YWx1YXRpb24gdG8gc2VlIGlmIHRoZSB1bmlmb3JtIGlzIHJlYWxseSBuZWVkZWQgdG8gYmUgc2V0XG4gICAgICAgICAgICAvLyBpZiAocHJldk1hdGVyaWFsICYmIHNhbWVTaGFkZXIpIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAocHJldk1hdGVyaWFsLnVuaWZvcm1zW3N5bWJvbF0udmFsdWUgPT09IHVuaWZvcm1WYWx1ZSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmICh1bmlmb3JtVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBBc3N1bWUgbWF0ZXJpYWwgd2l0aCBzYW1lIHNoYWRlciBoYXZlIHNhbWUgb3JkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAvLyBPciBpZiBkaWZmZXJlbnQgbWF0ZXJpYWwgdXNlIHNhbWUgdGV4dHVyZXMsXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNsb3Qgd2lsbCBiZSBkaWZmZXJlbnQgYW5kIHN0aWxsIHNraXBwZWQgYmVjYXVzZSBvcHRpbWl6YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNsb3QgPSBwcm9ncmFtLmN1cnJlbnRUZXh0dXJlU2xvdCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gcHJvZ3JhbS5zZXRVbmlmb3JtKF9nbCwgJzFpJywgc3ltYm9sLCBzbG90KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgeyAvLyBUZXh0dXJlIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIG9jY3VweSB0aGUgc2xvdCB0byBtYWtlIHN1cmUgc2FtZSB0ZXh0dXJlIGluIGRpZmZlcmVudCBtYXRlcmlhbHMgaGF2ZSBzYW1lIHNsb3QuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnRha2VDdXJyZW50VGV4dHVyZVNsb3QocmVuZGVyZXIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5pZm9ybVZhbHVlIGluc3RhbmNlb2YgVGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtVmFsdWUuX19zbG90IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2xvdCA9IHByb2dyYW0uY3VycmVudFRleHR1cmVTbG90KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBwcm9ncmFtLnNldFVuaWZvcm0oX2dsLCAnMWknLCBzeW1ib2wsIHNsb3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcykgeyAvLyBUZXh0dXJlIHVuaWZvcm0gaXMgbm90IGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0udGFrZUN1cnJlbnRUZXh0dXJlU2xvdChyZW5kZXJlciwgdW5pZm9ybVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlLl9fc2xvdCA9IHNsb3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIHVuaWZvcm0gdXNlIHNhbWUgdGV4dHVyZS4uXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShfZ2wsICcxaScsIHN5bWJvbCwgdW5pZm9ybVZhbHVlLl9fc2xvdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1WYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgQXJyYXlcbiAgICAgICAgICAgICAgICB2YXIgZXhhbXBsZVZhbHVlID0gdW5pZm9ybVZhbHVlWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4YW1wbGVWYWx1ZSBpbnN0YW5jZW9mIFRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9ncmFtLmhhc1VuaWZvcm0oc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5pZm9ybVZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHVuaWZvcm1WYWx1ZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUuX19zbG90IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzbG90ID0gcHJvZ3JhbS5jdXJyZW50VGV4dHVyZVNsb3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChzbG90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnRha2VDdXJyZW50VGV4dHVyZVNsb3QocmVuZGVyZXIsIHRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuX19zbG90ID0gc2xvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRleHR1cmUuX19zbG90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShfZ2wsICcxaXYnLCBzeW1ib2wsIGFycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oX2dsLCB1bmlmb3JtLnR5cGUsIHN5bWJvbCwgdW5pZm9ybVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShfZ2wsIHVuaWZvcm0udHlwZSwgc3ltYm9sLCB1bmlmb3JtVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmUgc2xvdCBtYXliZSB1c2VkIG91dCBvZiBtYXRlcmlhbC5cbiAgICAgICAgcHJvZ3JhbS5yZXNldFRleHR1cmVTbG90KGN1cnJlbnRUZXh0dXJlU2xvdCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBtYXRlcmlhbCB1bmlmb3JtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgbWF0LnNldFVuaWZvcm0oJ2NvbG9yJywgWzEsIDEsIDEsIDFdKTtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHBhcmFtIHtudW1iZXJ8YXJyYXl8Y2xheS5UZXh0dXJlfEFycmF5QnVmZmVyVmlld30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRVbmlmb3JtOiBmdW5jdGlvbiAoc3ltYm9sLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmlmb3JtIHZhbHVlIFwiJyArIHN5bWJvbCArICdcIiBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHVuaWZvcm0pIHtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcGFyc2UgYXMgYSBjb2xvci4gSW52YWxpZCBjb2xvciBzdHJpbmcgd2lsbCByZXR1cm4gbnVsbC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlQ29sb3IodmFsdWUpIHx8IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1bmlmb3JtLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVUZXh0dXJlU3RhdHVzICYmIHVuaWZvcm0udHlwZSA9PT0gJ3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlVGV4dHVyZShzeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlVGV4dHVyZShzeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAgICovXG4gICAgc2V0VW5pZm9ybXM6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICB0aGlzLnNldFVuaWZvcm0oa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIC8qKlxuICAgIC8vICAqIEVuYWJsZSBhIHVuaWZvcm1cbiAgICAvLyAgKiBJdCBvbmx5IGhhdmUgZWZmZWN0IG9uIHRoZSB1bmlmb3JtIGV4aXN0cyBpbiBzaGFkZXIuXG4gICAgLy8gICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAvLyAgKi9cbiAgICAvLyBlbmFibGVVbmlmb3JtOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLnVuaWZvcm1zW3N5bWJvbF0gJiYgIXRoaXMuaXNVbmlmb3JtRW5hYmxlZChzeW1ib2wpKSB7XG4gICAgLy8gICAgICAgICB0aGlzLl9lbmFibGVkVW5pZm9ybXMucHVzaChzeW1ib2wpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcblxuICAgIC8vIC8qKlxuICAgIC8vICAqIERpc2FibGUgYSB1bmlmb3JtXG4gICAgLy8gICogSXQgd2lsbCBub3QgYWZmZWN0IHRoZSB1bmlmb3JtIHN0YXRlIGluIHRoZSBzaGFkZXIuIEJlY2F1c2UgdGhlIHNoYWRlciB1bmlmb3JtcyBpcyBwYXJzZWQgZnJvbSBzaGFkZXIgY29kZSB3aXRoIG5haXZlIHJlZ2V4LiBXaGVuIHVzaW5nIG1pY3JvIHRvIGRpc2FibGUgc29tZSB1bmlmb3JtcyBpbiB0aGUgc2hhZGVyLiBJdCB3aWxsIHN0aWxsIHRyeSB0byBzZXQgdGhlc2UgdW5pZm9ybXMgaW4gZWFjaCByZW5kZXJpbmcgcGFzcy4gV2UgY2FuIGRpc2FibGUgdGhlc2UgdW5pZm9ybXMgbWFudWFsbHkgaWYgd2UgbmVlZCB0aGlzIGJpdCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4gTW9zdGx5IHdlIGNhbiBzaW1wbHkgaWdub3JlIGl0LlxuICAgIC8vICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgLy8gICovXG4gICAgLy8gZGlzYWJsZVVuaWZvcm06IGZ1bmN0aW9uIChzeW1ib2wpIHtcbiAgICAvLyAgICAgdmFyIGlkeCA9IHRoaXMuX2VuYWJsZWRVbmlmb3Jtcy5pbmRleE9mKHN5bWJvbCk7XG4gICAgLy8gICAgIGlmIChpZHggPj0gMCkge1xuICAgIC8vICAgICAgICAgdGhpcy5fZW5hYmxlZFVuaWZvcm1zLnNwbGljZShpZHgsIDEpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gIHN5bWJvbFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNVbmlmb3JtRW5hYmxlZDogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZFVuaWZvcm1zLmluZGV4T2Yoc3ltYm9sKSA+PSAwO1xuICAgIH0sXG5cbiAgICBnZXRFbmFibGVkVW5pZm9ybXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWRVbmlmb3JtcztcbiAgICB9LFxuICAgIGdldFRleHR1cmVVbmlmb3JtczogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dHVyZVVuaWZvcm1zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBvZiBzZXRVbmlmb3JtIGFuZCBzZXRVbmlmb3Jtc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fHN0cmluZ30gc3ltYm9sXG4gICAgICogQHBhcmFtIHtudW1iZXJ8YXJyYXl8Y2xheS5UZXh0dXJlfEFycmF5QnVmZmVyVmlld30gW3ZhbHVlXVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gKHN5bWJvbCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZihzeW1ib2wpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHN5bWJvbCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBzeW1ib2xba2V5XTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFVuaWZvcm0oa2V5LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRVbmlmb3JtKHN5bWJvbCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdW5pZm9ybSB2YWx1ZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHJldHVybiB7bnVtYmVyfGFycmF5fGNsYXkuVGV4dHVyZXxBcnJheUJ1ZmZlclZpZXd9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIHZhciB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1tzeW1ib2xdO1xuICAgICAgICBpZiAodW5pZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuaWZvcm0udmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEF0dGFjaCBhIHNoYWRlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSAge2NsYXkuU2hhZGVyfSBzaGFkZXJcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBrZWVwU3RhdHVzIElmIHRyeSB0byBrZWVwIHVuaWZvcm0gYW5kIHRleHR1cmVcbiAgICAgKi9cbiAgICBhdHRhY2hTaGFkZXI6IGZ1bmN0aW9uKHNoYWRlciwga2VlcFN0YXR1cykge1xuICAgICAgICB2YXIgb3JpZ2luYWxVbmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XG5cbiAgICAgICAgLy8gSWdub3JlIGlmIHVuaWZvcm0gY2FuIHVzZSBpbiBzaGFkZXIuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSBzaGFkZXIuY3JlYXRlVW5pZm9ybXMoKTtcbiAgICAgICAgdGhpcy5zaGFkZXIgPSBzaGFkZXI7XG5cbiAgICAgICAgdmFyIHVuaWZvcm1zID0gdGhpcy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5fZW5hYmxlZFVuaWZvcm1zID0gT2JqZWN0LmtleXModW5pZm9ybXMpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdW5pZm9ybXMgYXJlIHNldCBpbiBzYW1lIG9yZGVyIHRvIGF2b2lkIHRleHR1cmUgc2xvdCB3cm9uZ1xuICAgICAgICB0aGlzLl9lbmFibGVkVW5pZm9ybXMuc29ydCgpO1xuICAgICAgICB0aGlzLl90ZXh0dXJlVW5pZm9ybXMgPSB0aGlzLl9lbmFibGVkVW5pZm9ybXMuZmlsdGVyKGZ1bmN0aW9uICh1bmlmb3JtTmFtZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnVuaWZvcm1zW3VuaWZvcm1OYW1lXS50eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICd0JyB8fCB0eXBlID09PSAndHYnO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB2YXIgb3JpZ2luYWxWZXJ0ZXhEZWZpbmVzID0gdGhpcy52ZXJ0ZXhEZWZpbmVzO1xuICAgICAgICB2YXIgb3JpZ2luYWxGcmFnbWVudERlZmluZXMgPSB0aGlzLmZyYWdtZW50RGVmaW5lcztcblxuICAgICAgICB0aGlzLnZlcnRleERlZmluZXMgPSB1dGlsLmNsb25lKHNoYWRlci52ZXJ0ZXhEZWZpbmVzKTtcbiAgICAgICAgdGhpcy5mcmFnbWVudERlZmluZXMgPSB1dGlsLmNsb25lKHNoYWRlci5mcmFnbWVudERlZmluZXMpO1xuXG4gICAgICAgIGlmIChrZWVwU3RhdHVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gb3JpZ2luYWxVbmlmb3Jtcykge1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3Jtc1tzeW1ib2xdKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW3N5bWJvbF0udmFsdWUgPSBvcmlnaW5hbFVuaWZvcm1zW3N5bWJvbF0udmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1dGlsLmRlZmF1bHRzKHRoaXMudmVydGV4RGVmaW5lcywgb3JpZ2luYWxWZXJ0ZXhEZWZpbmVzKTtcbiAgICAgICAgICAgIHV0aWwuZGVmYXVsdHModGhpcy5mcmFnbWVudERlZmluZXMsIG9yaWdpbmFsRnJhZ21lbnREZWZpbmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0dXJlU3RhdHVzID0ge307XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzaGFkZXIudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRleHR1cmVTdGF0dXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBzaGFkZXJUeXBlOiBzaGFkZXIudGV4dHVyZXNba2V5XS5zaGFkZXJUeXBlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHNoYWRlci50ZXh0dXJlc1trZXldLnR5cGUsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogKGtlZXBTdGF0dXMgJiYgdGhpcy5fdGV4dHVyZVN0YXR1c1trZXldKSA/IHRoaXMuX3RleHR1cmVTdGF0dXNba2V5XS5lbmFibGVkIDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZXh0dXJlU3RhdHVzID0gdGV4dHVyZVN0YXR1cztcblxuICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gJyc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IG1hdGVyaWFsIGFuZCBrZWVwIHVuaWZvcm1zLCBzaGFkZXIgd2lsbCBub3QgYmUgY2xvbmVkXG4gICAgICogQHJldHVybiB7Y2xheS5NYXRlcmlhbH1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBzaGFkZXI6IHRoaXMuc2hhZGVyXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgbWF0ZXJpYWwudW5pZm9ybXNbc3ltYm9sXS52YWx1ZSA9IHRoaXMudW5pZm9ybXNbc3ltYm9sXS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRlcmlhbC5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcbiAgICAgICAgbWF0ZXJpYWwuZGVwdGhNYXNrID0gdGhpcy5kZXB0aE1hc2s7XG4gICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcbiAgICAgICAgbWF0ZXJpYWwuYmxlbmQgPSB0aGlzLmJsZW5kO1xuXG4gICAgICAgIG1hdGVyaWFsLnZlcnRleERlZmluZXMgPSB1dGlsLmNsb25lKHRoaXMudmVydGV4RGVmaW5lcyk7XG4gICAgICAgIG1hdGVyaWFsLmZyYWdtZW50RGVmaW5lcyA9IHV0aWwuY2xvbmUodGhpcy5mcmFnbWVudERlZmluZXMpO1xuICAgICAgICBtYXRlcmlhbC5lbmFibGVUZXh0dXJlKHRoaXMuZ2V0RW5hYmxlZFRleHR1cmVzKCkpO1xuICAgICAgICBtYXRlcmlhbC5wcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbjtcblxuICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhICNkZWZpbmUgbWFjcm8gaW4gc2hhZGVyIGNvZGVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHNoYWRlclR5cGUgQ2FuIGJlIHZlcnRleCwgZnJhZ21lbnQgb3IgYm90aFxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbdmFsXVxuICAgICAqL1xuICAgIGRlZmluZTogZnVuY3Rpb24gKHNoYWRlclR5cGUsIHN5bWJvbCwgdmFsKSB7XG4gICAgICAgIHZhciB2ZXJ0ZXhEZWZpbmVzID0gdGhpcy52ZXJ0ZXhEZWZpbmVzO1xuICAgICAgICB2YXIgZnJhZ21lbnREZWZpbmVzID0gdGhpcy5mcmFnbWVudERlZmluZXM7XG4gICAgICAgIGlmIChzaGFkZXJUeXBlICE9PSAndmVydGV4JyAmJiBzaGFkZXJUeXBlICE9PSAnZnJhZ21lbnQnICYmIHNoYWRlclR5cGUgIT09ICdib3RoJ1xuICAgICAgICAgICAgJiYgYXJndW1lbnRzLmxlbmd0aCA8IDNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBzaGFkZXJUeXBlIGRlZmF1bHQgdG8gYmUgJ2JvdGgnXG4gICAgICAgICAgICB2YWwgPSBzeW1ib2w7XG4gICAgICAgICAgICBzeW1ib2wgPSBzaGFkZXJUeXBlO1xuICAgICAgICAgICAgc2hhZGVyVHlwZSA9ICdib3RoJztcbiAgICAgICAgfVxuICAgICAgICB2YWwgPSB2YWwgIT0gbnVsbCA/IHZhbCA6IG51bGw7XG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSAndmVydGV4JyB8fCBzaGFkZXJUeXBlID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgIGlmICh2ZXJ0ZXhEZWZpbmVzW3N5bWJvbF0gIT09IHZhbCkge1xuICAgICAgICAgICAgICAgIHZlcnRleERlZmluZXNbc3ltYm9sXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIGRpcnR5XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSAnZnJhZ21lbnQnIHx8IHNoYWRlclR5cGUgPT09ICdib3RoJykge1xuICAgICAgICAgICAgaWYgKGZyYWdtZW50RGVmaW5lc1tzeW1ib2xdICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudERlZmluZXNbc3ltYm9sXSA9IHZhbDtcbiAgICAgICAgICAgICAgICBpZiAoc2hhZGVyVHlwZSAhPT0gJ2JvdGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyYW1LZXkgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgI2RlZmluZSBtYWNybyBpbiBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc2hhZGVyVHlwZSBDYW4gYmUgdmVydGV4LCBmcmFnbWVudCBvciBib3RoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKi9cbiAgICB1bmRlZmluZTogZnVuY3Rpb24gKHNoYWRlclR5cGUsIHN5bWJvbCkge1xuICAgICAgICBpZiAoc2hhZGVyVHlwZSAhPT0gJ3ZlcnRleCcgJiYgc2hhZGVyVHlwZSAhPT0gJ2ZyYWdtZW50JyAmJiBzaGFkZXJUeXBlICE9PSAnYm90aCdcbiAgICAgICAgICAgICYmIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gc2hhZGVyVHlwZSBkZWZhdWx0IHRvIGJlICdib3RoJ1xuICAgICAgICAgICAgc3ltYm9sID0gc2hhZGVyVHlwZTtcbiAgICAgICAgICAgIHNoYWRlclR5cGUgPSAnYm90aCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRlclR5cGUgPT09ICd2ZXJ0ZXgnIHx8IHNoYWRlclR5cGUgPT09ICdib3RoJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKCd2ZXJ0ZXgnLCBzeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudmVydGV4RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgZGlydHlcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRlclR5cGUgPT09ICdmcmFnbWVudCcgfHwgc2hhZGVyVHlwZSA9PT0gJ2JvdGgnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQoJ2ZyYWdtZW50Jywgc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZyYWdtZW50RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICAgICAgICAgIGlmIChzaGFkZXJUeXBlICE9PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBtYWNybyBpcyBkZWZpbmVkIGluIHNoYWRlci5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHNoYWRlclR5cGUgQ2FuIGJlIHZlcnRleCwgZnJhZ21lbnQgb3IgYm90aFxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICovXG4gICAgaXNEZWZpbmVkOiBmdW5jdGlvbiAoc2hhZGVyVHlwZSwgc3ltYm9sKSB7XG4gICAgICAgIC8vIFBFTkRJTkcgaGFzT3duUHJvcGVydHkgP1xuICAgICAgICBzd2l0Y2ggKHNoYWRlclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnRleCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4RGVmaW5lc1tzeW1ib2xdICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYXNlICdmcmFnbWVudCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJhZ21lbnREZWZpbmVzW3N5bWJvbF0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IG1hY3JvIHZhbHVlIGRlZmluZWQgaW4gc2hhZGVyLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc2hhZGVyVHlwZSBDYW4gYmUgdmVydGV4LCBmcmFnbWVudCBvciBib3RoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKi9cbiAgICBnZXREZWZpbmU6IGZ1bmN0aW9uIChzaGFkZXJUeXBlLCBzeW1ib2wpIHtcbiAgICAgICAgc3dpdGNoKHNoYWRlclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnRleCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICAgICAgY2FzZSAnZnJhZ21lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYWdtZW50RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmFibGUgYSB0ZXh0dXJlLCBhY3R1YWxseSBpdCB3aWxsIGFkZCBhICNkZWZpbmUgbWFjcm8gaW4gdGhlIHNoYWRlciBjb2RlXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIHRleHR1cmUgc3ltYm9sIGlzIGRpZmZ1c2VNYXAsIGl0IHdpbGwgYWRkIGEgbGluZSBgI2RlZmluZSBESUZGVVNFTUFQX0VOQUJMRURgIGluIHRoZSBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICovXG4gICAgZW5hYmxlVGV4dHVyZTogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzeW1ib2wpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlVGV4dHVyZShzeW1ib2xbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3RleHR1cmVTdGF0dXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdmFyIGlzRW5hYmxlZCA9IHN0YXR1cy5lbmFibGVkO1xuICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmFibGUgYWxsIHRleHR1cmVzIHVzZWQgaW4gdGhlIHNoYWRlclxuICAgICAqL1xuICAgIGVuYWJsZVRleHR1cmVzQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlU3RhdHVzID0gdGhpcy5fdGV4dHVyZVN0YXR1cztcbiAgICAgICAgZm9yICh2YXIgc3ltYm9sIGluIHRleHR1cmVTdGF0dXMpIHtcbiAgICAgICAgICAgIHRleHR1cmVTdGF0dXNbc3ltYm9sXS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Byb2dyYW1LZXkgPSAnJztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgYSB0ZXh0dXJlLCBpdCByZW1vdmUgYSAjZGVmaW5lIG1hY3JvIGluIHRoZSBzaGFkZXJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHN5bWJvbFxuICAgICAqL1xuICAgIGRpc2FibGVUZXh0dXJlOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN5bWJvbCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlVGV4dHVyZShzeW1ib2xbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3RleHR1cmVTdGF0dXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdmFyIGlzRGlzYWJsZWQgPSAhIHN0YXR1cy5lbmFibGVkO1xuICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgYWxsIHRleHR1cmVzIHVzZWQgaW4gdGhlIHNoYWRlclxuICAgICAqL1xuICAgIGRpc2FibGVUZXh0dXJlc0FsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGV4dHVyZVN0YXR1cyA9IHRoaXMuX3RleHR1cmVTdGF0dXM7XG4gICAgICAgIGZvciAodmFyIHN5bWJvbCBpbiB0ZXh0dXJlU3RhdHVzKSB7XG4gICAgICAgICAgICB0ZXh0dXJlU3RhdHVzW3N5bWJvbF0uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogSWYgdGV4dHVyZSBvZiBnaXZlbiB0eXBlIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSAgc3ltYm9sXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1RleHR1cmVFbmFibGVkOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlU3RhdHVzID0gdGhpcy5fdGV4dHVyZVN0YXR1cztcbiAgICAgICAgcmV0dXJuICEhdGV4dHVyZVN0YXR1c1tzeW1ib2xdXG4gICAgICAgICAgICAmJiB0ZXh0dXJlU3RhdHVzW3N5bWJvbF0uZW5hYmxlZDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBlbmFibGVkIHRleHR1cmVzXG4gICAgICogQHJldHVybiB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RW5hYmxlZFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbmFibGVkVGV4dHVyZXMgPSBbXTtcbiAgICAgICAgdmFyIHRleHR1cmVTdGF0dXMgPSB0aGlzLl90ZXh0dXJlU3RhdHVzO1xuICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGV4dHVyZVN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHRleHR1cmVTdGF0dXNbc3ltYm9sXS5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZFRleHR1cmVzLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5hYmxlZFRleHR1cmVzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYXJrIGRlZmluZXMgYXJlIHVwZGF0ZWQuXG4gICAgICovXG4gICAgZGlydHlEZWZpbmVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyYW1LZXkgPSAnJztcbiAgICB9XG59KTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXRlcmlhbC5wcm90b3R5cGUsICdzaGFkZXInLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRlciB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdZb3UgbmVlZCB0byB1c2UgYXR0YWNoU2hhZGVyIHRvIHNldCB0aGUgc2hhZGVyLicpO1xuICAgICAgICAgICAgdGhpcy5fc2hhZGVyID0gdmFsO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWF0ZXJpYWwucHJvdG90eXBlLCAncHJvZ3JhbUtleScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Byb2dyYW1LZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gZ2V0UHJvZ3JhbUtleShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhEZWZpbmVzLCB0aGlzLmZyYWdtZW50RGVmaW5lcywgdGhpcy5nZXRFbmFibGVkVGV4dHVyZXMoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbUtleTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRlcmlhbDtcbiIsImltcG9ydCB2ZW5kb3IgZnJvbSAnLi4vY29yZS92ZW5kb3InO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vY29yZS9CYXNlJztcblxudmFyIFNIQURFUl9TVEFURV9UT19FTkFCTEUgPSAxO1xudmFyIFNIQURFUl9TVEFURV9LRUVQX0VOQUJMRSA9IDI7XG52YXIgU0hBREVSX1NUQVRFX1BFTkRJTkcgPSAzO1xuXG4vLyBFbmFibGUgYXR0cmlidXRlIG9wZXJhdGlvbiBpcyBnbG9iYWwgdG8gYWxsIHByb2dyYW1zXG4vLyBIZXJlIHNhdmVkIHRoZSBsaXN0IG9mIGFsbCBlbmFibGVkIGF0dHJpYnV0ZSBpbmRleFxuLy8gaHR0cDovL3d3dy5tamJzaGF3LmNvbS8yMDEzLzAzL3dlYmdsLWZpeGluZy1pbnZhbGlkb3BlcmF0aW9uLmh0bWxcbnZhciBlbmFibGVkQXR0cmlidXRlTGlzdCA9IHt9O1xuXG4vLyBzb21lIHV0aWwgZnVuY3Rpb25zXG5mdW5jdGlvbiBhZGRMaW5lTnVtYmVycyhzdHJpbmcpIHtcbiAgICB2YXIgY2h1bmtzID0gc3RyaW5nLnNwbGl0KCdcXG4nKTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWw7IGkgKyspIHtcbiAgICAgICAgLy8gQ2hyb21lIHJlcG9ydHMgc2hhZGVyIGVycm9ycyBvbiBsaW5lc1xuICAgICAgICAvLyBzdGFydGluZyBjb3VudGluZyBmcm9tIDFcbiAgICAgICAgY2h1bmtzW2ldID0gKGkgKyAxKSArICc6ICcgKyBjaHVua3NbaV07XG4gICAgfVxuICAgIHJldHVybiBjaHVua3Muam9pbignXFxuJyk7XG59XG5cbi8vIFJldHVybiB0cnVlIG9yIGVycm9yIG1zZyBpZiBlcnJvciBoYXBwZW5lZFxuZnVuY3Rpb24gY2hlY2tTaGFkZXJFcnJvck1zZyhfZ2wsIHNoYWRlciwgc2hhZGVyU3RyaW5nKSB7XG4gICAgaWYgKCFfZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgX2dsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICByZXR1cm4gW19nbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlciksIGFkZExpbmVOdW1iZXJzKHNoYWRlclN0cmluZyldLmpvaW4oJ1xcbicpO1xuICAgIH1cbn1cblxudmFyIEdMUHJvZ3JhbSA9IEJhc2UuZXh0ZW5kKHtcblxuICAgIHVuaWZvcm1TZW1hbnRpY3M6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9XG5cbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9sb2NhdGlvbnMgPSB7fTtcblxuICAgIHRoaXMuX3RleHR1cmVTbG90ID0gMDtcblxuICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsO1xufSwge1xuXG4gICAgYmluZDogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVTbG90ID0gMDtcbiAgICAgICAgcmVuZGVyZXIuZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcbiAgICB9LFxuXG4gICAgaGFzVW5pZm9ybTogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB2YXIgbG9jYXRpb24gPSB0aGlzLl9sb2NhdGlvbnNbc3ltYm9sXTtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uICE9PSBudWxsICYmIGxvY2F0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHVzZVRleHR1cmVTbG90OiBmdW5jdGlvbiAocmVuZGVyZXIsIHRleHR1cmUsIHNsb3QpIHtcbiAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmdsLmFjdGl2ZVRleHR1cmUocmVuZGVyZXIuZ2wuVEVYVFVSRTAgKyBzbG90KTtcbiAgICAgICAgICAgIC8vIE1heWJlIHRleHR1cmUgaXMgbm90IGxvYWRlZCB5ZXQ7XG4gICAgICAgICAgICBpZiAodGV4dHVyZS5pc1JlbmRlcmFibGUoKSkge1xuICAgICAgICAgICAgICAgIHRleHR1cmUuYmluZChyZW5kZXJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBCaW5kIHRleHR1cmUgdG8gbnVsbFxuICAgICAgICAgICAgICAgIHRleHR1cmUudW5iaW5kKHJlbmRlcmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dHVyZVNsb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHR1cmVTbG90O1xuICAgIH0sXG5cbiAgICByZXNldFRleHR1cmVTbG90OiBmdW5jdGlvbiAoc2xvdCkge1xuICAgICAgICB0aGlzLl90ZXh0dXJlU2xvdCA9IHNsb3QgfHwgMDtcbiAgICB9LFxuXG4gICAgdGFrZUN1cnJlbnRUZXh0dXJlU2xvdDogZnVuY3Rpb24gKHJlbmRlcmVyLCB0ZXh0dXJlKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlU2xvdCA9IHRoaXMuX3RleHR1cmVTbG90O1xuXG4gICAgICAgIHRoaXMudXNlVGV4dHVyZVNsb3QocmVuZGVyZXIsIHRleHR1cmUsIHRleHR1cmVTbG90KTtcblxuICAgICAgICB0aGlzLl90ZXh0dXJlU2xvdCsrO1xuXG4gICAgICAgIHJldHVybiB0ZXh0dXJlU2xvdDtcbiAgICB9LFxuXG4gICAgc2V0VW5pZm9ybTogZnVuY3Rpb24gKF9nbCwgdHlwZSwgc3ltYm9sLCB2YWx1ZSkge1xuICAgICAgICB2YXIgbG9jYXRpb25NYXAgPSB0aGlzLl9sb2NhdGlvbnM7XG4gICAgICAgIHZhciBsb2NhdGlvbiA9IGxvY2F0aW9uTWFwW3N5bWJvbF07XG4gICAgICAgIC8vIFVuaWZvcm0gaXMgbm90IGV4aXN0ZWQgaW4gdGhlIHNoYWRlclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbTQnOlxuICAgICAgICAgICAgICAgIC8vIFRoZSBtYXRyaXggbXVzdCBiZSBjcmVhdGVkIGJ5IGdsbWF0cml4IGFuZCBjYW4gcGFzcyBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJpJzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTJpKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgIF9nbC51bmlmb3JtMmYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczaSc6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm0zaShsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm0zZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0aSc6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm00aShsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGYnOlxuICAgICAgICAgICAgICAgIF9nbC51bmlmb3JtNGYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFpJzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm0xZihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWZ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTFmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWl2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMml2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTJpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmZ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTJmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2l2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2Z2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTNmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGl2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTRpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGZ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTRmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbTInOlxuICAgICAgICAgICAgY2FzZSAnbTJ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ20zJzpcbiAgICAgICAgICAgIGNhc2UgJ20zdic6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtNHYnOlxuICAgICAgICAgICAgICAgIC8vIFJhdyB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheSh2YWx1ZS5sZW5ndGggKiAxNik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbY3Vyc29yKytdID0gaXRlbVtqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIGFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiB2ZW5kb3IuRmxvYXQzMkFycmF5KSB7ICAgLy8gQXJyYXlCdWZmZXJWaWV3XG4gICAgICAgICAgICAgICAgICAgIF9nbC51bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgc2V0VW5pZm9ybU9mU2VtYW50aWM6IGZ1bmN0aW9uIChfZ2wsIHNlbWFudGljLCB2YWwpIHtcbiAgICAgICAgdmFyIHNlbWFudGljSW5mbyA9IHRoaXMudW5pZm9ybVNlbWFudGljc1tzZW1hbnRpY107XG4gICAgICAgIGlmIChzZW1hbnRpY0luZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFVuaWZvcm0oX2dsLCBzZW1hbnRpY0luZm8udHlwZSwgc2VtYW50aWNJbmZvLnN5bWJvbCwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIFVzZWQgZm9yIGNyZWF0aW5nIFZBT1xuICAgIC8vIEVuYWJsZSB0aGUgYXR0cmlidXRlcyBwYXNzZWQgaW4gYW5kIGRpc2FibGUgdGhlIHJlc3RcbiAgICAvLyBFeGFtcGxlIFVzYWdlOlxuICAgIC8vIGVuYWJsZUF0dHJpYnV0ZXMocmVuZGVyZXIsIFtcInBvc2l0aW9uXCIsIFwidGV4Y29vcmRzXCJdKVxuICAgIGVuYWJsZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChyZW5kZXJlciwgYXR0cmliTGlzdCwgdmFvKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLl9wcm9ncmFtO1xuXG4gICAgICAgIHZhciBsb2NhdGlvbk1hcCA9IHRoaXMuX2xvY2F0aW9ucztcblxuICAgICAgICB2YXIgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHQ7XG4gICAgICAgIGlmICh2YW8pIHtcbiAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVMaXN0SW5Db250ZXh0ID0gdmFvLl9fZW5hYmxlZEF0dHJpYnV0ZUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmFibGVkQXR0cmlidXRlTGlzdEluQ29udGV4dCA9IGVuYWJsZWRBdHRyaWJ1dGVMaXN0W3JlbmRlcmVyLl9fdWlkX19dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEluIHZlcnRleCBhcnJheSBvYmplY3QgY29udGV4dFxuICAgICAgICAgICAgLy8gUEVORElORyBFYWNoIHZhbyBvYmplY3QgbmVlZHMgdG8gZW5hYmxlIGF0dHJpYnV0ZXMgYWdhaW4/XG4gICAgICAgICAgICBpZiAodmFvKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgPSB2YW8uX19lbmFibGVkQXR0cmlidXRlTGlzdFxuICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgPSBlbmFibGVkQXR0cmlidXRlTGlzdFtyZW5kZXJlci5fX3VpZF9fXVxuICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBsb2NhdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3ltYm9sID0gYXR0cmliTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdHRyaWJ1dGVzW3N5bWJvbF0pIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbkxpc3RbaV0gPSAtMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9IGxvY2F0aW9uTWFwW3N5bWJvbF07XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gX2dsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgLy8gQXR0cmliIGxvY2F0aW9uIGlzIGEgbnVtYmVyIGZyb20gMCB0byAuLi5cbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uTGlzdFtpXSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYXRpb25NYXBbc3ltYm9sXSA9IGxvY2F0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYXRpb25MaXN0W2ldID0gbG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmICghZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRbbG9jYXRpb25dKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRbbG9jYXRpb25dID0gU0hBREVSX1NUQVRFX1RPX0VOQUJMRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVMaXN0SW5Db250ZXh0W2xvY2F0aW9uXSA9IFNIQURFUl9TVEFURV9LRUVQX0VOQUJMRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN3aXRjaChlbmFibGVkQXR0cmlidXRlTGlzdEluQ29udGV4dFtpXSl7XG4gICAgICAgICAgICAgICAgY2FzZSBTSEFERVJfU1RBVEVfVE9fRU5BQkxFOlxuICAgICAgICAgICAgICAgICAgICBfZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSk7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVMaXN0SW5Db250ZXh0W2ldID0gU0hBREVSX1NUQVRFX1BFTkRJTkc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgU0hBREVSX1NUQVRFX0tFRVBfRU5BQkxFOlxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkQXR0cmlidXRlTGlzdEluQ29udGV4dFtpXSA9IFNIQURFUl9TVEFURV9QRU5ESU5HO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBFeHBpcmVkXG4gICAgICAgICAgICAgICAgY2FzZSBTSEFERVJfU1RBVEVfUEVORElORzpcbiAgICAgICAgICAgICAgICAgICAgX2dsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKTtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRbaV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhdGlvbkxpc3Q7XG4gICAgfSxcblxuICAgIGJ1aWxkUHJvZ3JhbTogZnVuY3Rpb24gKF9nbCwgc2hhZGVyLCB2ZXJ0ZXhTaGFkZXJDb2RlLCBmcmFnbWVudFNoYWRlckNvZGUpIHtcbiAgICAgICAgdmFyIHZlcnRleFNoYWRlciA9IF9nbC5jcmVhdGVTaGFkZXIoX2dsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgcHJvZ3JhbSA9IF9nbC5jcmVhdGVQcm9ncmFtKCk7XG5cbiAgICAgICAgX2dsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNoYWRlckNvZGUpO1xuICAgICAgICBfZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuXG4gICAgICAgIHZhciBmcmFnbWVudFNoYWRlciA9IF9nbC5jcmVhdGVTaGFkZXIoX2dsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgICAgIF9nbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U2hhZGVyQ29kZSk7XG4gICAgICAgIF9nbC5jb21waWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICB2YXIgbXNnID0gY2hlY2tTaGFkZXJFcnJvck1zZyhfZ2wsIHZlcnRleFNoYWRlciwgdmVydGV4U2hhZGVyQ29kZSk7XG4gICAgICAgIGlmIChtc2cpIHtcbiAgICAgICAgICAgIHJldHVybiBtc2c7XG4gICAgICAgIH1cbiAgICAgICAgbXNnID0gY2hlY2tTaGFkZXJFcnJvck1zZyhfZ2wsIGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlckNvZGUpO1xuICAgICAgICBpZiAobXNnKSB7XG4gICAgICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBfZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgLy8gRm9yY2UgdGhlIHBvc2l0aW9uIGJpbmQgdG8gbG9jYXRpb24gMDtcbiAgICAgICAgaWYgKHNoYWRlci5hdHRyaWJ1dGVTZW1hbnRpY3NbJ1BPU0lUSU9OJ10pIHtcbiAgICAgICAgICAgIF9nbC5iaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgMCwgc2hhZGVyLmF0dHJpYnV0ZVNlbWFudGljc1snUE9TSVRJT04nXS5zeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRWxzZSBjaG9vc2UgYW4gYXR0cmlidXRlIGFuZCBiaW5kIHRvIGxvY2F0aW9uIDA7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICBfZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIDAsIGtleXNbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICghX2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgX2dsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICAgICAgcmV0dXJuICdDb3VsZCBub3QgbGluayBwcm9ncmFtXFxuJyArICdWQUxJREFURV9TVEFUVVM6ICcgKyBfZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBfZ2wuVkFMSURBVEVfU1RBVFVTKSArICcsIGdsIGVycm9yIFsnICsgX2dsLmdldEVycm9yKCkgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB1bmlmb3JtIGxvY2F0aW9uc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNoYWRlci51bmlmb3Jtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHVuaWZvcm1TeW1ib2wgPSBzaGFkZXIudW5pZm9ybXNbaV07XG4gICAgICAgICAgICB0aGlzLl9sb2NhdGlvbnNbdW5pZm9ybVN5bWJvbF0gPSBfZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1TeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBfZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTtcblxuICAgICAgICAvLyBTYXZlIGNvZGUuXG4gICAgICAgIHRoaXMudmVydGV4Q29kZSA9IHZlcnRleFNoYWRlckNvZGU7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRDb2RlID0gZnJhZ21lbnRTaGFkZXJDb2RlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBHTFByb2dyYW07IiwiaW1wb3J0IEdMUHJvZ3JhbSBmcm9tICcuL0dMUHJvZ3JhbSc7XG5cbnZhciBsb29wUmVnZXggPSAvZm9yXFxzKj9cXChpbnRcXHMqP19pZHhfXFxzKlxcPVxccyooW1xcdy1dKylcXDtcXHMqX2lkeF9cXHMqPFxccyooW1xcdy1dKyk7XFxzKl9pZHhfXFxzKlxcK1xcK1xccypcXClcXHMqXFx7XFx7KFtcXHNcXFNdKz8pKD89XFx9XFx9KVxcfVxcfS9nO1xuXG5mdW5jdGlvbiB1bnJvbGxMb29wKHNoYWRlclN0ciwgZGVmaW5lcywgbGlnaHRzTnVtYmVycykge1xuICAgIC8vIExvb3AgdW5yb2xsIGZyb20gdGhyZWUuanMsIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9tYXN0ZXIvc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFByb2dyYW0uanMjTDE3NVxuICAgIC8vIEluIHNvbWUgY2FzZSBsaWtlIHNoYWRvd01hcCBpbiBsb29wIHVzZSAnaScgdG8gaW5kZXggdmFsdWUgbXVjaCBzbG93ZXIuXG5cbiAgICAvLyBMb29wIHVzZSBfaWR4XyBhbmQgaW5jcmVhc2VkIHdpdGggX2lkeF8rKyB3aWxsIGJlIHVucm9sbGVkXG4gICAgLy8gVXNlIHt7IH19IHRvIG1hdGNoIHRoZSBwYWlyIHNvIHRoZSBpZiBzdGF0ZW1lbnQgd2lsbCBub3QgYmUgYWZmZWN0ZWRcbiAgICAvLyBXcml0ZSBsaWtlIGZvbGxvd2luZ1xuICAgIC8vIGZvciAoaW50IF9pZHhfID0gMDsgX2lkeF8gPCA0OyBfaWR4XysrKSB7e1xuICAgIC8vICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZTJEKHRleHR1cmVzW19pZHhfXSwgdXYpLnJnYjtcbiAgICAvLyB9fVxuICAgIGZ1bmN0aW9uIHJlcGxhY2UobWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQpIHtcbiAgICAgICAgdmFyIHVucm9sbCA9ICcnO1xuICAgICAgICAvLyBUcnkgdG8gdHJlYXQgYXMgZGVmaW5lXG4gICAgICAgIGlmIChpc05hTihzdGFydCkpIHtcbiAgICAgICAgICAgIGlmIChzdGFydCBpbiBkZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBkZWZpbmVzW3N0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGlnaHROdW1iZXJEZWZpbmVzW3N0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oZW5kKSkge1xuICAgICAgICAgICAgaWYgKGVuZCBpbiBkZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gZGVmaW5lc1tlbmRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5kID0gbGlnaHROdW1iZXJEZWZpbmVzW2VuZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyBFcnJvciBjaGVja2luZ1xuXG4gICAgICAgIGZvciAodmFyIGlkeCA9IHBhcnNlSW50KHN0YXJ0KTsgaWR4IDwgcGFyc2VJbnQoZW5kKTsgaWR4KyspIHtcbiAgICAgICAgICAgIC8vIFBFTkRJTkcgQWRkIHNjb3BlP1xuICAgICAgICAgICAgdW5yb2xsICs9ICd7J1xuICAgICAgICAgICAgICAgICsgc25pcHBldFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvZmxvYXRcXHMqXFwoXFxzKl9pZHhfXFxzKlxcKS9nLCBpZHgudG9GaXhlZCgxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL19pZHhfL2csIGlkeClcbiAgICAgICAgICAgICsgJ30nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVucm9sbDtcbiAgICB9XG5cbiAgICB2YXIgbGlnaHROdW1iZXJEZWZpbmVzID0ge307XG4gICAgZm9yICh2YXIgbGlnaHRUeXBlIGluIGxpZ2h0c051bWJlcnMpIHtcbiAgICAgICAgbGlnaHROdW1iZXJEZWZpbmVzW2xpZ2h0VHlwZSArICdfQ09VTlQnXSA9IGxpZ2h0c051bWJlcnNbbGlnaHRUeXBlXTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRlclN0ci5yZXBsYWNlKGxvb3BSZWdleCwgcmVwbGFjZSk7XG59XG5cbmZ1bmN0aW9uIGdldERlZmluZUNvZGUoZGVmaW5lcywgbGlnaHRzTnVtYmVycywgZW5hYmxlZFRleHR1cmVzKSB7XG4gICAgdmFyIGRlZmluZVN0ciA9IFtdO1xuICAgIGlmIChsaWdodHNOdW1iZXJzKSB7XG4gICAgICAgIGZvciAodmFyIGxpZ2h0VHlwZSBpbiBsaWdodHNOdW1iZXJzKSB7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBsaWdodHNOdW1iZXJzW2xpZ2h0VHlwZV07XG4gICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lU3RyLnB1c2goJyNkZWZpbmUgJyArIGxpZ2h0VHlwZS50b1VwcGVyQ2FzZSgpICsgJ19DT1VOVCAnICsgY291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbmFibGVkVGV4dHVyZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmFibGVkVGV4dHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBlbmFibGVkVGV4dHVyZXNbaV07XG4gICAgICAgICAgICBkZWZpbmVTdHIucHVzaCgnI2RlZmluZSAnICsgc3ltYm9sLnRvVXBwZXJDYXNlKCkgKyAnX0VOQUJMRUQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDdXN0b20gRGVmaW5lc1xuICAgIGZvciAodmFyIHN5bWJvbCBpbiBkZWZpbmVzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlZmluZXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWZpbmVTdHIucHVzaCgnI2RlZmluZSAnICsgc3ltYm9sKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgZGVmaW5lU3RyLnB1c2goJyNkZWZpbmUgJyArIHN5bWJvbCArICcgJyArIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVTdHIuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldEV4dGVuc2lvbkNvZGUoZXh0cykge1xuICAgIC8vIEV4dGVuc2lvbiBkZWNsYXJhdGlvbiBtdXN0IGJlZm9yZSBhbGwgbm9uLXByZXByb2Nlc3NvciBjb2Rlc1xuICAgIC8vIFRPRE8gdmVydGV4ID8gZXh0ZW5zaW9uIGVudW0gP1xuICAgIHZhciBleHRlbnNpb25TdHIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXh0ZW5zaW9uU3RyLnB1c2goJyNleHRlbnNpb24gR0xfJyArIGV4dHNbaV0gKyAnIDogZW5hYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25TdHIuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldFByZWNpc2lvbkNvZGUocHJlY2lzaW9uKSB7XG4gICAgcmV0dXJuIFsncHJlY2lzaW9uJywgcHJlY2lzaW9uLCAnZmxvYXQnXS5qb2luKCcgJykgKyAnO1xcbidcbiAgICAgICAgKyBbJ3ByZWNpc2lvbicsIHByZWNpc2lvbiwgJ2ludCddLmpvaW4oJyAnKSArICc7XFxuJ1xuICAgICAgICAvLyBkZXB0aCB0ZXh0dXJlIG1heSBoYXZlIHByZWNpc2lvbiBwcm9ibGVtIG9uIGlPUyBkZXZpY2UuXG4gICAgICAgICsgWydwcmVjaXNpb24nLCBwcmVjaXNpb24sICdzYW1wbGVyMkQnXS5qb2luKCcgJykgKyAnO1xcbic7XG59XG5cbmZ1bmN0aW9uIFByb2dyYW1NYW5hZ2VyKHJlbmRlcmVyKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICB0aGlzLl9jYWNoZSA9IHt9O1xufVxuXG5Qcm9ncmFtTWFuYWdlci5wcm90b3R5cGUuZ2V0UHJvZ3JhbSA9IGZ1bmN0aW9uIChyZW5kZXJhYmxlLCBtYXRlcmlhbCwgc2NlbmUpIHtcbiAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcblxuICAgIHZhciBrZXkgPSAncycgKyBtYXRlcmlhbC5zaGFkZXIuc2hhZGVySUQgKyAnbScgKyBtYXRlcmlhbC5wcm9ncmFtS2V5O1xuICAgIGlmIChzY2VuZSkge1xuICAgICAgICBrZXkgKz0gJ3NlJyArIHNjZW5lLmdldFByb2dyYW1LZXkocmVuZGVyYWJsZS5saWdodEdyb3VwKTtcbiAgICB9XG4gICAgaWYgKHJlbmRlcmFibGUuaXNTa2lubmVkTWVzaCgpKSB7XG4gICAgICAgIGtleSArPSAnLCcgKyByZW5kZXJhYmxlLmpvaW50cy5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBwcm9ncmFtID0gY2FjaGVba2V5XTtcblxuICAgIGlmIChwcm9ncmFtKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIHZhciBsaWdodHNOdW1iZXJzID0gc2NlbmUgPyBzY2VuZS5nZXRMaWdodHNOdW1iZXJzKHJlbmRlcmFibGUubGlnaHRHcm91cCkgOiB7fTtcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcbiAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgdmFyIGVuYWJsZWRUZXh0dXJlcyA9IG1hdGVyaWFsLmdldEVuYWJsZWRUZXh0dXJlcygpO1xuICAgIHZhciBza2luRGVmaW5lQ29kZSA9ICcnO1xuICAgIGlmIChyZW5kZXJhYmxlLmlzU2tpbm5lZE1lc2goKSkge1xuICAgICAgICAvLyBUT0RPIEFkZCBza2lubmluZyBjb2RlP1xuICAgICAgICBza2luRGVmaW5lQ29kZSA9ICdcXG4nICsgZ2V0RGVmaW5lQ29kZSh7XG4gICAgICAgICAgICBTS0lOTklORzogbnVsbCxcbiAgICAgICAgICAgIEpPSU5UX0NPVU5UOiByZW5kZXJhYmxlLmpvaW50cy5sZW5ndGhcbiAgICAgICAgfSkgKyAnXFxuJztcbiAgICB9XG4gICAgLy8gVE9ETyBPcHRpbWl6ZSBrZXkgZ2VuZXJhdGlvblxuICAgIC8vIFZFUlRFWFxuICAgIHZhciB2ZXJ0ZXhEZWZpbmVTdHIgPSBza2luRGVmaW5lQ29kZSArIGdldERlZmluZUNvZGUobWF0ZXJpYWwudmVydGV4RGVmaW5lcywgbGlnaHRzTnVtYmVycywgZW5hYmxlZFRleHR1cmVzKTtcbiAgICAvLyBGUkFHTUVOVFxuICAgIHZhciBmcmFnbWVudERlZmluZVN0ciA9IHNraW5EZWZpbmVDb2RlICsgZ2V0RGVmaW5lQ29kZShtYXRlcmlhbC5mcmFnbWVudERlZmluZXMsIGxpZ2h0c051bWJlcnMsIGVuYWJsZWRUZXh0dXJlcyk7XG5cbiAgICB2YXIgdmVydGV4Q29kZSA9IHZlcnRleERlZmluZVN0ciArICdcXG4nICsgbWF0ZXJpYWwuc2hhZGVyLnZlcnRleDtcbiAgICB2YXIgZnJhZ21lbnRDb2RlID0gZ2V0RXh0ZW5zaW9uQ29kZShbXG4gICAgICAgICAgICAvLyBUT0RPIE5vdCBoYXJkIGNvZGVkXG4gICAgICAgICAgICAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyxcbiAgICAgICAgICAgICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJ1xuICAgICAgICBdKSArICdcXG4nXG4gICAgICAgICAgICArIGdldFByZWNpc2lvbkNvZGUobWF0ZXJpYWwucHJlY2lzaW9uKSArICdcXG4nXG4gICAgICAgICAgICArIGZyYWdtZW50RGVmaW5lU3RyICsgJ1xcbicgKyBtYXRlcmlhbC5zaGFkZXIuZnJhZ21lbnQ7XG5cbiAgICB2YXIgZmluYWxWZXJ0ZXhDb2RlID0gdW5yb2xsTG9vcCh2ZXJ0ZXhDb2RlLCBtYXRlcmlhbC52ZXJ0ZXhEZWZpbmVzLCBsaWdodHNOdW1iZXJzKTtcbiAgICB2YXIgZmluYWxGcmFnbWVudENvZGUgPSB1bnJvbGxMb29wKGZyYWdtZW50Q29kZSwgbWF0ZXJpYWwuZnJhZ21lbnREZWZpbmVzLCBsaWdodHNOdW1iZXJzKTtcblxuICAgIHZhciBwcm9ncmFtID0gbmV3IEdMUHJvZ3JhbSgpO1xuICAgIHByb2dyYW0udW5pZm9ybVNlbWFudGljcyA9IG1hdGVyaWFsLnNoYWRlci51bmlmb3JtU2VtYW50aWNzO1xuICAgIHByb2dyYW0uYXR0cmlidXRlcyA9IG1hdGVyaWFsLnNoYWRlci5hdHRyaWJ1dGVzO1xuICAgIHZhciBlcnJvck1zZyA9IHByb2dyYW0uYnVpbGRQcm9ncmFtKF9nbCwgbWF0ZXJpYWwuc2hhZGVyLCBmaW5hbFZlcnRleENvZGUsIGZpbmFsRnJhZ21lbnRDb2RlKTtcbiAgICBwcm9ncmFtLl9fZXJyb3IgPSBlcnJvck1zZztcblxuICAgIGNhY2hlW2tleV0gPSBwcm9ncmFtO1xuXG4gICAgcmV0dXJuIHByb2dyYW07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtTWFuYWdlcjsiLCIvKipcbiAqIE1haW5seSBkbyB0aGUgcGFyc2UgYW5kIGNvbXBpbGUgb2Ygc2hhZGVyIHN0cmluZ1xuICogU3VwcG9ydCBzaGFkZXIgY29kZSBjaHVuayBpbXBvcnQgYW5kIGV4cG9ydFxuICogU3VwcG9ydCBzaGFkZXIgc2VtYW50aWNzXG4gKiBodHRwOi8vd3d3Lm52aWRpYS5jb20vb2JqZWN0L3VzaW5nX3Nhcy5odG1sXG4gKiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2NvbGxhZGEyanNvbi9pc3N1ZXMvNDVcbiAqXG4gKiBUT0RPOiBVc2UgZXRwbCBvciBvdGhlciBzdHJpbmcgdGVtcGxhdGUgZW5naW5lXG4gKi9cbmltcG9ydCB1dGlsIGZyb20gJy4vY29yZS91dGlsJztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDIgPSBnbE1hdHJpeC5tYXQyO1xudmFyIG1hdDMgPSBnbE1hdHJpeC5tYXQzO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xuXG52YXIgdW5pZm9ybVJlZ2V4ID0gL3VuaWZvcm1cXHMrKGJvb2x8ZmxvYXR8aW50fHZlYzJ8dmVjM3x2ZWM0fGl2ZWMyfGl2ZWMzfGl2ZWM0fG1hdDJ8bWF0M3xtYXQ0fHNhbXBsZXIyRHxzYW1wbGVyQ3ViZSlcXHMrKFtcXHdcXCxdKyk/KFxcWy4qP1xcXSk/XFxzKig6XFxzKihbXFxTXFxzXSs/KSk/Oy9nO1xudmFyIGF0dHJpYnV0ZVJlZ2V4ID0gL2F0dHJpYnV0ZVxccysoZmxvYXR8aW50fHZlYzJ8dmVjM3x2ZWM0KVxccysoXFx3KilcXHMqKDpcXHMqKFxcdyspKT87L2c7XG52YXIgZGVmaW5lUmVnZXggPSAvI2RlZmluZVxccysoXFx3Kyk/KFxccytbXFx3LS5dKyk/XFxzKjs/XFxzKlxcbi9nO1xuXG52YXIgdW5pZm9ybVR5cGVNYXAgPSB7XG4gICAgJ2Jvb2wnOiAnMWknLFxuICAgICdpbnQnOiAnMWknLFxuICAgICdzYW1wbGVyMkQnOiAndCcsXG4gICAgJ3NhbXBsZXJDdWJlJzogJ3QnLFxuICAgICdmbG9hdCc6ICcxZicsXG4gICAgJ3ZlYzInOiAnMmYnLFxuICAgICd2ZWMzJzogJzNmJyxcbiAgICAndmVjNCc6ICc0ZicsXG4gICAgJ2l2ZWMyJzogJzJpJyxcbiAgICAnaXZlYzMnOiAnM2knLFxuICAgICdpdmVjNCc6ICc0aScsXG4gICAgJ21hdDInOiAnbTInLFxuICAgICdtYXQzJzogJ20zJyxcbiAgICAnbWF0NCc6ICdtNCdcbn07XG5cbnZhciB1bmlmb3JtVmFsdWVDb25zdHJ1Y3RvciA9IHtcbiAgICAnYm9vbCc6IGZ1bmN0aW9uICgpIHtyZXR1cm4gdHJ1ZTt9LFxuICAgICdpbnQnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIDA7fSxcbiAgICAnZmxvYXQnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIDA7fSxcbiAgICAnc2FtcGxlcjJEJzogZnVuY3Rpb24gKCkge3JldHVybiBudWxsO30sXG4gICAgJ3NhbXBsZXJDdWJlJzogZnVuY3Rpb24gKCkge3JldHVybiBudWxsO30sXG5cbiAgICAndmVjMic6IGZ1bmN0aW9uICgpIHtyZXR1cm4gWzAsIDBdO30sXG4gICAgJ3ZlYzMnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIFswLCAwLCAwXTt9LFxuICAgICd2ZWM0JzogZnVuY3Rpb24gKCkge3JldHVybiBbMCwgMCwgMCwgMF07fSxcblxuICAgICdpdmVjMic6IGZ1bmN0aW9uICgpIHtyZXR1cm4gWzAsIDBdO30sXG4gICAgJ2l2ZWMzJzogZnVuY3Rpb24gKCkge3JldHVybiBbMCwgMCwgMF07fSxcbiAgICAnaXZlYzQnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIFswLCAwLCAwLCAwXTt9LFxuXG4gICAgJ21hdDInOiBmdW5jdGlvbiAoKSB7cmV0dXJuIG1hdDIuY3JlYXRlKCk7fSxcbiAgICAnbWF0Myc6IGZ1bmN0aW9uICgpIHtyZXR1cm4gbWF0My5jcmVhdGUoKTt9LFxuICAgICdtYXQ0JzogZnVuY3Rpb24gKCkge3JldHVybiBtYXQ0LmNyZWF0ZSgpO30sXG5cbiAgICAnYXJyYXknOiBmdW5jdGlvbiAoKSB7cmV0dXJuIFtdO31cbn07XG5cbnZhciBhdHRyaWJ1dGVTZW1hbnRpY3MgPSBbXG4gICAgJ1BPU0lUSU9OJyxcbiAgICAnTk9STUFMJyxcbiAgICAnQklOT1JNQUwnLFxuICAgICdUQU5HRU5UJyxcbiAgICAnVEVYQ09PUkQnLFxuICAgICdURVhDT09SRF8wJyxcbiAgICAnVEVYQ09PUkRfMScsXG4gICAgJ0NPTE9SJyxcbiAgICAvLyBTa2lubmluZ1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uL1JFQURNRS5tZCNzZW1hbnRpY3NcbiAgICAnSk9JTlQnLFxuICAgICdXRUlHSFQnXG5dO1xudmFyIHVuaWZvcm1TZW1hbnRpY3MgPSBbXG4gICAgJ1NLSU5fTUFUUklYJyxcbiAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCB2aWV3cG9ydFxuICAgICdWSUVXUE9SVF9TSVpFJyxcbiAgICAnVklFV1BPUlQnLFxuICAgICdERVZJQ0VQSVhFTFJBVElPJyxcbiAgICAvLyBXaW5kb3cgc2l6ZSBmb3Igd2luZG93IHJlbGF0aXZlIGNvb3JkaW5hdGVcbiAgICAvLyBodHRwczovL3d3dy5vcGVuZ2wub3JnL3Nkay9kb2NzL21hbi9odG1sL2dsX0ZyYWdDb29yZC54aHRtbFxuICAgICdXSU5ET1dfU0laRScsXG4gICAgLy8gSW5mb21hdGlvbiBhYm91dCBjYW1lcmFcbiAgICAnTkVBUicsXG4gICAgJ0ZBUicsXG4gICAgLy8gVGltZVxuICAgICdUSU1FJ1xuXTtcbnZhciBtYXRyaXhTZW1hbnRpY3MgPSBbXG4gICAgJ1dPUkxEJyxcbiAgICAnVklFVycsXG4gICAgJ1BST0pFQ1RJT04nLFxuICAgICdXT1JMRFZJRVcnLFxuICAgICdWSUVXUFJPSkVDVElPTicsXG4gICAgJ1dPUkxEVklFV1BST0pFQ1RJT04nLFxuICAgICdXT1JMRElOVkVSU0UnLFxuICAgICdWSUVXSU5WRVJTRScsXG4gICAgJ1BST0pFQ1RJT05JTlZFUlNFJyxcbiAgICAnV09STERWSUVXSU5WRVJTRScsXG4gICAgJ1ZJRVdQUk9KRUNUSU9OSU5WRVJTRScsXG4gICAgJ1dPUkxEVklFV1BST0pFQ1RJT05JTlZFUlNFJyxcbiAgICAnV09STERUUkFOU1BPU0UnLFxuICAgICdWSUVXVFJBTlNQT1NFJyxcbiAgICAnUFJPSkVDVElPTlRSQU5TUE9TRScsXG4gICAgJ1dPUkxEVklFV1RSQU5TUE9TRScsXG4gICAgJ1ZJRVdQUk9KRUNUSU9OVFJBTlNQT1NFJyxcbiAgICAnV09STERWSUVXUFJPSkVDVElPTlRSQU5TUE9TRScsXG4gICAgJ1dPUkxESU5WRVJTRVRSQU5TUE9TRScsXG4gICAgJ1ZJRVdJTlZFUlNFVFJBTlNQT1NFJyxcbiAgICAnUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0UnLFxuICAgICdXT1JMRFZJRVdJTlZFUlNFVFJBTlNQT1NFJyxcbiAgICAnVklFV1BST0pFQ1RJT05JTlZFUlNFVFJBTlNQT1NFJyxcbiAgICAnV09STERWSUVXUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0UnXG5dO1xuXG5cbnZhciBzaGFkZXJJRENhY2hlID0ge307XG52YXIgc2hhZGVyQ29kZUNhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldFNoYWRlcklEKHZlcnRleCwgZnJhZ21lbnQpIHtcbiAgICB2YXIga2V5ID0gJ3ZlcnRleDonICsgdmVydGV4ICsgJ2ZyYWdtZW50OicgKyBmcmFnbWVudDtcbiAgICBpZiAoc2hhZGVySURDYWNoZVtrZXldKSB7XG4gICAgICAgIHJldHVybiBzaGFkZXJJRENhY2hlW2tleV07XG4gICAgfVxuICAgIHZhciBpZCA9IHV0aWwuZ2VuR1VJRCgpO1xuICAgIHNoYWRlcklEQ2FjaGVba2V5XSA9IGlkO1xuXG4gICAgc2hhZGVyQ29kZUNhY2hlW2lkXSA9IHtcbiAgICAgICAgdmVydGV4OiB2ZXJ0ZXgsXG4gICAgICAgIGZyYWdtZW50OiBmcmFnbWVudFxuICAgIH07XG5cbiAgICByZXR1cm4gaWQ7XG59XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICogQGFsaWFzIGNsYXkuU2hhZGVyXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGhvbmcgc2hhZGVyXG4gKiB2YXIgc2hhZGVyID0gbmV3IGNsYXkuU2hhZGVyKFxuICogICAgICBjbGF5LlNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmQudmVydGV4JyksXG4gKiAgICAgIGNsYXkuU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZC5mcmFnbWVudCcpXG4gKiApO1xuICovXG5mdW5jdGlvbiBTaGFkZXIodmVydGV4LCBmcmFnbWVudCkge1xuICAgIC8vIEZpcnN0IGFyZ3VtZW50IGNhbiBiZSB7IHZlcnRleCwgZnJhZ21lbnQgfVxuICAgIGlmICh0eXBlb2YgdmVydGV4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmcmFnbWVudCA9IHZlcnRleC5mcmFnbWVudDtcbiAgICAgICAgdmVydGV4ID0gdmVydGV4LnZlcnRleDtcbiAgICB9XG5cbiAgICB0aGlzLl9zaGFkZXJJRCA9IGdldFNoYWRlcklEKHZlcnRleCwgZnJhZ21lbnQpO1xuXG4gICAgdGhpcy5fdmVydGV4Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydCh2ZXJ0ZXgpO1xuICAgIHRoaXMuX2ZyYWdtZW50Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydChmcmFnbWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmF0dHJpYnV0ZVNlbWFudGljcyA9IHt9O1xuICAgIC8qKlxuICAgICAqIEByZWFkT25seVxuICAgICAqL1xuICAgIHRoaXMubWF0cml4U2VtYW50aWNzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy51bmlmb3JtU2VtYW50aWNzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy5tYXRyaXhTZW1hbnRpY0tleXMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnVuaWZvcm1UZW1wbGF0ZXMgPSB7fTtcbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnRleHR1cmVzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy52ZXJ0ZXhEZWZpbmVzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy5mcmFnbWVudERlZmluZXMgPSB7fTtcblxuICAgIHRoaXMuX3BhcnNlQXR0cmlidXRlcygpO1xuICAgIHRoaXMuX3BhcnNlVW5pZm9ybXMoKTtcbiAgICB0aGlzLl9wYXJzZURlZmluZXMoKTtcbn1cblxuU2hhZGVyLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBTaGFkZXIsXG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdW5pZm9ybSBpbnN0YW5jZSBmb3IgbWF0ZXJpYWxcbiAgICBjcmVhdGVVbmlmb3JtczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdW5pZm9ybXMgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGhpcy51bmlmb3JtVGVtcGxhdGVzKXtcbiAgICAgICAgICAgIHZhciB1bmlmb3JtVHBsID0gdGhpcy51bmlmb3JtVGVtcGxhdGVzW3N5bWJvbF07XG4gICAgICAgICAgICB1bmlmb3Jtc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IHVuaWZvcm1UcGwudHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVRwbC52YWx1ZSgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zO1xuICAgIH0sXG5cbiAgICBfcGFyc2VJbXBvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmVydGV4Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydCh0aGlzLnZlcnRleCk7XG4gICAgICAgIHRoaXMuX2ZyYWdtZW50Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydCh0aGlzLmZyYWdtZW50KTtcbiAgICB9LFxuXG4gICAgX3BhcnNlVW5pZm9ybXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVuaWZvcm1zID0ge307XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHNoYWRlclR5cGUgPSAndmVydGV4JztcbiAgICAgICAgdGhpcy5fdW5pZm9ybUxpc3QgPSBbXTtcblxuICAgICAgICB0aGlzLl92ZXJ0ZXhDb2RlID0gdGhpcy5fdmVydGV4Q29kZS5yZXBsYWNlKHVuaWZvcm1SZWdleCwgX3VuaWZvcm1QYXJzZXIpO1xuICAgICAgICBzaGFkZXJUeXBlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRDb2RlID0gdGhpcy5fZnJhZ21lbnRDb2RlLnJlcGxhY2UodW5pZm9ybVJlZ2V4LCBfdW5pZm9ybVBhcnNlcik7XG5cbiAgICAgICAgc2VsZi5tYXRyaXhTZW1hbnRpY0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLm1hdHJpeFNlbWFudGljcyk7XG5cbiAgICAgICAgZnVuY3Rpb24gX3VuaWZvcm1QYXJzZXIoc3RyLCB0eXBlLCBzeW1ib2wsIGlzQXJyYXksIHNlbWFudGljV3JhcHBlciwgc2VtYW50aWMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlICYmIHN5bWJvbCkge1xuICAgICAgICAgICAgICAgIHZhciB1bmlmb3JtVHlwZSA9IHVuaWZvcm1UeXBlTWFwW3R5cGVdO1xuICAgICAgICAgICAgICAgIHZhciBpc0NvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZUZ1bmM7XG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3VuaWZvcm1MaXN0LnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnIHx8IHR5cGUgPT09ICdzYW1wbGVyQ3ViZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgaXMgZGVmYXVsdCBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0dXJlc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGU6IHNoYWRlclR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybVR5cGUgKz0gJ3YnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZW1hbnRpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGlzIG9ubHkgZm9yIFNLSU5fTUFUUklYXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlU2VtYW50aWNzLmluZGV4T2Yoc2VtYW50aWMpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZVNlbWFudGljc1tzZW1hbnRpY10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB1bmlmb3JtVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25maWd1cmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdHJpeFNlbWFudGljcy5pbmRleE9mKHNlbWFudGljKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzVHJhbnNwb3NlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFudGljTm9UcmFuc3Bvc2UgPSBzZW1hbnRpYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMubWF0Y2goL1RSQU5TUE9TRSQvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zcG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljTm9UcmFuc3Bvc2UgPSBzZW1hbnRpYy5zbGljZSgwLCAtOSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWF0cml4U2VtYW50aWNzW3NlbWFudGljXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHVuaWZvcm1UeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zcG9zZTogaXNUcmFuc3Bvc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljTm9UcmFuc3Bvc2U6IHNlbWFudGljTm9UcmFuc3Bvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtU2VtYW50aWNzLmluZGV4T2Yoc2VtYW50aWMpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVuaWZvcm1TZW1hbnRpY3Nbc2VtYW50aWNdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdW5pZm9ybVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdW5pZm9ybSBpcyBub3QgY29uZmlndXJhYmxlLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBhcHBlYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWF0ZXJpYWwgdW5pZm9ybSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbWFudGljID09PSAndW5jb25maWd1cmFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmb3JtIGhhdmUgYSBkZWZhbHV0IHZhbHVlLCBsaWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaWZvcm0gdmVjMyBjb2xvcjogWzEsIDEsIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVGdW5jID0gc2VsZi5fcGFyc2VEZWZhdWx0VmFsdWUodHlwZSwgc2VtYW50aWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmF1bHRWYWx1ZUZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rb3duIHNlbWFudGljIFwiJyArIHNlbWFudGljICsgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hbnRpYyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHVuaWZvcm1UeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpc0FycmF5ID8gdW5pZm9ybVZhbHVlQ29uc3RydWN0b3JbJ2FycmF5J10gOiAoZGVmYXVsdFZhbHVlRnVuYyB8fCB1bmlmb3JtVmFsdWVDb25zdHJ1Y3Rvclt0eXBlXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWM6IHNlbWFudGljIHx8IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsndW5pZm9ybScsIHR5cGUsIHN5bWJvbCwgaXNBcnJheV0uam9pbignICcpICsgJztcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51bmlmb3JtVGVtcGxhdGVzID0gdW5pZm9ybXM7XG4gICAgfSxcblxuICAgIF9wYXJzZURlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKHR5cGUsIHN0cikge1xuICAgICAgICB2YXIgYXJyYXlSZWdleCA9IC9cXFtcXHMqKC4qKVxccypcXF0vO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZlYzInIHx8IHR5cGUgPT09ICd2ZWMzJyB8fCB0eXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgIHZhciBhcnJheVN0ciA9IGFycmF5UmVnZXguZXhlYyhzdHIpWzFdO1xuICAgICAgICAgICAgaWYgKGFycmF5U3RyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IGFycmF5U3RyLnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHZlbmRvci5GbG9hdDMyQXJyYXkoYXJyKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2ludCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9wYXJzZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl92ZXJ0ZXhDb2RlID0gdGhpcy5fdmVydGV4Q29kZS5yZXBsYWNlKGF0dHJpYnV0ZVJlZ2V4LCBfYXR0cmlidXRlUGFyc2VyKTtcblxuICAgICAgICBmdW5jdGlvbiBfYXR0cmlidXRlUGFyc2VyKHN0ciwgdHlwZSwgc3ltYm9sLCBzZW1hbnRpY1dyYXBwZXIsIHNlbWFudGljKSB7XG4gICAgICAgICAgICBpZiAodHlwZSAmJiBzeW1ib2wpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IDE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZlYzQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndmVjMyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2ZWMyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYW4gb25seSBiZSBmbG9hdFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBzaXplLFxuICAgICAgICAgICAgICAgICAgICBzZW1hbnRpYzogc2VtYW50aWMgfHwgbnVsbFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNlbWFudGljcy5pbmRleE9mKHNlbWFudGljKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rb3duIHNlbWFudGljIFwiJyArIHNlbWFudGljICsgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZVNlbWFudGljc1tzZW1hbnRpY10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFsnYXR0cmlidXRlJywgdHlwZSwgc3ltYm9sXS5qb2luKCcgJykgKyAnO1xcbic7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgIH0sXG5cbiAgICBfcGFyc2VEZWZpbmVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHNoYWRlclR5cGUgPSAndmVydGV4JztcbiAgICAgICAgdGhpcy5fdmVydGV4Q29kZSA9IHRoaXMuX3ZlcnRleENvZGUucmVwbGFjZShkZWZpbmVSZWdleCwgX2RlZmluZVBhcnNlcik7XG4gICAgICAgIHNoYWRlclR5cGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB0aGlzLl9mcmFnbWVudENvZGUgPSB0aGlzLl9mcmFnbWVudENvZGUucmVwbGFjZShkZWZpbmVSZWdleCwgX2RlZmluZVBhcnNlcik7XG5cbiAgICAgICAgZnVuY3Rpb24gX2RlZmluZVBhcnNlcihzdHIsIHN5bWJvbCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBkZWZpbmVzID0gc2hhZGVyVHlwZSA9PT0gJ3ZlcnRleCcgPyBzZWxmLnZlcnRleERlZmluZXMgOiBzZWxmLmZyYWdtZW50RGVmaW5lcztcbiAgICAgICAgICAgIGlmICghZGVmaW5lc1tzeW1ib2xdKSB7IC8vIEhhdmVuJ3QgYmVlbiBkZWZpbmVkIGJ5IHVzZXJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzW3N5bWJvbF0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXNbc3ltYm9sXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzW3N5bWJvbF0gPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY2FuIHBhcnNlIHRvIGZsb2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IChpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgPyB2YWx1ZS50cmltKCkgOiBwYXJzZUZsb2F0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgYSBuZXcgc2hhZGVyXG4gICAgICogQHJldHVybiB7Y2xheS5TaGFkZXJ9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzaGFkZXJDb2RlQ2FjaGVbdGhpcy5fc2hhZGVySURdO1xuICAgICAgICB2YXIgc2hhZGVyID0gbmV3IFNoYWRlcihjb2RlLnZlcnRleCwgY29kZS5mcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBzaGFkZXI7XG4gICAgfVxufTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTaGFkZXIucHJvdG90eXBlLCAnc2hhZGVySUQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRlcklEO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNoYWRlci5wcm90b3R5cGUsICd2ZXJ0ZXgnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnRleENvZGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2hhZGVyLnByb3RvdHlwZSwgJ2ZyYWdtZW50Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFnbWVudENvZGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2hhZGVyLnByb3RvdHlwZSwgJ3VuaWZvcm1zJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bmlmb3JtTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG52YXIgaW1wb3J0UmVnZXggPSAvKEBpbXBvcnQpXFxzKihbMC05YS16QS1aX1xcLVxcLl0qKS9nO1xuU2hhZGVyLnBhcnNlSW1wb3J0ID0gZnVuY3Rpb24gKHNoYWRlclN0cikge1xuICAgIHNoYWRlclN0ciA9IHNoYWRlclN0ci5yZXBsYWNlKGltcG9ydFJlZ2V4LCBmdW5jdGlvbiAoc3RyLCBpbXBvcnRTeW1ib2wsIGltcG9ydE5hbWUpIHtcbiAgICAgICAgdmFyIHN0ciA9IFNoYWRlci5zb3VyY2UoaW1wb3J0TmFtZSk7XG4gICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlXG4gICAgICAgICAgICByZXR1cm4gU2hhZGVyLnBhcnNlSW1wb3J0KHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTaGFkZXIgY2h1bmsgXCInICsgaW1wb3J0TmFtZSArICdcIiBub3QgZXhpc3RlZCBpbiBsaWJyYXJ5Jyk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2hhZGVyU3RyO1xufTtcblxudmFyIGV4cG9ydFJlZ2V4ID0gLyhAZXhwb3J0KVxccyooWzAtOWEtekEtWl9cXC1cXC5dKilcXHMqXFxuKFtcXHNcXFNdKj8pQGVuZC9nO1xuXG4vKipcbiAqIEltcG9ydCBzaGFkZXIgc291cmNlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNoYWRlclN0clxuICogQG1lbWJlck9mIGNsYXkuU2hhZGVyXG4gKi9cblNoYWRlclsnaW1wb3J0J10gPSBmdW5jdGlvbiAoc2hhZGVyU3RyKSB7XG4gICAgc2hhZGVyU3RyLnJlcGxhY2UoZXhwb3J0UmVnZXgsIGZ1bmN0aW9uIChzdHIsIGV4cG9ydFN5bWJvbCwgZXhwb3J0TmFtZSwgY29kZSkge1xuICAgICAgICB2YXIgY29kZSA9IGNvZGUucmVwbGFjZSgvKF5bXFxzXFx0XFx4YTBcXHUzMDAwXSspfChbXFx1MzAwMFxceGEwXFxzXFx0XStcXHgyNCkvZywgJycpO1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gZXhwb3J0TmFtZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgdmFyIG9iaiA9IFNoYWRlci5jb2RlcztcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IHBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBwYXJ0c1tpKytdO1xuICAgICAgICAgICAgICAgIGlmICghb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgIG9ialtrZXldID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogTGlicmFyeSB0byBzdG9yZSBhbGwgdGhlIGxvYWRlZCBzaGFkZXIgY29kZXNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcmVhZE9ubHlcbiAqIEBtZW1iZXJPZiBjbGF5LlNoYWRlclxuICovXG5TaGFkZXIuY29kZXMgPSB7fTtcblxuLyoqXG4gKiBHZXQgc2hhZGVyIHNvdXJjZVxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblNoYWRlci5zb3VyY2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICB2YXIgb2JqID0gU2hhZGVyLmNvZGVzO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob2JqICYmIGkgPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHBhcnRzW2krK107XG4gICAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gRklYTUUgVXNlIGRlZmF1bHQgaW5zdGVhZFxuICAgICAgICBjb25zb2xlLmVycm9yKCdTaGFkZXIgXCInICsgbmFtZSArICdcIiBub3QgZXhpc3RlZCBpbiBsaWJyYXJ5Jyk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNoYWRlcjtcbiIsImV4cG9ydCBkZWZhdWx0IFwidmVjMyBjYWxjQW1iaWVudFNITGlnaHQoaW50IGlkeCwgdmVjMyBOKSB7XFxuICAgIGludCBvZmZzZXQgPSA5ICogaWR4O1xcbiAgICByZXR1cm4gYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbMF1cXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbMV0gKiBOLnhcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbMl0gKiBOLnlcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbM10gKiBOLnpcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbNF0gKiBOLnggKiBOLnpcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbNV0gKiBOLnogKiBOLnlcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbNl0gKiBOLnkgKiBOLnhcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbN10gKiAoMy4wICogTi56ICogTi56IC0gMS4wKVxcbiAgICAgICAgKyBhbWJpZW50U0hMaWdodENvZWZmaWNpZW50c1s4XSAqIChOLnggKiBOLnggLSBOLnkgKiBOLnkpO1xcbn1cIjtcbiIsImltcG9ydCBjYWxjQW1iaWVudFNITGlnaHRFc3NsIGZyb20gJy4vY2FsY0FtYmllbnRTSExpZ2h0Lmdsc2wuanMnO1xuXG52YXIgdW5pZm9ybVZlYzNQcmVmaXggPSAndW5pZm9ybSB2ZWMzICc7XG52YXIgdW5pZm9ybUZsb2F0UHJlZml4ID0gJ3VuaWZvcm0gZmxvYXQgJztcbnZhciBleHBvcnRIZWFkZXJQcmVmaXggPSAnQGV4cG9ydCBjbGF5LmhlYWRlci4nO1xudmFyIGV4cG9ydEVuZCA9ICdAZW5kJztcbnZhciB1bmNvbmZpZ3VyYWJsZSA9ICc6dW5jb25maWd1cmFibGU7JztcbmV4cG9ydCBkZWZhdWx0IFtcbiAgICBleHBvcnRIZWFkZXJQcmVmaXggKyAnZGlyZWN0aW9uYWxfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2RpcmVjdGlvbmFsTGlnaHREaXJlY3Rpb25bRElSRUNUSU9OQUxfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2RpcmVjdGlvbmFsTGlnaHRDb2xvcltESVJFQ1RJT05BTF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kLFxuXG4gICAgZXhwb3J0SGVhZGVyUHJlZml4ICsgJ2FtYmllbnRfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2FtYmllbnRMaWdodENvbG9yW0FNQklFTlRfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIGV4cG9ydEVuZCxcblxuICAgIGV4cG9ydEhlYWRlclByZWZpeCArICdhbWJpZW50X3NoX2xpZ2h0JyxcbiAgICB1bmlmb3JtVmVjM1ByZWZpeCArICdhbWJpZW50U0hMaWdodENvbG9yW0FNQklFTlRfU0hfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2FtYmllbnRTSExpZ2h0Q29lZmZpY2llbnRzW0FNQklFTlRfU0hfTElHSFRfQ09VTlQgKiA5XScgKyB1bmNvbmZpZ3VyYWJsZSxcbiAgICBjYWxjQW1iaWVudFNITGlnaHRFc3NsLFxuICAgIGV4cG9ydEVuZCxcblxuICAgIGV4cG9ydEhlYWRlclByZWZpeCArICdhbWJpZW50X2N1YmVtYXBfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2FtYmllbnRDdWJlbWFwTGlnaHRDb2xvcltBTUJJRU5UX0NVQkVNQVBfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgICd1bmlmb3JtIHNhbXBsZXJDdWJlIGFtYmllbnRDdWJlbWFwTGlnaHRDdWJlbWFwW0FNQklFTlRfQ1VCRU1BUF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgJ3VuaWZvcm0gc2FtcGxlcjJEIGFtYmllbnRDdWJlbWFwTGlnaHRCUkRGTG9va3VwW0FNQklFTlRfQ1VCRU1BUF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kLFxuXG4gICAgZXhwb3J0SGVhZGVyUHJlZml4ICsgJ3BvaW50X2xpZ2h0JyxcbiAgICB1bmlmb3JtVmVjM1ByZWZpeCArICdwb2ludExpZ2h0UG9zaXRpb25bUE9JTlRfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1GbG9hdFByZWZpeCArICdwb2ludExpZ2h0UmFuZ2VbUE9JTlRfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ3BvaW50TGlnaHRDb2xvcltQT0lOVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kLFxuXG4gICAgZXhwb3J0SGVhZGVyUHJlZml4ICsgJ3Nwb3RfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ3Nwb3RMaWdodFBvc2l0aW9uW1NQT1RfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ3Nwb3RMaWdodERpcmVjdGlvbltTUE9UX0xJR0hUX0NPVU5UXScgKyB1bmNvbmZpZ3VyYWJsZSxcbiAgICB1bmlmb3JtRmxvYXRQcmVmaXggKyAnc3BvdExpZ2h0UmFuZ2VbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybUZsb2F0UHJlZml4ICsgJ3Nwb3RMaWdodFVtYnJhQW5nbGVDb3NpbmVbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybUZsb2F0UHJlZml4ICsgJ3Nwb3RMaWdodFBlbnVtYnJhQW5nbGVDb3NpbmVbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybUZsb2F0UHJlZml4ICsgJ3Nwb3RMaWdodEZhbGxvZmZGYWN0b3JbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybVZlYzNQcmVmaXggKyAnc3BvdExpZ2h0Q29sb3JbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kXG5dLmpvaW4oJ1xcbicpO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkucHJlei52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG5AaW1wb3J0IGNsYXkuY2h1bmsuc2tpbm5pbmdfaGVhZGVyXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzMgc2tpbm5lZFBvc2l0aW9uID0gcG9zaXRpb247XFxuI2lmZGVmIFNLSU5OSU5HXFxuICAgIEBpbXBvcnQgY2xheS5jaHVuay5za2luX21hdHJpeFxcbiAgICBza2lubmVkUG9zaXRpb24gPSAoc2tpbk1hdHJpeFdTICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5wcmV6LmZyYWdtZW50XFxudm9pZCBtYWluKClcXG57XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcXG59XFxuQGVuZFwiO1xuIiwiLy8gVE9ETyBSZXNvdXJjZXMgbGlrZSBzaGFkZXIsIHRleHR1cmUsIGdlb21ldHJ5IHJlZmVyZW5jZSBtYW5hZ2VtZW50XG4vLyBUcmFjZSBhbmQgZmluZCBvdXQgd2hpY2ggc2hhZGVyLCB0ZXh0dXJlLCBnZW9tZXRyeSBjYW4gYmUgZGVzdHJveWVkXG5pbXBvcnQgQmFzZSBmcm9tICcuL2NvcmUvQmFzZSc7XG5pbXBvcnQgR0xJbmZvIGZyb20gJy4vY29yZS9HTEluZm8nO1xuaW1wb3J0IGdsZW51bSBmcm9tICcuL2NvcmUvZ2xlbnVtJztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi9tYXRoL0JvdW5kaW5nQm94JztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL01hdGVyaWFsJztcbmltcG9ydCBWZWN0b3IyIGZyb20gJy4vbWF0aC9WZWN0b3IyJztcbmltcG9ydCBQcm9ncmFtTWFuYWdlciBmcm9tICcuL2dwdS9Qcm9ncmFtTWFuYWdlcic7XG5cbi8vIExpZ2h0IGhlYWRlclxuaW1wb3J0IFNoYWRlciBmcm9tICcuL1NoYWRlcic7XG5cbmltcG9ydCBsaWdodFNoYWRlciBmcm9tICcuL3NoYWRlci9zb3VyY2UvaGVhZGVyL2xpZ2h0JztcbmltcG9ydCBwcmV6RXNzbCBmcm9tICcuL3NoYWRlci9zb3VyY2UvcHJlei5nbHNsLmpzJztcblNoYWRlclsnaW1wb3J0J10obGlnaHRTaGFkZXIpO1xuU2hhZGVyWydpbXBvcnQnXShwcmV6RXNzbCk7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuL2RlcC9nbG1hdHJpeCc7XG52YXIgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbnZhciBtYXQ0Q3JlYXRlID0gbWF0NC5jcmVhdGU7XG5cbnZhciBlcnJvclNoYWRlciA9IHt9O1xuXG5mdW5jdGlvbiBkZWZhdWx0R2V0TWF0ZXJpYWwocmVuZGVyYWJsZSkge1xuICAgIHJldHVybiByZW5kZXJhYmxlLm1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5SZW5kZXJlclxuICovXG52YXIgUmVuZGVyZXIgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5SZW5kZXJlciMgKi8ge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgY2FudmFzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW52YXMgd2lkdGgsIHNldCBieSByZXNpemUgbWV0aG9kXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfd2lkdGg6IDEwMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FudmFzIHdpZHRoLCBzZXQgYnkgcmVzaXplIG1ldGhvZFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX2hlaWdodDogMTAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXZpY2UgcGl4ZWwgcmF0aW8sIHNldCBieSBzZXREZXZpY2VQaXhlbFJhdGlvIG1ldGhvZFxuICAgICAgICAgKiBTcGVjaWFsbHkgZm9yIGhpZ2ggZGVmaW5hdGlvbiBkaXNwbGF5XG4gICAgICAgICAqIEBzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy93ZWJnbC93aWtpL0hhbmRsaW5nSGlnaERQSVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMS4wLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDbGVhciBjb2xvclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckNvbG9yOiBbMC4wLCAwLjAsIDAuMCwgMC4wXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmYXVsdDpcbiAgICAgICAgICogICAgIF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQgfCBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckJpdDogMTc2NjQsXG5cbiAgICAgICAgLy8gU2V0dGluZ3Mgd2hlbiBnZXR0aW5nIGNvbnRleHRcbiAgICAgICAgLy8gaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9zcGVjcy9sYXRlc3QvIzIuNFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBlbmFibGUgYWxwaGEsIGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGFscGhhOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgZW5hYmxlIGRlcHRoIGJ1ZmZlciwgZGVmYXVsdCB0cnVlXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwdGg6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBlbmFibGUgc3RlbmNpbCBidWZmZXIsIGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBzdGVuY2lsOiBmYWxzZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZSBhbnRpYWxpYXMsIGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGFudGlhbGlhczogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZSBwcmVtdWx0aXBsaWVkIGFscGhhLCBkZWZhdWx0IHRydWVcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBwcmVzZXJ2ZSBkcmF3aW5nIGJ1ZmZlciwgZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2UsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aHJvdyBjb250ZXh0IGVycm9yLCB1c3VhbGx5IHR1cm5lZCBvbiBpbiBkZWJ1ZyBtb2RlXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhyb3dFcnJvcjogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdlYkdMIENvbnRleHQgY3JlYXRlZCBmcm9tIGdpdmVuIGNhbnZhc1xuICAgICAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fVxuICAgICAgICAgKi9cbiAgICAgICAgZ2w6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW5kZXJlciB2aWV3cG9ydCwgcmVhZC1vbmx5LCBjYW4gYmUgc2V0IGJ5IHNldFZpZXdwb3J0IG1ldGhvZFxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdmlld3BvcnQ6IHt9LFxuXG4gICAgICAgIC8vIFNldCBieSBGcmFtZUJ1ZmZlciNiaW5kXG4gICAgICAgIF9fY3VycmVudEZyYW1lQnVmZmVyOiBudWxsLFxuXG4gICAgICAgIF92aWV3cG9ydFN0YWNrOiBbXSxcbiAgICAgICAgX2NsZWFyU3RhY2s6IFtdLFxuXG4gICAgICAgIF9zY2VuZVJlbmRlcmluZzogbnVsbFxuICAgIH07XG59LCBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgfVxuICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICB0cnkge1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIGFscGhhOiB0aGlzLmFscGhhLFxuICAgICAgICAgICAgZGVwdGg6IHRoaXMuZGVwdGgsXG4gICAgICAgICAgICBzdGVuY2lsOiB0aGlzLnN0ZW5jaWwsXG4gICAgICAgICAgICBhbnRpYWxpYXM6IHRoaXMuYW50aWFsaWFzLFxuICAgICAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhOiB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0cylcbiAgICAgICAgICAgIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBvcHRzKTtcblxuICAgICAgICBpZiAoIXRoaXMuZ2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ2xpbmZvID0gbmV3IEdMSW5mbyh0aGlzLmdsKTtcblxuICAgICAgICBpZiAodGhpcy5nbC50YXJnZXRSZW5kZXJlcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWxyZWFkeSBjcmVhdGVkIGEgcmVuZGVyZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLnRhcmdldFJlbmRlcmVyID0gdGhpcztcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgQ29udGV4dCAnICsgZTtcbiAgICB9XG5cbiAgICAvLyBJbml0IG1hbmFnZXJzXG4gICAgdGhpcy5fcHJvZ3JhbU1nciA9IG5ldyBQcm9ncmFtTWFuYWdlcih0aGlzKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuUmVuZGVyZXIucHJvdG90eXBlLiAqKi9cbntcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGNhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAgICAgKi9cbiAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgICAvLyBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3dlYmdsL3dpa2kvSGFuZGxpbmdIaWdoRFBJXG4gICAgICAgIC8vIHNldCB0aGUgZGlzcGxheSBzaXplIG9mIHRoZSBjYW52YXMuXG4gICAgICAgIHZhciBkcHIgPSB0aGlzLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIC8vIHNldCB0aGUgc2l6ZSBvZiB0aGUgZHJhd2luZ0J1ZmZlclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBkcHI7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogZHByO1xuXG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSBjYW52YXMud2lkdGggLyBkcHI7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBjYW52YXMuaGVpZ2h0IC8gZHByO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3cG9ydCgwLCAwLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHJlbmRlcmVyIHdpZHRoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpZHRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHJlbmRlcmVyIGhlaWdodFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHZpZXdwb3J0IGFzcGVjdCxcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Vmlld3BvcnRBc3BlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICAgICAgcmV0dXJuIHZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQuaGVpZ2h0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGV2aWNlUGl4ZWxSYXRpb1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgICovXG4gICAgc2V0RGV2aWNlUGl4ZWxSYXRpbzogZnVuY3Rpb24oZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICB0aGlzLmRldmljZVBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnJlc2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGRldmljZVBpeGVsUmF0aW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGV2aWNlUGl4ZWxSYXRpb1xuICAgICAqL1xuICAgIGdldERldmljZVBpeGVsUmF0aW86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IFdlYkdMIGV4dGVuc2lvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAqL1xuICAgIGdldEdMRXh0ZW5zaW9uOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2xpbmZvLmdldEV4dGVuc2lvbihuYW1lKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IFdlYkdMIHBhcmFtZXRlclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKi9cbiAgICBnZXRHTFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dsaW5mby5nZXRQYXJhbWV0ZXIobmFtZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCByZW5kZXJpbmcgdmlld3BvcnRcbiAgICAgKiBAcGFyYW0ge251bWJlcnxPYmplY3R9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF1cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF1cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RldmljZVBpeGVsUmF0aW9dXG4gICAgICogICAgICAgIERlZmF1bHRseSB1c2UgdGhlIHJlbmRlcmVyZSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgICogICAgICAgIEl0IG5lZWRzIHRvIGJlIDEgd2hlbiBzZXRWaWV3cG9ydCBpcyBjYWxsZWQgYnkgZnJhbWVCdWZmZXJcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogIHNldFZpZXdwb3J0KDAsMCx3aWR0aCxoZWlnaHQsMSlcbiAgICAgKiAgc2V0Vmlld3BvcnQoe1xuICAgICAqICAgICAgeDogMCxcbiAgICAgKiAgICAgIHk6IDAsXG4gICAgICogICAgICB3aWR0aDogd2lkdGgsXG4gICAgICogICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgKiAgICAgIGRldmljZVBpeGVsUmF0aW86IDFcbiAgICAgKiAgfSlcbiAgICAgKi9cbiAgICBzZXRWaWV3cG9ydDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGRwcikge1xuXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZhciBvYmogPSB4O1xuXG4gICAgICAgICAgICB4ID0gb2JqLng7XG4gICAgICAgICAgICB5ID0gb2JqLnk7XG4gICAgICAgICAgICB3aWR0aCA9IG9iai53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IG9iai5oZWlnaHQ7XG4gICAgICAgICAgICBkcHIgPSBvYmouZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBkcHIgPSBkcHIgfHwgdGhpcy5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoXG4gICAgICAgICAgICB4ICogZHByLCB5ICogZHByLCB3aWR0aCAqIGRwciwgaGVpZ2h0ICogZHByXG4gICAgICAgICk7XG4gICAgICAgIC8vIFVzZSBhIGZyZXNoIG5ldyBvYmplY3QsIG5vdCB3cml0ZSBwcm9wZXJ0eS5cbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiBkcHJcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHVzaCBjdXJyZW50IHZpZXdwb3J0IGludG8gYSBzdGFja1xuICAgICAqL1xuICAgIHNhdmVWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl92aWV3cG9ydFN0YWNrLnB1c2godGhpcy52aWV3cG9ydCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBvcCB2aWV3cG9ydCBmcm9tIHN0YWNrLCByZXN0b3JlIGluIHRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIHJlc3RvcmVWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdmlld3BvcnRTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZpZXdwb3J0KHRoaXMuX3ZpZXdwb3J0U3RhY2sucG9wKCkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFB1c2ggY3VycmVudCBjbGVhciBpbnRvIGEgc3RhY2tcbiAgICAgKi9cbiAgICBzYXZlQ2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIGNsZWFyQml0OiB0aGlzLmNsZWFyQml0LFxuICAgICAgICAgICAgY2xlYXJDb2xvcjogdGhpcy5jbGVhckNvbG9yXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQb3AgY2xlYXIgZnJvbSBzdGFjaywgcmVzdG9yZSBpbiB0aGUgcmVuZGVyZXJcbiAgICAgKi9cbiAgICByZXN0b3JlQ2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsZWFyU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIG9wdCA9IHRoaXMuX2NsZWFyU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ29sb3IgPSBvcHQuY2xlYXJDb2xvcjtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJCaXQgPSBvcHQuY2xlYXJCaXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZFNjZW5lUmVuZGVyaW5nOiBmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgdGhpcy5fc2NlbmVSZW5kZXJpbmcgPSBzY2VuZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIHRoZSBzY2VuZSBpbiBjYW1lcmEgdG8gdGhlIHNjcmVlbiBvciBiaW5kZWQgb2ZmbGluZSBmcmFtZWJ1ZmZlclxuICAgICAqIEBwYXJhbSAge2NsYXkuU2NlbmV9ICAgICAgIHNjZW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5DYW1lcmF9ICAgICAgY2FtZXJhXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgIFtub3RVcGRhdGVTY2VuZV0gSWYgbm90IGNhbGwgdGhlIHNjZW5lLnVwZGF0ZSBtZXRob2RzIGluIHRoZSByZW5kZXJpbmcsIGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICBbcHJlWl0gICAgICAgICAgIElmIHVzZSBwcmVaIG9wdGltaXphdGlvbiwgZGVmYXVsdCBmYWxzZVxuICAgICAqIEByZXR1cm4ge0lSZW5kZXJJbmZvfVxuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24oc2NlbmUsIGNhbWVyYSwgbm90VXBkYXRlU2NlbmUsIHByZVopIHtcbiAgICAgICAgdmFyIF9nbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XG5cbiAgICAgICAgaWYgKHRoaXMuY2xlYXJCaXQpIHtcblxuICAgICAgICAgICAgLy8gTXVzdCBzZXQgZGVwdGggYW5kIGNvbG9yIG1hc2sgdHJ1ZSBiZWZvcmUgY2xlYXJcbiAgICAgICAgICAgIF9nbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBfZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICAgICAgdmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICAgICAgICAgIHZhciBuZWVkc1NjaXNzb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciB2aWV3cG9ydERwciA9IHZpZXdwb3J0LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICBpZiAodmlld3BvcnQud2lkdGggIT09IHRoaXMuX3dpZHRoIHx8IHZpZXdwb3J0LmhlaWdodCAhPT0gdGhpcy5faGVpZ2h0XG4gICAgICAgICAgICAgICAgfHwgKHZpZXdwb3J0RHByICYmIHZpZXdwb3J0RHByICE9PSB0aGlzLmRldmljZVBpeGVsUmF0aW8pXG4gICAgICAgICAgICAgICAgfHwgdmlld3BvcnQueCB8fCB2aWV3cG9ydC55XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBuZWVkc1NjaXNzb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE1NDQ2MDgvaG93LXRvLWNsZWFyLWEtcmVjdGFuZ2xlLWFyZWEtaW4td2ViZ2xcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgICAgIF9nbC5lbmFibGUoX2dsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgICAgICAgICAgX2dsLnNjaXNzb3Iodmlld3BvcnQueCAqIHZpZXdwb3J0RHByLCB2aWV3cG9ydC55ICogdmlld3BvcnREcHIsIHZpZXdwb3J0LndpZHRoICogdmlld3BvcnREcHIsIHZpZXdwb3J0LmhlaWdodCAqIHZpZXdwb3J0RHByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9nbC5jbGVhckNvbG9yKGNsZWFyQ29sb3JbMF0sIGNsZWFyQ29sb3JbMV0sIGNsZWFyQ29sb3JbMl0sIGNsZWFyQ29sb3JbM10pO1xuICAgICAgICAgICAgX2dsLmNsZWFyKHRoaXMuY2xlYXJCaXQpO1xuICAgICAgICAgICAgaWYgKG5lZWRzU2Npc3Nvcikge1xuICAgICAgICAgICAgICAgIF9nbC5kaXNhYmxlKF9nbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHNjZW5lIGhhdmUgYmVlbiB1cGRhdGVkIGluIHRoZSBwcmVwYXNzIGxpa2Ugc2hhZG93IG1hcFxuICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSBpdCBhZ2FpblxuICAgICAgICBpZiAoIW5vdFVwZGF0ZVNjZW5lKSB7XG4gICAgICAgICAgICBzY2VuZS51cGRhdGUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhbWVyYSA9IGNhbWVyYSB8fCBzY2VuZS5nZXRNYWluQ2FtZXJhKCk7XG4gICAgICAgIGlmICghY2FtZXJhKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5cXCd0IGZpbmQgY2FtZXJhIGluIHRoZSBzY2VuZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgaWYgY2FtZXJhIG5vdCBtb3VudGVkIG9uIHRoZSBzY2VuZVxuICAgICAgICBpZiAoIWNhbWVyYS5nZXRTY2VuZSgpKSB7XG4gICAgICAgICAgICBjYW1lcmEudXBkYXRlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2NlbmVSZW5kZXJpbmcgPSBzY2VuZTtcblxuICAgICAgICAvLyBSZXNldCB0aGUgc2NlbmUgYm91bmRpbmcgYm94O1xuICAgICAgICBzY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWUubWluLnNldChJbmZpbml0eSwgSW5maW5pdHksIEluZmluaXR5KTtcbiAgICAgICAgc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLm1heC5zZXQoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSk7XG5cbiAgICAgICAgdmFyIG9wYXF1ZUxpc3QgPSB0aGlzLmN1bGxSZW5kZXJMaXN0KHNjZW5lLm9wYXF1ZUxpc3QsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB2YXIgdHJhbnNwYXJlbnRMaXN0ID0gdGhpcy5jdWxsUmVuZGVyTGlzdChzY2VuZS50cmFuc3BhcmVudExpc3QsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB2YXIgc2NlbmVNYXRlcmlhbCA9IHNjZW5lLm1hdGVyaWFsO1xuXG4gICAgICAgIHNjZW5lLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcicsIHRoaXMsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgICAgIC8vIFJlbmRlciBwcmUgelxuICAgICAgICBpZiAocHJlWikge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJQcmVaKG9wYXF1ZUxpc3QsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICAgICAgX2dsLmRlcHRoRnVuYyhfZ2wuTEVRVUFMKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9nbC5kZXB0aEZ1bmMoX2dsLkxFU1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBkZXB0aCBvZiB0cmFuc3BhcmVudCBsaXN0LlxuICAgICAgICB2YXIgd29ybGRWaWV3TWF0ID0gbWF0NENyZWF0ZSgpO1xuICAgICAgICB2YXIgcG9zVmlld1NwYWNlID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc3BhcmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gdHJhbnNwYXJlbnRMaXN0W2ldO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseUFmZmluZSh3b3JsZFZpZXdNYXQsIGNhbWVyYS52aWV3TWF0cml4LmFycmF5LCByZW5kZXJhYmxlLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NChwb3NWaWV3U3BhY2UsIHJlbmRlcmFibGUucG9zaXRpb24uYXJyYXksIHdvcmxkVmlld01hdCk7XG4gICAgICAgICAgICByZW5kZXJhYmxlLl9fZGVwdGggPSBwb3NWaWV3U3BhY2VbMl07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW5kZXIgb3BhcXVlIGxpc3RcbiAgICAgICAgc2NlbmUudHJpZ2dlcignYmVmb3JlcmVuZGVyOm9wYXF1ZScsIHRoaXMsIG9wYXF1ZUxpc3QpO1xuICAgICAgICB2YXIgb3BhcXVlUmVuZGVySW5mbyA9IHRoaXMucmVuZGVyUGFzcyhvcGFxdWVMaXN0LCBjYW1lcmEsIHtcbiAgICAgICAgICAgIGdldE1hdGVyaWFsOiBmdW5jdGlvbiAocmVuZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2VuZU1hdGVyaWFsIHx8IHJlbmRlcmFibGUubWF0ZXJpYWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydENvbXBhcmU6IHRoaXMub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2NlbmUudHJpZ2dlcignYWZ0ZXJyZW5kZXI6b3BhcXVlJywgdGhpcywgb3BhcXVlTGlzdCwgb3BhcXVlUmVuZGVySW5mbyk7XG4gICAgICAgIHNjZW5lLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcjp0cmFuc3BhcmVudCcsIHRoaXMsIHRyYW5zcGFyZW50TGlzdCk7XG5cbiAgICAgICAgdmFyIHRyYW5zcGFyZW50UmVuZGVySW5mbyA9IHRoaXMucmVuZGVyUGFzcyh0cmFuc3BhcmVudExpc3QsIGNhbWVyYSwge1xuICAgICAgICAgICAgZ2V0TWF0ZXJpYWw6IGZ1bmN0aW9uIChyZW5kZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjZW5lTWF0ZXJpYWwgfHwgcmVuZGVyYWJsZS5tYXRlcmlhbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3J0Q29tcGFyZTogdGhpcy50cmFuc3BhcmVudFNvcnRDb21wYXJlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNjZW5lLnRyaWdnZXIoJ2FmdGVycmVuZGVyOnRyYW5zcGFyZW50JywgdGhpcywgdHJhbnNwYXJlbnRMaXN0LCB0cmFuc3BhcmVudFJlbmRlckluZm8pO1xuICAgICAgICB2YXIgcmVuZGVySW5mbyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9wYXF1ZVJlbmRlckluZm8pIHtcbiAgICAgICAgICAgIHJlbmRlckluZm9bbmFtZV0gPSBvcGFxdWVSZW5kZXJJbmZvW25hbWVdICsgdHJhbnNwYXJlbnRSZW5kZXJJbmZvW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NlbmUudHJpZ2dlcignYWZ0ZXJyZW5kZXInLCB0aGlzLCBzY2VuZSwgY2FtZXJhLCByZW5kZXJJbmZvKTtcblxuICAgICAgICAvLyBDbGVhbnVwXG4gICAgICAgIHRoaXMuX3NjZW5lUmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJlbmRlckluZm87XG4gICAgfSxcblxuICAgIGdldFByb2dyYW06IGZ1bmN0aW9uIChyZW5kZXJhYmxlLCByZW5kZXJNYXRlcmlhbCwgc2NlbmUpIHtcbiAgICAgICAgcmVuZGVyTWF0ZXJpYWwgPSByZW5kZXJNYXRlcmlhbCB8fCByZW5kZXJhYmxlLm1hdGVyaWFsO1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbU1nci5nZXRQcm9ncmFtKHJlbmRlcmFibGUsIHJlbmRlck1hdGVyaWFsLCBzY2VuZSk7XG4gICAgfSxcblxuICAgIHZhbGlkYXRlUHJvZ3JhbTogZnVuY3Rpb24gKHByb2dyYW0pIHtcbiAgICAgICAgaWYgKHByb2dyYW0uX19lcnJvcikge1xuICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gcHJvZ3JhbS5fX2Vycm9yO1xuICAgICAgICAgICAgaWYgKGVycm9yU2hhZGVyW3Byb2dyYW0uX191aWRfX10pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcnJvclNoYWRlcltwcm9ncmFtLl9fdWlkX19dID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudGhyb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgZXJyb3JNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgdXBkYXRlUHJvZ3JhbXM6IGZ1bmN0aW9uIChsaXN0LCBzY2VuZSwgcGFzc0NvbmZpZykge1xuICAgICAgICB2YXIgZ2V0TWF0ZXJpYWwgPSAocGFzc0NvbmZpZyAmJiBwYXNzQ29uZmlnLmdldE1hdGVyaWFsKSB8fCBkZWZhdWx0R2V0TWF0ZXJpYWw7XG4gICAgICAgIHNjZW5lID0gc2NlbmUgfHwgbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyYWJsZSA9IGxpc3RbaV07XG4gICAgICAgICAgICB2YXIgcmVuZGVyTWF0ZXJpYWwgPSBnZXRNYXRlcmlhbC5jYWxsKHRoaXMsIHJlbmRlcmFibGUpO1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZSZW5kZXJhYmxlID0gbGlzdFtpIC0gMV07XG4gICAgICAgICAgICAgICAgdmFyIHByZXZKb2ludHNMZW4gPSBwcmV2UmVuZGVyYWJsZS5qb2ludHMgPyBwcmV2UmVuZGVyYWJsZS5qb2ludHMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnRzTGVuID0gcmVuZGVyYWJsZS5qb2ludHMubGVuZ3RoID8gcmVuZGVyYWJsZS5qb2ludHMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAvLyBLZWVwIHByb2dyYW0gbm90IGNoYW5nZSBpZiBqb2ludHMsIG1hdGVyaWFsLCBsaWdodEdyb3VwIGFyZSBzYW1lIG9mIHR3byByZW5kZXJhYmxlcy5cbiAgICAgICAgICAgICAgICBpZiAoam9pbnRzTGVuID09PSBwcmV2Sm9pbnRzTGVuXG4gICAgICAgICAgICAgICAgICAgICYmIHJlbmRlcmFibGUubWF0ZXJpYWwgPT09IHByZXZSZW5kZXJhYmxlLm1hdGVyaWFsXG4gICAgICAgICAgICAgICAgICAgICYmIHJlbmRlcmFibGUubGlnaHRHcm91cCA9PT0gcHJldlJlbmRlcmFibGUubGlnaHRHcm91cFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJhYmxlLl9fcHJvZ3JhbSA9IHByZXZSZW5kZXJhYmxlLl9fcHJvZ3JhbTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcHJvZ3JhbSA9IHRoaXMuX3Byb2dyYW1NZ3IuZ2V0UHJvZ3JhbShyZW5kZXJhYmxlLCByZW5kZXJNYXRlcmlhbCwgc2NlbmUpO1xuXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgICAgICAgICAgcmVuZGVyYWJsZS5fX3Byb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERvIGZydXN0dW0gY3VsbGluZyBvbiByZW5kZXIgbGlzdFxuICAgICAqL1xuICAgIGN1bGxSZW5kZXJMaXN0OiBmdW5jdGlvbiAobGlzdCwgc2NlbmUsIGNhbWVyYSkge1xuICAgICAgICB2YXIgY3VsbGVkUmVuZGVyTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gbGlzdFtpXTtcblxuICAgICAgICAgICAgdmFyIHdvcmxkTSA9IHJlbmRlcmFibGUuaXNTa2lubmVkTWVzaCgpID8gbWF0cmljZXMuSURFTlRJVFkgOiByZW5kZXJhYmxlLndvcmxkVHJhbnNmb3JtLmFycmF5O1xuICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gcmVuZGVyYWJsZS5nZW9tZXRyeTtcblxuICAgICAgICAgICAgbWF0NC5tdWx0aXBseUFmZmluZShtYXRyaWNlcy5XT1JMRFZJRVcsIGNhbWVyYS52aWV3TWF0cml4LmFycmF5ICwgd29ybGRNKTtcbiAgICAgICAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ0JveCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRnJ1c3R1bUN1bGxlZChcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyYWJsZSwgc2NlbmUsIGNhbWVyYSwgbWF0cmljZXMuV09STERWSUVXLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5hcnJheVxuICAgICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdWxsZWRSZW5kZXJMaXN0LnB1c2gocmVuZGVyYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VsbGVkUmVuZGVyTGlzdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc2luZ2xlIHJlbmRlcmFibGUgbGlzdCBpbiBjYW1lcmEgaW4gc2VxdWVuY2VcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyYWJsZVtdfSBsaXN0IExpc3Qgb2YgYWxsIHJlbmRlcmFibGVzLlxuICAgICAqIEBwYXJhbSB7Y2xheS5DYW1lcmF9IGNhbWVyYVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFzc0NvbmZpZ11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGFzc0NvbmZpZy5nZXRNYXRlcmlhbF0gR2V0IHJlbmRlcmFibGUgbWF0ZXJpYWwuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Bhc3NDb25maWcuYmVmb3JlUmVuZGVyXSBCZWZvcmUgcmVuZGVyIGVhY2ggcmVuZGVyYWJsZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGFzc0NvbmZpZy5hZnRlclJlbmRlcl0gQWZ0ZXIgcmVuZGVyIGVhY2ggcmVuZGVyYWJsZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwYXNzQ29uZmlnLmlmUmVuZGVyXSBJZiByZW5kZXIgdGhlIHJlbmRlcmFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Bhc3NDb25maWcuc29ydENvbXBhcmVdIFNvcnQgY29tcGFyZSBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtJUmVuZGVySW5mb31cbiAgICAgKi9cbiAgICByZW5kZXJQYXNzOiBmdW5jdGlvbihsaXN0LCBjYW1lcmEsIHBhc3NDb25maWcpIHtcbiAgICAgICAgdmFyIHJlbmRlckluZm8gPSB7XG4gICAgICAgICAgICB0cmlhbmdsZUNvdW50OiAwLFxuICAgICAgICAgICAgdmVydGV4Q291bnQ6IDAsXG4gICAgICAgICAgICBkcmF3Q2FsbENvdW50OiAwLFxuICAgICAgICAgICAgbWVzaENvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICAgICAgICAgIHJlbmRlcmVkTWVzaENvdW50OiAwXG4gICAgICAgIH07XG4gICAgICAgIHBhc3NDb25maWcgPSBwYXNzQ29uZmlnIHx8IHt9O1xuICAgICAgICBwYXNzQ29uZmlnLmdldE1hdGVyaWFsID0gcGFzc0NvbmZpZy5nZXRNYXRlcmlhbCB8fCBkZWZhdWx0R2V0TWF0ZXJpYWw7XG4gICAgICAgIHBhc3NDb25maWcuYmVmb3JlUmVuZGVyID0gcGFzc0NvbmZpZy5iZWZvcmVSZW5kZXIgfHwgbm9vcDtcbiAgICAgICAgcGFzc0NvbmZpZy5hZnRlclJlbmRlciA9IHBhc3NDb25maWcuYWZ0ZXJSZW5kZXIgfHwgbm9vcDtcblxuICAgICAgICB0aGlzLnVwZGF0ZVByb2dyYW1zKGxpc3QsIHRoaXMuX3NjZW5lUmVuZGVyaW5nLCBwYXNzQ29uZmlnKTtcbiAgICAgICAgaWYgKHBhc3NDb25maWcuc29ydENvbXBhcmUpIHtcbiAgICAgICAgICAgIGxpc3Quc29ydChwYXNzQ29uZmlnLnNvcnRDb21wYXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvbWUgY29tbW9uIGJ1aWx0aW4gdW5pZm9ybXNcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICAgICAgdmFyIHZEcHIgPSB2aWV3cG9ydC5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB2YXIgdmlld3BvcnRVbmlmb3JtID0gW1xuICAgICAgICAgICAgdmlld3BvcnQueCAqIHZEcHIsIHZpZXdwb3J0LnkgKiB2RHByLFxuICAgICAgICAgICAgdmlld3BvcnQud2lkdGggKiB2RHByLCB2aWV3cG9ydC5oZWlnaHQgKiB2RHByXG4gICAgICAgIF07XG4gICAgICAgIHZhciB3aW5kb3dEcHIgPSB0aGlzLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHZhciB3aW5kb3dTaXplVW5pZm9ybSA9IHRoaXMuX19jdXJyZW50RnJhbWVCdWZmZXJcbiAgICAgICAgICAgID8gW3RoaXMuX19jdXJyZW50RnJhbWVCdWZmZXIuZ2V0VGV4dHVyZVdpZHRoKCksIHRoaXMuX19jdXJyZW50RnJhbWVCdWZmZXIuZ2V0VGV4dHVyZUhlaWdodCgpXVxuICAgICAgICAgICAgOiBbdGhpcy5fd2lkdGggKiB3aW5kb3dEcHIsIHRoaXMuX2hlaWdodCAqIHdpbmRvd0Rwcl07XG4gICAgICAgIC8vIERFUFJFQ0FURURcbiAgICAgICAgdmFyIHZpZXdwb3J0U2l6ZVVuaWZvcm0gPSBbXG4gICAgICAgICAgICB2aWV3cG9ydFVuaWZvcm1bMl0sIHZpZXdwb3J0VW5pZm9ybVszXVxuICAgICAgICBdO1xuICAgICAgICB2YXIgdGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQuY29weShtYXRyaWNlcy5WSUVXLCBjYW1lcmEudmlld01hdHJpeC5hcnJheSk7XG4gICAgICAgIG1hdDQuY29weShtYXRyaWNlcy5QUk9KRUNUSU9OLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5hcnJheSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMuVklFV1BST0pFQ1RJT04sIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmFycmF5LCBtYXRyaWNlcy5WSUVXKTtcbiAgICAgICAgbWF0NC5jb3B5KG1hdHJpY2VzLlZJRVdJTlZFUlNFLCBjYW1lcmEud29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICBtYXQ0LmludmVydChtYXRyaWNlcy5QUk9KRUNUSU9OSU5WRVJTRSwgbWF0cmljZXMuUFJPSkVDVElPTik7XG4gICAgICAgIG1hdDQuaW52ZXJ0KG1hdHJpY2VzLlZJRVdQUk9KRUNUSU9OSU5WRVJTRSwgbWF0cmljZXMuVklFV1BST0pFQ1RJT04pO1xuXG4gICAgICAgIHZhciBfZ2wgPSB0aGlzLmdsO1xuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLl9zY2VuZVJlbmRlcmluZztcblxuICAgICAgICB2YXIgcHJldk1hdGVyaWFsO1xuICAgICAgICB2YXIgcHJldlByb2dyYW07XG5cbiAgICAgICAgLy8gU3RhdHVzXG4gICAgICAgIHZhciBkZXB0aFRlc3QsIGRlcHRoTWFzaztcbiAgICAgICAgdmFyIGN1bGxpbmcsIGN1bGxGYWNlLCBmcm9udEZhY2U7XG4gICAgICAgIHZhciB0cmFuc3BhcmVudDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gbGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChwYXNzQ29uZmlnLmlmUmVuZGVyICYmICFwYXNzQ29uZmlnLmlmUmVuZGVyKHJlbmRlcmFibGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraW5uZWQgbWVzaCB3aWxsIHRyYW5zZm9ybWVkIHRvIGpvaW50IHNwYWNlLiBJZ25vcmUgdGhlIG1lc2ggdHJhbnNmb3JtXG4gICAgICAgICAgICB2YXIgd29ybGRNID0gcmVuZGVyYWJsZS5pc1NraW5uZWRNZXNoKCkgPyBtYXRyaWNlcy5JREVOVElUWSA6IHJlbmRlcmFibGUud29ybGRUcmFuc2Zvcm0uYXJyYXk7XG5cbiAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IHBhc3NDb25maWcuZ2V0TWF0ZXJpYWwuY2FsbCh0aGlzLCByZW5kZXJhYmxlKTtcblxuICAgICAgICAgICAgdmFyIHByb2dyYW0gPSByZW5kZXJhYmxlLl9fcHJvZ3JhbTtcbiAgICAgICAgICAgIHZhciBzaGFkZXIgPSBtYXRlcmlhbC5zaGFkZXI7XG5cbiAgICAgICAgICAgIG1hdDQuY29weShtYXRyaWNlcy5XT1JMRCwgd29ybGRNKTtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMuV09STERWSUVXUFJPSkVDVElPTiwgbWF0cmljZXMuVklFV1BST0pFQ1RJT04gLCB3b3JsZE0pO1xuICAgICAgICAgICAgaWYgKHNoYWRlci5tYXRyaXhTZW1hbnRpY3MuV09STERJTlZFUlNFIHx8XG4gICAgICAgICAgICAgICAgc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRElOVkVSU0VUUkFOU1BPU0UpIHtcbiAgICAgICAgICAgICAgICBtYXQ0LmludmVydChtYXRyaWNlcy5XT1JMRElOVkVSU0UsIHdvcmxkTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRFZJRVdJTlZFUlNFIHx8XG4gICAgICAgICAgICAgICAgc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRFZJRVdJTlZFUlNFVFJBTlNQT1NFKSB7XG4gICAgICAgICAgICAgICAgbWF0NC5pbnZlcnQobWF0cmljZXMuV09STERWSUVXSU5WRVJTRSwgbWF0cmljZXMuV09STERWSUVXKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaGFkZXIubWF0cml4U2VtYW50aWNzLldPUkxEVklFV1BST0pFQ1RJT05JTlZFUlNFIHx8XG4gICAgICAgICAgICAgICAgc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRFZJRVdQUk9KRUNUSU9OSU5WRVJTRVRSQU5TUE9TRSkge1xuICAgICAgICAgICAgICAgIG1hdDQuaW52ZXJ0KG1hdHJpY2VzLldPUkxEVklFV1BST0pFQ1RJT05JTlZFUlNFLCBtYXRyaWNlcy5XT1JMRFZJRVdQUk9KRUNUSU9OKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmVmb3JlIHJlbmRlciBob29rXG4gICAgICAgICAgICByZW5kZXJhYmxlLmJlZm9yZVJlbmRlcih0aGlzKTtcbiAgICAgICAgICAgIHBhc3NDb25maWcuYmVmb3JlUmVuZGVyLmNhbGwodGhpcywgcmVuZGVyYWJsZSwgbWF0ZXJpYWwsIHByZXZNYXRlcmlhbCk7XG5cbiAgICAgICAgICAgIHZhciBwcm9ncmFtQ2hhbmdlZCA9IHByb2dyYW0gIT09IHByZXZQcm9ncmFtO1xuICAgICAgICAgICAgaWYgKHByb2dyYW1DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IGxpZ2h0cyBudW1iZXJcbiAgICAgICAgICAgICAgICBwcm9ncmFtLmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHNvbWUgY29tbW9uIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdWSUVXUE9SVCcsIHZpZXdwb3J0VW5pZm9ybSk7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdXSU5ET1dfU0laRScsIHdpbmRvd1NpemVVbmlmb3JtKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ05FQVInLCBjYW1lcmEubmVhcik7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdGQVInLCBjYW1lcmEuZmFyKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ0RFVklDRVBJWEVMUkFUSU8nLCB2RHByKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ1RJTUUnLCB0aW1lKTtcbiAgICAgICAgICAgICAgICAvLyBERVBSRUNBVEVEXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdWSUVXUE9SVF9TSVpFJywgdmlld3BvcnRTaXplVW5pZm9ybSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgbGlnaHRzIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBuZWVkcyBvcHRpbWl6ZWRcbiAgICAgICAgICAgICAgICBpZiAoc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUuc2V0TGlnaHRVbmlmb3Jtcyhwcm9ncmFtLCByZW5kZXJhYmxlLmxpZ2h0R3JvdXAsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSBwcmV2UHJvZ3JhbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvZ3JhbSBjaGFuZ2VzIGFsc28gbmVlZHMgcmVzZXQgdGhlIG1hdGVyaWFscy5cbiAgICAgICAgICAgIGlmIChwcmV2TWF0ZXJpYWwgIT09IG1hdGVyaWFsIHx8IHByb2dyYW1DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLmRlcHRoVGVzdCAhPT0gZGVwdGhUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoVGVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfZ2wuZW5hYmxlKF9nbC5ERVBUSF9URVNUKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZ2wuZGlzYWJsZShfZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoVGVzdCA9IG1hdGVyaWFsLmRlcHRoVGVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLmRlcHRoTWFzayAhPT0gZGVwdGhNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIF9nbC5kZXB0aE1hc2sobWF0ZXJpYWwuZGVwdGhNYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGhNYXNrID0gbWF0ZXJpYWwuZGVwdGhNYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF0ZXJpYWwudHJhbnNwYXJlbnQgIT09IHRyYW5zcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9nbC5lbmFibGUoX2dsLkJMRU5EKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZ2wuZGlzYWJsZShfZ2wuQkxFTkQpO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudCA9IG1hdGVyaWFsLnRyYW5zcGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUT0RPIGNhY2hlIGJsZW5kaW5nXG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLnRyYW5zcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRlcmlhbC5ibGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuYmxlbmQoX2dsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgYmxlbmQgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF9nbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoX2dsLkZVTkNfQURELCBfZ2wuRlVOQ19BREQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2dsLmJsZW5kRnVuY1NlcGFyYXRlKF9nbC5TUkNfQUxQSEEsIF9nbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBfZ2wuT05FLCBfZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5iaW5kKHRoaXMsIHByb2dyYW0sIHByZXZNYXRlcmlhbCwgcHJldlByb2dyYW0pO1xuICAgICAgICAgICAgICAgIHByZXZNYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbWF0cml4U2VtYW50aWNLZXlzID0gc2hhZGVyLm1hdHJpeFNlbWFudGljS2V5cztcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWF0cml4U2VtYW50aWNLZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbWFudGljID0gbWF0cml4U2VtYW50aWNLZXlzW2tdO1xuICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpY0luZm8gPSBzaGFkZXIubWF0cml4U2VtYW50aWNzW3NlbWFudGljXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0cml4ID0gbWF0cmljZXNbc2VtYW50aWNdO1xuICAgICAgICAgICAgICAgIGlmIChzZW1hbnRpY0luZm8uaXNUcmFuc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdHJpeE5vVHJhbnNwb3NlID0gbWF0cmljZXNbc2VtYW50aWNJbmZvLnNlbWFudGljTm9UcmFuc3Bvc2VdO1xuICAgICAgICAgICAgICAgICAgICBtYXQ0LnRyYW5zcG9zZShtYXRyaXgsIG1hdHJpeE5vVHJhbnNwb3NlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKF9nbCwgc2VtYW50aWNJbmZvLnR5cGUsIHNlbWFudGljSW5mby5zeW1ib2wsIG1hdHJpeCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJhYmxlLmN1bGxGYWNlICE9PSBjdWxsRmFjZSkge1xuICAgICAgICAgICAgICAgIGN1bGxGYWNlID0gcmVuZGVyYWJsZS5jdWxsRmFjZTtcbiAgICAgICAgICAgICAgICBfZ2wuY3VsbEZhY2UoY3VsbEZhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlbmRlcmFibGUuZnJvbnRGYWNlICE9PSBmcm9udEZhY2UpIHtcbiAgICAgICAgICAgICAgICBmcm9udEZhY2UgPSByZW5kZXJhYmxlLmZyb250RmFjZTtcbiAgICAgICAgICAgICAgICBfZ2wuZnJvbnRGYWNlKGZyb250RmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVuZGVyYWJsZS5jdWxsaW5nICE9PSBjdWxsaW5nKSB7XG4gICAgICAgICAgICAgICAgY3VsbGluZyA9IHJlbmRlcmFibGUuY3VsbGluZztcbiAgICAgICAgICAgICAgICBjdWxsaW5nID8gX2dsLmVuYWJsZShfZ2wuQ1VMTF9GQUNFKSA6IF9nbC5kaXNhYmxlKF9nbC5DVUxMX0ZBQ0UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb2JqZWN0UmVuZGVySW5mbyA9IHJlbmRlcmFibGUucmVuZGVyKHRoaXMsIG1hdGVyaWFsLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgaWYgKG9iamVjdFJlbmRlckluZm8pIHtcbiAgICAgICAgICAgICAgICByZW5kZXJJbmZvLnRyaWFuZ2xlQ291bnQgKz0gb2JqZWN0UmVuZGVySW5mby50cmlhbmdsZUNvdW50O1xuICAgICAgICAgICAgICAgIHJlbmRlckluZm8udmVydGV4Q291bnQgKz0gb2JqZWN0UmVuZGVySW5mby52ZXJ0ZXhDb3VudDtcbiAgICAgICAgICAgICAgICByZW5kZXJJbmZvLmRyYXdDYWxsQ291bnQgKz0gb2JqZWN0UmVuZGVySW5mby5kcmF3Q2FsbENvdW50O1xuICAgICAgICAgICAgICAgIHJlbmRlckluZm8ucmVuZGVyZWRNZXNoQ291bnQgKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFmdGVyIHJlbmRlciBob29rXG4gICAgICAgICAgICBwYXNzQ29uZmlnLmFmdGVyUmVuZGVyLmNhbGwodGhpcywgcmVuZGVyYWJsZSwgb2JqZWN0UmVuZGVySW5mbyk7XG4gICAgICAgICAgICByZW5kZXJhYmxlLmFmdGVyUmVuZGVyKHRoaXMsIG9iamVjdFJlbmRlckluZm8pO1xuXG4gICAgICAgICAgICBwcmV2UHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgcHJvZ3JhbXMgaW5jYXNlIGl0J3Mgbm90IHVwZGF0ZWQgaW4gdGhlIG90aGVyIHBhc3Nlcy5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsaXN0W2ldLl9fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVySW5mbztcbiAgICB9LFxuXG4gICAgcmVuZGVyUHJlWjogZnVuY3Rpb24gKGxpc3QsIHNjZW5lLCBjYW1lcmEpIHtcbiAgICAgICAgdmFyIF9nbCA9IHRoaXMuZ2w7XG4gICAgICAgIHZhciBwcmVaUGFzc01hdGVyaWFsID0gdGhpcy5fcHJlek1hdGVyaWFsIHx8IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5wcmV6LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnByZXouZnJhZ21lbnQnKSlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3ByZXpNYXRlcmlhbCA9IHByZVpQYXNzTWF0ZXJpYWw7XG5cbiAgICAgICAgX2dsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIF9nbC5kZXB0aE1hc2sodHJ1ZSk7XG5cbiAgICAgICAgLy8gU3RhdHVzXG4gICAgICAgIHRoaXMucmVuZGVyUGFzcyhsaXN0LCBjYW1lcmEsIHtcbiAgICAgICAgICAgIGlmUmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhcmVuZGVyYWJsZS5pZ25vcmVQcmVaO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZVpQYXNzTWF0ZXJpYWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydDogdGhpcy5vcGFxdWVTb3J0Q29tcGFyZVxuICAgICAgICB9KTtcblxuICAgICAgICBfZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICBfZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBhbiBzY2VuZSBvYmplY3QgaXMgY3VsbGVkIGJ5IGNhbWVyYSBmcnVzdHVtXG4gICAgICpcbiAgICAgKiBPYmplY3QgY2FuIGJlIGEgcmVuZGVyYWJsZSBvciBhIGxpZ2h0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2NsYXkuTm9kZX0gU2NlbmUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtjbGF5LkNhbWVyYX0gY2FtZXJhXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gd29ybGRWaWV3TWF0IHJlcHJlc2VudGVkIHdpdGggYXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBwcm9qZWN0aW9uTWF0IHJlcHJlc2VudGVkIHdpdGggYXJyYXlcbiAgICAgKi9cbiAgICBpc0ZydXN0dW1DdWxsZWQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEZydXN0dW0gY3VsbGluZ1xuICAgICAgICAvLyBodHRwOi8vd3d3LmNzZS5jaGFsbWVycy5zZS9+dWZmZS92ZmNfYmJveC5wZGZcbiAgICAgICAgdmFyIGN1bGxpbmdCb3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB2YXIgY3VsbGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBzY2VuZSwgY2FtZXJhLCB3b3JsZFZpZXdNYXQsIHByb2plY3Rpb25NYXQpIHtcbiAgICAgICAgICAgIC8vIEJvdW5kaW5nIGJveCBjYW4gYmUgYSBwcm9wZXJ0eSBvZiBvYmplY3QobGlrZSBsaWdodCkgb3IgcmVuZGVyYWJsZS5nZW9tZXRyeVxuICAgICAgICAgICAgdmFyIGdlb0JCb3ggPSBvYmplY3QuYm91bmRpbmdCb3ggfHwgb2JqZWN0Lmdlb21ldHJ5LmJvdW5kaW5nQm94O1xuICAgICAgICAgICAgY3VsbGluZ01hdHJpeC5hcnJheSA9IHdvcmxkVmlld01hdDtcbiAgICAgICAgICAgIGN1bGxpbmdCb3VuZGluZ0JveC5jb3B5KGdlb0JCb3gpO1xuICAgICAgICAgICAgY3VsbGluZ0JvdW5kaW5nQm94LmFwcGx5VHJhbnNmb3JtKGN1bGxpbmdNYXRyaXgpO1xuXG4gICAgICAgICAgICAvLyBQYXNzaW5nbHkgdXBkYXRlIHRoZSBzY2VuZSBib3VuZGluZyBib3hcbiAgICAgICAgICAgIC8vIEZJWE1FIGV4Y2x1ZGUgdmVyeSBsYXJnZSBtZXNoIGxpa2UgZ3JvdW5kIHBsYW5lIG9yIHRlcnJhaW4gP1xuICAgICAgICAgICAgLy8gRklYTUUgT25seSByZW5kZXJlcmFibGUgd2hpY2ggY2FzdCBzaGFkb3cgP1xuXG4gICAgICAgICAgICAvLyBGSVhNRSBib3VuZGluZ0JveCBiZWNvbWVzIG11Y2ggbGFyZ2VyIGFmdGVyIHRyYW5zZm9ybWQuXG4gICAgICAgICAgICBpZiAoc2NlbmUgJiYgb2JqZWN0LmlzUmVuZGVyYWJsZSgpICYmIG9iamVjdC5jYXN0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLnVuaW9uKGN1bGxpbmdCb3VuZGluZ0JveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZ25vcmUgZnJ1c3R1bSBjdWxsaW5nIGlmIG9iamVjdCBpcyBza2lubmVkIG1lc2guXG4gICAgICAgICAgICBpZiAob2JqZWN0LmZydXN0dW1DdWxsaW5nICYmICFvYmplY3QuaXNTa2lubmVkTWVzaCgpKSAge1xuICAgICAgICAgICAgICAgIGlmICghY3VsbGluZ0JvdW5kaW5nQm94LmludGVyc2VjdEJvdW5kaW5nQm94KGNhbWVyYS5mcnVzdHVtLmJvdW5kaW5nQm94KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdWxsaW5nTWF0cml4LmFycmF5ID0gcHJvamVjdGlvbk1hdDtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGN1bGxpbmdCb3VuZGluZ0JveC5tYXguYXJyYXlbMl0gPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIGN1bGxpbmdCb3VuZGluZ0JveC5taW4uYXJyYXlbMl0gPCAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaXAgaW4gdGhlIG5lYXIgcGxhbmVcbiAgICAgICAgICAgICAgICAgICAgY3VsbGluZ0JvdW5kaW5nQm94Lm1heC5hcnJheVsyXSA9IC0xZS0yMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdWxsaW5nQm91bmRpbmdCb3guYXBwbHlQcm9qZWN0aW9uKGN1bGxpbmdNYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1pbiA9IGN1bGxpbmdCb3VuZGluZ0JveC5taW4uYXJyYXk7XG4gICAgICAgICAgICAgICAgdmFyIG1heCA9IGN1bGxpbmdCb3VuZGluZ0JveC5tYXguYXJyYXk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1heFswXSA8IC0xIHx8IG1pblswXSA+IDFcbiAgICAgICAgICAgICAgICAgICAgfHwgbWF4WzFdIDwgLTEgfHwgbWluWzFdID4gMVxuICAgICAgICAgICAgICAgICAgICB8fCBtYXhbMl0gPCAtMSB8fCBtaW5bMl0gPiAxXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGdpdmVuIHNjZW5lLCBpbmNsdWRpbmcgYWxsIGdlb21ldHJpcywgdGV4dHVyZXMgYW5kIHNoYWRlcnMgaW4gdGhlIHNjZW5lXG4gICAgICogQHBhcmFtIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqL1xuICAgIGRpc3Bvc2VTY2VuZTogZnVuY3Rpb24oc2NlbmUpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlTm9kZShzY2VuZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHNjZW5lLmRpc3Bvc2UoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBnaXZlbiBub2RlLCBpbmNsdWRpbmcgYWxsIGdlb21ldHJpZXMsIHRleHR1cmVzIGFuZCBzaGFkZXJzIGF0dGFjaGVkIG9uIGl0IG9yIGl0cyBkZXNjZW5kYW50XG4gICAgICogQHBhcmFtIHtjbGF5Lk5vZGV9IG5vZGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkaXNwb3NlR2VvbWV0cnk9ZmFsc2VdIElmIGRpc3Bvc2UgdGhlIGdlb21ldHJpZXMgdXNlZCBpbiB0aGUgZGVzY2VuZGFudCBtZXNoXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGlzcG9zZVRleHR1cmU9ZmFsc2VdIElmIGRpc3Bvc2UgdGhlIHRleHR1cmVzIHVzZWQgaW4gdGhlIGRlc2NlbmRhbnQgbWVzaFxuICAgICAqL1xuICAgIGRpc3Bvc2VOb2RlOiBmdW5jdGlvbihyb290LCBkaXNwb3NlR2VvbWV0cnksIGRpc3Bvc2VUZXh0dXJlKSB7XG4gICAgICAgIC8vIERldHRhY2hlZCBmcm9tIHBhcmVudFxuICAgICAgICBpZiAocm9vdC5nZXRQYXJlbnQoKSkge1xuICAgICAgICAgICAgcm9vdC5nZXRQYXJlbnQoKS5yZW1vdmUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC50cmF2ZXJzZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5nZW9tZXRyeSAmJiBkaXNwb3NlR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBub2RlLmdlb21ldHJ5LmRpc3Bvc2UodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQYXJ0aWNsZSBzeXN0ZW0gYW5kIEFtYmllbnRDdWJlbWFwIGxpZ2h0IG5lZWQgdG8gZGlzcG9zZVxuICAgICAgICAgICAgaWYgKG5vZGUuZGlzcG9zZSkge1xuICAgICAgICAgICAgICAgIG5vZGUuZGlzcG9zZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2UgZ2l2ZW4gZ2VvbWV0cnlcbiAgICAgKiBAcGFyYW0ge2NsYXkuR2VvbWV0cnl9IGdlb21ldHJ5XG4gICAgICovXG4gICAgZGlzcG9zZUdlb21ldHJ5OiBmdW5jdGlvbihnZW9tZXRyeSkge1xuICAgICAgICBnZW9tZXRyeS5kaXNwb3NlKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGdpdmVuIHRleHR1cmVcbiAgICAgKiBAcGFyYW0ge2NsYXkuVGV4dHVyZX0gdGV4dHVyZVxuICAgICAqL1xuICAgIGRpc3Bvc2VUZXh0dXJlOiBmdW5jdGlvbih0ZXh0dXJlKSB7XG4gICAgICAgIHRleHR1cmUuZGlzcG9zZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBnaXZlbiBmcmFtZSBidWZmZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkuRnJhbWVCdWZmZXJ9IGZyYW1lQnVmZmVyXG4gICAgICovXG4gICAgZGlzcG9zZUZyYW1lQnVmZmVyOiBmdW5jdGlvbihmcmFtZUJ1ZmZlcikge1xuICAgICAgICBmcmFtZUJ1ZmZlci5kaXNwb3NlKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHNjcmVlbiBjb29yZHMgdG8gbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZXMoTkRDKVxuICAgICAqIFNjcmVlbiBjb29yZHMgY2FuIGdldCBmcm9tIG1vdXNlIGV2ZW50LCBpdCBpcyBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIGNhbnZhcyBlbGVtZW50XG4gICAgICogTkRDIGNhbiBiZSB1c2VkIGluIHJheSBjYXN0aW5nIHdpdGggQ2FtZXJhLnByb3RvdHlwZS5jYXN0UmF5IG1ldGhvZHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gICAgICAgeFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gICAgICAgeVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIHNjcmVlblRvTkRDOiBmdW5jdGlvbih4LCB5LCBvdXQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW52ZXJ0IHk7XG4gICAgICAgIHkgPSB0aGlzLl9oZWlnaHQgLSB5O1xuXG4gICAgICAgIHZhciB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7XG4gICAgICAgIHZhciBhcnIgPSBvdXQuYXJyYXk7XG4gICAgICAgIGFyclswXSA9ICh4IC0gdmlld3BvcnQueCkgLyB2aWV3cG9ydC53aWR0aDtcbiAgICAgICAgYXJyWzBdID0gYXJyWzBdICogMiAtIDE7XG4gICAgICAgIGFyclsxXSA9ICh5IC0gdmlld3BvcnQueSkgLyB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgIGFyclsxXSA9IGFyclsxXSAqIDIgLSAxO1xuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufSk7XG5cbi8qKlxuICogT3BhcXVlIHJlbmRlcmFibGVzIGNvbXBhcmUgZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkuUmVuZGVyYWJsZX0geFxuICogQHBhcmFtICB7Y2xheS5SZW5kZXJhYmxlfSB5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHN0YXRpY1xuICovXG5SZW5kZXJlci5vcGFxdWVTb3J0Q29tcGFyZSA9IFJlbmRlcmVyLnByb3RvdHlwZS5vcGFxdWVTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAvLyBQcmlvcml0eSByZW5kZXJPcmRlciAtPiBwcm9ncmFtIC0+IG1hdGVyaWFsIC0+IGdlb21ldHJ5XG4gICAgaWYgKHgucmVuZGVyT3JkZXIgPT09IHkucmVuZGVyT3JkZXIpIHtcbiAgICAgICAgaWYgKHguX19wcm9ncmFtID09PSB5Ll9fcHJvZ3JhbSkge1xuICAgICAgICAgICAgaWYgKHgubWF0ZXJpYWwgPT09IHkubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC5nZW9tZXRyeS5fX3VpZF9fIC0geS5nZW9tZXRyeS5fX3VpZF9fO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHgubWF0ZXJpYWwuX191aWRfXyAtIHkubWF0ZXJpYWwuX191aWRfXztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeC5fX3Byb2dyYW0gICYmIHkuX19wcm9ncmFtKSB7XG4gICAgICAgICAgICByZXR1cm4geC5fX3Byb2dyYW0uX191aWRfXyAtIHkuX19wcm9ncmFtLl9fdWlkX187XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB4LnJlbmRlck9yZGVyIC0geS5yZW5kZXJPcmRlcjtcbn07XG5cbi8qKlxuICogVHJhbnNwYXJlbnQgcmVuZGVyYWJsZXMgY29tcGFyZSBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5SZW5kZXJhYmxlfSBhXG4gKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmFibGV9IGJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAc3RhdGljXG4gKi9cblJlbmRlcmVyLnRyYW5zcGFyZW50U29ydENvbXBhcmUgPSBSZW5kZXJlci5wcm90b3R5cGUudHJhbnNwYXJlbnRTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAvLyBQcmlvcml0eSByZW5kZXJPcmRlciAtPiBkZXB0aCAtPiBwcm9ncmFtIC0+IG1hdGVyaWFsIC0+IGdlb21ldHJ5XG5cbiAgICBpZiAoeC5yZW5kZXJPcmRlciA9PT0geS5yZW5kZXJPcmRlcikge1xuICAgICAgICBpZiAoeC5fX2RlcHRoID09PSB5Ll9fZGVwdGgpIHtcbiAgICAgICAgICAgIGlmICh4Ll9fcHJvZ3JhbSA9PT0geS5fX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoeC5tYXRlcmlhbCA9PT0geS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5nZW9tZXRyeS5fX3VpZF9fIC0geS5nZW9tZXRyeS5fX3VpZF9fO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geC5tYXRlcmlhbC5fX3VpZF9fIC0geS5tYXRlcmlhbC5fX3VpZF9fO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHguX19wcm9ncmFtICAmJiB5Ll9fcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB4Ll9fcHJvZ3JhbS5fX3VpZF9fIC0geS5fX3Byb2dyYW0uX191aWRfXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlcHRoIGlzIG5lZ2F0aXZlXG4gICAgICAgIC8vIFNvIGZhcnRoZXIgb2JqZWN0IGhhcyBzbWFsbGVyIGRlcHRoIHZhbHVlXG4gICAgICAgIHJldHVybiB4Ll9fZGVwdGggLSB5Ll9fZGVwdGg7XG4gICAgfVxuICAgIHJldHVybiB4LnJlbmRlck9yZGVyIC0geS5yZW5kZXJPcmRlcjtcbn07XG5cbi8vIFRlbXBvcmFyeSB2YXJpYWJsZXNcbnZhciBtYXRyaWNlcyA9IHtcbiAgICBJREVOVElUWTogbWF0NENyZWF0ZSgpLFxuXG4gICAgV09STEQ6IG1hdDRDcmVhdGUoKSxcbiAgICBWSUVXOiBtYXQ0Q3JlYXRlKCksXG4gICAgUFJPSkVDVElPTjogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxEVklFVzogbWF0NENyZWF0ZSgpLFxuICAgIFZJRVdQUk9KRUNUSU9OOiBtYXQ0Q3JlYXRlKCksXG4gICAgV09STERWSUVXUFJPSkVDVElPTjogbWF0NENyZWF0ZSgpLFxuXG4gICAgV09STERJTlZFUlNFOiBtYXQ0Q3JlYXRlKCksXG4gICAgVklFV0lOVkVSU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBQUk9KRUNUSU9OSU5WRVJTRTogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxEVklFV0lOVkVSU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBWSUVXUFJPSkVDVElPTklOVkVSU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBXT1JMRFZJRVdQUk9KRUNUSU9OSU5WRVJTRTogbWF0NENyZWF0ZSgpLFxuXG4gICAgV09STERUUkFOU1BPU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBWSUVXVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgUFJPSkVDVElPTlRSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxEVklFV1RSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFZJRVdQUk9KRUNUSU9OVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgV09STERWSUVXUFJPSkVDVElPTlRSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxESU5WRVJTRVRSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFZJRVdJTlZFUlNFVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBXT1JMRFZJRVdJTlZFUlNFVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgVklFV1BST0pFQ1RJT05JTlZFUlNFVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgV09STERWSUVXUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0U6IG1hdDRDcmVhdGUoKVxufTtcblxuLyoqXG4gKiBAbmFtZSBjbGF5LlJlbmRlcmVyLkNPTE9SX0JVRkZFUl9CSVRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmVyLkNPTE9SX0JVRkZFUl9CSVQgPSBnbGVudW0uQ09MT1JfQlVGRkVSX0JJVDtcbi8qKlxuICogQG5hbWUgY2xheS5SZW5kZXJlci5ERVBUSF9CVUZGRVJfQklUXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJlci5ERVBUSF9CVUZGRVJfQklUID0gZ2xlbnVtLkRFUFRIX0JVRkZFUl9CSVQ7XG4vKipcbiAqIEBuYW1lIGNsYXkuUmVuZGVyZXIuU1RFTkNJTF9CVUZGRVJfQklUXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJlci5TVEVOQ0lMX0JVRkZFUl9CSVQgPSBnbGVudW0uU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlcjtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5RdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge251bWJlcn0geFxuICogQHBhcmFtIHtudW1iZXJ9IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gKiBAcGFyYW0ge251bWJlcn0gd1xuICovXG52YXIgUXVhdGVybmlvbiA9IGZ1bmN0aW9uICh4LCB5LCB6LCB3KSB7XG5cbiAgICB4ID0geCB8fCAwO1xuICAgIHkgPSB5IHx8IDA7XG4gICAgeiA9IHogfHwgMDtcbiAgICB3ID0gdyA9PT0gdW5kZWZpbmVkID8gMSA6IHc7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIFF1YXRlcm5pb24sIHJlYWQgYW5kIHdyaXRlIG9mIHgsIHksIHosIHcgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhcnJheVxuICAgICAqIEFsbCBtZXRob2RzIGFsc28gb3BlcmF0ZSBvbiB0aGUgYXJyYXkgaW5zdGVhZCBvZiB4LCB5LCB6LCB3IGNvbXBvbmVudHNcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5RdWF0ZXJuaW9uI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBxdWF0LmZyb21WYWx1ZXMoeCwgeSwgeiwgdyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXJ0eSBmbGFnIGlzIHVzZWQgYnkgdGhlIE5vZGUgdG8gZGV0ZXJtaW5lXG4gICAgICogaWYgdGhlIG1hdHJpeCBpcyB1cGRhdGVkIHRvIGxhdGVzdFxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguUXVhdGVybmlvbiNcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGIgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAoYikge1xuICAgICAgICBxdWF0LmFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSB3IGNvbXBvbmVudCBmcm9tIHgsIHksIHogY29tcG9uZW50XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgY2FsY3VsYXRlVzogZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWF0LmNhbGN1bGF0ZVcodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB4LCB5IGFuZCB6IGNvbXBvbmVudHNcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgeVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHpcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB3XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiAoeCwgeSwgeiwgdykge1xuICAgICAgICB0aGlzLmFycmF5WzBdID0geDtcbiAgICAgICAgdGhpcy5hcnJheVsxXSA9IHk7XG4gICAgICAgIHRoaXMuYXJyYXlbMl0gPSB6O1xuICAgICAgICB0aGlzLmFycmF5WzNdID0gdztcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHgsIHksIHogYW5kIHcgY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICB0aGlzLmFycmF5WzBdID0gYXJyWzBdO1xuICAgICAgICB0aGlzLmFycmF5WzFdID0gYXJyWzFdO1xuICAgICAgICB0aGlzLmFycmF5WzJdID0gYXJyWzJdO1xuICAgICAgICB0aGlzLmFycmF5WzNdID0gYXJyWzNdO1xuXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IFF1YXRlcm5pb25cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24odGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIHNlbGYgSWYgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIGludmVydCBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgY29uanVnYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHF1YXQuY29uanVnYXRlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGZyb20gYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgY29weTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgcXVhdC5jb3B5KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEb3QgcHJvZHVjdCBvZiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZG90OiBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gcXVhdC5kb3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBmcm9tTWF0MzogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgcXVhdC5mcm9tTWF0Myh0aGlzLmFycmF5LCBtLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGZyb20gdGhlIGdpdmVuIDR4NCByb3RhdGlvbiBtYXRyaXhcbiAgICAgKiBUaGUgNHRoIGNvbHVtbiBhbmQgNHRoIHJvdyB3aWxsIGJlIGRyb3BlZFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgZnJvbU1hdDQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXQzID0gZ2xNYXRyaXgubWF0MztcbiAgICAgICAgdmFyIG0zID0gbWF0My5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICBtYXQzLmZyb21NYXQ0KG0zLCBtLmFycmF5KTtcbiAgICAgICAgICAgIC8vIFRPRE8gTm90IGxpa2UgbWF0NCwgbWF0MyBpbiBnbG1hdHJpeCBzZWVtcyB0byBiZSByb3ctYmFzZWRcbiAgICAgICAgICAgIG1hdDMudHJhbnNwb3NlKG0zLCBtMyk7XG4gICAgICAgICAgICBxdWF0LmZyb21NYXQzKHRoaXMuYXJyYXksIG0zKTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gaWRlbnRpdHkgcXVhdGVybmlvblxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHF1YXQuaWRlbnRpdHkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBJbnZlcnQgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIGludmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWF0LmludmVydCh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHF1YXQubGVuKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHF1YXQubGVuZ3RoKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIGxlcnA6IGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIHF1YXQubGVycCh0aGlzLmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11bHRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHF1YXQubXVsKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgbXVsdGlwbHlMZWZ0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBtdWxMZWZ0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBxdWF0Lm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNdXRpcGx5IHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIG11bHRpcGx5OiBmdW5jdGlvbiAoYikge1xuICAgICAgICBxdWF0Lm11bHRpcGx5KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNdXRpcGx5IGEgYW5kIHNlbGZcbiAgICAgKiBRdWF0ZXJuaW9uIG11dGlwbHkgaXMgbm90IGNvbW11dGF0aXZlLCBzbyB0aGUgcmVzdWx0IG9mIG11dGlwbHlMZWZ0IGlzIGRpZmZlcmVudCB3aXRoIG11bHRpcGx5LlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgbXVsdGlwbHlMZWZ0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBxdWF0Lm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWF0Lm5vcm1hbGl6ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHNlbGYgYnkgYSBnaXZlbiByYWRpYW4gYWJvdXQgWCBheGlzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIHJvdGF0ZVg6IGZ1bmN0aW9uIChyYWQpIHtcbiAgICAgICAgcXVhdC5yb3RhdGVYKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBzZWxmIGJ5IGEgZ2l2ZW4gcmFkaWFuIGFib3V0IFkgYXhpc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICByb3RhdGVZOiBmdW5jdGlvbiAocmFkKSB7XG4gICAgICAgIHF1YXQucm90YXRlWSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCByYWQpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSBhIGdpdmVuIHJhZGlhbiBhYm91dCBaIGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgcm90YXRlWjogZnVuY3Rpb24gKHJhZCkge1xuICAgICAgICBxdWF0LnJvdGF0ZVoodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBzZWxmIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBWZWN0b3IzIGEgdG8gVmVjdG9yMyBiLlxuICAgICAqIGEgYW5kIGIgbmVlZHMgdG8gYmUgbm9ybWFsaXplZFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICByb3RhdGlvblRvOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBxdWF0LnJvdGF0aW9uVG8odGhpcy5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXRzIHNlbGYgd2l0aCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXhlc1xuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHZpZXdcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSByaWdodFxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHVwXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2V0QXhlczogZnVuY3Rpb24gKHZpZXcsIHJpZ2h0LCB1cCkge1xuICAgICAgICBxdWF0LnNldEF4ZXModGhpcy5hcnJheSwgdmlldy5hcnJheSwgcmlnaHQuYXJyYXksIHVwLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBzZWxmIHdpdGggYSByb3RhdGlvbiBheGlzIGFuZCByb3RhdGlvbiBhbmdsZVxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2V0QXhpc0FuZ2xlOiBmdW5jdGlvbiAoYXhpcywgcmFkKSB7XG4gICAgICAgIHF1YXQuc2V0QXhpc0FuZ2xlKHRoaXMuYXJyYXksIGF4aXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2xlcnA6IGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIHF1YXQuc2xlcnAodGhpcy5hcnJheSwgYS5hcnJheSwgYi5hcnJheSwgdCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzcXVhcmVkTGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcXVhdC5zcXJMZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgbGVuZ3RoIG9mIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZExlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcXVhdC5zcXVhcmVkTGVuZ3RoKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZnJvbSBldWxlclxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHZcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3JkZXJcbiAgICAgKi9cbiAgICBmcm9tRXVsZXI6IGZ1bmN0aW9uICh2LCBvcmRlcikge1xuICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tRXVsZXIodGhpcywgdiwgb3JkZXIpO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ1snICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbCh0aGlzLmFycmF5LCAnLCcpICsgJ10nO1xuICAgIH0sXG5cbiAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KTtcbiAgICB9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBHZXR0ZXIgYW5kIFNldHRlclxuaWYgKGRlZmluZVByb3BlcnR5KSB7XG5cbiAgICB2YXIgcHJvdG8gPSBRdWF0ZXJuaW9uLnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBAbmFtZSB4XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlF1YXRlcm5pb25cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3gnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbMF07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzBdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguUXVhdGVybmlvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgelxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5RdWF0ZXJuaW9uXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd6Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzJdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVsyXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSB3XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlF1YXRlcm5pb25cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3cnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbM107XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzNdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLy8gU3VwcGx5IG1ldGhvZHMgdGhhdCBhcmUgbm90IGluIHBsYWNlXG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5hZGQgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgcXVhdC5hZGQob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB5XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB6XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB3XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5zZXQgPSBmdW5jdGlvbiAob3V0LCB4LCB5LCB6LCB3KSB7XG4gICAgcXVhdC5zZXQob3V0LmFycmF5LCB4LCB5LCB6LCB3KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmNvcHkgPSBmdW5jdGlvbiAob3V0LCBiKSB7XG4gICAgcXVhdC5jb3B5KG91dC5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgcXVhdC5jYWxjdWxhdGVXKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBxdWF0LmNvbmp1Z2F0ZShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmlkZW50aXR5ID0gZnVuY3Rpb24gKG91dCkge1xuICAgIHF1YXQuaWRlbnRpdHkob3V0LmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24uaW52ZXJ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIHF1YXQuaW52ZXJ0KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblF1YXRlcm5pb24uZG90ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcXVhdC5kb3QoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblF1YXRlcm5pb24ubGVuID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gcXVhdC5sZW5ndGgoYS5hcnJheSk7XG59O1xuXG4vLyBRdWF0ZXJuaW9uLmxlbmd0aCA9IFF1YXRlcm5pb24ubGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYlxuICogQHBhcmFtICB7bnVtYmVyfSAgICAgdFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICBxdWF0LmxlcnAob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLnNsZXJwID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgdCkge1xuICAgIHF1YXQuc2xlcnAob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLm11bCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICBxdWF0Lm11bHRpcGx5KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLm11bHRpcGx5ID0gUXVhdGVybmlvbi5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ucm90YXRlWCA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHF1YXQucm90YXRlWChvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHF1YXQucm90YXRlWShvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ucm90YXRlWiA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHF1YXQucm90YXRlWihvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIGF4aXNcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24uc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24gKG91dCwgYXhpcywgcmFkKSB7XG4gICAgcXVhdC5zZXRBeGlzQW5nbGUob3V0LmFycmF5LCBheGlzLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5ub3JtYWxpemUgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgcXVhdC5ub3JtYWxpemUob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5RdWF0ZXJuaW9uLnNxckxlbiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIHF1YXQuc3FyTGVuKGEuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblF1YXRlcm5pb24uc3F1YXJlZExlbmd0aCA9IFF1YXRlcm5pb24uc3FyTGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSAgICBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5mcm9tTWF0MyA9IGZ1bmN0aW9uIChvdXQsIG0pIHtcbiAgICBxdWF0LmZyb21NYXQzKG91dC5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIHZpZXdcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSAgICByaWdodFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIHVwXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5zZXRBeGVzID0gZnVuY3Rpb24gKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgcXVhdC5zZXRBeGVzKG91dC5hcnJheSwgdmlldy5hcnJheSwgcmlnaHQuYXJyYXksIHVwLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gICAgYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLnJvdGF0aW9uVG8gPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgcXVhdC5yb3RhdGlvblRvKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHF1YXRlcm5pb24gZnJvbSBldWxlclxuICogQHBhcmFtIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSB2XG4gKiBAcGFyYW0ge1N0cmluZ30gb3JkZXJcbiAqL1xuUXVhdGVybmlvbi5mcm9tRXVsZXIgPSBmdW5jdGlvbiAob3V0LCB2LCBvcmRlcikge1xuXG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG5cbiAgICB2ID0gdi5hcnJheTtcbiAgICB2YXIgdGFyZ2V0ID0gb3V0LmFycmF5O1xuICAgIHZhciBjMSA9IE1hdGguY29zKHZbMF0gLyAyKTtcbiAgICB2YXIgYzIgPSBNYXRoLmNvcyh2WzFdIC8gMik7XG4gICAgdmFyIGMzID0gTWF0aC5jb3ModlsyXSAvIDIpO1xuICAgIHZhciBzMSA9IE1hdGguc2luKHZbMF0gLyAyKTtcbiAgICB2YXIgczIgPSBNYXRoLnNpbih2WzFdIC8gMik7XG4gICAgdmFyIHMzID0gTWF0aC5zaW4odlsyXSAvIDIpO1xuXG4gICAgdmFyIG9yZGVyID0gKG9yZGVyIHx8ICdYWVonKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuICAgIC8vICAyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cbiAgICAvLyAgY29udGVudC9TcGluQ2FsYy5tXG5cbiAgICBzd2l0Y2ggKG9yZGVyKSB7XG4gICAgICAgIGNhc2UgJ1hZWic6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMV0gPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG4gICAgICAgICAgICB0YXJnZXRbM10gPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVhaJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcbiAgICAgICAgICAgIHRhcmdldFszXSA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdaWFknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuICAgICAgICAgICAgdGFyZ2V0WzNdID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1pZWCc6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMV0gPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG4gICAgICAgICAgICB0YXJnZXRbM10gPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVpYJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcbiAgICAgICAgICAgIHRhcmdldFszXSA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdYWlknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuICAgICAgICAgICAgdGFyZ2V0WzNdID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUXVhdGVybmlvbjtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBRdWF0ZXJuaW9uIGZyb20gJy4vbWF0aC9RdWF0ZXJuaW9uJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuL2RlcC9nbG1hdHJpeCc7XG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi9tYXRoL0JvdW5kaW5nQm94JztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcblxudmFyIG5hbWVJZCA9IDA7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuTm9kZVxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIE5vZGUgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5Ob2RlIyAqL1xue1xuICAgIC8qKlxuICAgICAqIFNjZW5lIG5vZGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgbmFtZTogJycsXG5cbiAgICAvKipcbiAgICAgKiBQb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IG5vZGUuIGFrYSB0cmFuc2xhdGlvbi5cbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgcG9zaXRpb246IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGlvbiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IG5vZGUuIFJlcHJlc2VudGVkIGJ5IGEgcXVhdGVybmlvblxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICByb3RhdGlvbjogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgbm9kZVxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzY2FsZTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIEFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHJlbGF0aXZlIHRvIGl0cyByb290IHNjZW5lLlxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICB3b3JsZFRyYW5zZm9ybTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIEFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgbm9kZS5cbiAgICAgKiBDb21wb3NpdGVkIHdpdGggcG9zaXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsZS5cbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgbG9jYWxUcmFuc2Zvcm06IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgbG9jYWwgdHJhbnNmb3JtIGlzIHVwZGF0ZSBmcm9tIFNSVChzY2FsZSwgcm90YXRpb24sIHRyYW5zbGF0aW9uLCB3aGljaCBpcyBwb3NpdGlvbiBoZXJlKSBlYWNoIGZyYW1lXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgYXV0b1VwZGF0ZUxvY2FsVHJhbnNmb3JtOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogUGFyZW50IG9mIGN1cnJlbnQgc2NlbmUgbm9kZVxuICAgICAqIEB0eXBlIHs/Y2xheS5Ob2RlfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3BhcmVudDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBUaGUgcm9vdCBzY2VuZSBtb3VudGVkLiBOdWxsIGlmIGl0IGlzIGEgaXNvbGF0ZWQgbm9kZVxuICAgICAqIEB0eXBlIHs/Y2xheS5TY2VuZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zY2VuZTogbnVsbCxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9uZWVkc1VwZGF0ZVdvcmxkVHJhbnNmb3JtOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luSXRlcmF0aW5nOiBmYWxzZSxcblxuICAgIC8vIERlcHRoIGZvciB0cmFuc3BhcmVudCBsaXN0IHNvcnRpbmdcbiAgICBfX2RlcHRoOiAwXG5cbn0sIGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICh0aGlzLnR5cGUgfHwgJ05PREUnKSArICdfJyArIChuYW1lSWQrKyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucm90YXRpb24pIHtcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zY2FsZSkge1xuICAgICAgICB0aGlzLnNjYWxlID0gbmV3IFZlY3RvcjMoMSwgMSwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy53b3JsZFRyYW5zZm9ybSA9IG5ldyBNYXRyaXg0KCk7XG4gICAgdGhpcy5sb2NhbFRyYW5zZm9ybSA9IG5ldyBNYXRyaXg0KCk7XG5cbiAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuXG59LFxuLyoqQGxlbmRzIGNsYXkuTm9kZS5wcm90b3R5cGUuICovXG57XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHRhcmdldDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBJZiBub2RlIGFuZCBpdHMgY2hpbHJlbiBpbnZpc2libGVcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBpbnZpc2libGU6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogSWYgTm9kZSBpcyBhIHNraW5uZWQgbWVzaFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTa2lubmVkTWVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIHJlbmRlcmFibGUgc2NlbmUgbm9kZSwgbGlrZSBNZXNoIGFuZCBQYXJ0aWNsZVN5c3RlbVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNSZW5kZXJhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBzY2VuZSBub2RlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKi9cbiAgICBzZXROYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLl9zY2VuZTtcbiAgICAgICAgaWYgKHNjZW5lKSB7XG4gICAgICAgICAgICB2YXIgbm9kZVJlcG9zaXRvcnkgPSBzY2VuZS5fbm9kZVJlcG9zaXRvcnk7XG4gICAgICAgICAgICBkZWxldGUgbm9kZVJlcG9zaXRvcnlbdGhpcy5uYW1lXTtcbiAgICAgICAgICAgIG5vZGVSZXBvc2l0b3J5W25hbWVdID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjaGlsZCBub2RlXG4gICAgICogQHBhcmFtIHtjbGF5Lk5vZGV9IG5vZGVcbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbkl0ZXJhdGluZykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdBZGQgb3BlcmF0aW9uIGNhbiBjYXVzZSB1bnByZWRpY3RhYmxlIGVycm9yIHdoZW4gaW4gaXRlcmF0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yaWdpbmFsUGFyZW50ID0gbm9kZS5fcGFyZW50O1xuICAgICAgICBpZiAob3JpZ2luYWxQYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JpZ2luYWxQYXJlbnQpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsUGFyZW50LnJlbW92ZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLl9wYXJlbnQgPSB0aGlzO1xuICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKG5vZGUpO1xuXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuX3NjZW5lO1xuICAgICAgICBpZiAoc2NlbmUgJiYgc2NlbmUgIT09IG5vZGUuc2NlbmUpIHtcbiAgICAgICAgICAgIG5vZGUudHJhdmVyc2UodGhpcy5fYWRkU2VsZlRvU2NlbmUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgY2hpbGRyZW4gbmVlZHMgdXBkYXRlIHRyYW5zZm9ybVxuICAgICAgICAvLyBJbiBjYXNlIGNoaWxkIGFyZSByZW1vdmUgYW5kIGFkZGVkIGFnYWluIGFmdGVyIHBhcmVudCBtb3ZlZFxuICAgICAgICBub2RlLl9uZWVkc1VwZGF0ZVdvcmxkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBjaGlsZCBzY2VuZSBub2RlXG4gICAgICogQHBhcmFtIHtjbGF5Lk5vZGV9IG5vZGVcbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbkl0ZXJhdGluZykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW1vdmUgb3BlcmF0aW9uIGNhbiBjYXVzZSB1bnByZWRpY3RhYmxlIGVycm9yIHdoZW4gaW4gaXRlcmF0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIHZhciBpZHggPSBjaGlsZHJlbi5pbmRleE9mKG5vZGUpO1xuICAgICAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIG5vZGUuX3BhcmVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NjZW5lKSB7XG4gICAgICAgICAgICBub2RlLnRyYXZlcnNlKHRoaXMuX3JlbW92ZVNlbGZGcm9tU2NlbmUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgY2hpbGRyZW5cbiAgICAgKi9cbiAgICByZW1vdmVBbGw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG5cbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY2hpbGRyZW5baWR4XS5fcGFyZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baWR4XS50cmF2ZXJzZSh0aGlzLl9yZW1vdmVTZWxmRnJvbVNjZW5lLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2NlbmUgbW91bnRlZFxuICAgICAqIEByZXR1cm4ge2NsYXkuU2NlbmV9XG4gICAgICovXG4gICAgZ2V0U2NlbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjZW5lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGFyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlNjZW5lfVxuICAgICAqL1xuICAgIGdldFBhcmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlU2VsZkZyb21TY2VuZTogZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgZGVzY2VuZGFudC5fc2NlbmUucmVtb3ZlRnJvbVNjZW5lKGRlc2NlbmRhbnQpO1xuICAgICAgICBkZXNjZW5kYW50Ll9zY2VuZSA9IG51bGw7XG4gICAgfSxcblxuICAgIF9hZGRTZWxmVG9TY2VuZTogZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgdGhpcy5fc2NlbmUuYWRkVG9TY2VuZShkZXNjZW5kYW50KTtcbiAgICAgICAgZGVzY2VuZGFudC5fc2NlbmUgPSB0aGlzLl9zY2VuZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgaXQgaXMgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHNjZW5lIG5vZGVcbiAgICAgKiBAcGFyYW0ge2NsYXkuTm9kZX0gbm9kZVxuICAgICAqL1xuICAgIGlzQW5jZXN0b3I6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBub2RlLl9wYXJlbnQ7XG4gICAgICAgIHdoaWxlKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBuZXcgY3JlYXRlZCBhcnJheSBvZiBhbGwgY2hpbGRyZW4gbm9kZXNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lk5vZGVbXX1cbiAgICAgKi9cbiAgICBjaGlsZHJlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uc2xpY2UoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGNoaWxkIHNjZW5lIG5vZGUgYXQgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeFxuICAgICAqIEByZXR1cm4ge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICBjaGlsZEF0OiBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbltpZHhdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIGdldENoaWxkQnlOYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGZpcnN0IGRlc2NlbmRhbnQgaGF2ZSB0aGUgZ2l2ZW4gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIGdldERlc2NlbmRhbnRCeU5hbWU6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gY2hpbGQuZ2V0RGVzY2VuZGFudEJ5TmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGRlc2NlbmRhbnQgbm9kZSBieSBwYXRoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lk5vZGV9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgbm9kZS5xdWVyeU5vZGUoJ3Jvb3QvcGFyZW50L2NoaWxkJyk7XG4gICAgICovXG4gICAgcXVlcnlOb2RlOiBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIE5hbWUgaGF2ZSBzbGFzaCA/XG4gICAgICAgIHZhciBwYXRoQXJyID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBwYXRoQXJyW2ldO1xuICAgICAgICAgICAgLy8gU2tpcCBlbXB0eVxuICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGN1cnJlbnQuX2NoaWxkcmVuO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm90IGZvdW5kXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBxdWVyeSBwYXRoLCByZWxhdGl2ZSB0byByb290Tm9kZShkZWZhdWx0IGlzIHNjZW5lKVxuICAgICAqIEBwYXJhbSB7Y2xheS5Ob2RlfSBbcm9vdE5vZGVdXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldFBhdGg6IGZ1bmN0aW9uIChyb290Tm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuICcvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMubmFtZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQuX3BhcmVudCkge1xuICAgICAgICAgICAgcGF0aCA9IGN1cnJlbnQubmFtZSArICcvJyArIHBhdGg7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5fcGFyZW50ID09IHJvb3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudC5fcGFyZW50ICYmIHJvb3ROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVwdGggZmlyc3QgdHJhdmVyc2UgYWxsIGl0cyBkZXNjZW5kYW50IHNjZW5lIG5vZGVzIGFuZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtOb2RlfSBbY29udGV4dF1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZmlsdGVyXVxuICAgICAqL1xuICAgIHRyYXZlcnNlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQsIGZpbHRlcikge1xuXG4gICAgICAgIHRoaXMuX2luSXRlcmF0aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIuY2FsbChjb250ZXh0LCB0aGlzKSkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2NoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IF9jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgX2NoaWxkcmVuW2ldLnRyYXZlcnNlKGNhbGxiYWNrLCBjb250ZXh0LCBmaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5JdGVyYXRpbmcgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgZWFjaENoaWxkOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQsIGN0b3IpIHtcbiAgICAgICAgdGhpcy5faW5JdGVyYXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHZhciBfY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlbjtcbiAgICAgICAgdmFyIG5vQ3RvciA9IGN0b3IgPT0gbnVsbDtcbiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gX2NoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBfY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobm9DdG9yIHx8IGNoaWxkLmNvbnN0cnVjdG9yID09PSBjdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBjaGlsZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbkl0ZXJhdGluZyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxvY2FsIHRyYW5zZm9ybSBhbmQgZGVjb21wb3NlIHRvIFNSVFxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLk1hdHJpeDR9IG1hdHJpeFxuICAgICAqL1xuICAgIHNldExvY2FsVHJhbnNmb3JtOiBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgICAgIG1hdDQuY29weSh0aGlzLmxvY2FsVHJhbnNmb3JtLmFycmF5LCBtYXRyaXguYXJyYXkpO1xuICAgICAgICB0aGlzLmRlY29tcG9zZUxvY2FsVHJhbnNmb3JtKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlY29tcG9zZSB0aGUgbG9jYWwgdHJhbnNmb3JtIHRvIFNSVFxuICAgICAqL1xuICAgIGRlY29tcG9zZUxvY2FsVHJhbnNmb3JtOiBmdW5jdGlvbiAoa2VlcFNjYWxlKSB7XG4gICAgICAgIHZhciBzY2FsZSA9ICFrZWVwU2NhbGUgPyB0aGlzLnNjYWxlOiBudWxsO1xuICAgICAgICB0aGlzLmxvY2FsVHJhbnNmb3JtLmRlY29tcG9zZU1hdHJpeChzY2FsZSwgdGhpcy5yb3RhdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgd29ybGQgdHJhbnNmb3JtIGFuZCBkZWNvbXBvc2UgdG8gU1JUXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH0gbWF0cml4XG4gICAgICovXG4gICAgc2V0V29ybGRUcmFuc2Zvcm06IGZ1bmN0aW9uIChtYXRyaXgpIHtcbiAgICAgICAgbWF0NC5jb3B5KHRoaXMud29ybGRUcmFuc2Zvcm0uYXJyYXksIG1hdHJpeC5hcnJheSk7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlV29ybGRUcmFuc2Zvcm0oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVjb21wb3NlIHRoZSB3b3JsZCB0cmFuc2Zvcm0gdG8gU1JUXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgZGVjb21wb3NlV29ybGRUcmFuc2Zvcm06IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIHRtcCA9IG1hdDQuY3JlYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZWVwU2NhbGUpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbFRyYW5zZm9ybSA9IHRoaXMubG9jYWxUcmFuc2Zvcm07XG4gICAgICAgICAgICB2YXIgd29ybGRUcmFuc2Zvcm0gPSB0aGlzLndvcmxkVHJhbnNmb3JtO1xuICAgICAgICAgICAgLy8gQXNzdW1lIHdvcmxkIHRyYW5zZm9ybSBpcyB1cGRhdGVkXG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgbWF0NC5pbnZlcnQodG1wLCB0aGlzLl9wYXJlbnQud29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobG9jYWxUcmFuc2Zvcm0uYXJyYXksIHRtcCwgd29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXQ0LmNvcHkobG9jYWxUcmFuc2Zvcm0uYXJyYXksIHdvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzY2FsZSA9ICFrZWVwU2NhbGUgPyB0aGlzLnNjYWxlOiBudWxsO1xuICAgICAgICAgICAgbG9jYWxUcmFuc2Zvcm0uZGVjb21wb3NlTWF0cml4KHNjYWxlLCB0aGlzLnJvdGF0aW9uLCB0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgdHJhbnNmb3JtTmVlZHNVcGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24uX2RpcnR5XG4gICAgICAgICAgICB8fCB0aGlzLnJvdGF0aW9uLl9kaXJ0eVxuICAgICAgICAgICAgfHwgdGhpcy5zY2FsZS5fZGlydHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBsb2NhbCB0cmFuc2Zvcm0gZnJvbSBTUlRcbiAgICAgKiBOb3RpY2UgdGhhdCBsb2NhbCB0cmFuc2Zvcm0gd2lsbCBub3QgYmUgdXBkYXRlZCBpZiBfZGlydHkgbWFyayBvZiBwb3NpdGlvbiwgcm90YXRpb24sIHNjYWxlIGlzIGFsbCBmYWxzZVxuICAgICAqL1xuICAgIHVwZGF0ZUxvY2FsVHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgICAgIHZhciByb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtTmVlZHNVcGRhdGUoKSkge1xuICAgICAgICAgICAgdmFyIG0gPSB0aGlzLmxvY2FsVHJhbnNmb3JtLmFycmF5O1xuXG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gb3JkZXIsIHNjYWxlLT5yb3RhdGlvbi0+cG9zaXRpb25cbiAgICAgICAgICAgIG1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24obSwgcm90YXRpb24uYXJyYXksIHBvc2l0aW9uLmFycmF5KTtcblxuICAgICAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBzY2FsZS5hcnJheSk7XG5cbiAgICAgICAgICAgIHJvdGF0aW9uLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgc2NhbGUuX2RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICBwb3NpdGlvbi5fZGlydHkgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGVXb3JsZFRyYW5zZm9ybSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHdvcmxkIHRyYW5zZm9ybSwgYXNzdW1lIGl0cyBwYXJlbnQgd29ybGQgdHJhbnNmb3JtIGhhdmUgYmVlbiB1cGRhdGVkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlV29ybGRUcmFuc2Zvcm1Ub3BEb3duOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFRyYW5zZm9ybSA9IHRoaXMubG9jYWxUcmFuc2Zvcm0uYXJyYXk7XG4gICAgICAgIHZhciB3b3JsZFRyYW5zZm9ybSA9IHRoaXMud29ybGRUcmFuc2Zvcm0uYXJyYXk7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHlBZmZpbmUoXG4gICAgICAgICAgICAgICAgd29ybGRUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LndvcmxkVHJhbnNmb3JtLmFycmF5LFxuICAgICAgICAgICAgICAgIGxvY2FsVHJhbnNmb3JtXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0NC5jb3B5KHdvcmxkVHJhbnNmb3JtLCBsb2NhbFRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHdvcmxkIHRyYW5zZm9ybSBiZWZvcmUgd2hvbGUgc2NlbmUgaXMgdXBkYXRlZC5cbiAgICAgKi9cbiAgICB1cGRhdGVXb3JsZFRyYW5zZm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBGaW5kIHRoZSByb290IG5vZGUgd2hpY2ggdHJhbnNmb3JtIG5lZWRzIHVwZGF0ZTtcbiAgICAgICAgdmFyIHJvb3ROb2RlSXNEaXJ0eSA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChyb290Tm9kZUlzRGlydHkgJiYgcm9vdE5vZGVJc0RpcnR5LmdldFBhcmVudCgpXG4gICAgICAgICAgICAmJiByb290Tm9kZUlzRGlydHkuZ2V0UGFyZW50KCkudHJhbnNmb3JtTmVlZHNVcGRhdGUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJvb3ROb2RlSXNEaXJ0eSA9IHJvb3ROb2RlSXNEaXJ0eS5nZXRQYXJlbnQoKTtcbiAgICAgICAgfTJcbiAgICAgICAgcm9vdE5vZGVJc0RpcnR5LnVwZGF0ZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgbG9jYWwgdHJhbnNmb3JtIGFuZCB3b3JsZCB0cmFuc2Zvcm0gcmVjdXJzaXZlbHlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlVXBkYXRlV29ybGRcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChmb3JjZVVwZGF0ZVdvcmxkKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVMb2NhbFRyYW5zZm9ybSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbFRyYW5zZm9ybSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGlzIG1hbnVhbGx5IHNldHRlZFxuICAgICAgICAgICAgZm9yY2VVcGRhdGVXb3JsZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9yY2VVcGRhdGVXb3JsZCB8fCB0aGlzLl9uZWVkc1VwZGF0ZVdvcmxkVHJhbnNmb3JtKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JsZFRyYW5zZm9ybVRvcERvd24oKTtcbiAgICAgICAgICAgIGZvcmNlVXBkYXRlV29ybGQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGVXb3JsZFRyYW5zZm9ybSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZHJlbltpXS51cGRhdGUoZm9yY2VVcGRhdGVXb3JsZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGJvdW5kaW5nIGJveCBvZiBub2RlXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtmaWx0ZXJdXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5Cb3VuZGluZ0JveH1cbiAgICAgKi9cbiAgICAvLyBUT0RPIFNraW5uaW5nXG4gICAgZ2V0Qm91bmRpbmdCb3g6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIgKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gIWVsLmludmlzaWJsZSAmJiBlbC5nZW9tZXRyeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG1wQkJveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB2YXIgdG1wTWF0NCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBpbnZXb3JsZFRyYW5zZm9ybSA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZmlsdGVyLCBvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG91dCB8fCBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlciB8fCBkZWZhdWx0RmlsdGVyO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgTWF0cml4NC5pbnZlcnQoaW52V29ybGRUcmFuc2Zvcm0sIHRoaXMuX3BhcmVudC53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBNYXRyaXg0LmlkZW50aXR5KGludldvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmF2ZXJzZShmdW5jdGlvbiAobWVzaCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoLmdlb21ldHJ5ICYmIG1lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wQkJveC5jb3B5KG1lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgICAgICAgICBNYXRyaXg0Lm11bHRpcGx5KHRtcE1hdDQsIGludldvcmxkVHJhbnNmb3JtLCBtZXNoLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgdG1wQkJveC5hcHBseVRyYW5zZm9ybSh0bXBNYXQ0KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnVuaW9uKHRtcEJCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMsIGRlZmF1bHRGaWx0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBHZXQgd29ybGQgcG9zaXRpb24sIGV4dHJhY3RlZCBmcm9tIHdvcmxkIHRyYW5zZm9ybVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgLy8gUEVORElOR1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1OZWVkc1VwZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdvcmxkVHJhbnNmb3JtKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG0gPSB0aGlzLndvcmxkVHJhbnNmb3JtLmFycmF5O1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICB2YXIgYXJyID0gb3V0LmFycmF5O1xuICAgICAgICAgICAgYXJyWzBdID0gbVsxMl07XG4gICAgICAgICAgICBhcnJbMV0gPSBtWzEzXTtcbiAgICAgICAgICAgIGFyclsyXSA9IG1bMTRdO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMyhtWzEyXSwgbVsxM10sIG1bMTRdKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBub2RlXG4gICAgICogQHJldHVybiB7Tm9kZX1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuO1xuXG4gICAgICAgIG5vZGUuc2V0TmFtZSh0aGlzLm5hbWUpO1xuICAgICAgICBub2RlLnBvc2l0aW9uLmNvcHkodGhpcy5wb3NpdGlvbik7XG4gICAgICAgIG5vZGUucm90YXRpb24uY29weSh0aGlzLnJvdGF0aW9uKTtcbiAgICAgICAgbm9kZS5zY2FsZS5jb3B5KHRoaXMuc2NhbGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5vZGUuYWRkKGNoaWxkcmVuW2ldLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhlIG5vZGUgYXJvdW5kIGEgYXhpcyBieSBhbmdsZSBkZWdyZWVzLCBheGlzIHBhc3NlcyB0aHJvdWdoIHBvaW50XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gcG9pbnQgQ2VudGVyIHBvaW50XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gYXhpcyAgQ2VudGVyIGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gICAgICAgYW5nbGUgUm90YXRpb24gYW5nbGVcbiAgICAgKiBAc2VlIGh0dHA6Ly9kb2NzLnVuaXR5M2QuY29tL0RvY3VtZW50YXRpb24vU2NyaXB0UmVmZXJlbmNlL1RyYW5zZm9ybS5Sb3RhdGVBcm91bmQuaHRtbFxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIHJvdGF0ZUFyb3VuZDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB2YXIgUlRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG4gICAgICAgIC8vIFRPRE8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvaW50LCBheGlzLCBhbmdsZSkge1xuXG4gICAgICAgICAgICB2LmNvcHkodGhpcy5wb3NpdGlvbikuc3VidHJhY3QocG9pbnQpO1xuXG4gICAgICAgICAgICB2YXIgbG9jYWxUcmFuc2Zvcm0gPSB0aGlzLmxvY2FsVHJhbnNmb3JtO1xuICAgICAgICAgICAgbG9jYWxUcmFuc2Zvcm0uaWRlbnRpdHkoKTtcbiAgICAgICAgICAgIC8vIHBhcmVudCBub2RlXG4gICAgICAgICAgICBsb2NhbFRyYW5zZm9ybS50cmFuc2xhdGUocG9pbnQpO1xuICAgICAgICAgICAgbG9jYWxUcmFuc2Zvcm0ucm90YXRlKGFuZ2xlLCBheGlzKTtcblxuICAgICAgICAgICAgUlRNYXRyaXguZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24odGhpcy5yb3RhdGlvbiwgdik7XG4gICAgICAgICAgICBsb2NhbFRyYW5zZm9ybS5tdWx0aXBseShSVE1hdHJpeCk7XG4gICAgICAgICAgICBsb2NhbFRyYW5zZm9ybS5zY2FsZSh0aGlzLnNjYWxlKTtcblxuICAgICAgICAgICAgdGhpcy5kZWNvbXBvc2VMb2NhbFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGVXb3JsZFRyYW5zZm9ybSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IFt1cF1cbiAgICAgKiBAc2VlIGh0dHA6Ly93d3cub3BlbmdsLm9yZy9zZGsvZG9jcy9tYW4yL3hodG1sL2dsdUxvb2tBdC54bWxcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKi9cbiAgICBsb29rQXQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVwKSB7XG4gICAgICAgICAgICBtLmxvb2tBdCh0aGlzLnBvc2l0aW9uLCB0YXJnZXQsIHVwIHx8IHRoaXMubG9jYWxUcmFuc2Zvcm0ueSkuaW52ZXJ0KCk7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsVHJhbnNmb3JtKG0pO1xuXG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgfTtcbiAgICB9KSgpXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTm9kZTtcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuTGlnaHRcbiAqIEBleHRlbmRzIGNsYXkuTm9kZVxuICovXG52YXIgTGlnaHQgPSBOb2RlLmV4dGVuZChmdW5jdGlvbigpe1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuTGlnaHQjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpZ2h0IFJHQiBjb2xvclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAgICAgICAqL1xuICAgICAgICBjb2xvcjogWzEsIDEsIDFdLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaWdodCBpbnRlbnNpdHlcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIGludGVuc2l0eTogMS4wLFxuXG4gICAgICAgIC8vIENvbmZpZyBmb3Igc2hhZG93IG1hcFxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgbGlnaHQgY2FzdCBzaGFkb3dcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBjYXN0U2hhZG93OiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaGFkb3cgbWFwIHNpemVcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNoYWRvd1Jlc29sdXRpb246IDUxMixcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlnaHQgZ3JvdXAsIHNoYWRlciB3aXRoIHNhbWUgYGxpZ2h0R3JvdXBgIHdpbGwgYmUgYWZmZWN0ZWRcbiAgICAgICAgICpcbiAgICAgICAgICogT25seSB1c2VmdWwgaW4gZm9yd2FyZCByZW5kZXJpbmdcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIGdyb3VwOiAwXG4gICAgfTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuTGlnaHQucHJvdG90eXBlLiAqL1xue1xuICAgIC8qKlxuICAgICAqIExpZ2h0IHR5cGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LkxpZ2h0I1xuICAgICAqL1xuICAgIHR5cGU6ICcnLFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Y2xheS5MaWdodH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5MaWdodC5wcm90b3R5cGVcbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsaWdodCA9IE5vZGUucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIGxpZ2h0LmNvbG9yID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5jb2xvcik7XG4gICAgICAgIGxpZ2h0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuICAgICAgICBsaWdodC5jYXN0U2hhZG93ID0gdGhpcy5jYXN0U2hhZG93O1xuICAgICAgICBsaWdodC5zaGFkb3dSZXNvbHV0aW9uID0gdGhpcy5zaGFkb3dSZXNvbHV0aW9uO1xuXG4gICAgICAgIHJldHVybiBsaWdodDtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTGlnaHQ7XG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG52YXIgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG52YXIgdmVjNCA9IGdsTWF0cml4LnZlYzQ7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlBsYW5lXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbbm9ybWFsXVxuICogQHBhcmFtIHtudW1iZXJ9IFtkaXN0YW5jZV1cbiAqL1xudmFyIFBsYW5lID0gZnVuY3Rpb24obm9ybWFsLCBkaXN0YW5jZSkge1xuICAgIC8qKlxuICAgICAqIE5vcm1hbCBvZiB0aGUgcGxhbmVcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy5ub3JtYWwgPSBub3JtYWwgfHwgbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiB0aGUgcGxhbmUgZXF1YXRpb24sIHVzZWQgYXMgZGlzdGFuY2UgdG8gdGhlIG9yaWdpblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlIHx8IDA7XG59O1xuXG5QbGFuZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogUGxhbmUsXG5cbiAgICAvKipcbiAgICAgKiBEaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gcG9pbnQgdG8gdGhlIHBsYW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IHBvaW50XG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZG90KHBvaW50LmFycmF5LCB0aGlzLm5vcm1hbC5hcnJheSkgLSB0aGlzLmRpc3RhbmNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHByb2plY3Rpb24gcG9pbnQgb24gdGhlIHBsYW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IHBvaW50XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHByb2plY3RQb2ludDogZnVuY3Rpb24ocG9pbnQsIG91dCkge1xuICAgICAgICBpZiAoIW91dCkge1xuICAgICAgICAgICAgb3V0ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KHBvaW50KTtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIHBvaW50LmFycmF5LCB0aGlzLm5vcm1hbC5hcnJheSwgLWQpO1xuICAgICAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRoZSBwbGFuZSdzIG5vcm1hbCBhbmQgY2FsY3VsYXRlIHRoZSBkaXN0YW5jZVxuICAgICAqL1xuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpbnZMZW4gPSAxIC8gdmVjMy5sZW4odGhpcy5ub3JtYWwuYXJyYXkpO1xuICAgICAgICB2ZWMzLnNjYWxlKHRoaXMubm9ybWFsLmFycmF5LCBpbnZMZW4pO1xuICAgICAgICB0aGlzLmRpc3RhbmNlICo9IGludkxlbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYW5lIGludGVyc2VjdCBhIGZydXN0dW1cbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguRnJ1c3R1bX0gRnJ1c3R1bVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW50ZXJzZWN0RnJ1c3R1bTogZnVuY3Rpb24oZnJ1c3R1bSkge1xuICAgICAgICAvLyBDaGVjayBpZiBhbGwgY29vcmRzIG9mIGZydXN0dW0gaXMgb24gcGxhbmUgYWxsIHVuZGVyIHBsYW5lXG4gICAgICAgIHZhciBjb29yZHMgPSBmcnVzdHVtLnZlcnRpY2VzO1xuICAgICAgICB2YXIgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXJyYXk7XG4gICAgICAgIHZhciBvblBsYW5lID0gdmVjMy5kb3QoY29vcmRzWzBdLmFycmF5LCBub3JtYWwpID4gdGhpcy5kaXN0YW5jZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgIGlmICgodmVjMy5kb3QoY29vcmRzW2ldLmFycmF5LCBub3JtYWwpID4gdGhpcy5kaXN0YW5jZSkgIT0gb25QbGFuZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgaW50ZXJzZWN0aW9uIHBvaW50IGJldHdlZW4gcGxhbmUgYW5kIGEgZ2l2ZW4gbGluZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHN0YXJ0IHN0YXJ0IHBvaW50IG9mIGxpbmVcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBlbmQgZW5kIHBvaW50IG9mIGxpbmVcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGludGVyc2VjdExpbmU6IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJkID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIG91dCkge1xuICAgICAgICAgICAgdmFyIGQwID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGQxID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoZW5kKTtcbiAgICAgICAgICAgIGlmICgoZDAgPiAwICYmIGQxID4gMCkgfHwgKGQwIDwgMCAmJiBkMSA8IDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSYXkgaW50ZXJzZWN0aW9uXG4gICAgICAgICAgICB2YXIgcG4gPSB0aGlzLm5vcm1hbC5hcnJheTtcbiAgICAgICAgICAgIHZhciBkID0gdGhpcy5kaXN0YW5jZTtcbiAgICAgICAgICAgIHZhciBybyA9IHN0YXJ0LmFycmF5O1xuICAgICAgICAgICAgLy8gZGlyZWN0aW9uXG4gICAgICAgICAgICB2ZWMzLnN1YihyZCwgZW5kLmFycmF5LCBzdGFydC5hcnJheSk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZShyZCwgcmQpO1xuXG4gICAgICAgICAgICB2YXIgZGl2aWRlciA9IHZlYzMuZG90KHBuLCByZCk7XG4gICAgICAgICAgICAvLyByYXkgaXMgcGFyYWxsZWwgdG8gdGhlIHBsYW5lXG4gICAgICAgICAgICBpZiAoZGl2aWRlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgICAgICBvdXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHQgPSAodmVjMy5kb3QocG4sIHJvKSAtIGQpIC8gZGl2aWRlcjtcbiAgICAgICAgICAgIHZlYzMuc2NhbGVBbmRBZGQob3V0LmFycmF5LCBybywgcmQsIC10KTtcbiAgICAgICAgICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYW4gYWZmaW5lIHRyYW5zZm9ybSBtYXRyaXggdG8gcGxhbmVcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBhcHBseVRyYW5zZm9ybTogKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaW52ZXJzZVRyYW5zcG9zZSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIHZhciBub3JtYWx2NCA9IHZlYzQuY3JlYXRlKCk7XG4gICAgICAgIHZhciBwb2ludHY0ID0gdmVjNC5jcmVhdGUoKTtcbiAgICAgICAgcG9pbnR2NFszXSA9IDE7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtNCkge1xuICAgICAgICAgICAgbTQgPSBtNC5hcnJheTtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBwb2ludCBvbiBwbGFuZVxuICAgICAgICAgICAgdmVjMy5zY2FsZShwb2ludHY0LCB0aGlzLm5vcm1hbC5hcnJheSwgdGhpcy5kaXN0YW5jZSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocG9pbnR2NCwgcG9pbnR2NCwgbTQpO1xuICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSA9IHZlYzMuZG90KHBvaW50djQsIHRoaXMubm9ybWFsLmFycmF5KTtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBwbGFuZSBub3JtYWxcbiAgICAgICAgICAgIG1hdDQuaW52ZXJ0KGludmVyc2VUcmFuc3Bvc2UsIG00KTtcbiAgICAgICAgICAgIG1hdDQudHJhbnNwb3NlKGludmVyc2VUcmFuc3Bvc2UsIGludmVyc2VUcmFuc3Bvc2UpO1xuICAgICAgICAgICAgbm9ybWFsdjRbM10gPSAwO1xuICAgICAgICAgICAgdmVjMy5jb3B5KG5vcm1hbHY0LCB0aGlzLm5vcm1hbC5hcnJheSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQobm9ybWFsdjQsIG5vcm1hbHY0LCBpbnZlcnNlVHJhbnNwb3NlKTtcbiAgICAgICAgICAgIHZlYzMuY29weSh0aGlzLm5vcm1hbC5hcnJheSwgbm9ybWFsdjQpO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGZyb20gYW5vdGhlciBwbGFuZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBwbGFuZVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKHBsYW5lKSB7XG4gICAgICAgIHZlYzMuY29weSh0aGlzLm5vcm1hbC5hcnJheSwgcGxhbmUubm9ybWFsLmFycmF5KTtcbiAgICAgICAgdGhpcy5ub3JtYWwuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IHBsYW5lLmRpc3RhbmNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBwbGFuZVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5QbGFuZX1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuICAgICAgICBwbGFuZS5jb3B5KHRoaXMpO1xuICAgICAgICByZXR1cm4gcGxhbmU7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGxhbmU7XG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4vQm91bmRpbmdCb3gnO1xuaW1wb3J0IFBsYW5lIGZyb20gJy4vUGxhbmUnO1xuXG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcblxudmFyIHZlYzNTZXQgPSB2ZWMzLnNldDtcbnZhciB2ZWMzQ29weSA9IHZlYzMuY29weTtcbnZhciB2ZWMzVHJhbmZvcm1NYXQ0ID0gdmVjMy50cmFuc2Zvcm1NYXQ0O1xudmFyIG1hdGhNaW4gPSBNYXRoLm1pbjtcbnZhciBtYXRoTWF4ID0gTWF0aC5tYXg7XG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5GcnVzdHVtXG4gKi9cbnZhciBGcnVzdHVtID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBFaWdodCBwbGFuZXMgdG8gZW5jbG9zZSB0aGUgZnJ1c3R1bVxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguUGxhbmVbXX1cbiAgICAgKi9cbiAgICB0aGlzLnBsYW5lcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgdGhpcy5wbGFuZXMucHVzaChuZXcgUGxhbmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQm91bmRpbmcgYm94IG9mIGZydXN0dW1cbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fVxuICAgICAqL1xuICAgIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcblxuICAgIC8qKlxuICAgICAqIEVpZ2h0IHZlcnRpY2VzIG9mIGZydXN0dW1cbiAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XG4gICAgICovXG4gICAgdGhpcy52ZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgIHRoaXMudmVydGljZXNbaV0gPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMCk7XG4gICAgfVxufTtcblxuRnJ1c3R1bS5wcm90b3R5cGUgPSB7XG5cbiAgICAvLyBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEyMDUzMTIzMTAwNS9odHRwOi8vY3Jhenlqb2tlLmZyZWUuZnIvZG9jLzNEL3BsYW5lJTIwZXh0cmFjdGlvbi5wZGZcbiAgICAvKipcbiAgICAgKiBTZXQgZnJ1c3R1bSBmcm9tIGEgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5NYXRyaXg0fSBwcm9qZWN0aW9uTWF0cml4XG4gICAgICovXG4gICAgc2V0RnJvbVByb2plY3Rpb246IGZ1bmN0aW9uKHByb2plY3Rpb25NYXRyaXgpIHtcblxuICAgICAgICB2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG4gICAgICAgIHZhciBtID0gcHJvamVjdGlvbk1hdHJpeC5hcnJheTtcbiAgICAgICAgdmFyIG0wID0gbVswXSwgbTEgPSBtWzFdLCBtMiA9IG1bMl0sIG0zID0gbVszXTtcbiAgICAgICAgdmFyIG00ID0gbVs0XSwgbTUgPSBtWzVdLCBtNiA9IG1bNl0sIG03ID0gbVs3XTtcbiAgICAgICAgdmFyIG04ID0gbVs4XSwgbTkgPSBtWzldLCBtMTAgPSBtWzEwXSwgbTExID0gbVsxMV07XG4gICAgICAgIHZhciBtMTIgPSBtWzEyXSwgbTEzID0gbVsxM10sIG0xNCA9IG1bMTRdLCBtMTUgPSBtWzE1XTtcblxuICAgICAgICAvLyBVcGRhdGUgcGxhbmVzXG4gICAgICAgIHZlYzNTZXQocGxhbmVzWzBdLm5vcm1hbC5hcnJheSwgbTMgLSBtMCwgbTcgLSBtNCwgbTExIC0gbTgpO1xuICAgICAgICBwbGFuZXNbMF0uZGlzdGFuY2UgPSAtKG0xNSAtIG0xMik7XG4gICAgICAgIHBsYW5lc1swXS5ub3JtYWxpemUoKTtcblxuICAgICAgICB2ZWMzU2V0KHBsYW5lc1sxXS5ub3JtYWwuYXJyYXksIG0zICsgbTAsIG03ICsgbTQsIG0xMSArIG04KTtcbiAgICAgICAgcGxhbmVzWzFdLmRpc3RhbmNlID0gLShtMTUgKyBtMTIpO1xuICAgICAgICBwbGFuZXNbMV0ubm9ybWFsaXplKCk7XG5cbiAgICAgICAgdmVjM1NldChwbGFuZXNbMl0ubm9ybWFsLmFycmF5LCBtMyArIG0xLCBtNyArIG01LCBtMTEgKyBtOSk7XG4gICAgICAgIHBsYW5lc1syXS5kaXN0YW5jZSA9IC0obTE1ICsgbTEzKTtcbiAgICAgICAgcGxhbmVzWzJdLm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIHZlYzNTZXQocGxhbmVzWzNdLm5vcm1hbC5hcnJheSwgbTMgLSBtMSwgbTcgLSBtNSwgbTExIC0gbTkpO1xuICAgICAgICBwbGFuZXNbM10uZGlzdGFuY2UgPSAtKG0xNSAtIG0xMyk7XG4gICAgICAgIHBsYW5lc1szXS5ub3JtYWxpemUoKTtcblxuICAgICAgICB2ZWMzU2V0KHBsYW5lc1s0XS5ub3JtYWwuYXJyYXksIG0zIC0gbTIsIG03IC0gbTYsIG0xMSAtIG0xMCk7XG4gICAgICAgIHBsYW5lc1s0XS5kaXN0YW5jZSA9IC0obTE1IC0gbTE0KTtcbiAgICAgICAgcGxhbmVzWzRdLm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIHZlYzNTZXQocGxhbmVzWzVdLm5vcm1hbC5hcnJheSwgbTMgKyBtMiwgbTcgKyBtNiwgbTExICsgbTEwKTtcbiAgICAgICAgcGxhbmVzWzVdLmRpc3RhbmNlID0gLShtMTUgKyBtMTQpO1xuICAgICAgICBwbGFuZXNbNV0ubm9ybWFsaXplKCk7XG5cbiAgICAgICAgLy8gUGVyc3BlY3RpdmUgcHJvamVjdGlvblxuICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSB0aGlzLmJvdW5kaW5nQm94O1xuICAgICAgICBpZiAobTE1ID09PSAwKSAge1xuICAgICAgICAgICAgdmFyIGFzcGVjdCA9IG01IC8gbTA7XG4gICAgICAgICAgICB2YXIgek5lYXIgPSAtbTE0IC8gKG0xMCAtIDEpO1xuICAgICAgICAgICAgdmFyIHpGYXIgPSAtbTE0IC8gKG0xMCArIDEpO1xuICAgICAgICAgICAgdmFyIGZhclkgPSAtekZhciAvIG01O1xuICAgICAgICAgICAgdmFyIG5lYXJZID0gLXpOZWFyIC8gbTU7XG4gICAgICAgICAgICAvLyBVcGRhdGUgYm91bmRpbmcgYm94XG4gICAgICAgICAgICBib3VuZGluZ0JveC5taW4uc2V0KC1mYXJZICogYXNwZWN0LCAtZmFyWSwgekZhcik7XG4gICAgICAgICAgICBib3VuZGluZ0JveC5tYXguc2V0KGZhclkgKiBhc3BlY3QsIGZhclksIHpOZWFyKTtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB2ZXJ0aWNlc1xuICAgICAgICAgICAgdmFyIHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcbiAgICAgICAgICAgIC8vLS0tIG1pbiB6XG4gICAgICAgICAgICAvLyBtaW4geFxuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1swXSwgLWZhclkgKiBhc3BlY3QsIC1mYXJZLCB6RmFyKTtcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbMV0sIC1mYXJZICogYXNwZWN0LCBmYXJZLCB6RmFyKTtcbiAgICAgICAgICAgIC8vIG1heCB4XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzJdLCBmYXJZICogYXNwZWN0LCAtZmFyWSwgekZhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzNdLCBmYXJZICogYXNwZWN0LCBmYXJZLCB6RmFyKTtcbiAgICAgICAgICAgIC8vLS0gbWF4IHpcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbNF0sIC1uZWFyWSAqIGFzcGVjdCwgLW5lYXJZLCB6TmVhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzVdLCAtbmVhclkgKiBhc3BlY3QsIG5lYXJZLCB6TmVhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzZdLCBuZWFyWSAqIGFzcGVjdCwgLW5lYXJZLCB6TmVhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzddLCBuZWFyWSAqIGFzcGVjdCwgbmVhclksIHpOZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gT3J0aG9ncmFwaGljIHByb2plY3Rpb25cbiAgICAgICAgICAgIHZhciBsZWZ0ID0gKC0xIC0gbTEyKSAvIG0wO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKDEgLSBtMTIpIC8gbTA7XG4gICAgICAgICAgICB2YXIgdG9wID0gKDEgLSBtMTMpIC8gbTU7XG4gICAgICAgICAgICB2YXIgYm90dG9tID0gKC0xIC0gbTEzKSAvIG01O1xuICAgICAgICAgICAgdmFyIG5lYXIgPSAoLTEgLSBtMTQpIC8gbTEwO1xuICAgICAgICAgICAgdmFyIGZhciA9ICgxIC0gbTE0KSAvIG0xMDtcblxuXG4gICAgICAgICAgICBib3VuZGluZ0JveC5taW4uc2V0KE1hdGgubWluKGxlZnQsIHJpZ2h0KSwgTWF0aC5taW4oYm90dG9tLCB0b3ApLCBNYXRoLm1pbihmYXIsIG5lYXIpKTtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94Lm1heC5zZXQoTWF0aC5tYXgocmlnaHQsIGxlZnQpLCBNYXRoLm1heCh0b3AsIGJvdHRvbSksIE1hdGgubWF4KG5lYXIsIGZhcikpO1xuXG4gICAgICAgICAgICB2YXIgbWluID0gYm91bmRpbmdCb3gubWluLmFycmF5O1xuICAgICAgICAgICAgdmFyIG1heCA9IGJvdW5kaW5nQm94Lm1heC5hcnJheTtcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG4gICAgICAgICAgICAvLy0tLSBtaW4gelxuICAgICAgICAgICAgLy8gbWluIHhcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbMF0sIG1pblswXSwgbWluWzFdLCBtaW5bMl0pO1xuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1sxXSwgbWluWzBdLCBtYXhbMV0sIG1pblsyXSk7XG4gICAgICAgICAgICAvLyBtYXggeFxuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1syXSwgbWF4WzBdLCBtaW5bMV0sIG1pblsyXSk7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzNdLCBtYXhbMF0sIG1heFsxXSwgbWluWzJdKTtcbiAgICAgICAgICAgIC8vLS0gbWF4IHpcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbNF0sIG1pblswXSwgbWluWzFdLCBtYXhbMl0pO1xuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1s1XSwgbWluWzBdLCBtYXhbMV0sIG1heFsyXSk7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzZdLCBtYXhbMF0sIG1pblsxXSwgbWF4WzJdKTtcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbN10sIG1heFswXSwgbWF4WzFdLCBtYXhbMl0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgYWZmaW5lIHRyYW5zZm9ybSBtYXRyaXggYW5kIHNldCB0byB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICovXG4gICAgZ2V0VHJhbnNmb3JtZWRCb3VuZGluZ0JveDogKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciB0bXBWZWMzID0gdmVjMy5jcmVhdGUoKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYmJveCwgbWF0cml4KSB7XG4gICAgICAgICAgICB2YXIgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xuXG4gICAgICAgICAgICB2YXIgbTQgPSBtYXRyaXguYXJyYXk7XG4gICAgICAgICAgICB2YXIgbWluID0gYmJveC5taW47XG4gICAgICAgICAgICB2YXIgbWF4ID0gYmJveC5tYXg7XG4gICAgICAgICAgICB2YXIgbWluQXJyID0gbWluLmFycmF5O1xuICAgICAgICAgICAgdmFyIG1heEFyciA9IG1heC5hcnJheTtcbiAgICAgICAgICAgIHZhciB2ID0gdmVydGljZXNbMF07XG4gICAgICAgICAgICB2ZWMzVHJhbmZvcm1NYXQ0KHRtcFZlYzMsIHYsIG00KTtcbiAgICAgICAgICAgIHZlYzNDb3B5KG1pbkFyciwgdG1wVmVjMyk7XG4gICAgICAgICAgICB2ZWMzQ29weShtYXhBcnIsIHRtcFZlYzMpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgICAgIHYgPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgICAgICAgICB2ZWMzVHJhbmZvcm1NYXQ0KHRtcFZlYzMsIHYsIG00KTtcblxuICAgICAgICAgICAgICAgIG1pbkFyclswXSA9IG1hdGhNaW4odG1wVmVjM1swXSwgbWluQXJyWzBdKTtcbiAgICAgICAgICAgICAgICBtaW5BcnJbMV0gPSBtYXRoTWluKHRtcFZlYzNbMV0sIG1pbkFyclsxXSk7XG4gICAgICAgICAgICAgICAgbWluQXJyWzJdID0gbWF0aE1pbih0bXBWZWMzWzJdLCBtaW5BcnJbMl0pO1xuXG4gICAgICAgICAgICAgICAgbWF4QXJyWzBdID0gbWF0aE1heCh0bXBWZWMzWzBdLCBtYXhBcnJbMF0pO1xuICAgICAgICAgICAgICAgIG1heEFyclsxXSA9IG1hdGhNYXgodG1wVmVjM1sxXSwgbWF4QXJyWzFdKTtcbiAgICAgICAgICAgICAgICBtYXhBcnJbMl0gPSBtYXRoTWF4KHRtcFZlYzNbMl0sIG1heEFyclsyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1pbi5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiBiYm94O1xuICAgICAgICB9O1xuICAgIH0pICgpXG59O1xuZXhwb3J0IGRlZmF1bHQgRnJ1c3R1bTtcbiIsImltcG9ydCBWZWN0b3IzIGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcblxudmFyIEVQU0lMT04gPSAxZS01O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5SYXlcbiAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IFtvcmlnaW5dXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbZGlyZWN0aW9uXVxuICovXG52YXIgUmF5ID0gZnVuY3Rpb24gKG9yaWdpbiwgZGlyZWN0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luIHx8IG5ldyBWZWN0b3IzKCk7XG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8IG5ldyBWZWN0b3IzKCk7XG59O1xuXG5SYXkucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IFJheSxcblxuICAgIC8vIGh0dHA6Ly93d3cuc2lnZ3JhcGgub3JnL2VkdWNhdGlvbi9tYXRlcmlhbHMvSHlwZXJHcmFwaC9yYXl0cmFjZS9yYXlwbGFuZV9pbnRlcnNlY3Rpb24uaHRtXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludCBiZXR3ZWVuIHJheSBhbmQgYSBnaXZlIHBsYW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlBsYW5lfSBwbGFuZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAocGxhbmUsIG91dCkge1xuICAgICAgICB2YXIgcG4gPSBwbGFuZS5ub3JtYWwuYXJyYXk7XG4gICAgICAgIHZhciBkID0gcGxhbmUuZGlzdGFuY2U7XG4gICAgICAgIHZhciBybyA9IHRoaXMub3JpZ2luLmFycmF5O1xuICAgICAgICB2YXIgcmQgPSB0aGlzLmRpcmVjdGlvbi5hcnJheTtcblxuICAgICAgICB2YXIgZGl2aWRlciA9IHZlYzMuZG90KHBuLCByZCk7XG4gICAgICAgIC8vIHJheSBpcyBwYXJhbGxlbCB0byB0aGUgcGxhbmVcbiAgICAgICAgaWYgKGRpdmlkZXIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3V0KSB7XG4gICAgICAgICAgICBvdXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ID0gKHZlYzMuZG90KHBuLCBybykgLSBkKSAvIGRpdmlkZXI7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQob3V0LmFycmF5LCBybywgcmQsIC10KTtcbiAgICAgICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1pcnJvciB0aGUgcmF5IGFnYWluc3QgcGxhbmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUGxhbmV9IHBsYW5lXG4gICAgICovXG4gICAgbWlycm9yQWdhaW5zdFBsYW5lOiBmdW5jdGlvbiAocGxhbmUpIHtcbiAgICAgICAgLy8gRGlzdGFuY2UgdG8gcGxhbmVcbiAgICAgICAgdmFyIGQgPSB2ZWMzLmRvdChwbGFuZS5ub3JtYWwuYXJyYXksIHRoaXMuZGlyZWN0aW9uLmFycmF5KTtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZCh0aGlzLmRpcmVjdGlvbi5hcnJheSwgdGhpcy5kaXJlY3Rpb24uYXJyYXksIHBsYW5lLm5vcm1hbC5hcnJheSwgLWQgKiAyKTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24uX2RpcnR5ID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZGlzdGFuY2VUb1BvaW50OiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgICAgIHZlYzMuc3ViKHYsIHBvaW50LCB0aGlzLm9yaWdpbi5hcnJheSk7XG4gICAgICAgICAgICAvLyBEaXN0YW5jZSBmcm9tIHByb2plY3Rpb24gcG9pbnQgdG8gb3JpZ2luXG4gICAgICAgICAgICB2YXIgYiA9IHZlYzMuZG90KHYsIHRoaXMuZGlyZWN0aW9uLmFycmF5KTtcbiAgICAgICAgICAgIGlmIChiIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzLmRpc3RhbmNlKHRoaXMub3JpZ2luLmFycmF5LCBwb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTcXVhcmVkIGRpc3RhbmNlIGZyb20gY2VudGVyIHRvIG9yaWdpblxuICAgICAgICAgICAgdmFyIGMyID0gdmVjMy5sZW5TcXVhcmVkKHYpO1xuICAgICAgICAgICAgLy8gU3F1YXJlZCBkaXN0YW5jZSBmcm9tIGNlbnRlciB0byBwcm9qZWN0aW9uIHBvaW50XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGMyIC0gYiAqIGIpO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIHBvaW50IGJldHdlZW4gcmF5IGFuZCBzcGhlcmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gY2VudGVyXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSByYWRpdXNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgaW50ZXJzZWN0U3BoZXJlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2VudGVyLCByYWRpdXMsIG91dCkge1xuICAgICAgICAgICAgdmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luLmFycmF5O1xuICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uLmFycmF5O1xuICAgICAgICAgICAgY2VudGVyID0gY2VudGVyLmFycmF5O1xuICAgICAgICAgICAgdmVjMy5zdWIodiwgY2VudGVyLCBvcmlnaW4pO1xuICAgICAgICAgICAgLy8gRGlzdGFuY2UgZnJvbSBwcm9qZWN0aW9uIHBvaW50IHRvIG9yaWdpblxuICAgICAgICAgICAgdmFyIGIgPSB2ZWMzLmRvdCh2LCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgLy8gU3F1YXJlZCBkaXN0YW5jZSBmcm9tIGNlbnRlciB0byBvcmlnaW5cbiAgICAgICAgICAgIHZhciBjMiA9IHZlYzMuc3F1YXJlZExlbmd0aCh2KTtcbiAgICAgICAgICAgIC8vIFNxdWFyZWQgZGlzdGFuY2UgZnJvbSBjZW50ZXIgdG8gcHJvamVjdGlvbiBwb2ludFxuICAgICAgICAgICAgdmFyIGQyID0gYzIgLSBiICogYjtcblxuICAgICAgICAgICAgdmFyIHIyID0gcmFkaXVzICogcmFkaXVzO1xuICAgICAgICAgICAgLy8gTm8gaW50ZXJzZWN0aW9uXG4gICAgICAgICAgICBpZiAoZDIgPiByMikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGEgPSBNYXRoLnNxcnQocjIgLSBkMik7XG4gICAgICAgICAgICAvLyBGaXJzdCBpbnRlcnNlY3QgcG9pbnRcbiAgICAgICAgICAgIHZhciB0MCA9IGIgLSBhO1xuICAgICAgICAgICAgLy8gU2Vjb25kIGludGVyc2VjdCBwb2ludFxuICAgICAgICAgICAgdmFyIHQxID0gYiArIGE7XG5cbiAgICAgICAgICAgIGlmICghb3V0KSB7XG4gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0MCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodDEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIG9yaWdpbiwgZGlyZWN0aW9uLCB0MSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIG9yaWdpbiwgZGlyZWN0aW9uLCB0MCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgLy8gaHR0cDovL3d3dy5zY3JhdGNoYXBpeGVsLmNvbS9sZXNzb25zLzNkLWJhc2ljLWxlc3NvbnMvbGVzc29uLTctaW50ZXJzZWN0aW5nLXNpbXBsZS1zaGFwZXMvcmF5LWJveC1pbnRlcnNlY3Rpb24vXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludCBiZXR3ZWVuIHJheSBhbmQgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9IGJib3hcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGludGVyc2VjdEJvdW5kaW5nQm94OiBmdW5jdGlvbiAoYmJveCwgb3V0KSB7XG4gICAgICAgIHZhciBkaXIgPSB0aGlzLmRpcmVjdGlvbi5hcnJheTtcbiAgICAgICAgdmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luLmFycmF5O1xuICAgICAgICB2YXIgbWluID0gYmJveC5taW4uYXJyYXk7XG4gICAgICAgIHZhciBtYXggPSBiYm94Lm1heC5hcnJheTtcblxuICAgICAgICB2YXIgaW52ZGlyeCA9IDEgLyBkaXJbMF07XG4gICAgICAgIHZhciBpbnZkaXJ5ID0gMSAvIGRpclsxXTtcbiAgICAgICAgdmFyIGludmRpcnogPSAxIC8gZGlyWzJdO1xuXG4gICAgICAgIHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcbiAgICAgICAgaWYgKGludmRpcnggPj0gMCkge1xuICAgICAgICAgICAgdG1pbiA9IChtaW5bMF0gLSBvcmlnaW5bMF0pICogaW52ZGlyeDtcbiAgICAgICAgICAgIHRtYXggPSAobWF4WzBdIC0gb3JpZ2luWzBdKSAqIGludmRpcng7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0bWF4ID0gKG1pblswXSAtIG9yaWdpblswXSkgKiBpbnZkaXJ4O1xuICAgICAgICAgICAgdG1pbiA9IChtYXhbMF0gLSBvcmlnaW5bMF0pICogaW52ZGlyeDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW52ZGlyeSA+PSAwKSB7XG4gICAgICAgICAgICB0eW1pbiA9IChtaW5bMV0gLSBvcmlnaW5bMV0pICogaW52ZGlyeTtcbiAgICAgICAgICAgIHR5bWF4ID0gKG1heFsxXSAtIG9yaWdpblsxXSkgKiBpbnZkaXJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHltYXggPSAobWluWzFdIC0gb3JpZ2luWzFdKSAqIGludmRpcnk7XG4gICAgICAgICAgICB0eW1pbiA9IChtYXhbMV0gLSBvcmlnaW5bMV0pICogaW52ZGlyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgodG1pbiA+IHR5bWF4KSB8fCAodHltaW4gPiB0bWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4pIHtcbiAgICAgICAgICAgIHRtaW4gPSB0eW1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHltYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXgpIHtcbiAgICAgICAgICAgIHRtYXggPSB0eW1heDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZkaXJ6ID49IDApIHtcbiAgICAgICAgICAgIHR6bWluID0gKG1pblsyXSAtIG9yaWdpblsyXSkgKiBpbnZkaXJ6O1xuICAgICAgICAgICAgdHptYXggPSAobWF4WzJdIC0gb3JpZ2luWzJdKSAqIGludmRpcno7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0em1heCA9IChtaW5bMl0gLSBvcmlnaW5bMl0pICogaW52ZGlyejtcbiAgICAgICAgICAgIHR6bWluID0gKG1heFsyXSAtIG9yaWdpblsyXSkgKiBpbnZkaXJ6O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0bWluID4gdHptYXgpIHx8ICh0em1pbiA+IHRtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbikge1xuICAgICAgICAgICAgdG1pbiA9IHR6bWluO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCkge1xuICAgICAgICAgICAgdG1heCA9IHR6bWF4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0bWF4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4O1xuXG4gICAgICAgIGlmICghb3V0KSB7XG4gICAgICAgICAgICBvdXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB9XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQob3V0LmFycmF5LCBvcmlnaW4sIGRpciwgdCk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSxcblxuICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTSVDMyVCNmxsZXIlRTIlODAlOTNUcnVtYm9yZV9pbnRlcnNlY3Rpb25fYWxnb3JpdGhtXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludCBiZXR3ZWVuIHJheSBhbmQgdGhyZWUgdHJpYW5nbGUgdmVydGljZXNcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IGNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICBzaW5nbGVTaWRlZCwgQ1cgdHJpYW5nbGUgd2lsbCBiZSBpZ25vcmVkXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gW291dF1cbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbYmFyeWNlbnRlcmljXSBiYXJ5Y2VudHJpYyBjb29yZHNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBpbnRlcnNlY3RUcmlhbmdsZTogKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgZUJBID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgdmFyIGVDQSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciBBTyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB2Q3Jvc3MgPSB2ZWMzLmNyZWF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYywgc2luZ2xlU2lkZWQsIG91dCwgYmFyeWNlbnRlcmljKSB7XG4gICAgICAgICAgICB2YXIgZGlyID0gdGhpcy5kaXJlY3Rpb24uYXJyYXk7XG4gICAgICAgICAgICB2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW4uYXJyYXk7XG4gICAgICAgICAgICBhID0gYS5hcnJheTtcbiAgICAgICAgICAgIGIgPSBiLmFycmF5O1xuICAgICAgICAgICAgYyA9IGMuYXJyYXk7XG5cbiAgICAgICAgICAgIHZlYzMuc3ViKGVCQSwgYiwgYSk7XG4gICAgICAgICAgICB2ZWMzLnN1YihlQ0EsIGMsIGEpO1xuXG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHZDcm9zcywgZUNBLCBkaXIpO1xuXG4gICAgICAgICAgICB2YXIgZGV0ID0gdmVjMy5kb3QoZUJBLCB2Q3Jvc3MpO1xuXG4gICAgICAgICAgICBpZiAoc2luZ2xlU2lkZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0ID4gLUVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRldCA+IC1FUFNJTE9OICYmIGRldCA8IEVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZWMzLnN1YihBTywgb3JpZ2luLCBhKTtcbiAgICAgICAgICAgIHZhciB1ID0gdmVjMy5kb3QodkNyb3NzLCBBTykgLyBkZXQ7XG4gICAgICAgICAgICBpZiAodSA8IDAgfHwgdSA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVjMy5jcm9zcyh2Q3Jvc3MsIGVCQSwgQU8pO1xuICAgICAgICAgICAgdmFyIHYgPSB2ZWMzLmRvdChkaXIsIHZDcm9zcykgLyBkZXQ7XG5cbiAgICAgICAgICAgIGlmICh2IDwgMCB8fCB2ID4gMSB8fCAodSArIHYgPiAxKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHZDcm9zcywgZUJBLCBlQ0EpO1xuICAgICAgICAgICAgdmFyIHQgPSAtdmVjMy5kb3QoQU8sIHZDcm9zcykgLyBkZXQ7XG5cbiAgICAgICAgICAgIGlmICh0IDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW91dCkge1xuICAgICAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFyeWNlbnRlcmljKSB7XG4gICAgICAgICAgICAgICAgVmVjdG9yMy5zZXQoYmFyeWNlbnRlcmljLCAoMSAtIHUgLSB2KSwgdSwgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZWMzLnNjYWxlQW5kQWRkKG91dC5hcnJheSwgb3JpZ2luLCBkaXIsIHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBhZmZpbmUgdHJhbnNmb3JtIG1hdHJpeCB0byB0aGUgcmF5XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9IG1hdHJpeFxuICAgICAqL1xuICAgIGFwcGx5VHJhbnNmb3JtOiBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgICAgIFZlY3RvcjMuYWRkKHRoaXMuZGlyZWN0aW9uLCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5vcmlnaW4pO1xuICAgICAgICBWZWN0b3IzLnRyYW5zZm9ybU1hdDQodGhpcy5vcmlnaW4sIHRoaXMub3JpZ2luLCBtYXRyaXgpO1xuICAgICAgICBWZWN0b3IzLnRyYW5zZm9ybU1hdDQodGhpcy5kaXJlY3Rpb24sIHRoaXMuZGlyZWN0aW9uLCBtYXRyaXgpO1xuXG4gICAgICAgIFZlY3RvcjMuc3ViKHRoaXMuZGlyZWN0aW9uLCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5vcmlnaW4pO1xuICAgICAgICBWZWN0b3IzLm5vcm1hbGl6ZSh0aGlzLmRpcmVjdGlvbiwgdGhpcy5kaXJlY3Rpb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IHZhbHVlcyBmcm9tIGFub3RoZXIgcmF5XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguUmF5fSByYXlcbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAocmF5KSB7XG4gICAgICAgIFZlY3RvcjMuY29weSh0aGlzLm9yaWdpbiwgcmF5Lm9yaWdpbik7XG4gICAgICAgIFZlY3RvcjMuY29weSh0aGlzLmRpcmVjdGlvbiwgcmF5LmRpcmVjdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IHJheVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5SYXl9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJheSA9IG5ldyBSYXkoKTtcbiAgICAgICAgcmF5LmNvcHkodGhpcyk7XG4gICAgICAgIHJldHVybiByYXk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmF5O1xuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBGcnVzdHVtIGZyb20gJy4vbWF0aC9GcnVzdHVtJztcbmltcG9ydCBSYXkgZnJvbSAnLi9tYXRoL1JheSc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG52YXIgdmVjNCA9IGdsTWF0cml4LnZlYzQ7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuQ2FtZXJhXG4gKiBAZXh0ZW5kcyBjbGF5Lk5vZGVcbiAqL1xudmFyIENhbWVyYSA9IE5vZGUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LkNhbWVyYSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXg6IG5ldyBNYXRyaXg0KCksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludmVyc2Ugb2YgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgICAgICovXG4gICAgICAgIGludlByb2plY3Rpb25NYXRyaXg6IG5ldyBNYXRyaXg0KCksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFZpZXcgbWF0cml4LCBlcXVhbCB0byBpbnZlcnNlIG9mIGNhbWVyYSdzIHdvcmxkIG1hdHJpeFxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICAgICAqL1xuICAgICAgICB2aWV3TWF0cml4OiBuZXcgTWF0cml4NCgpLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW1lcmEgZnJ1c3R1bSBpbiB2aWV3IHNwYWNlXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguRnJ1c3R1bX1cbiAgICAgICAgICovXG4gICAgICAgIGZydXN0dW06IG5ldyBGcnVzdHVtKClcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudXBkYXRlKHRydWUpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5DYW1lcmEucHJvdG90eXBlICovXG57XG5cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgICBOb2RlLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLCBmb3JjZSk7XG4gICAgICAgIE1hdHJpeDQuaW52ZXJ0KHRoaXMudmlld01hdHJpeCwgdGhpcy53b3JsZFRyYW5zZm9ybSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICAgIE1hdHJpeDQuaW52ZXJ0KHRoaXMuaW52UHJvamVjdGlvbk1hdHJpeCwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgICB0aGlzLmZydXN0dW0uc2V0RnJvbVByb2plY3Rpb24odGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGNhbWVyYSB2aWV3IG1hdHJpeFxuICAgICAqL1xuICAgIHNldFZpZXdNYXRyaXg6IGZ1bmN0aW9uICh2aWV3TWF0cml4KSB7XG4gICAgICAgIE1hdHJpeDQuY29weSh0aGlzLnZpZXdNYXRyaXgsIHZpZXdNYXRyaXgpO1xuICAgICAgICBNYXRyaXg0LmludmVydCh0aGlzLndvcmxkVHJhbnNmb3JtLCB2aWV3TWF0cml4KTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2VXb3JsZFRyYW5zZm9ybSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZWNvbXBvc2UgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICovXG4gICAgZGVjb21wb3NlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH0gcHJvamVjdGlvbk1hdHJpeFxuICAgICAqL1xuICAgIHNldFByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uIChwcm9qZWN0aW9uTWF0cml4KSB7XG4gICAgICAgIE1hdHJpeDQuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgsIHByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICBNYXRyaXg0LmludmVydCh0aGlzLmludlByb2plY3Rpb25NYXRyaXgsIHByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICB0aGlzLmRlY29tcG9zZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCwgY2FsbGVkIGFmdGVyIHVwZGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBhIHBpY2tpbmcgcmF5IGZyb20gY2FtZXJhIG5lYXIgcGxhbmUgdG8gZmFyIHBsYW5lXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yMn0gbmRjXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguUmF5fSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5SYXl9XG4gICAgICovXG4gICAgY2FzdFJheTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHY0ID0gdmVjNC5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuZGMsIG91dCkge1xuICAgICAgICAgICAgdmFyIHJheSA9IG91dCAhPT0gdW5kZWZpbmVkID8gb3V0IDogbmV3IFJheSgpO1xuICAgICAgICAgICAgdmFyIHggPSBuZGMuYXJyYXlbMF07XG4gICAgICAgICAgICB2YXIgeSA9IG5kYy5hcnJheVsxXTtcbiAgICAgICAgICAgIHZlYzQuc2V0KHY0LCB4LCB5LCAtMSwgMSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodjQsIHY0LCB0aGlzLmludlByb2plY3Rpb25NYXRyaXguYXJyYXkpO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHY0LCB2NCwgdGhpcy53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICB2ZWMzLnNjYWxlKHJheS5vcmlnaW4uYXJyYXksIHY0LCAxIC8gdjRbM10pO1xuXG4gICAgICAgICAgICB2ZWM0LnNldCh2NCwgeCwgeSwgMSwgMSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodjQsIHY0LCB0aGlzLmludlByb2plY3Rpb25NYXRyaXguYXJyYXkpO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHY0LCB2NCwgdGhpcy53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICB2ZWMzLnNjYWxlKHY0LCB2NCwgMSAvIHY0WzNdKTtcbiAgICAgICAgICAgIHZlYzMuc3ViKHJheS5kaXJlY3Rpb24uYXJyYXksIHY0LCByYXkub3JpZ2luLmFycmF5KTtcblxuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUocmF5LmRpcmVjdGlvbi5hcnJheSwgcmF5LmRpcmVjdGlvbi5hcnJheSk7XG4gICAgICAgICAgICByYXkuZGlyZWN0aW9uLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICByYXkub3JpZ2luLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiByYXk7XG4gICAgICAgIH07XG4gICAgfSkoKVxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAcmV0dXJuIHtjbGF5LkNhbWVyYX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5DYW1lcmEucHJvdG90eXBlXG4gICAgICovXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FtZXJhO1xuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcbmltcG9ydCBMaWdodCBmcm9tICcuL0xpZ2h0JztcbmltcG9ydCBDYW1lcmEgZnJvbSAnLi9DYW1lcmEnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4vbWF0aC9Cb3VuZGluZ0JveCc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5cbnZhciBwcm9ncmFtS2V5Q2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0UHJvZ3JhbUtleShsaWdodE51bWJlcnMpIHtcbiAgICB2YXIgZGVmaW5lU3RyID0gW107XG4gICAgdmFyIGxpZ2h0VHlwZXMgPSBPYmplY3Qua2V5cyhsaWdodE51bWJlcnMpO1xuICAgIGxpZ2h0VHlwZXMuc29ydCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlnaHRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGlnaHRUeXBlID0gbGlnaHROdW1iZXJzW2ldO1xuICAgICAgICBkZWZpbmVTdHIucHVzaChsaWdodFR5cGUgKyAnICcgKyBsaWdodE51bWJlcnNbbGlnaHRUeXBlXSk7XG4gICAgfVxuICAgIHZhciBrZXkgPSBkZWZpbmVTdHIuam9pbignXFxuJyk7XG5cbiAgICBpZiAocHJvZ3JhbUtleUNhY2hlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW1LZXlDYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHZhciBpZCA9IHV0aWwuZ2VuR1VJRCgpO1xuICAgIHByb2dyYW1LZXlDYWNoZVtrZXldID0gaWQ7XG4gICAgcmV0dXJuIGlkO1xufVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LlNjZW5lXG4gKiBAZXh0ZW5kcyBjbGF5Lk5vZGVcbiAqL1xudmFyIFNjZW5lID0gTm9kZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuU2NlbmUjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdsb2JhbCBtYXRlcmlhbCBvZiBzY2VuZVxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5NYXRlcmlhbH1cbiAgICAgICAgICovXG4gICAgICAgIG1hdGVyaWFsOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9VcGRhdGU6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wYXF1ZSByZW5kZXJhYmxlIGxpc3QsIGl0IHdpbGwgYmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlJlbmRlcmFibGVbXX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICBvcGFxdWVMaXN0OiBbXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3BhcXVlIHJlbmRlcmFibGUgbGlzdCwgaXQgd2lsbCBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICogQHR5cGUge2NsYXkuUmVuZGVyYWJsZVtdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zcGFyZW50TGlzdDogW10sXG5cbiAgICAgICAgbGlnaHRzOiBbXSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY2VuZSBib3VuZGluZyBib3ggaW4gdmlldyBzcGFjZS5cbiAgICAgICAgICogVXNlZCB3aGVuIGNhbWVyYSBuZWVkcyB0byBhZHVqc3QgdGhlIG5lYXIgYW5kIGZhciBwbGFuZSBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAqIHNvIHRoYXQgdGhlIHZpZXcgZnJ1c3R1bSBjb250YWlucyB0aGUgdmlzaWJsZSBvYmplY3RzIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUuXG4gICAgICAgICAqIE5vdGljZTpcbiAgICAgICAgICogIEl0IGlzIHVwZGF0ZWQgYWZ0ZXIgcmVuZGVyaW5nIChpbiB0aGUgc3RlcCBvZiBmcnVzdHVtIGN1bGxpbmcgcGFzc2luZ2x5KS4gU28gbWF5IGJlIG5vdCBzbyBhY2N1cmF0ZSwgYnV0IHNhdmVzIGEgbG90IG9mIGNhbGN1bGF0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICAgICAqL1xuICAgICAgICB2aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWU6IG5ldyBCb3VuZGluZ0JveCgpLFxuXG4gICAgICAgIC8vIFVuaWZvcm1zIGZvciBzaGFkb3cgbWFwLlxuICAgICAgICBzaGFkb3dVbmlmb3Jtczoge30sXG5cbiAgICAgICAgX2NhbWVyYUxpc3Q6IFtdLFxuXG4gICAgICAgIC8vIFByb3BlcnRpZXMgdG8gc2F2ZSB0aGUgbGlnaHQgaW5mb3JtYXRpb24gaW4gdGhlIHNjZW5lXG4gICAgICAgIC8vIFdpbGwgYmUgc2V0IGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAgICAgX2xpZ2h0VW5pZm9ybXM6IHt9LFxuXG4gICAgICAgIF9wcmV2aW91c0xpZ2h0TnVtYmVyOiB7fSxcblxuICAgICAgICBfbGlnaHROdW1iZXI6IHtcbiAgICAgICAgICAgIC8vIGdyb3VwSWQ6IHtcbiAgICAgICAgICAgICAgICAvLyBQT0lOVF9MSUdIVDogMCxcbiAgICAgICAgICAgICAgICAvLyBESVJFQ1RJT05BTF9MSUdIVDogMCxcbiAgICAgICAgICAgICAgICAvLyBTUE9UX0xJR0hUOiAwLFxuICAgICAgICAgICAgICAgIC8vIEFNQklFTlRfTElHSFQ6IDAsXG4gICAgICAgICAgICAgICAgLy8gQU1CSUVOVF9TSF9MSUdIVDogMFxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9saWdodFByb2dyYW1LZXlzOiB7fSxcblxuICAgICAgICBfb3BhcXVlT2JqZWN0Q291bnQ6IDAsXG4gICAgICAgIF90cmFuc3BhcmVudE9iamVjdENvdW50OiAwLFxuXG4gICAgICAgIF9ub2RlUmVwb3NpdG9yeToge30sXG5cbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3NjZW5lID0gdGhpcztcbn0sXG4vKiogQGxlbmRzIGNsYXkuU2NlbmUucHJvdG90eXBlLiAqL1xue1xuICAgIC8qKlxuICAgICAqIEFkZCBub2RlIHRvIHNjZW5lXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICovXG4gICAgYWRkVG9TY2VuZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDYW1lcmEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYW1lcmFMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZvdW5kIG11bHRpcGxlIGNhbWVyYSBpbiBvbmUgc2NlbmUuIFVzZSB0aGUgZmlzdCBvbmUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFMaXN0LnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fbm9kZVJlcG9zaXRvcnlbbm9kZS5uYW1lXSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIG5vZGUgZnJvbSBzY2VuZVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIHJlbW92ZUZyb21TY2VuZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDYW1lcmEpIHtcbiAgICAgICAgICAgIHZhciBpZHggPSB0aGlzLl9jYW1lcmFMaXN0LmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYW1lcmFMaXN0LnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ub2RlUmVwb3NpdG9yeVtub2RlLm5hbWVdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBub2RlIGJ5IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtOb2RlfVxuICAgICAqIEBERVBSRUNBVEVEXG4gICAgICovXG4gICAgZ2V0Tm9kZTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVSZXBvc2l0b3J5W25hbWVdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBzY2VuZSBub2RlIHJlY3Vyc2l2ZWx5LCBpbmNsdWRpbmcgbWF0ZXJpYWwsIHNrZWxldG9uLlxuICAgICAqIFNoYWRlciBhbmQgZ2VvbWV0cnkgaW5zdGFuY2VzIHdpbGwgbm90IGJlZW4gY2xvbmVkXG4gICAgICogQHBhcmFtICB7Y2xheS5Ob2RlfSBub2RlXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIGNsb25lTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIG5ld05vZGUgPSBub2RlLmNsb25lKCk7XG4gICAgICAgIHZhciBtYXRlcmlhbHNNYXAgPSB7fTtcblxuICAgICAgICB2YXIgY2xvbmVTa2VsZXRvbiA9IGZ1bmN0aW9uIChjdXJyZW50LCBjdXJyZW50TmV3KSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5za2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnROZXcuc2tlbGV0b24gPSBjdXJyZW50LnNrZWxldG9uLmNsb25lKG5vZGUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnROZXcuam9pbnRzID0gY3VycmVudC5qb2ludHMuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50Lm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxzTWFwW2N1cnJlbnQubWF0ZXJpYWwuX191aWRfX10gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZE1hdDogY3VycmVudC5tYXRlcmlhbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnQuX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2xvbmVTa2VsZXRvbihjdXJyZW50Ll9jaGlsZHJlbltpXSwgY3VycmVudE5ldy5fY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNsb25lU2tlbGV0b24obm9kZSwgbmV3Tm9kZSk7XG5cbiAgICAgICAgZm9yICh2YXIgZ3VpZCBpbiBtYXRlcmlhbHNNYXApIHtcbiAgICAgICAgICAgIG1hdGVyaWFsc01hcFtndWlkXS5uZXdNYXQgPSBtYXRlcmlhbHNNYXBbZ3VpZF0ub2xkTWF0LmNsb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXBsYWNlIG1hdGVyaWFsXG4gICAgICAgIG5ld05vZGUudHJhdmVyc2UoZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Lm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5tYXRlcmlhbCA9IG1hdGVyaWFsc01hcFtjdXJyZW50Lm1hdGVyaWFsLl9fdWlkX19dLm5ld01hdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2NlbmUgdXBkYXRlXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gZm9yY2VcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBub3RVcGRhdGVMaWdodHNcbiAgICAgKiAgICAgICAgIFVzZWZ1bCBpbiBkZWZlcnJlZCBwaXBlbGluZVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKGZvcmNlLCBub3RVcGRhdGVMaWdodHMpIHtcbiAgICAgICAgaWYgKCEodGhpcy5hdXRvVXBkYXRlIHx8IGZvcmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMsIGZvcmNlKTtcblxuICAgICAgICB2YXIgbGlnaHRzID0gdGhpcy5saWdodHM7XG4gICAgICAgIHZhciBzY2VuZU1hdGVyaWFsVHJhbnNwYXJlbnQgPSB0aGlzLm1hdGVyaWFsICYmIHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQ7XG5cbiAgICAgICAgdGhpcy5fb3BhcXVlT2JqZWN0Q291bnQgPSAwO1xuICAgICAgICB0aGlzLl90cmFuc3BhcmVudE9iamVjdENvdW50ID0gMDtcblxuICAgICAgICBsaWdodHMubGVuZ3RoID0gMDtcblxuICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJMaXN0KHRoaXMsIHNjZW5lTWF0ZXJpYWxUcmFuc3BhcmVudCk7XG5cbiAgICAgICAgdGhpcy5vcGFxdWVMaXN0Lmxlbmd0aCA9IHRoaXMuX29wYXF1ZU9iamVjdENvdW50O1xuICAgICAgICB0aGlzLnRyYW5zcGFyZW50TGlzdC5sZW5ndGggPSB0aGlzLl90cmFuc3BhcmVudE9iamVjdENvdW50O1xuXG4gICAgICAgIC8vIHJlc2V0XG4gICAgICAgIGlmICghbm90VXBkYXRlTGlnaHRzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c0xpZ2h0TnVtYmVyID0gdGhpcy5fbGlnaHROdW1iZXI7XG5cbiAgICAgICAgICAgIHZhciBsaWdodE51bWJlciA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbGlnaHQgPSBsaWdodHNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwID0gbGlnaHQuZ3JvdXA7XG4gICAgICAgICAgICAgICAgaWYgKCFsaWdodE51bWJlcltncm91cF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlnaHROdW1iZXJbZ3JvdXBdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFVzZXIgY2FuIHVzZSBhbnkgdHlwZSBvZiBsaWdodFxuICAgICAgICAgICAgICAgIGxpZ2h0TnVtYmVyW2dyb3VwXVtsaWdodC50eXBlXSA9IGxpZ2h0TnVtYmVyW2dyb3VwXVtsaWdodC50eXBlXSB8fCAwO1xuICAgICAgICAgICAgICAgIGxpZ2h0TnVtYmVyW2dyb3VwXVtsaWdodC50eXBlXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGlnaHROdW1iZXIgPSBsaWdodE51bWJlcjtcblxuICAgICAgICAgICAgZm9yICh2YXIgZ3JvdXBJZCBpbiBsaWdodE51bWJlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0UHJvZ3JhbUtleXNbZ3JvdXBJZF0gPSBnZXRQcm9ncmFtS2V5KGxpZ2h0TnVtYmVyW2dyb3VwSWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGlnaHRVbmlmb3JtcygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldE1haW5DYW1lcmE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbWVyYUxpc3RbMF07XG4gICAgfSxcblxuICAgIC8vIFRyYXZlcnNlIHRoZSBzY2VuZSBhbmQgYWRkIHRoZSByZW5kZXJhYmxlXG4gICAgLy8gb2JqZWN0IHRvIHRoZSByZW5kZXIgbGlzdFxuICAgIF91cGRhdGVSZW5kZXJMaXN0OiBmdW5jdGlvbiAocGFyZW50LCBzY2VuZU1hdGVyaWFsVHJhbnNwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5pbnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50Ll9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Ll9jaGlsZHJlbltpXTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTGlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpZ2h0cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLm1hdGVyaWFsLnRyYW5zcGFyZW50IHx8IHNjZW5lTWF0ZXJpYWxUcmFuc3BhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcGFyZW50TGlzdFt0aGlzLl90cmFuc3BhcmVudE9iamVjdENvdW50KytdID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wYXF1ZUxpc3RbdGhpcy5fb3BhcXVlT2JqZWN0Q291bnQrK10gPSBjaGlsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hpbGQuX2NoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJMaXN0KGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfdXBkYXRlTGlnaHRVbmlmb3JtczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlnaHRzID0gdGhpcy5saWdodHM7XG4gICAgICAgIC8vIFB1dCB0aGUgbGlnaHQgY2FzdCBzaGFkb3cgYmVmb3JlIHRoZSBsaWdodCBub3QgY2FzdCBzaGFkb3dcbiAgICAgICAgbGlnaHRzLnNvcnQobGlnaHRTb3J0RnVuYyk7XG5cbiAgICAgICAgdmFyIGxpZ2h0VW5pZm9ybXMgPSB0aGlzLl9saWdodFVuaWZvcm1zO1xuICAgICAgICBmb3IgKHZhciBncm91cCBpbiBsaWdodFVuaWZvcm1zKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gbGlnaHRVbmlmb3Jtc1tncm91cF0pIHtcbiAgICAgICAgICAgICAgICBsaWdodFVuaWZvcm1zW2dyb3VwXVtzeW1ib2xdLnZhbHVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWdodHMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgdmFyIGxpZ2h0ID0gbGlnaHRzW2ldO1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gbGlnaHQuZ3JvdXA7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHN5bWJvbCBpbiBsaWdodC51bmlmb3JtVGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuaWZvcm1UcGwgPSBsaWdodC51bmlmb3JtVGVtcGxhdGVzW3N5bWJvbF07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdW5pZm9ybVRwbC52YWx1ZShsaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbGlnaHRVbmlmb3Jtc1tncm91cF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlnaHRVbmlmb3Jtc1tncm91cF0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFsaWdodFVuaWZvcm1zW2dyb3VwXVtzeW1ib2xdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0VW5pZm9ybXNbZ3JvdXBdW3N5bWJvbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbHUgPSBsaWdodFVuaWZvcm1zW2dyb3VwXVtzeW1ib2xdO1xuICAgICAgICAgICAgICAgIGx1LnR5cGUgPSB1bmlmb3JtVHBsLnR5cGUgKyAndic7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh1bmlmb3JtVHBsLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMWknOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbHUudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzRmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdS52YWx1ZS5wdXNoKHZhbHVlW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5rb3duIGxpZ2h0IHVuaWZvcm0gdHlwZSAnICsgdW5pZm9ybVRwbC50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0TGlnaHRHcm91cHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpZ2h0R3JvdXBzID0gW107XG4gICAgICAgIGZvciAodmFyIGdyb3VwSWQgaW4gdGhpcy5fbGlnaHROdW1iZXIpIHtcbiAgICAgICAgICAgIGxpZ2h0R3JvdXBzLnB1c2goZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpZ2h0R3JvdXBzO1xuICAgIH0sXG5cbiAgICBnZXROdW1iZXJDaGFuZ2VkTGlnaHRHcm91cHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpZ2h0R3JvdXBzID0gW107XG4gICAgICAgIGZvciAodmFyIGdyb3VwSWQgaW4gdGhpcy5fbGlnaHROdW1iZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGlnaHROdW1iZXJDaGFuZ2VkKGdyb3VwSWQpKSB7XG4gICAgICAgICAgICAgICAgbGlnaHRHcm91cHMucHVzaChncm91cElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlnaHRHcm91cHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiBsaWdodCBncm91cCBpcyBkaWZmZXJlbnQgd2l0aCBzaW5jZSBsYXN0IGZyYW1lXG4gICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byB1cGRhdGUgc2hhZGVyIGFuZCBzY2VuZSdzIHVuaWZvcm1zIGluIFJlbmRlcmVyLnJlbmRlclxuICAgICAqIEBwYXJhbSB7U2hhZGVyfSBzaGFkZXJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0xpZ2h0TnVtYmVyQ2hhbmdlZDogZnVuY3Rpb24gKGxpZ2h0R3JvdXApIHtcbiAgICAgICAgdmFyIHByZXZMaWdodE51bWJlciA9IHRoaXMuX3ByZXZpb3VzTGlnaHROdW1iZXI7XG4gICAgICAgIHZhciBjdXJyZW50TGlnaHROdW1iZXIgPSB0aGlzLl9saWdodE51bWJlcjtcbiAgICAgICAgLy8gUEVORElORyBQZXJmb3JtYW5jZVxuICAgICAgICBmb3IgKHZhciB0eXBlIGluIGN1cnJlbnRMaWdodE51bWJlcltsaWdodEdyb3VwXSkge1xuICAgICAgICAgICAgaWYgKCFwcmV2TGlnaHROdW1iZXJbbGlnaHRHcm91cF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGlnaHROdW1iZXJbbGlnaHRHcm91cF1bdHlwZV0gIT09IHByZXZMaWdodE51bWJlcltsaWdodEdyb3VwXVt0eXBlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIHR5cGUgaW4gcHJldkxpZ2h0TnVtYmVyW2xpZ2h0R3JvdXBdKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRMaWdodE51bWJlcltsaWdodEdyb3VwXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaWdodE51bWJlcltsaWdodEdyb3VwXVt0eXBlXSAhPT0gcHJldkxpZ2h0TnVtYmVyW2xpZ2h0R3JvdXBdW3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2hhZGVyJ3MgbGlnaHQgZ3JvdXAgd2l0aCBzY2VuZSdzXG4gICAgICogQHBhcmFtIHtTaGFkZXJ9IHNoYWRlclxuICAgICAqL1xuICAgIGdldExpZ2h0c051bWJlcnM6IGZ1bmN0aW9uIChsaWdodEdyb3VwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodE51bWJlcltsaWdodEdyb3VwXTtcbiAgICB9LFxuXG4gICAgZ2V0UHJvZ3JhbUtleTogZnVuY3Rpb24gKGxpZ2h0R3JvdXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpZ2h0UHJvZ3JhbUtleXNbbGlnaHRHcm91cF07XG4gICAgfSxcblxuICAgIHNldExpZ2h0VW5pZm9ybXM6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIHNldFVuaWZvcm1zKHVuaWZvcm1zLCBwcm9ncmFtLCByZW5kZXJlcikge1xuICAgICAgICAgICAgZm9yICh2YXIgc3ltYm9sIGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGx1ID0gdW5pZm9ybXNbc3ltYm9sXTtcbiAgICAgICAgICAgICAgICBpZiAobHUudHlwZSA9PT0gJ3R2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0uaGFzVW5pZm9ybShzeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4U2xvdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsdS52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBsdS52YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzbG90ID0gcHJvZ3JhbS50YWtlQ3VycmVudFRleHR1cmVTbG90KHJlbmRlcmVyLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleFNsb3RzLnB1c2goc2xvdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKHJlbmRlcmVyLmdsLCAnMWl2Jywgc3ltYm9sLCB0ZXhTbG90cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0ocmVuZGVyZXIuZ2wsIGx1LnR5cGUsIHN5bWJvbCwgbHUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJvZ3JhbSwgbGlnaHRHcm91cCwgcmVuZGVyZXIpIHtcbiAgICAgICAgICAgIHNldFVuaWZvcm1zKHRoaXMuX2xpZ2h0VW5pZm9ybXNbbGlnaHRHcm91cF0sIHByb2dyYW0sIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIC8vIFNldCBzaGFkb3dzXG4gICAgICAgICAgICBzZXRVbmlmb3Jtcyh0aGlzLnNoYWRvd1VuaWZvcm1zLCBwcm9ncmFtLCByZW5kZXJlcik7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugc2VsZiwgY2xlYXIgYWxsIHRoZSBzY2VuZSBvYmplY3RzXG4gICAgICogQnV0IHJlc291cmNlcyBvZiBnbCBsaWtlIHRleHV0dXJlLCBzaGFkZXIgd2lsbCBub3QgYmUgZGlzcG9zZWQuXG4gICAgICogTW9zdGx5IHlvdSBzaG91bGQgdXNlIGRpc3Bvc2VTY2VuZSBtZXRob2QgaW4gUmVuZGVyZXIgdG8gZG8gZGlzcG9zZS5cbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBudWxsO1xuICAgICAgICB0aGlzLm9wYXF1ZUxpc3QgPSBbXTtcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudExpc3QgPSBbXTtcblxuICAgICAgICB0aGlzLmxpZ2h0cyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX2xpZ2h0VW5pZm9ybXMgPSB7fTtcblxuICAgICAgICB0aGlzLl9saWdodE51bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9ub2RlUmVwb3NpdG9yeSA9IHt9O1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBsaWdodFNvcnRGdW5jKGEsIGIpIHtcbiAgICBpZiAoYi5jYXN0U2hhZG93ICYmICFhLmNhc3RTaGFkb3cpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY2VuZTtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgQ2FjaGUgZnJvbSAnLi9jb3JlL0NhY2hlJztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4vbWF0aC9Cb3VuZGluZ0JveCc7XG5cbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcblxudmFyIHZlYzNDcmVhdGUgPSB2ZWMzLmNyZWF0ZTtcbnZhciB2ZWMzQWRkID0gdmVjMy5hZGQ7XG52YXIgdmVjM1NldCA9IHZlYzMuc2V0O1xuXG5mdW5jdGlvbiBnZXRBcnJheUN0b3JCeVR5cGUgKHR5cGUpIHtcbiAgICByZXR1cm4gKHtcbiAgICAgICAgJ2J5dGUnOiB2ZW5kb3IuSW50OEFycmF5LFxuICAgICAgICAndWJ5dGUnOiB2ZW5kb3IuVWludDhBcnJheSxcbiAgICAgICAgJ3Nob3J0JzogdmVuZG9yLkludDE2QXJyYXksXG4gICAgICAgICd1c2hvcnQnOiB2ZW5kb3IuVWludDE2QXJyYXlcbiAgICB9KVt0eXBlXSB8fCB2ZW5kb3IuRmxvYXQzMkFycmF5O1xufVxuXG5mdW5jdGlvbiBtYWtlQXR0cktleShhdHRyTmFtZSkge1xuICAgIHJldHVybiAnYXR0cl8nICsgYXR0ck5hbWU7XG59XG4vKipcbiAqIEdlb21ldHJ5IGF0dHJpYnV0ZVxuICogQGFsaWFzIGNsYXkuR2VvbWV0cnkuQXR0cmlidXRlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlKG5hbWUsIHR5cGUsIHNpemUsIHNlbWFudGljKSB7XG4gICAgLyoqXG4gICAgICogQXR0cmlidXRlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgLyoqXG4gICAgICogQXR0cmlidXRlIHR5cGVcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsgYCdieXRlJ2BcbiAgICAgKiAgKyBgJ3VieXRlJ2BcbiAgICAgKiAgKyBgJ3Nob3J0J2BcbiAgICAgKiAgKyBgJ3VzaG9ydCdgXG4gICAgICogICsgYCdmbG9hdCdgIE1vc3QgY29tbW9ubHkgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgLyoqXG4gICAgICogU2l6ZSBvZiBhdHRyaWJ1dGUgY29tcG9uZW50LiAxIC0gNC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgLyoqXG4gICAgICogU2VtYW50aWMgb2YgdGhpcyBhdHRyaWJ1dGUuXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqICArIGAnUE9TSVRJT04nYFxuICAgICAqICArIGAnTk9STUFMJ2BcbiAgICAgKiAgKyBgJ0JJTk9STUFMJ2BcbiAgICAgKiAgKyBgJ1RBTkdFTlQnYFxuICAgICAqICArIGAnVEVYQ09PUkQnYFxuICAgICAqICArIGAnVEVYQ09PUkRfMCdgXG4gICAgICogICsgYCdURVhDT09SRF8xJ2BcbiAgICAgKiAgKyBgJ0NPTE9SJ2BcbiAgICAgKiAgKyBgJ0pPSU5UJ2BcbiAgICAgKiAgKyBgJ1dFSUdIVCdgXG4gICAgICpcbiAgICAgKiBJbiBzaGFkZXIsIGF0dHJpYnV0ZSB3aXRoIHNhbWUgc2VtYW50aWMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hcHBlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBgZ2xzbFxuICAgICAqIGF0dHJpYnV0ZSB2ZWMzIHBvczogUE9TSVRJT05cbiAgICAgKiBgYGBcbiAgICAgKiB3aWxsIHVzZSB0aGUgYXR0cmlidXRlIHZhbHVlIHdpdGggc2VtYW50aWMgUE9TSVRJT04gaW4gZ2VvbWV0cnksIG5vIG1hdHRlciB3aGF0IG5hbWUgaXQgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc2VtYW50aWMgPSBzZW1hbnRpYyB8fCAnJztcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAgICogQHR5cGUge1R5cGVkQXJyYXl9XG4gICAgICovXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG5cbiAgICAvLyBJbml0IGdldHRlciBzZXR0ZXJcbiAgICBzd2l0Y2ggKHNpemUpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVbaWR4XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldCA9IGZ1bmN0aW9uIChpZHgsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVtpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ29weSBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgICAgICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVbdGFyZ2V0XSA9IHRoaXMudmFsdWVbdGFyZ2V0XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoaWR4LCBvdXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBvdXRbMF0gPSBhcnJbaWR4ICogMl07XG4gICAgICAgICAgICAgICAgb3V0WzFdID0gYXJyW2lkeCAqIDIgKyAxXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2V0ID0gZnVuY3Rpb24gKGlkeCwgdmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICAgICAgYXJyW2lkeCAqIDJdID0gdmFsWzBdO1xuICAgICAgICAgICAgICAgIGFycltpZHggKiAyICsgMV0gPSB2YWxbMV07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jb3B5ID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICAgICAgc291cmNlICo9IDI7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ICo9IDI7XG4gICAgICAgICAgICAgICAgYXJyW3RhcmdldF0gPSBhcnJbc291cmNlXTtcbiAgICAgICAgICAgICAgICBhcnJbdGFyZ2V0ICsgMV0gPSBhcnJbc291cmNlICsgMV07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKGlkeCwgb3V0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkeDMgPSBpZHggKiAzO1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIG91dFswXSA9IGFycltpZHgzXTtcbiAgICAgICAgICAgICAgICBvdXRbMV0gPSBhcnJbaWR4MyArIDFdO1xuICAgICAgICAgICAgICAgIG91dFsyXSA9IGFycltpZHgzICsgMl07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldCA9IGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuICAgICAgICAgICAgICAgIHZhciBpZHgzID0gaWR4ICogMztcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBhcnJbaWR4M10gPSB2YWxbMF07XG4gICAgICAgICAgICAgICAgYXJyW2lkeDMgKyAxXSA9IHZhbFsxXTtcbiAgICAgICAgICAgICAgICBhcnJbaWR4MyArIDJdID0gdmFsWzJdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSAqPSAzO1xuICAgICAgICAgICAgICAgIHRhcmdldCAqPSAzO1xuICAgICAgICAgICAgICAgIGFyclt0YXJnZXRdID0gYXJyW3NvdXJjZV07XG4gICAgICAgICAgICAgICAgYXJyW3RhcmdldCArIDFdID0gYXJyW3NvdXJjZSArIDFdO1xuICAgICAgICAgICAgICAgIGFyclt0YXJnZXQgKyAyXSA9IGFycltzb3VyY2UgKyAyXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoaWR4LCBvdXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaWR4NCA9IGlkeCAqIDQ7XG4gICAgICAgICAgICAgICAgb3V0WzBdID0gYXJyW2lkeDRdO1xuICAgICAgICAgICAgICAgIG91dFsxXSA9IGFycltpZHg0ICsgMV07XG4gICAgICAgICAgICAgICAgb3V0WzJdID0gYXJyW2lkeDQgKyAyXTtcbiAgICAgICAgICAgICAgICBvdXRbM10gPSBhcnJbaWR4NCArIDNdO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBmdW5jdGlvbiAoaWR4LCB2YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaWR4NCA9IGlkeCAqIDQ7XG4gICAgICAgICAgICAgICAgYXJyW2lkeDRdID0gdmFsWzBdO1xuICAgICAgICAgICAgICAgIGFycltpZHg0ICsgMV0gPSB2YWxbMV07XG4gICAgICAgICAgICAgICAgYXJyW2lkeDQgKyAyXSA9IHZhbFsyXTtcbiAgICAgICAgICAgICAgICBhcnJbaWR4NCArIDNdID0gdmFsWzNdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSAqPSA0O1xuICAgICAgICAgICAgICAgIHRhcmdldCAqPSA0O1xuICAgICAgICAgICAgICAgIC8vIGNvcHlXaXRoaW4gaXMgZXh0cmVtZWx5IHNsb3dcbiAgICAgICAgICAgICAgICBhcnJbdGFyZ2V0XSA9IGFycltzb3VyY2VdO1xuICAgICAgICAgICAgICAgIGFyclt0YXJnZXQgKyAxXSA9IGFycltzb3VyY2UgKyAxXTtcbiAgICAgICAgICAgICAgICBhcnJbdGFyZ2V0ICsgMl0gPSBhcnJbc291cmNlICsgMl07XG4gICAgICAgICAgICAgICAgYXJyW3RhcmdldCArIDNdID0gYXJyW3NvdXJjZSArIDNdO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogU2V0IGl0ZW0gdmFsdWUgYXQgZ2l2ZSBpbmRleC4gU2Vjb25kIHBhcmFtZXRlciB2YWwgaXMgbnVtYmVyIGlmIHNpemUgaXMgMVxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBjbGF5Lkdlb21ldHJ5LkF0dHJpYnV0ZSNzZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpZHhcbiAqIEBwYXJhbSB7bnVtYmVyW118bnVtYmVyfSB2YWxcbiAqIEBleGFtcGxlXG4gKiBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykuc2V0KDAsIFsxLCAxLCAxXSk7XG4gKi9cblxuLyoqXG4gKiBHZXQgaXRlbSB2YWx1ZSBhdCBnaXZlIGluZGV4LiBTZWNvbmQgcGFyYW1ldGVyIG91dCBpcyBubyBuZWVkIGlmIHNpemUgaXMgMVxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBjbGF5Lkdlb21ldHJ5LkF0dHJpYnV0ZSNzZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpZHhcbiAqIEBwYXJhbSB7bnVtYmVyW119IFtvdXRdXG4gKiBAZXhhbXBsZVxuICogZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpLmdldCgwLCBvdXQpO1xuICovXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgd2l0aCBnaXZlbiB2ZXJ0ZXggY291bnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuVmVydGV4XG4gKi9cbkF0dHJpYnV0ZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChuVmVydGV4KSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUubGVuZ3RoICE9IG5WZXJ0ZXggKiB0aGlzLnNpemUpIHtcbiAgICAgICAgdmFyIEFycmF5Q29uc3RydWN0b3IgPSBnZXRBcnJheUN0b3JCeVR5cGUodGhpcy50eXBlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKG5WZXJ0ZXggKiB0aGlzLnNpemUpO1xuICAgIH1cbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgd2l0aCBnaXZlbiBhcnJheS4gV2hpY2ggY2FuIGJlIDEgZGltZW5zaW9uYWwgb3IgMiBkaW1lbnNpb25hbFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAqIEBleGFtcGxlXG4gKiAgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpLmZyb21BcnJheShcbiAqICAgICAgWy0xLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwXVxuICogICk7XG4gKiAgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpLmZyb21BcnJheShcbiAqICAgICAgWyBbLTEsIDAsIDBdLCBbMSwgMCwgMF0sIFswLCAxLCAwXSBdXG4gKiAgKTtcbiAqL1xuQXR0cmlidXRlLnByb3RvdHlwZS5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgQXJyYXlDb25zdHJ1Y3RvciA9IGdldEFycmF5Q3RvckJ5VHlwZSh0aGlzLnR5cGUpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBDb252ZXJ0IDJkIGFycmF5IHRvIGZsYXRcbiAgICBpZiAoYXJyYXlbMF0gJiYgKGFycmF5WzBdLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgdmFsdWUgPSBuZXcgQXJyYXlDb25zdHJ1Y3RvcihhcnJheS5sZW5ndGggKiBzaXplKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtuKytdID0gYXJyYXlbaV1bal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IEFycmF5Q29uc3RydWN0b3IoYXJyYXkpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG59O1xuXG5BdHRyaWJ1dGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oY29weVZhbHVlKSB7XG4gICAgdmFyIHJldCA9IG5ldyBBdHRyaWJ1dGUodGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuc2l6ZSwgdGhpcy5zZW1hbnRpYyk7XG4gICAgLy8gRklYTUVcbiAgICBpZiAoY29weVZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybigndG9kbycpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gQXR0cmlidXRlQnVmZmVyKG5hbWUsIHR5cGUsIGJ1ZmZlciwgc2l6ZSwgc2VtYW50aWMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLnNlbWFudGljID0gc2VtYW50aWM7XG5cbiAgICAvLyBUbyBiZSBzZXQgaW4gbWVzaFxuICAgIC8vIHN5bWJvbCBpbiB0aGUgc2hhZGVyXG4gICAgdGhpcy5zeW1ib2wgPSAnJztcblxuICAgIC8vIE5lZWRzIHJlbW92ZSBmbGFnXG4gICAgdGhpcy5uZWVkc1JlbW92ZSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBJbmRpY2VzQnVmZmVyKGJ1ZmZlcikge1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMuY291bnQgPSAwO1xufVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lkdlb21ldHJ5XG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgR2VvbWV0cnkgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5HZW9tZXRyeSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXR0cmlidXRlcyBvZiBnZW9tZXRyeS4gSW5jbHVkaW5nOlxuICAgICAgICAgKiAgKyBgcG9zaXRpb25gXG4gICAgICAgICAqICArIGB0ZXhjb29yZDBgXG4gICAgICAgICAqICArIGB0ZXhjb29yZDFgXG4gICAgICAgICAqICArIGBub3JtYWxgXG4gICAgICAgICAqICArIGB0YW5nZW50YFxuICAgICAgICAgKiAgKyBgY29sb3JgXG4gICAgICAgICAqICArIGB3ZWlnaHRgXG4gICAgICAgICAqICArIGBqb2ludGBcbiAgICAgICAgICogICsgYGJhcnljZW50cmljYFxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgcG9zaXRpb246IG5ldyBBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgJ2Zsb2F0JywgMywgJ1BPU0lUSU9OJyksXG4gICAgICAgICAgICB0ZXhjb29yZDA6IG5ldyBBdHRyaWJ1dGUoJ3RleGNvb3JkMCcsICdmbG9hdCcsIDIsICdURVhDT09SRF8wJyksXG4gICAgICAgICAgICB0ZXhjb29yZDE6IG5ldyBBdHRyaWJ1dGUoJ3RleGNvb3JkMScsICdmbG9hdCcsIDIsICdURVhDT09SRF8xJyksXG4gICAgICAgICAgICBub3JtYWw6IG5ldyBBdHRyaWJ1dGUoJ25vcm1hbCcsICdmbG9hdCcsIDMsICdOT1JNQUwnKSxcbiAgICAgICAgICAgIHRhbmdlbnQ6IG5ldyBBdHRyaWJ1dGUoJ3RhbmdlbnQnLCAnZmxvYXQnLCA0LCAnVEFOR0VOVCcpLFxuICAgICAgICAgICAgY29sb3I6IG5ldyBBdHRyaWJ1dGUoJ2NvbG9yJywgJ2Zsb2F0JywgNCwgJ0NPTE9SJyksXG4gICAgICAgICAgICAvLyBTa2lubmluZyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAvLyBFYWNoIHZlcnRleCBjYW4gYmUgYmluZCB0byA0IGJvbmVzLCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgLy8gc3VtIG9mIHdlaWdodHMgaXMgMSwgc28gdGhlIHdlaWdodHMgaXMgc3RvcmVkIGluIHZlYzMgYW5kIHRoZSBsYXN0XG4gICAgICAgICAgICAvLyBjYW4gYmUgY2FsY3VsYXRlZCBieSAxLXcueC13Lnktdy56XG4gICAgICAgICAgICB3ZWlnaHQ6IG5ldyBBdHRyaWJ1dGUoJ3dlaWdodCcsICdmbG9hdCcsIDMsICdXRUlHSFQnKSxcbiAgICAgICAgICAgIGpvaW50OiBuZXcgQXR0cmlidXRlKCdqb2ludCcsICdmbG9hdCcsIDQsICdKT0lOVCcpLFxuICAgICAgICAgICAgLy8gRm9yIHdpcmVmcmFtZSBkaXNwbGF5XG4gICAgICAgICAgICAvLyBodHRwOi8vY29kZWZsb3cub3JnL2VudHJpZXMvMjAxMi9hdWcvMDIvZWFzeS13aXJlZnJhbWUtZGlzcGxheS13aXRoLWJhcnljZW50cmljLWNvb3JkaW5hdGVzL1xuICAgICAgICAgICAgYmFyeWNlbnRyaWM6IG5ldyBBdHRyaWJ1dGUoJ2JhcnljZW50cmljJywgJ2Zsb2F0JywgMywgbnVsbCksXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGVkIGJvdW5kaW5nIGJveCBvZiBnZW9tZXRyeS5cbiAgICAgICAgICogQHR5cGUge2NsYXkubWF0aC5Cb3VuZGluZ0JveH1cbiAgICAgICAgICovXG4gICAgICAgIGJvdW5kaW5nQm94OiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2VzIG9mIGdlb21ldHJ5LlxuICAgICAgICAgKiBAdHlwZSB7VWludDE2QXJyYXl8VWludDMyQXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICBpbmRpY2VzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB2ZXJ0aWNlcyBkYXRhIGR5bmFtaWNhbGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEF0dHJpYnV0ZXMgdmFsdWUgY2FuJ3QgYmUgY2hhbmdlZCBhZnRlciBmaXJzdCByZW5kZXIgaWYgZHlhbm1pYyBpcyBmYWxzZS5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBkeW5hbWljOiB0cnVlLFxuXG4gICAgICAgIF9lbmFibGVkQXR0cmlidXRlczogbnVsbFxuICAgIH07XG59LCBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgY2FjaGVcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBDYWNoZSgpO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlTGlzdCA9IE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcyk7XG59LFxuLyoqIEBsZW5kcyBjbGF5Lkdlb21ldHJ5LnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIE1haW4gYXR0cmlidXRlIHdpbGwgYmUgdXNlZCB0byBjb3VudCB2ZXJ0ZXggbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBtYWluQXR0cmlidXRlOiAncG9zaXRpb24nLFxuICAgIC8qKlxuICAgICAqIFVzZXIgZGVmaW5lZCBwaWNraW5nIGFsZ29yaXRobSBpbnN0ZWFkIG9mIGRlZmF1bHRcbiAgICAgKiB0cmlhbmdsZSByYXkgaW50ZXJzZWN0aW9uXG4gICAgICogeCwgeSBhcmUgTkRDLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAoeCwgeSwgcmVuZGVyZXIsIGNhbWVyYSwgcmVuZGVyYWJsZSwgb3V0KSA9PiBib29sZWFuXG4gICAgICogYGBgXG4gICAgICogQHR5cGUgez9GdW5jdGlvbn1cbiAgICAgKi9cbiAgICBwaWNrOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogVXNlciBkZWZpbmVkIHJheSBwaWNraW5nIGFsZ29yaXRobSBpbnN0ZWFkIG9mIGRlZmF1bHRcbiAgICAgKiB0cmlhbmdsZSByYXkgaW50ZXJzZWN0aW9uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIChyYXk6IGNsYXkubWF0aC5SYXksIHJlbmRlcmFibGU6IGNsYXkuUmVuZGVyYWJsZSwgb3V0OiBBcnJheSkgPT4gYm9vbGVhblxuICAgICAqIGBgYFxuICAgICAqIEB0eXBlIHs/RnVuY3Rpb259XG4gICAgICovXG4gICAgcGlja0J5UmF5OiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGJvdW5kaW5nQm94IG9mIEdlb21ldHJ5XG4gICAgICovXG4gICAgdXBkYXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJib3ggPSB0aGlzLmJvdW5kaW5nQm94O1xuICAgICAgICBpZiAoIWJib3gpIHtcbiAgICAgICAgICAgIGJib3ggPSB0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc0FyciA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZTtcbiAgICAgICAgaWYgKHBvc0FyciAmJiBwb3NBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbWluID0gYmJveC5taW47XG4gICAgICAgICAgICB2YXIgbWF4ID0gYmJveC5tYXg7XG4gICAgICAgICAgICB2YXIgbWluQXJyID0gbWluLmFycmF5O1xuICAgICAgICAgICAgdmFyIG1heEFyciA9IG1heC5hcnJheTtcbiAgICAgICAgICAgIHZlYzMuc2V0KG1pbkFyciwgcG9zQXJyWzBdLCBwb3NBcnJbMV0sIHBvc0FyclsyXSk7XG4gICAgICAgICAgICB2ZWMzLnNldChtYXhBcnIsIHBvc0FyclswXSwgcG9zQXJyWzFdLCBwb3NBcnJbMl0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBwb3NBcnIubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgIHZhciB4ID0gcG9zQXJyW2krK107XG4gICAgICAgICAgICAgICAgdmFyIHkgPSBwb3NBcnJbaSsrXTtcbiAgICAgICAgICAgICAgICB2YXIgeiA9IHBvc0FycltpKytdO1xuICAgICAgICAgICAgICAgIGlmICh4IDwgbWluQXJyWzBdKSB7IG1pbkFyclswXSA9IHg7IH1cbiAgICAgICAgICAgICAgICBpZiAoeSA8IG1pbkFyclsxXSkgeyBtaW5BcnJbMV0gPSB5OyB9XG4gICAgICAgICAgICAgICAgaWYgKHogPCBtaW5BcnJbMl0pIHsgbWluQXJyWzJdID0gejsgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHggPiBtYXhBcnJbMF0pIHsgbWF4QXJyWzBdID0geDsgfVxuICAgICAgICAgICAgICAgIGlmICh5ID4gbWF4QXJyWzFdKSB7IG1heEFyclsxXSA9IHk7IH1cbiAgICAgICAgICAgICAgICBpZiAoeiA+IG1heEFyclsyXSkgeyBtYXhBcnJbMl0gPSB6OyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1heC5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBNYXJrIGF0dHJpYnV0ZXMgYW5kIGluZGljZXMgaW4gZ2VvbWV0cnkgbmVlZHMgdG8gdXBkYXRlLlxuICAgICAqL1xuICAgIGRpcnR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbmFibGVkQXR0cmlidXRlcyA9IHRoaXMuZ2V0RW5hYmxlZEF0dHJpYnV0ZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eUF0dHJpYnV0ZShlbmFibGVkQXR0cmlidXRlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eUluZGljZXMoKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZEF0dHJpYnV0ZXMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5KCdhbnknKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGluZGljZXMgbmVlZHMgdG8gdXBkYXRlLlxuICAgICAqL1xuICAgIGRpcnR5SW5kaWNlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jYWNoZS5kaXJ0eUFsbCgnaW5kaWNlcycpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogTWFyayB0aGUgYXR0cmlidXRlcyBuZWVkcyB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFthdHRyTmFtZV1cbiAgICAgKi9cbiAgICBkaXJ0eUF0dHJpYnV0ZTogZnVuY3Rpb24gKGF0dHJOYW1lKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5QWxsKG1ha2VBdHRyS2V5KGF0dHJOYW1lKSk7XG4gICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5QWxsKCdhdHRyaWJ1dGVzJyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgaW5kaWNlcyBvZiB0cmlhbmdsZSBhdCBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4XG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gb3V0XG4gICAgICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59XG4gICAgICovXG4gICAgZ2V0VHJpYW5nbGVJbmRpY2VzOiBmdW5jdGlvbiAoaWR4LCBvdXQpIHtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudHJpYW5nbGVDb3VudCAmJiBpZHggPj0gMCkge1xuICAgICAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgICAgICBvdXQgPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgICAgIG91dFswXSA9IGluZGljZXNbaWR4ICogM107XG4gICAgICAgICAgICBvdXRbMV0gPSBpbmRpY2VzW2lkeCAqIDMgKyAxXTtcbiAgICAgICAgICAgIG91dFsyXSA9IGluZGljZXNbaWR4ICogMyArIDJdO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgaW5kaWNlcyBvZiB0cmlhbmdsZSBhdCBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4XG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyXG4gICAgICovXG4gICAgc2V0VHJpYW5nbGVJbmRpY2VzOiBmdW5jdGlvbiAoaWR4LCBhcnIpIHtcbiAgICAgICAgdmFyIGluZGljZXMgPSB0aGlzLmluZGljZXM7XG4gICAgICAgIGluZGljZXNbaWR4ICogM10gPSBhcnJbMF07XG4gICAgICAgIGluZGljZXNbaWR4ICogMyArIDFdID0gYXJyWzFdO1xuICAgICAgICBpbmRpY2VzW2lkeCAqIDMgKyAyXSA9IGFyclsyXTtcbiAgICB9LFxuXG4gICAgaXNVc2VJbmRpY2VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuaW5kaWNlcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBpbmRpY2VzIGZyb20gYW4gYXJyYXkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICAgKi9cbiAgICBpbml0SW5kaWNlc0Zyb21BcnJheTogZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgdmFyIEFycmF5Q29uc3RydWN0b3IgPSB0aGlzLnZlcnRleENvdW50ID4gMHhmZmZmXG4gICAgICAgICAgICA/IHZlbmRvci5VaW50MzJBcnJheSA6IHZlbmRvci5VaW50MTZBcnJheTtcbiAgICAgICAgLy8gQ29udmVydCAyZCBhcnJheSB0byBmbGF0XG4gICAgICAgIGlmIChhcnJheVswXSAmJiAoYXJyYXlbMF0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICAgICAgdmFyIHNpemUgPSAzO1xuXG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKGFycmF5Lmxlbmd0aCAqIHNpemUpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW24rK10gPSBhcnJheVtpXVtqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKGFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IHZhbHVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGF0dHJpYnV0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VtYW50aWNdXG4gICAgICovXG4gICAgY3JlYXRlQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgdHlwZSwgc2l6ZSwgc2VtYW50aWMpIHtcbiAgICAgICAgdmFyIGF0dHJpYiA9IG5ldyBBdHRyaWJ1dGUobmFtZSwgdHlwZSwgc2l6ZSwgc2VtYW50aWMpO1xuICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzW25hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyaWI7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZUxpc3QucHVzaChuYW1lKTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhdHRyaWJ1dGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqL1xuICAgIHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUxpc3QgPSB0aGlzLl9hdHRyaWJ1dGVMaXN0O1xuICAgICAgICB2YXIgaWR4ID0gYXR0cmlidXRlTGlzdC5pbmRleE9mKG5hbWUpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3Quc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXR0cmlidXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lkdlb21ldHJ5LkF0dHJpYnV0ZX1cbiAgICAgKi9cbiAgICBnZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBlbmFibGVkIGF0dHJpYnV0ZXMgbmFtZSBsaXN0XG4gICAgICogQXR0cmlidXRlIHdoaWNoIGhhcyB0aGUgc2FtZSB2ZXJ0ZXggbnVtYmVyIHdpdGggcG9zaXRpb24gaXMgdHJlYXRlZCBhcyBhIGVuYWJsZWQgYXR0cmlidXRlXG4gICAgICogQHJldHVybiB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RW5hYmxlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gdGhpcy5fZW5hYmxlZEF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVMaXN0ID0gdGhpcy5fYXR0cmlidXRlTGlzdDtcbiAgICAgICAgLy8gQ2FjaGVcbiAgICAgICAgaWYgKGVuYWJsZWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5hYmxlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBuVmVydGV4ID0gdGhpcy52ZXJ0ZXhDb3VudDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTGlzdFtpXTtcbiAgICAgICAgICAgIHZhciBhdHRyaWIgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0cmliLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYi52YWx1ZS5sZW5ndGggPT09IG5WZXJ0ZXggKiBhdHRyaWIuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbmFibGVkQXR0cmlidXRlcyA9IHJlc3VsdDtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXRCdWZmZXJDaHVua3M6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuICAgICAgICB2YXIgaXNBdHRyaWJ1dGVzRGlydHkgPSBjYWNoZS5pc0RpcnR5KCdhdHRyaWJ1dGVzJyk7XG4gICAgICAgIHZhciBpc0luZGljZXNEaXJ0eSA9IGNhY2hlLmlzRGlydHkoJ2luZGljZXMnKTtcbiAgICAgICAgaWYgKGlzQXR0cmlidXRlc0RpcnR5IHx8IGlzSW5kaWNlc0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVCdWZmZXIocmVuZGVyZXIuZ2wsIGlzQXR0cmlidXRlc0RpcnR5LCBpc0luZGljZXNEaXJ0eSk7XG4gICAgICAgICAgICB2YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSB0aGlzLmdldEVuYWJsZWRBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUuZnJlc2gobWFrZUF0dHJLZXkoZW5hYmxlZEF0dHJpYnV0ZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlLmZyZXNoKCdhdHRyaWJ1dGVzJyk7XG4gICAgICAgICAgICBjYWNoZS5mcmVzaCgnaW5kaWNlcycpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlLmZyZXNoKCdhbnknKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldCgnY2h1bmtzJyk7XG4gICAgfSxcblxuICAgIF91cGRhdGVCdWZmZXI6IGZ1bmN0aW9uIChfZ2wsIGlzQXR0cmlidXRlc0RpcnR5LCBpc0luZGljZXNEaXJ0eSkge1xuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgdmFyIGNodW5rcyA9IGNhY2hlLmdldCgnY2h1bmtzJyk7XG4gICAgICAgIHZhciBmaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWNodW5rcykge1xuICAgICAgICAgICAgY2h1bmtzID0gW107XG4gICAgICAgICAgICAvLyBJbnRpYWxpemVcbiAgICAgICAgICAgIGNodW5rc1swXSA9IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVCdWZmZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBpbmRpY2VzQnVmZmVyOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FjaGUucHV0KCdjaHVua3MnLCBjaHVua3MpO1xuICAgICAgICAgICAgZmlyc3RVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNodW5rID0gY2h1bmtzWzBdO1xuICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVycyA9IGNodW5rLmF0dHJpYnV0ZUJ1ZmZlcnM7XG4gICAgICAgIHZhciBpbmRpY2VzQnVmZmVyID0gY2h1bmsuaW5kaWNlc0J1ZmZlcjtcblxuICAgICAgICBpZiAoaXNBdHRyaWJ1dGVzRGlydHkgfHwgZmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVMaXN0ID0gdGhpcy5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVyTWFwID0ge307XG4gICAgICAgICAgICBpZiAoIWZpcnN0VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUJ1ZmZlck1hcFthdHRyaWJ1dGVCdWZmZXJzW2ldLm5hbWVdID0gYXR0cmlidXRlQnVmZmVyc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGSVhNRSBJZiBzb21lIGF0dHJpYnV0ZXMgcmVtb3ZlZFxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhdHRyaWJ1dGVMaXN0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVMaXN0W2tdO1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmICghZmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5mbyA9IGF0dHJpYnV0ZUJ1ZmZlck1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJJbmZvLmJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLmlzRGlydHkobWFrZUF0dHJLZXkobmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gdGhleSBhcmUgZGlydHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBCdWZmZXJTdWJEYXRhP1xuICAgICAgICAgICAgICAgICAgICBfZ2wuYmluZEJ1ZmZlcihfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBfZ2wuYnVmZmVyRGF0YShfZ2wuQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGUudmFsdWUsIHRoaXMuZHluYW1pYyA/IGdsZW51bS5EWU5BTUlDX0RSQVcgOiBnbGVudW0uU1RBVElDX0RSQVcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUJ1ZmZlcnNba10gPSBuZXcgQXR0cmlidXRlQnVmZmVyKG5hbWUsIGF0dHJpYnV0ZS50eXBlLCBidWZmZXIsIGF0dHJpYnV0ZS5zaXplLCBhdHRyaWJ1dGUuc2VtYW50aWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIHVudXNlZCBhdHRyaWJ1dGVzIGJ1ZmZlcnMuXG4gICAgICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gazsgaSA8IGF0dHJpYnV0ZUJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBfZ2wuZGVsZXRlQnVmZmVyKGF0dHJpYnV0ZUJ1ZmZlcnNbaV0uYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHJpYnV0ZUJ1ZmZlcnMubGVuZ3RoID0gaztcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNVc2VJbmRpY2VzKCkgJiYgKGlzSW5kaWNlc0RpcnR5IHx8IGZpcnN0VXBkYXRlKSkge1xuICAgICAgICAgICAgaWYgKCFpbmRpY2VzQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgaW5kaWNlc0J1ZmZlciA9IG5ldyBJbmRpY2VzQnVmZmVyKF9nbC5jcmVhdGVCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgY2h1bmsuaW5kaWNlc0J1ZmZlciA9IGluZGljZXNCdWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRpY2VzQnVmZmVyLmNvdW50ID0gdGhpcy5pbmRpY2VzLmxlbmd0aDtcbiAgICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kaWNlc0J1ZmZlci5idWZmZXIpO1xuICAgICAgICAgICAgX2dsLmJ1ZmZlckRhdGEoX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmluZGljZXMsIHRoaXMuZHluYW1pYyA/IGdsZW51bS5EWU5BTUlDX0RSQVcgOiBnbGVudW0uU1RBVElDX0RSQVcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG5vcm1hbHMgcGVyIHZlcnRleC5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZlcnRleENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlO1xuICAgICAgICB2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlO1xuXG4gICAgICAgIGlmICghbm9ybWFscyB8fCBub3JtYWxzLmxlbmd0aCAhPT0gcG9zaXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlID0gbmV3IHZlbmRvci5GbG9hdDMyQXJyYXkocG9zaXRpb25zLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub3JtYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsc1tpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcDEgPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgIHZhciBwMiA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIHAzID0gdmVjM0NyZWF0ZSgpO1xuXG4gICAgICAgIHZhciB2MjEgPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgIHZhciB2MzIgPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIG4gPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIGxlbiA9IGluZGljZXMgPyBpbmRpY2VzLmxlbmd0aCA6IHRoaXMudmVydGV4Q291bnQ7XG4gICAgICAgIHZhciBpMSwgaTIsIGkzO1xuICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGxlbjspIHtcbiAgICAgICAgICAgIGlmIChpbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgaTEgPSBpbmRpY2VzW2YrK107XG4gICAgICAgICAgICAgICAgaTIgPSBpbmRpY2VzW2YrK107XG4gICAgICAgICAgICAgICAgaTMgPSBpbmRpY2VzW2YrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpMSA9IGYrKztcbiAgICAgICAgICAgICAgICBpMiA9IGYrKztcbiAgICAgICAgICAgICAgICBpMyA9IGYrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVjM1NldChwMSwgcG9zaXRpb25zW2kxKjNdLCBwb3NpdGlvbnNbaTEqMysxXSwgcG9zaXRpb25zW2kxKjMrMl0pO1xuICAgICAgICAgICAgdmVjM1NldChwMiwgcG9zaXRpb25zW2kyKjNdLCBwb3NpdGlvbnNbaTIqMysxXSwgcG9zaXRpb25zW2kyKjMrMl0pO1xuICAgICAgICAgICAgdmVjM1NldChwMywgcG9zaXRpb25zW2kzKjNdLCBwb3NpdGlvbnNbaTMqMysxXSwgcG9zaXRpb25zW2kzKjMrMl0pO1xuXG4gICAgICAgICAgICB2ZWMzLnN1Yih2MjEsIHAxLCBwMik7XG4gICAgICAgICAgICB2ZWMzLnN1Yih2MzIsIHAyLCBwMyk7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKG4sIHYyMSwgdjMyKTtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYmUgd2VpZ2h0ZWQgYnkgdGhlIHRyaWFuZ2xlIGFyZWFcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsc1tpMSozK2ldID0gbm9ybWFsc1tpMSozK2ldICsgbltpXTtcbiAgICAgICAgICAgICAgICBub3JtYWxzW2kyKjMraV0gPSBub3JtYWxzW2kyKjMraV0gKyBuW2ldO1xuICAgICAgICAgICAgICAgIG5vcm1hbHNbaTMqMytpXSA9IG5vcm1hbHNbaTMqMytpXSArIG5baV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vcm1hbHMubGVuZ3RoOykge1xuICAgICAgICAgICAgdmVjM1NldChuLCBub3JtYWxzW2ldLCBub3JtYWxzW2krMV0sIG5vcm1hbHNbaSsyXSk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZShuLCBuKTtcbiAgICAgICAgICAgIG5vcm1hbHNbaSsrXSA9IG5bMF07XG4gICAgICAgICAgICBub3JtYWxzW2krK10gPSBuWzFdO1xuICAgICAgICAgICAgbm9ybWFsc1tpKytdID0gblsyXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG5vcm1hbHMgcGVyIGZhY2UuXG4gICAgICovXG4gICAgZ2VuZXJhdGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudmVydGV4Q291bnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1VuaXF1ZVZlcnRleCgpKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlVW5pcXVlVmVydGV4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlO1xuICAgICAgICB2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlO1xuXG4gICAgICAgIHZhciBwMSA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIHAyID0gdmVjM0NyZWF0ZSgpO1xuICAgICAgICB2YXIgcDMgPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIHYyMSA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIHYzMiA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIG4gPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgaWYgKCFub3JtYWxzKSB7XG4gICAgICAgICAgICBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW4gPSBpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiB0aGlzLnZlcnRleENvdW50O1xuICAgICAgICB2YXIgaTEsIGkyLCBpMztcbiAgICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCBsZW47KSB7XG4gICAgICAgICAgICBpZiAoaW5kaWNlcykge1xuICAgICAgICAgICAgICAgIGkxID0gaW5kaWNlc1tmKytdO1xuICAgICAgICAgICAgICAgIGkyID0gaW5kaWNlc1tmKytdO1xuICAgICAgICAgICAgICAgIGkzID0gaW5kaWNlc1tmKytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaTEgPSBmKys7XG4gICAgICAgICAgICAgICAgaTIgPSBmKys7XG4gICAgICAgICAgICAgICAgaTMgPSBmKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlYzNTZXQocDEsIHBvc2l0aW9uc1tpMSozXSwgcG9zaXRpb25zW2kxKjMrMV0sIHBvc2l0aW9uc1tpMSozKzJdKTtcbiAgICAgICAgICAgIHZlYzNTZXQocDIsIHBvc2l0aW9uc1tpMiozXSwgcG9zaXRpb25zW2kyKjMrMV0sIHBvc2l0aW9uc1tpMiozKzJdKTtcbiAgICAgICAgICAgIHZlYzNTZXQocDMsIHBvc2l0aW9uc1tpMyozXSwgcG9zaXRpb25zW2kzKjMrMV0sIHBvc2l0aW9uc1tpMyozKzJdKTtcblxuICAgICAgICAgICAgdmVjMy5zdWIodjIxLCBwMSwgcDIpO1xuICAgICAgICAgICAgdmVjMy5zdWIodjMyLCBwMiwgcDMpO1xuICAgICAgICAgICAgdmVjMy5jcm9zcyhuLCB2MjEsIHYzMik7XG5cbiAgICAgICAgICAgIHZlYzMubm9ybWFsaXplKG4sIG4pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICAgICAgICAgIG5vcm1hbHNbaTEqMyArIGldID0gbltpXTtcbiAgICAgICAgICAgICAgICBub3JtYWxzW2kyKjMgKyBpXSA9IG5baV07XG4gICAgICAgICAgICAgICAgbm9ybWFsc1tpMyozICsgaV0gPSBuW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGFuZ2VudHMgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy52ZXJ0ZXhDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5WZXJ0ZXggPSB0aGlzLnZlcnRleENvdW50O1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLnRhbmdlbnQudmFsdWUpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkoblZlcnRleCAqIDQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSBhdHRyaWJ1dGVzLnRleGNvb3JkMC52YWx1ZTtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWU7XG4gICAgICAgIHZhciB0YW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZTtcbiAgICAgICAgdmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZTtcblxuICAgICAgICBpZiAoIXRleGNvb3Jkcykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdHZW9tZXRyeSB3aXRob3V0IHRleGNvb3JkcyBjYW5cXCd0IGdlbmVyYXRlIHRhbmdlbnRzLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRhbjEgPSBbXTtcbiAgICAgICAgdmFyIHRhbjIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuVmVydGV4OyBpKyspIHtcbiAgICAgICAgICAgIHRhbjFbaV0gPSBbMC4wLCAwLjAsIDAuMF07XG4gICAgICAgICAgICB0YW4yW2ldID0gWzAuMCwgMC4wLCAwLjBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNkaXIgPSBbMC4wLCAwLjAsIDAuMF07XG4gICAgICAgIHZhciB0ZGlyID0gWzAuMCwgMC4wLCAwLjBdO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcblxuICAgICAgICB2YXIgbGVuID0gaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogdGhpcy52ZXJ0ZXhDb3VudDtcbiAgICAgICAgdmFyIGkxLCBpMiwgaTM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOykge1xuICAgICAgICAgICAgaWYgKGluZGljZXMpIHtcbiAgICAgICAgICAgICAgICBpMSA9IGluZGljZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpMiA9IGluZGljZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpMyA9IGluZGljZXNbaSsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGkxID0gaSsrO1xuICAgICAgICAgICAgICAgIGkyID0gaSsrO1xuICAgICAgICAgICAgICAgIGkzID0gaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3QxcyA9IHRleGNvb3Jkc1tpMSAqIDJdLFxuICAgICAgICAgICAgICAgIHN0MnMgPSB0ZXhjb29yZHNbaTIgKiAyXSxcbiAgICAgICAgICAgICAgICBzdDNzID0gdGV4Y29vcmRzW2kzICogMl0sXG4gICAgICAgICAgICAgICAgc3QxdCA9IHRleGNvb3Jkc1tpMSAqIDIgKyAxXSxcbiAgICAgICAgICAgICAgICBzdDJ0ID0gdGV4Y29vcmRzW2kyICogMiArIDFdLFxuICAgICAgICAgICAgICAgIHN0M3QgPSB0ZXhjb29yZHNbaTMgKiAyICsgMV0sXG5cbiAgICAgICAgICAgICAgICBwMXggPSBwb3NpdGlvbnNbaTEgKiAzXSxcbiAgICAgICAgICAgICAgICBwMnggPSBwb3NpdGlvbnNbaTIgKiAzXSxcbiAgICAgICAgICAgICAgICBwM3ggPSBwb3NpdGlvbnNbaTMgKiAzXSxcbiAgICAgICAgICAgICAgICBwMXkgPSBwb3NpdGlvbnNbaTEgKiAzICsgMV0sXG4gICAgICAgICAgICAgICAgcDJ5ID0gcG9zaXRpb25zW2kyICogMyArIDFdLFxuICAgICAgICAgICAgICAgIHAzeSA9IHBvc2l0aW9uc1tpMyAqIDMgKyAxXSxcbiAgICAgICAgICAgICAgICBwMXogPSBwb3NpdGlvbnNbaTEgKiAzICsgMl0sXG4gICAgICAgICAgICAgICAgcDJ6ID0gcG9zaXRpb25zW2kyICogMyArIDJdLFxuICAgICAgICAgICAgICAgIHAzeiA9IHBvc2l0aW9uc1tpMyAqIDMgKyAyXTtcblxuICAgICAgICAgICAgdmFyIHgxID0gcDJ4IC0gcDF4LFxuICAgICAgICAgICAgICAgIHgyID0gcDN4IC0gcDF4LFxuICAgICAgICAgICAgICAgIHkxID0gcDJ5IC0gcDF5LFxuICAgICAgICAgICAgICAgIHkyID0gcDN5IC0gcDF5LFxuICAgICAgICAgICAgICAgIHoxID0gcDJ6IC0gcDF6LFxuICAgICAgICAgICAgICAgIHoyID0gcDN6IC0gcDF6O1xuXG4gICAgICAgICAgICB2YXIgczEgPSBzdDJzIC0gc3QxcyxcbiAgICAgICAgICAgICAgICBzMiA9IHN0M3MgLSBzdDFzLFxuICAgICAgICAgICAgICAgIHQxID0gc3QydCAtIHN0MXQsXG4gICAgICAgICAgICAgICAgdDIgPSBzdDN0IC0gc3QxdDtcblxuICAgICAgICAgICAgdmFyIHIgPSAxLjAgLyAoczEgKiB0MiAtIHQxICogczIpO1xuICAgICAgICAgICAgc2RpclswXSA9ICh0MiAqIHgxIC0gdDEgKiB4MikgKiByO1xuICAgICAgICAgICAgc2RpclsxXSA9ICh0MiAqIHkxIC0gdDEgKiB5MikgKiByO1xuICAgICAgICAgICAgc2RpclsyXSA9ICh0MiAqIHoxIC0gdDEgKiB6MikgKiByO1xuXG4gICAgICAgICAgICB0ZGlyWzBdID0gKHMxICogeDIgLSBzMiAqIHgxKSAqIHI7XG4gICAgICAgICAgICB0ZGlyWzFdID0gKHMxICogeTIgLSBzMiAqIHkxKSAqIHI7XG4gICAgICAgICAgICB0ZGlyWzJdID0gKHMxICogejIgLSBzMiAqIHoxKSAqIHI7XG5cbiAgICAgICAgICAgIHZlYzNBZGQodGFuMVtpMV0sIHRhbjFbaTFdLCBzZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMVtpMl0sIHRhbjFbaTJdLCBzZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMVtpM10sIHRhbjFbaTNdLCBzZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMltpMV0sIHRhbjJbaTFdLCB0ZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMltpMl0sIHRhbjJbaTJdLCB0ZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMltpM10sIHRhbjJbaTNdLCB0ZGlyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG1wID0gdmVjM0NyZWF0ZSgpO1xuICAgICAgICB2YXIgbkNyb3NzVCA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIG4gPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblZlcnRleDsgaSsrKSB7XG4gICAgICAgICAgICBuWzBdID0gbm9ybWFsc1tpICogM107XG4gICAgICAgICAgICBuWzFdID0gbm9ybWFsc1tpICogMyArIDFdO1xuICAgICAgICAgICAgblsyXSA9IG5vcm1hbHNbaSAqIDMgKyAyXTtcbiAgICAgICAgICAgIHZhciB0ID0gdGFuMVtpXTtcblxuICAgICAgICAgICAgLy8gR3JhbS1TY2htaWR0IG9ydGhvZ29uYWxpemVcbiAgICAgICAgICAgIHZlYzMuc2NhbGUodG1wLCBuLCB2ZWMzLmRvdChuLCB0KSk7XG4gICAgICAgICAgICB2ZWMzLnN1Yih0bXAsIHQsIHRtcCk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXAsIHRtcCk7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgaGFuZGVkbmVzcy5cbiAgICAgICAgICAgIHZlYzMuY3Jvc3MobkNyb3NzVCwgbiwgdCk7XG4gICAgICAgICAgICB0YW5nZW50c1tpICogNF0gPSB0bXBbMF07XG4gICAgICAgICAgICB0YW5nZW50c1tpICogNCArIDFdID0gdG1wWzFdO1xuICAgICAgICAgICAgdGFuZ2VudHNbaSAqIDQgKyAyXSA9IHRtcFsyXTtcbiAgICAgICAgICAgIC8vIFBFTkRJTkcgY2FuIGNvbmZpZyA/XG4gICAgICAgICAgICB0YW5nZW50c1tpICogNCArIDNdID0gdmVjMy5kb3QobkNyb3NzVCwgdGFuMltpXSkgPCAwLjAgPyAtMS4wIDogMS4wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgdmVydGljZXMgYXJlIG5vdCBzaGFyZWQgYnkgZGlmZmVyZW50IGluZGljZXMuXG4gICAgICovXG4gICAgaXNVbmlxdWVWZXJ0ZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNVc2VJbmRpY2VzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnRleENvdW50ID09PSB0aGlzLmluZGljZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHVuaXF1ZSB2ZXJ0ZXggZm9yIGVhY2ggaW5kZXguXG4gICAgICovXG4gICAgZ2VuZXJhdGVVbmlxdWVWZXJ0ZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZlcnRleENvdW50IHx8ICF0aGlzLmluZGljZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGljZXMubGVuZ3RoID4gMHhmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLmluZGljZXMgPSBuZXcgdmVuZG9yLlVpbnQzMkFycmF5KHRoaXMuaW5kaWNlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgICAgdmFyIGluZGljZXMgPSB0aGlzLmluZGljZXM7XG5cbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWVMaXN0ID0gdGhpcy5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgIHZhciBvbGRBdHRyVmFsdWVzID0ge307XG4gICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgYXR0cmlidXRlTmFtZUxpc3QubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZUxpc3RbYV07XG4gICAgICAgICAgICBvbGRBdHRyVmFsdWVzW25hbWVdID0gYXR0cmlidXRlc1tuYW1lXS52YWx1ZTtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0uaW5pdCh0aGlzLmluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJzb3IgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpaSA9IGluZGljZXNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGF0dHJpYnV0ZU5hbWVMaXN0Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lTGlzdFthXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzW25hbWVdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gYXR0cmlidXRlc1tuYW1lXS5zaXplO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzaXplOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlbY3Vyc29yICogc2l6ZSArIGtdID0gb2xkQXR0clZhbHVlc1tuYW1lXVtpaSAqIHNpemUgKyBrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gY3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIGZvciB3aXJlZnJhbWUgZHJhdy5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZUJhcnljZW50cmljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy52ZXJ0ZXhDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVW5pcXVlVmVydGV4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVVbmlxdWVWZXJ0ZXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgICAgICB2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLmJhcnljZW50cmljLnZhbHVlO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgLy8gQWxyZWFkeSBleGlzdGVkO1xuICAgICAgICBpZiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoID09PSBpbmRpY2VzLmxlbmd0aCAqIDMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhcnJheSA9IGF0dHJpYnV0ZXMuYmFyeWNlbnRyaWMudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KGluZGljZXMubGVuZ3RoICogMyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAoaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogdGhpcy52ZXJ0ZXhDb3VudCAvIDMpOykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaWkgPSBpbmRpY2VzID8gaW5kaWNlc1tpKytdIDogKGkgKiAzICsgaik7XG4gICAgICAgICAgICAgICAgYXJyYXlbaWkgKiAzICsgal0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgdHJhbnNmb3JtIHRvIGdlb21ldHJ5IGF0dHJpYnV0ZXMuXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH0gbWF0cml4XG4gICAgICovXG4gICAgYXBwbHlUcmFuc2Zvcm06IGZ1bmN0aW9uIChtYXRyaXgpIHtcblxuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWU7XG4gICAgICAgIHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwudmFsdWU7XG4gICAgICAgIHZhciB0YW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZTtcblxuICAgICAgICBtYXRyaXggPSBtYXRyaXguYXJyYXk7XG4gICAgICAgIC8vIE5vcm1hbCBNYXRyaXhcbiAgICAgICAgdmFyIGludmVyc2VUcmFuc3Bvc2VNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LmludmVydChpbnZlcnNlVHJhbnNwb3NlTWF0cml4LCBtYXRyaXgpO1xuICAgICAgICBtYXQ0LnRyYW5zcG9zZShpbnZlcnNlVHJhbnNwb3NlTWF0cml4LCBpbnZlcnNlVHJhbnNwb3NlTWF0cml4KTtcblxuICAgICAgICB2YXIgdmVjM1RyYW5zZm9ybU1hdDQgPSB2ZWMzLnRyYW5zZm9ybU1hdDQ7XG4gICAgICAgIHZhciB2ZWMzRm9yRWFjaCA9IHZlYzMuZm9yRWFjaDtcbiAgICAgICAgdmVjM0ZvckVhY2gocG9zaXRpb25zLCAzLCAwLCBudWxsLCB2ZWMzVHJhbnNmb3JtTWF0NCwgbWF0cml4KTtcbiAgICAgICAgaWYgKG5vcm1hbHMpIHtcbiAgICAgICAgICAgIHZlYzNGb3JFYWNoKG5vcm1hbHMsIDMsIDAsIG51bGwsIHZlYzNUcmFuc2Zvcm1NYXQ0LCBpbnZlcnNlVHJhbnNwb3NlTWF0cml4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFuZ2VudHMpIHtcbiAgICAgICAgICAgIHZlYzNGb3JFYWNoKHRhbmdlbnRzLCA0LCAwLCBudWxsLCB2ZWMzVHJhbnNmb3JtTWF0NCwgaW52ZXJzZVRyYW5zcG9zZU1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ib3VuZGluZ0JveCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCb3VuZGluZ0JveCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGdlb21ldHJ5IGRhdGEgaW4gR0wgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuICAgICAgICB2YXIgY2h1bmtzID0gY2FjaGUuZ2V0KCdjaHVua3MnKTtcbiAgICAgICAgaWYgKGNodW5rcykge1xuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjaHVua3MubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSBjaHVua3NbY107XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGNodW5rLmF0dHJpYnV0ZUJ1ZmZlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnMgPSBjaHVuay5hdHRyaWJ1dGVCdWZmZXJzW2tdO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5nbC5kZWxldGVCdWZmZXIoYXR0cmlicy5idWZmZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjaHVuay5pbmRpY2VzQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLmdsLmRlbGV0ZUJ1ZmZlcihjaHVuay5pbmRpY2VzQnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlLmRlbGV0ZUNvbnRleHQocmVuZGVyZXIuX191aWRfXyk7XG4gICAgfVxuXG59KTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIC8qKlxuICAgICAqIEBuYW1lIGNsYXkuR2VvbWV0cnkjdmVydGV4Q291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEByZWFkT25seVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHZW9tZXRyeS5wcm90b3R5cGUsICd2ZXJ0ZXhDb3VudCcsIHtcblxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcblxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtYWluQXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW3RoaXMubWFpbkF0dHJpYnV0ZV07XG4gICAgICAgICAgICBpZiAoIW1haW5BdHRyaWJ1dGUgfHwgIW1haW5BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYWluQXR0cmlidXRlLnZhbHVlLmxlbmd0aCAvIG1haW5BdHRyaWJ1dGUuc2l6ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBuYW1lIGNsYXkuR2VvbWV0cnkjdHJpYW5nbGVDb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdlb21ldHJ5LnByb3RvdHlwZSwgJ3RyaWFuZ2xlQ291bnQnLCB7XG5cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgICAgIGlmICghaW5kaWNlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5HZW9tZXRyeS5TVEFUSUNfRFJBVyA9IGdsZW51bS5TVEFUSUNfRFJBVztcbkdlb21ldHJ5LkRZTkFNSUNfRFJBVyA9IGdsZW51bS5EWU5BTUlDX0RSQVc7XG5HZW9tZXRyeS5TVFJFQU1fRFJBVyA9IGdsZW51bS5TVFJFQU1fRFJBVztcblxuR2VvbWV0cnkuQXR0cmlidXRlQnVmZmVyID0gQXR0cmlidXRlQnVmZmVyO1xuR2VvbWV0cnkuSW5kaWNlc0J1ZmZlciA9IEluZGljZXNCdWZmZXI7XG5cbkdlb21ldHJ5LkF0dHJpYnV0ZSA9IEF0dHJpYnV0ZTtcblxuZXhwb3J0IGRlZmF1bHQgR2VvbWV0cnk7XG4iLCJpbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lmdlb21ldHJ5LlBsYW5lXG4gKiBAZXh0ZW5kcyBjbGF5Lkdlb21ldHJ5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0LndpZHRoU2VnbWVudHNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5oZWlnaHRTZWdtZW50c11cbiAqL1xudmFyIFBsYW5lID0gR2VvbWV0cnkuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LlBsYW5lIyAqL1xue1xuICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgd2lkdGhTZWdtZW50czogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodFNlZ21lbnRzOiAxXG59LCBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmJ1aWxkKCk7XG59LFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LlBsYW5lLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEJ1aWxkIHBsYW5lIGdlb21ldHJ5XG4gICAgICovXG4gICAgYnVpbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaGVpZ2h0U2VnbWVudHMgPSB0aGlzLmhlaWdodFNlZ21lbnRzO1xuICAgICAgICB2YXIgd2lkdGhTZWdtZW50cyA9IHRoaXMud2lkdGhTZWdtZW50cztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtdO1xuICAgICAgICB2YXIgbm9ybWFscyA9IFtdO1xuICAgICAgICB2YXIgZmFjZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHkgLyBoZWlnaHRTZWdtZW50cztcbiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDw9IHdpZHRoU2VnbWVudHM7IHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzID0geCAvIHdpZHRoU2VnbWVudHM7XG5cbiAgICAgICAgICAgICAgICBwb3NpdGlvbnMucHVzaChbMiAqIHMgLSAxLCAyICogdCAtIDEsIDBdKTtcbiAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKFtzLCB0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbHMucHVzaChbMCwgMCwgMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeCA8IHdpZHRoU2VnbWVudHMgJiYgeSA8IGhlaWdodFNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0geCArIHkgKiAod2lkdGhTZWdtZW50cyArIDEpO1xuICAgICAgICAgICAgICAgICAgICBmYWNlcy5wdXNoKFtpLCBpICsgMSwgaSArIHdpZHRoU2VnbWVudHMgKyAxXSk7XG4gICAgICAgICAgICAgICAgICAgIGZhY2VzLnB1c2goW2kgKyB3aWR0aFNlZ21lbnRzICsgMSwgaSArIDEsIGkgKyB3aWR0aFNlZ21lbnRzICsgMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24uZnJvbUFycmF5KHBvc2l0aW9ucyk7XG4gICAgICAgIGF0dHJpYnV0ZXMudGV4Y29vcmQwLmZyb21BcnJheSh0ZXhjb29yZHMpO1xuICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbC5mcm9tQXJyYXkobm9ybWFscyk7XG5cbiAgICAgICAgdGhpcy5pbml0SW5kaWNlc0Zyb21BcnJheShmYWNlcyk7XG5cbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94Lm1pbi5zZXQoLTEsIC0xLCAwKTtcbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveC5tYXguc2V0KDEsIDEsIDApO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBQbGFuZTtcbiIsImltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgUGxhbmUgZnJvbSAnLi9QbGFuZSc7XG5pbXBvcnQgTWF0cml4NCBmcm9tICcuLi9tYXRoL01hdHJpeDQnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBCb3VuZGluZ0JveCBmcm9tICcuLi9tYXRoL0JvdW5kaW5nQm94JztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi4vY29yZS92ZW5kb3InO1xuXG52YXIgcGxhbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lmdlb21ldHJ5LkN1YmVcbiAqIEBleHRlbmRzIGNsYXkuR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQud2lkdGhTZWdtZW50c11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0LmhlaWdodFNlZ21lbnRzXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQuZGVwdGhTZWdtZW50c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdC5pbnNpZGVdXG4gKi9cbnZhciBDdWJlID0gR2VvbWV0cnkuZXh0ZW5kKFxuLyoqQGxlbmRzIGNsYXkuZ2VvbWV0cnkuQ3ViZSMgKi9cbntcbiAgICBkeW5hbWljOiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRlcHRoU2VnbWVudHM6IDEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5zaWRlOiBmYWxzZVxufSwgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5idWlsZCgpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5DdWJlLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEJ1aWxkIGN1YmUgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIHBsYW5lcyA9IHtcbiAgICAgICAgICAgICdweCc6IGNyZWF0ZVBsYW5lKCdweCcsIHRoaXMuZGVwdGhTZWdtZW50cywgdGhpcy5oZWlnaHRTZWdtZW50cyksXG4gICAgICAgICAgICAnbngnOiBjcmVhdGVQbGFuZSgnbngnLCB0aGlzLmRlcHRoU2VnbWVudHMsIHRoaXMuaGVpZ2h0U2VnbWVudHMpLFxuICAgICAgICAgICAgJ3B5JzogY3JlYXRlUGxhbmUoJ3B5JywgdGhpcy53aWR0aFNlZ21lbnRzLCB0aGlzLmRlcHRoU2VnbWVudHMpLFxuICAgICAgICAgICAgJ255JzogY3JlYXRlUGxhbmUoJ255JywgdGhpcy53aWR0aFNlZ21lbnRzLCB0aGlzLmRlcHRoU2VnbWVudHMpLFxuICAgICAgICAgICAgJ3B6JzogY3JlYXRlUGxhbmUoJ3B6JywgdGhpcy53aWR0aFNlZ21lbnRzLCB0aGlzLmhlaWdodFNlZ21lbnRzKSxcbiAgICAgICAgICAgICdueic6IGNyZWF0ZVBsYW5lKCdueicsIHRoaXMud2lkdGhTZWdtZW50cywgdGhpcy5oZWlnaHRTZWdtZW50cyksXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGF0dHJMaXN0ID0gWydwb3NpdGlvbicsICd0ZXhjb29yZDAnLCAnbm9ybWFsJ107XG4gICAgICAgIHZhciB2ZXJ0ZXhOdW1iZXIgPSAwO1xuICAgICAgICB2YXIgZmFjZU51bWJlciA9IDA7XG4gICAgICAgIGZvciAodmFyIHBvcyBpbiBwbGFuZXMpIHtcbiAgICAgICAgICAgIHZlcnRleE51bWJlciArPSBwbGFuZXNbcG9zXS52ZXJ0ZXhDb3VudDtcbiAgICAgICAgICAgIGZhY2VOdW1iZXIgKz0gcGxhbmVzW3Bvc10uaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhdHRyTGlzdC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2F0dHJMaXN0W2tdXS5pbml0KHZlcnRleE51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IHZlbmRvci5VaW50MTZBcnJheShmYWNlTnVtYmVyKTtcbiAgICAgICAgdmFyIGZhY2VPZmZzZXQgPSAwO1xuICAgICAgICB2YXIgdmVydGV4T2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgcG9zIGluIHBsYW5lcykge1xuICAgICAgICAgICAgdmFyIHBsYW5lID0gcGxhbmVzW3Bvc107XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGF0dHJMaXN0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gYXR0ckxpc3Rba107XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJBcnJheSA9IHBsYW5lLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBhdHRyU2l6ZSA9IHBsYW5lLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLnNpemU7XG4gICAgICAgICAgICAgICAgdmFyIGlzTm9ybWFsID0gYXR0ck5hbWUgPT09ICdub3JtYWwnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0ckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGF0dHJBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5zaWRlICYmIGlzTm9ybWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IC12YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLnZhbHVlW2kgKyBhdHRyU2l6ZSAqIHZlcnRleE9mZnNldF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbGVuID0gcGxhbmUuaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYW5lLmluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljZXNbaSArIGZhY2VPZmZzZXRdID0gdmVydGV4T2Zmc2V0ICsgcGxhbmUuaW5kaWNlc1t0aGlzLmluc2lkZSA/IChsZW4gLSBpIC0gMSkgOiBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhY2VPZmZzZXQgKz0gcGxhbmUuaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQgKz0gcGxhbmUudmVydGV4Q291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWF4LnNldCgxLCAxLCAxKTtcbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveC5taW4uc2V0KC0xLCAtMSwgLTEpO1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVQbGFuZShwb3MsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzKSB7XG5cbiAgICBwbGFuZU1hdHJpeC5pZGVudGl0eSgpO1xuXG4gICAgdmFyIHBsYW5lID0gbmV3IFBsYW5lKHtcbiAgICAgICAgd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcbiAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG4gICAgfSk7XG5cbiAgICBzd2l0Y2gocG9zKSB7XG4gICAgICAgIGNhc2UgJ3B4JzpcbiAgICAgICAgICAgIE1hdHJpeDQudHJhbnNsYXRlKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgVmVjdG9yMy5QT1NJVElWRV9YKTtcbiAgICAgICAgICAgIE1hdHJpeDQucm90YXRlWShwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIE1hdGguUEkgLyAyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdueCc6XG4gICAgICAgICAgICBNYXRyaXg0LnRyYW5zbGF0ZShwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIFZlY3RvcjMuTkVHQVRJVkVfWCk7XG4gICAgICAgICAgICBNYXRyaXg0LnJvdGF0ZVkocGxhbmVNYXRyaXgsIHBsYW5lTWF0cml4LCAtTWF0aC5QSSAvIDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3B5JzpcbiAgICAgICAgICAgIE1hdHJpeDQudHJhbnNsYXRlKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgVmVjdG9yMy5QT1NJVElWRV9ZKTtcbiAgICAgICAgICAgIE1hdHJpeDQucm90YXRlWChwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIC1NYXRoLlBJIC8gMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnknOlxuICAgICAgICAgICAgTWF0cml4NC50cmFuc2xhdGUocGxhbmVNYXRyaXgsIHBsYW5lTWF0cml4LCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgTWF0cml4NC5yb3RhdGVYKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgTWF0aC5QSSAvIDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3B6JzpcbiAgICAgICAgICAgIE1hdHJpeDQudHJhbnNsYXRlKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgVmVjdG9yMy5QT1NJVElWRV9aKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdueic6XG4gICAgICAgICAgICBNYXRyaXg0LnRyYW5zbGF0ZShwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIFZlY3RvcjMuTkVHQVRJVkVfWik7XG4gICAgICAgICAgICBNYXRyaXg0LnJvdGF0ZVkocGxhbmVNYXRyaXgsIHBsYW5lTWF0cml4LCBNYXRoLlBJKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwbGFuZS5hcHBseVRyYW5zZm9ybShwbGFuZU1hdHJpeCk7XG4gICAgcmV0dXJuIHBsYW5lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDdWJlO1xuIiwiaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4uL0dlb21ldHJ5JztcbmltcG9ydCBCb3VuZGluZ0JveCBmcm9tICcuLi9tYXRoL0JvdW5kaW5nQm94JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5nZW9tZXRyeS5TcGhlcmVcbiAqIEBleHRlbmRzIGNsYXkuR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aFNlZ21lbnRzXVxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50c11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpU3RhcnRdXG4gKiBAcGFyYW0ge251bWJlcn0gW3BoaUxlbmd0aF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGhdXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1c11cbiAqL1xudmFyIFNwaGVyZSA9IEdlb21ldHJ5LmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5TcGhlcmUjICovXG57XG4gICAgZHluYW1pYzogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB3aWR0aFNlZ21lbnRzOiA0MCxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodFNlZ21lbnRzOiAyMCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcGhpU3RhcnQ6IDAsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBwaGlMZW5ndGg6IE1hdGguUEkgKiAyLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGV0YVN0YXJ0OiAwLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhldGFMZW5ndGg6IE1hdGguUEksXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHJhZGl1czogMVxuXG59LCBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmJ1aWxkKCk7XG59LFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LlNwaGVyZS5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBCdWlsZCBzcGhlcmUgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoZWlnaHRTZWdtZW50cyA9IHRoaXMuaGVpZ2h0U2VnbWVudHM7XG4gICAgICAgIHZhciB3aWR0aFNlZ21lbnRzID0gdGhpcy53aWR0aFNlZ21lbnRzO1xuXG4gICAgICAgIHZhciBwb3NpdGlvbkF0dHIgPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG4gICAgICAgIHZhciB0ZXhjb29yZEF0dHIgPSB0aGlzLmF0dHJpYnV0ZXMudGV4Y29vcmQwO1xuICAgICAgICB2YXIgbm9ybWFsQXR0ciA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cbiAgICAgICAgdmFyIHZlcnRleENvdW50ID0gKHdpZHRoU2VnbWVudHMgKyAxKSAqIChoZWlnaHRTZWdtZW50cyArIDEpO1xuICAgICAgICBwb3NpdGlvbkF0dHIuaW5pdCh2ZXJ0ZXhDb3VudCk7XG4gICAgICAgIHRleGNvb3JkQXR0ci5pbml0KHZlcnRleENvdW50KTtcbiAgICAgICAgbm9ybWFsQXR0ci5pbml0KHZlcnRleENvdW50KTtcblxuICAgICAgICB2YXIgSW5kaWNlc0N0b3IgPSB2ZXJ0ZXhDb3VudCA+IDB4ZmZmZiA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgICAgIHZhciBpbmRpY2VzID0gdGhpcy5pbmRpY2VzID0gbmV3IEluZGljZXNDdG9yKHdpZHRoU2VnbWVudHMgKiBoZWlnaHRTZWdtZW50cyAqIDYpO1xuXG4gICAgICAgIHZhciB4LCB5LCB6LFxuICAgICAgICAgICAgdSwgdixcbiAgICAgICAgICAgIGksIGo7XG5cbiAgICAgICAgdmFyIHJhZGl1cyA9IHRoaXMucmFkaXVzO1xuICAgICAgICB2YXIgcGhpU3RhcnQgPSB0aGlzLnBoaVN0YXJ0O1xuICAgICAgICB2YXIgcGhpTGVuZ3RoID0gdGhpcy5waGlMZW5ndGg7XG4gICAgICAgIHZhciB0aGV0YVN0YXJ0ID0gdGhpcy50aGV0YVN0YXJ0O1xuICAgICAgICB2YXIgdGhldGFMZW5ndGggPSB0aGlzLnRoZXRhTGVuZ3RoO1xuICAgICAgICB2YXIgcmFkaXVzID0gdGhpcy5yYWRpdXM7XG5cbiAgICAgICAgdmFyIHBvcyA9IFtdO1xuICAgICAgICB2YXIgdXYgPSBbXTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBkaXZpZGVyID0gMSAvIHJhZGl1cztcbiAgICAgICAgZm9yIChqID0gMDsgaiA8PSBoZWlnaHRTZWdtZW50czsgaiArKykge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSB3aWR0aFNlZ21lbnRzOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgdSA9IGkgLyB3aWR0aFNlZ21lbnRzO1xuICAgICAgICAgICAgICAgIHYgPSBqIC8gaGVpZ2h0U2VnbWVudHM7XG5cbiAgICAgICAgICAgICAgICAvLyBYIGF4aXMgaXMgaW52ZXJ0ZWQgc28gdGV4dHVyZSBjYW4gYmUgbWFwcGVkIGZyb20gbGVmdCB0byByaWdodFxuICAgICAgICAgICAgICAgIHggPSAtcmFkaXVzICogTWF0aC5jb3MocGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoKSAqIE1hdGguc2luKHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHkgPSByYWRpdXMgKiBNYXRoLmNvcyh0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB6ID0gcmFkaXVzICogTWF0aC5zaW4ocGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoKSAqIE1hdGguc2luKHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgcG9zWzBdID0geDsgcG9zWzFdID0geTsgcG9zWzJdID0gejtcbiAgICAgICAgICAgICAgICB1dlswXSA9IHU7IHV2WzFdID0gdjtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkF0dHIuc2V0KG9mZnNldCwgcG9zKTtcbiAgICAgICAgICAgICAgICB0ZXhjb29yZEF0dHIuc2V0KG9mZnNldCwgdXYpO1xuICAgICAgICAgICAgICAgIHBvc1swXSAqPSBkaXZpZGVyO1xuICAgICAgICAgICAgICAgIHBvc1sxXSAqPSBkaXZpZGVyO1xuICAgICAgICAgICAgICAgIHBvc1syXSAqPSBkaXZpZGVyO1xuICAgICAgICAgICAgICAgIG5vcm1hbEF0dHIuc2V0KG9mZnNldCwgcG9zKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpMSwgaTIsIGkzLCBpNDtcblxuICAgICAgICB2YXIgbGVuID0gd2lkdGhTZWdtZW50cyArIDE7XG5cbiAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0U2VnbWVudHM7IGogKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aFNlZ21lbnRzOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgaTIgPSBqICogbGVuICsgaTtcbiAgICAgICAgICAgICAgICBpMSA9IChqICogbGVuICsgaSArIDEpO1xuICAgICAgICAgICAgICAgIGk0ID0gKGogKyAxKSAqIGxlbiArIGkgKyAxO1xuICAgICAgICAgICAgICAgIGkzID0gKGogKyAxKSAqIGxlbiArIGk7XG5cbiAgICAgICAgICAgICAgICBpbmRpY2VzW24rK10gPSBpMTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzW24rK10gPSBpMjtcbiAgICAgICAgICAgICAgICBpbmRpY2VzW24rK10gPSBpNDtcblxuICAgICAgICAgICAgICAgIGluZGljZXNbbisrXSA9IGkyO1xuICAgICAgICAgICAgICAgIGluZGljZXNbbisrXSA9IGkzO1xuICAgICAgICAgICAgICAgIGluZGljZXNbbisrXSA9IGk0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94Lm1heC5zZXQocmFkaXVzLCByYWRpdXMsIHJhZGl1cyk7XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWluLnNldCgtcmFkaXVzLCAtcmFkaXVzLCAtcmFkaXVzKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU3BoZXJlO1xuIiwidmFyIG1hdGhVdGlsID0ge307XG5cbm1hdGhVdGlsLmlzUG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDA7XG59O1xuXG5tYXRoVXRpbC5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhbHVlIC0tO1xuICAgIHZhbHVlIHw9IHZhbHVlID4+IDE7XG4gICAgdmFsdWUgfD0gdmFsdWUgPj4gMjtcbiAgICB2YWx1ZSB8PSB2YWx1ZSA+PiA0O1xuICAgIHZhbHVlIHw9IHZhbHVlID4+IDg7XG4gICAgdmFsdWUgfD0gdmFsdWUgPj4gMTY7XG4gICAgdmFsdWUgKys7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG5tYXRoVXRpbC5uZWFyZXN0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5yb3VuZCggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtYXRoVXRpbDtcbiIsImltcG9ydCBUZXh0dXJlIGZyb20gJy4vVGV4dHVyZSc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4vY29yZS9nbGVudW0nO1xuaW1wb3J0IG1hdGhVdGlsIGZyb20gJy4vbWF0aC91dGlsJztcbnZhciBpc1Bvd2VyT2ZUd28gPSBtYXRoVXRpbC5pc1Bvd2VyT2ZUd287XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuVGV4dHVyZTJEXG4gKiBAZXh0ZW5kcyBjbGF5LlRleHR1cmVcbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIC4uLlxuICogICAgIHZhciBtYXQgPSBuZXcgY2xheS5NYXRlcmlhbCh7XG4gKiAgICAgICAgIHNoYWRlcjogY2xheS5zaGFkZXIubGlicmFyeS5nZXQoJ2NsYXkucGhvbmcnLCAnZGlmZnVzZU1hcCcpXG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIGRpZmZ1c2VNYXAgPSBuZXcgY2xheS5UZXh0dXJlMkQoKTtcbiAqICAgICBkaWZmdXNlTWFwLmxvYWQoJ2Fzc2V0cy90ZXh0dXJlcy9kaWZmdXNlLmpwZycpO1xuICogICAgIG1hdC5zZXQoJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlTWFwKTtcbiAqICAgICAuLi5cbiAqICAgICBkaWZmdXNlTWFwLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICogICAgICAgICAvLyBXYWl0IGZvciB0aGUgZGlmZnVzZSB0ZXh0dXJlIGxvYWRlZFxuICogICAgICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24gKGZyYW1lVGltZSkge1xuICogICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICogICAgICAgICB9KTtcbiAqICAgICB9KTtcbiAqL1xudmFyIFRleHR1cmUyRCA9IFRleHR1cmUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LlRleHR1cmUyRCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUgez9IVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtbmV0fVxuICAgICAgICAgKi9cbiAgICAgICAgaW1hZ2U6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQaXhlbHMgZGF0YS4gV2lsbCBiZSBpZ25vcmVkIGlmIGltYWdlIGlzIHNldC5cbiAgICAgICAgICogQHR5cGUgez9VaW50OEFycmF5fEZsb2F0MzJBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHBpeGVsczogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn1cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogICAgIFt7XG4gICAgICAgICAqICAgICAgICAgaW1hZ2U6IG1pcG1hcDAsXG4gICAgICAgICAqICAgICAgICAgcGl4ZWxzOiBudWxsXG4gICAgICAgICAqICAgICB9LCB7XG4gICAgICAgICAqICAgICAgICAgaW1hZ2U6IG1pcG1hcDEsXG4gICAgICAgICAqICAgICAgICAgcGl4ZWxzOiBudWxsXG4gICAgICAgICAqICAgICB9LCAuLi4uXVxuICAgICAgICAgKi9cbiAgICAgICAgbWlwbWFwczogW11cbiAgICB9O1xufSwge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBfZ2wuYmluZFRleHR1cmUoX2dsLlRFWFRVUkVfMkQsIHRoaXMuX2NhY2hlLmdldCgnd2ViZ2xfdGV4dHVyZScpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbW1vbihyZW5kZXJlcik7XG5cbiAgICAgICAgdmFyIGdsRm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgICAgIHZhciBnbFR5cGUgPSB0aGlzLnR5cGU7XG5cbiAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoX2dsLlRFWFRVUkVfMkQsIF9nbC5URVhUVVJFX1dSQVBfUywgdGhpcy5nZXRBdmFpbGFibGVXcmFwUygpKTtcbiAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoX2dsLlRFWFRVUkVfMkQsIF9nbC5URVhUVVJFX1dSQVBfVCwgdGhpcy5nZXRBdmFpbGFibGVXcmFwVCgpKTtcblxuICAgICAgICBfZ2wudGV4UGFyYW1ldGVyaShfZ2wuVEVYVFVSRV8yRCwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdGhpcy5nZXRBdmFpbGFibGVNYWdGaWx0ZXIoKSk7XG4gICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKF9nbC5URVhUVVJFXzJELCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB0aGlzLmdldEF2YWlsYWJsZU1pbkZpbHRlcigpKTtcblxuICAgICAgICB2YXIgYW5pc290cm9waWNFeHQgPSByZW5kZXJlci5nZXRHTEV4dGVuc2lvbignRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyk7XG4gICAgICAgIGlmIChhbmlzb3Ryb3BpY0V4dCAmJiB0aGlzLmFuaXNvdHJvcGljID4gMSkge1xuICAgICAgICAgICAgX2dsLnRleFBhcmFtZXRlcmYoX2dsLlRFWFRVUkVfMkQsIGFuaXNvdHJvcGljRXh0LlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCB0aGlzLmFuaXNvdHJvcGljKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGZsb2F0IHR5cGUgaWYgYnJvd3NlciBkb24ndCBoYXZlIGhhbGYgZmxvYXQgZXh0ZW5zaW9uXG4gICAgICAgIGlmIChnbFR5cGUgPT09IDM2MTkzKSB7XG4gICAgICAgICAgICB2YXIgaGFsZkZsb2F0RXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnKTtcbiAgICAgICAgICAgIGlmICghaGFsZkZsb2F0RXh0KSB7XG4gICAgICAgICAgICAgICAgZ2xUeXBlID0gZ2xlbnVtLkZMT0FUO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWlwbWFwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWlwbWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBtaXBtYXAgPSB0aGlzLm1pcG1hcHNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZURhdGEoX2dsLCBtaXBtYXAsIGksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUpO1xuICAgICAgICAgICAgICAgIHdpZHRoIC89IDI7XG4gICAgICAgICAgICAgICAgaGVpZ2h0IC89IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUZXh0dXJlRGF0YShfZ2wsIHRoaXMsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudXNlTWlwbWFwICYmICF0aGlzLk5QT1QpIHtcbiAgICAgICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFXzJELCBudWxsKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVRleHR1cmVEYXRhOiBmdW5jdGlvbiAoX2dsLCBkYXRhLCBsZXZlbCwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSkge1xuICAgICAgICBpZiAoZGF0YS5pbWFnZSkge1xuICAgICAgICAgICAgX2dsLnRleEltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgZGF0YS5pbWFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDYW4gYmUgdXNlZCBhcyBhIGJsYW5rIHRleHR1cmUgd2hlbiB3cml0aW5nIHJlbmRlciB0byB0ZXh0dXJlKFJUVClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBnbEZvcm1hdCA8PSBUZXh0dXJlLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUXG4gICAgICAgICAgICAgICAgJiYgZ2xGb3JtYXQgPj0gVGV4dHVyZS5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfZ2wuY29tcHJlc3NlZFRleEltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCBnbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZGF0YS5waXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSXMgYSByZW5kZXIgdGFyZ2V0IGlmIHBpeGVscyBpcyBudWxsXG4gICAgICAgICAgICAgICAgX2dsLnRleEltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCBnbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgZGF0YS5waXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQG1lbWJlck9mIGNsYXkuVGV4dHVyZTJELnByb3RvdHlwZVxuICAgICAqL1xuICAgIGdlbmVyYXRlTWlwbWFwOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBpZiAodGhpcy51c2VNaXBtYXAgJiYgIXRoaXMuTlBPVCkge1xuICAgICAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFXzJELCB0aGlzLl9jYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKSk7XG4gICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfMkQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGlzUG93ZXJPZlR3bzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuaW1hZ2Uud2lkdGg7XG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmltYWdlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1Bvd2VyT2ZUd28od2lkdGgpICYmIGlzUG93ZXJPZlR3byhoZWlnaHQpO1xuICAgIH0sXG5cbiAgICBpc1JlbmRlcmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmltYWdlLm5vZGVOYW1lID09PSAnQ0FOVkFTJ1xuICAgICAgICAgICAgICAgIHx8IHRoaXMuaW1hZ2Uubm9kZU5hbWUgPT09ICdWSURFTydcbiAgICAgICAgICAgICAgICB8fCB0aGlzLmltYWdlLmNvbXBsZXRlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICEhKHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFXzJELCB0aGlzLmdldFdlYkdMVGV4dHVyZShyZW5kZXJlcikpO1xuICAgIH0sXG5cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFXzJELCBudWxsKTtcbiAgICB9LFxuXG4gICAgbG9hZDogZnVuY3Rpb24gKHNyYywgY3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGlmIChjcm9zc09yaWdpbikge1xuICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuZGlydHkoKTtcbiAgICAgICAgICAgIHNlbGYudHJpZ2dlcignc3VjY2VzcycsIHNlbGYpO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYudHJpZ2dlcignZXJyb3InLCBzZWxmKTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dHVyZTJELnByb3RvdHlwZSwgJ3dpZHRoJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2Uud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGV4dHVyZSBmcm9tIGltYWdlIGNhblxcJ3Qgc2V0IHdpZHRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHR1cmUyRC5wcm90b3R5cGUsICdoZWlnaHQnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RleHR1cmUgZnJvbSBpbWFnZSBjYW5cXCd0IHNldCBoZWlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZTJEO1xuIiwiaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuXG52YXIgX2xpYnJhcnkgPSB7fTtcblxuZnVuY3Rpb24gU2hhZGVyTGlicmFyeSAoKSB7XG4gICAgdGhpcy5fcG9vbCA9IHt9O1xufVxuXG5TaGFkZXJMaWJyYXJ5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGtleSA9IG5hbWU7XG5cbiAgICBpZiAodGhpcy5fcG9vbFtrZXldKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb29sW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgc291cmNlID0gX2xpYnJhcnlbbmFtZV07XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTaGFkZXIgXCInICsgbmFtZSArICdcIicgKyAnIGlzIG5vdCBpbiB0aGUgbGlicmFyeScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzaGFkZXIgPSBuZXcgU2hhZGVyKHNvdXJjZS52ZXJ0ZXgsIHNvdXJjZS5mcmFnbWVudCk7XG4gICAgICAgIHRoaXMuX3Bvb2xba2V5XSA9IHNoYWRlcjtcbiAgICAgICAgcmV0dXJuIHNoYWRlcjtcbiAgICB9XG59O1xuXG5TaGFkZXJMaWJyYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3Bvb2wgPSB7fTtcbn07XG5cbmZ1bmN0aW9uIHRlbXBsYXRlKG5hbWUsIHZlcnRleCwgZnJhZ21lbnQpIHtcbiAgICBfbGlicmFyeVtuYW1lXSA9IHtcbiAgICAgICAgdmVydGV4OiB2ZXJ0ZXgsXG4gICAgICAgIGZyYWdtZW50OiBmcmFnbWVudFxuICAgIH07XG59XG5cbnZhciBkZWZhdWx0TGlicmFyeSA9IG5ldyBTaGFkZXJMaWJyYXJ5KCk7XG5cbi8qKlxuICogIyMjIEJ1aWxpbiBzaGFkZXJzXG4gKiArIGNsYXkuc3RhbmRhcmRcbiAqICsgY2xheS5iYXNpY1xuICogKyBjbGF5LmxhbWJlcnRcbiAqICsgY2xheS53aXJlZnJhbWVcbiAqXG4gKiBAbmFtZXNwYWNlIGNsYXkuc2hhZGVyLmxpYnJhcnlcbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBzaGFkZXIgbGlicmFyeS5cbiAgICAgKi9cbiAgICBjcmVhdGVMaWJyYXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2hhZGVyTGlicmFyeSgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHNoYWRlciBmcm9tIGRlZmF1bHQgbGlicmFyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm4ge2NsYXkuU2hhZGVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnNoYWRlci5saWJyYXJ5XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICAgY2xheS5zaGFkZXIubGlicmFyeS5nZXQoJ2NsYXkuc3RhbmRhcmQnKVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdExpYnJhcnkuZ2V0LmFwcGx5KGRlZmF1bHRMaWJyYXJ5LCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQG1lbWJlck9mIGNsYXkuc2hhZGVyLmxpYnJhcnlcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHZlcnRleCAtIFZlcnRleCBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gZnJhZ21lbnQgLSBGcmFnbWVudCBzaGFkZXIgY29kZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdExpYnJhcnkuY2xlYXIoKTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5cbi8vIENhY2hlXG52YXIgcHJldkRyYXdJRCA9IDA7XG52YXIgcHJldkRyYXdJbmRpY2VzQnVmZmVyID0gbnVsbDtcbnZhciBwcmV2RHJhd0lzVXNlSW5kaWNlcyA9IHRydWU7XG5cbnZhciBjdXJyZW50RHJhd0lEO1xuXG52YXIgUmVuZGVySW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudHJpYW5nbGVDb3VudCA9IDA7XG4gICAgdGhpcy52ZXJ0ZXhDb3VudCA9IDA7XG4gICAgdGhpcy5kcmF3Q2FsbENvdW50ID0gMDtcbn07XG5cbmZ1bmN0aW9uIFZlcnRleEFycmF5T2JqZWN0KFxuICAgIGF2YWlsYWJsZUF0dHJpYnV0ZXMsXG4gICAgYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scyxcbiAgICBpbmRpY2VzQnVmZmVyXG4pIHtcbiAgICB0aGlzLmF2YWlsYWJsZUF0dHJpYnV0ZXMgPSBhdmFpbGFibGVBdHRyaWJ1dGVzO1xuICAgIHRoaXMuYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scyA9IGF2YWlsYWJsZUF0dHJpYnV0ZVN5bWJvbHM7XG4gICAgdGhpcy5pbmRpY2VzQnVmZmVyID0gaW5kaWNlc0J1ZmZlcjtcblxuICAgIHRoaXMudmFvID0gbnVsbDtcbn1cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5SZW5kZXJhYmxlXG4gKiBAZXh0ZW5kcyBjbGF5Lk5vZGVcbiAqL1xudmFyIFJlbmRlcmFibGUgPSBOb2RlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5SZW5kZXJhYmxlIyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5Lk1hdGVyaWFsfVxuICAgICAqL1xuICAgIG1hdGVyaWFsOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkuR2VvbWV0cnl9XG4gICAgICovXG4gICAgZ2VvbWV0cnk6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGU6IGdsZW51bS5UUklBTkdMRVMsXG5cbiAgICBfZHJhd0NhY2hlOiBudWxsLFxuXG4gICAgX3JlbmRlckluZm86IG51bGxcbn0sIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2RyYXdDYWNoZSA9IHt9O1xuICAgIHRoaXMuX3JlbmRlckluZm8gPSBuZXcgUmVuZGVySW5mbygpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5SZW5kZXJhYmxlLnByb3RvdHlwZSAqL1xue1xuXG4gICAgX19wcm9ncmFtOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogR3JvdXAgb2YgcmVjZWl2ZWQgbGlnaHQuXG4gICAgICovXG4gICAgbGlnaHRHcm91cDogMCxcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgb3JkZXIsIE5vZGVzIHdpdGggc21hbGxlciB2YWx1ZSByZW5kZXJzIGJlZm9yZSBub2RlcyB3aXRoIGxhcmdlciB2YWx1ZXMuXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKi9cbiAgICByZW5kZXJPcmRlcjogMCxcbiAgICAvKipcbiAgICAgKiBVc2VkIHdoZW4gbW9kZSBpcyBMSU5FUywgTElORV9TVFJJUCBvciBMSU5FX0xPT1BcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxpbmVXaWR0aDogMSxcblxuICAgIC8qKlxuICAgICAqIElmIGVuYWJsZSBjdWxsaW5nXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgY3VsbGluZzogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIHNpZGUgb2YgcG9seWdvbiB3aWxsIGJlIGN1bGxlZC5cbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuUmVuZGVyYWJsZS5CQUNLfVxuICAgICAqICArIHtAbGluayBjbGF5LlJlbmRlcmFibGUuRlJPTlR9XG4gICAgICogICsge0BsaW5rIGNsYXkuUmVuZGVyYWJsZS5GUk9OVF9BTkRfQkFDS31cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvY3VsbEZhY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGN1bGxGYWNlOiBnbGVudW0uQkFDSyxcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIHNpZGUgaXMgZnJvbnQgZmFjZS5cbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuUmVuZGVyYWJsZS5DV31cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5SZW5kZXJhYmxlLkNDV31cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvZnJvbnRGYWNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBmcm9udEZhY2U6IGdsZW51bS5DQ1csXG5cbiAgICAvKipcbiAgICAgKiBJZiBlbmFibGUgc29mdHdhcmUgZnJ1c3R1bSBjdWxsaW5nXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnJ1c3R1bUN1bGxpbmc6IHRydWUsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVjZWl2ZVNoYWRvdzogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjYXN0U2hhZG93OiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGlnbm9yZVBpY2tpbmc6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGlnbm9yZVByZVo6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaWdub3JlR0J1ZmZlcjogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzUmVuZGVyYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFRPRE8gU2hhZGVyID9cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5tYXRlcmlhbCAmJiB0aGlzLm1hdGVyaWFsLnNoYWRlciAmJiAhdGhpcy5pbnZpc2libGVcbiAgICAgICAgICAgICYmIHRoaXMuZ2VvbWV0cnkudmVydGV4Q291bnQgPiAwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBCZWZvcmUgcmVuZGVyIGhvb2tcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICovXG4gICAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiAoX2dsKSB7fSxcblxuICAgIC8qKlxuICAgICAqIEJlZm9yZSByZW5kZXIgaG9va1xuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKF9nbCwgcmVuZGVyU3RhdCkge30sXG5cbiAgICBnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKGZpbHRlciwgb3V0KSB7XG4gICAgICAgIG91dCA9IE5vZGUucHJvdG90eXBlLmdldEJvdW5kaW5nQm94LmNhbGwodGhpcywgZmlsdGVyLCBvdXQpO1xuICAgICAgICBpZiAodGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmJvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICBvdXQudW5pb24odGhpcy5nZW9tZXRyeS5ib3VuZGluZ0JveCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSAge2NsYXkuTWF0ZXJpYWx9IFttYXRlcmlhbF1cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIG1hdGVyaWFsLCBwcm9ncmFtKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgbWF0ZXJpYWwgPSBtYXRlcmlhbCB8fCB0aGlzLm1hdGVyaWFsO1xuICAgICAgICAvLyBNYXkgdXNlIHNoYWRlciBvZiBvdGhlciBtYXRlcmlhbCBpZiBzaGFkZXIgY29kZSBhcmUgc2FtZVxuICAgICAgICB2YXIgc2hhZGVyID0gbWF0ZXJpYWwuc2hhZGVyO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG4gICAgICAgIHZhciBnbERyYXdNb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgICAgIHZhciBuVmVydGV4ID0gZ2VvbWV0cnkudmVydGV4Q291bnQ7XG4gICAgICAgIHZhciBpc1VzZUluZGljZXMgPSBnZW9tZXRyeS5pc1VzZUluZGljZXMoKTtcblxuICAgICAgICB2YXIgdWludEV4dCA9IHJlbmRlcmVyLmdldEdMRXh0ZW5zaW9uKCdPRVNfZWxlbWVudF9pbmRleF91aW50Jyk7XG4gICAgICAgIHZhciB1c2VVaW50RXh0ID0gdWludEV4dCAmJiBuVmVydGV4ID4gMHhmZmZmO1xuICAgICAgICB2YXIgaW5kaWNlc1R5cGUgPSB1c2VVaW50RXh0ID8gX2dsLlVOU0lHTkVEX0lOVCA6IF9nbC5VTlNJR05FRF9TSE9SVDtcblxuICAgICAgICB2YXIgdmFvRXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIC8vIHZhciB2YW9FeHQgPSBudWxsO1xuXG4gICAgICAgIHZhciBpc1N0YXRpYyA9ICFnZW9tZXRyeS5keW5hbWljO1xuXG4gICAgICAgIHZhciByZW5kZXJJbmZvID0gdGhpcy5fcmVuZGVySW5mbztcbiAgICAgICAgcmVuZGVySW5mby52ZXJ0ZXhDb3VudCA9IG5WZXJ0ZXg7XG4gICAgICAgIHJlbmRlckluZm8udHJpYW5nbGVDb3VudCA9IDA7XG4gICAgICAgIHJlbmRlckluZm8uZHJhd0NhbGxDb3VudCA9IDA7XG4gICAgICAgIC8vIERyYXcgZWFjaCBjaHVua1xuICAgICAgICB2YXIgZHJhd0hhc2hDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIC8vIEhhc2ggd2l0aCBzaGFkZXIgaWQgaW4gY2FzZSBwcmV2aW91cyBtYXRlcmlhbCBoYXMgbGVzcyBhdHRyaWJ1dGVzIHRoYW4gbmV4dCBtYXRlcmlhbFxuICAgICAgICBjdXJyZW50RHJhd0lEID0gcmVuZGVyZXIuX191aWRfXyArICctJyArIGdlb21ldHJ5Ll9fdWlkX18gKyAnLScgKyBwcm9ncmFtLl9fdWlkX187XG5cbiAgICAgICAgaWYgKGN1cnJlbnREcmF3SUQgIT09IHByZXZEcmF3SUQpIHtcbiAgICAgICAgICAgIGRyYXdIYXNoQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGUgd2lsbCBiZSBpbnZhbGlkIGluIHRoZSBmb2xsb3dpbmcgY2FzZXNcbiAgICAgICAgICAgIC8vIDEuIFZBTyBpcyBlbmFibGVkIGFuZCBpcyBiaW5kZWQgdG8gbnVsbCBhZnRlciByZW5kZXJcbiAgICAgICAgICAgIC8vIDIuIEdlb21ldHJ5IG5lZWRzIHVwZGF0ZVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIC8vIFRPRE8gT3B0aW1pemVcbiAgICAgICAgICAgICAgICAodmFvRXh0ICYmIGlzU3RhdGljKVxuICAgICAgICAgICAgICAgIC8vIFBFTkRJTkdcbiAgICAgICAgICAgICAgICB8fCBnZW9tZXRyeS5fY2FjaGUuaXNEaXJ0eSgnYW55JylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRyYXdIYXNoQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldkRyYXdJRCA9IGN1cnJlbnREcmF3SUQ7XG5cbiAgICAgICAgaWYgKCFkcmF3SGFzaENoYW5nZWQpIHtcbiAgICAgICAgICAgIC8vIERpcmVjdCBkcmF3XG4gICAgICAgICAgICBpZiAocHJldkRyYXdJc1VzZUluZGljZXMpIHtcbiAgICAgICAgICAgICAgICBfZ2wuZHJhd0VsZW1lbnRzKGdsRHJhd01vZGUsIHByZXZEcmF3SW5kaWNlc0J1ZmZlci5jb3VudCwgaW5kaWNlc1R5cGUsIDApO1xuICAgICAgICAgICAgICAgIHJlbmRlckluZm8udHJpYW5nbGVDb3VudCA9IHByZXZEcmF3SW5kaWNlc0J1ZmZlci5jb3VudCAvIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBVc2UgdmVydGV4IG51bWJlciBpbiBidWZmZXJcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0ZXhDb3VudCBtYXkgZ2V0IHRoZSB3cm9uZyB2YWx1ZSB3aGVuIGdlb21ldHJ5IGZvcmdldCB0byBtYXJrIGRpcnR5IGFmdGVyIHVwZGF0ZVxuICAgICAgICAgICAgICAgIF9nbC5kcmF3QXJyYXlzKGdsRHJhd01vZGUsIDAsIG5WZXJ0ZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVySW5mby5kcmF3Q2FsbENvdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgY2FjaGUgb2Ygc3RhdGljIGdlb21ldHJ5XG4gICAgICAgICAgICB2YXIgdmFvTGlzdCA9IHRoaXMuX2RyYXdDYWNoZVtjdXJyZW50RHJhd0lEXTtcbiAgICAgICAgICAgIGlmICghdmFvTGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBjaHVua3MgPSBnZW9tZXRyeS5nZXRCdWZmZXJDaHVua3MocmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIGlmICghY2h1bmtzKSB7ICAvLyBFbXB0eSBtZXNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFvTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2h1bmtzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IGNodW5rc1tjXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUJ1ZmZlcnMgPSBjaHVuay5hdHRyaWJ1dGVCdWZmZXJzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlc0J1ZmZlciA9IGNodW5rLmluZGljZXNCdWZmZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGF2YWlsYWJsZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF2YWlsYWJsZUF0dHJpYnV0ZVN5bWJvbHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdHRyaWJ1dGVCdWZmZXJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVySW5mbyA9IGF0dHJpYnV0ZUJ1ZmZlcnNbYV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZUJ1ZmZlckluZm8ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpYyA9IGF0dHJpYnV0ZUJ1ZmZlckluZm8uc2VtYW50aWM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbWFudGljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFudGljSW5mbyA9IHNoYWRlci5hdHRyaWJ1dGVTZW1hbnRpY3Nbc2VtYW50aWNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHNlbWFudGljSW5mbyAmJiBzZW1hbnRpY0luZm8uc3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgJiYgcHJvZ3JhbS5hdHRyaWJ1dGVzW3N5bWJvbF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlQnVmZmVySW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFvID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUF0dHJpYnV0ZVN5bWJvbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzQnVmZmVyXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHZhb0xpc3QucHVzaCh2YW8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0NhY2hlW2N1cnJlbnREcmF3SURdID0gdmFvTGlzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFvTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2YW8gPSB2YW9MaXN0W2ldO1xuICAgICAgICAgICAgICAgIHZhciBuZWVkc0JpbmRBdHRyaWJ1dGVzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB2ZXJ0ZXggb2JqZWN0IGFycmF5IGNvc3QgYSBsb3RcbiAgICAgICAgICAgICAgICAvLyBTbyB3ZSBkb24ndCB1c2UgaXQgb24gdGhlIGR5bmFtaWMgb2JqZWN0XG4gICAgICAgICAgICAgICAgaWYgKHZhb0V4dCAmJiBpc1N0YXRpYykge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdmVydGV4IGFycmF5IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vYmxvZy50b2ppY29kZS5jb20vMjAxMi8xMC9vZXN2ZXJ0ZXhhcnJheW9iamVjdC1leHRlbnNpb24uaHRtbFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFvLnZhbyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YW8udmFvID0gdmFvRXh0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkc0JpbmRBdHRyaWJ1dGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFvRXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8udmFvKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgYXZhaWxhYmxlQXR0cmlidXRlcyA9IHZhby5hdmFpbGFibGVBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIHZhciBpbmRpY2VzQnVmZmVyID0gdmFvLmluZGljZXNCdWZmZXI7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNCaW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25MaXN0ID0gcHJvZ3JhbS5lbmFibGVBdHRyaWJ1dGVzKHJlbmRlcmVyLCB2YW8uYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scywgKHZhb0V4dCAmJiBpc1N0YXRpYyAmJiB2YW8udmFvKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYXR0cmlidXRlcztcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdmFpbGFibGVBdHRyaWJ1dGVzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBsb2NhdGlvbkxpc3RbYV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVySW5mbyA9IGF2YWlsYWJsZUF0dHJpYnV0ZXNbYV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gYXR0cmlidXRlQnVmZmVySW5mby5idWZmZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IGF0dHJpYnV0ZUJ1ZmZlckluZm8uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnbFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZUJ1ZmZlckluZm8udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLkZMT0FUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdieXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLkJZVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VieXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLlVOU0lHTkVEX0JZVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLlNIT1JUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1c2hvcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbFR5cGUgPSBfZ2wuVU5TSUdORURfU0hPUlQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsVHlwZSA9IF9nbC5GTE9BVDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgc2l6ZSwgZ2xUeXBlLCBmYWxzZSwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBnbERyYXdNb2RlID09IGdsZW51bS5MSU5FUyB8fFxuICAgICAgICAgICAgICAgICAgICBnbERyYXdNb2RlID09IGdsZW51bS5MSU5FX1NUUklQIHx8XG4gICAgICAgICAgICAgICAgICAgIGdsRHJhd01vZGUgPT0gZ2xlbnVtLkxJTkVfTE9PUFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBfZ2wubGluZVdpZHRoKHRoaXMubGluZVdpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2RHJhd0luZGljZXNCdWZmZXIgPSBpbmRpY2VzQnVmZmVyO1xuICAgICAgICAgICAgICAgIHByZXZEcmF3SXNVc2VJbmRpY2VzID0gZ2VvbWV0cnkuaXNVc2VJbmRpY2VzKCk7XG4gICAgICAgICAgICAgICAgLy8gRG8gZHJhd2luZ1xuICAgICAgICAgICAgICAgIGlmIChwcmV2RHJhd0lzVXNlSW5kaWNlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNCaW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2dsLmJpbmRCdWZmZXIoX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzQnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2dsLmRyYXdFbGVtZW50cyhnbERyYXdNb2RlLCBpbmRpY2VzQnVmZmVyLmNvdW50LCBpbmRpY2VzVHlwZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckluZm8udHJpYW5nbGVDb3VudCArPSBpbmRpY2VzQnVmZmVyLmNvdW50IC8gMztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfZ2wuZHJhd0FycmF5cyhnbERyYXdNb2RlLCAwLCBuVmVydGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFvRXh0ICYmIGlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhb0V4dC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVuZGVySW5mby5kcmF3Q2FsbENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVySW5mbztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgYSBuZXcgcmVuZGVyYWJsZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge2NsYXkuUmVuZGVyYWJsZX1cbiAgICAgKi9cbiAgICBjbG9uZTogKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICdjYXN0U2hhZG93JywgJ3JlY2VpdmVTaGFkb3cnLFxuICAgICAgICAgICAgJ21vZGUnLCAnY3VsbGluZycsICdjdWxsRmFjZScsICdmcm9udEZhY2UnLFxuICAgICAgICAgICAgJ2ZydXN0dW1DdWxsaW5nJyxcbiAgICAgICAgICAgICdyZW5kZXJPcmRlcicsICdsaW5lV2lkdGgnLFxuICAgICAgICAgICAgJ2lnbm9yZVBpY2tpbmcnLCAnaWdub3JlUHJlWicsICdpZ25vcmVHQnVmZmVyJ1xuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyYWJsZSA9IE5vZGUucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgIHJlbmRlcmFibGUuZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuICAgICAgICAgICAgcmVuZGVyYWJsZS5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBUcnkgbm90IHRvIG92ZXJ3cml0ZSB0aGUgcHJvdG90eXBlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmFibGVbbmFtZV0gIT09IHRoaXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyYWJsZVtuYW1lXSA9IHRoaXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyYWJsZTtcbiAgICAgICAgfTtcbiAgICB9KSgpXG59KTtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJhYmxlLlBPSU5UUyA9IGdsZW51bS5QT0lOVFM7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmFibGUuTElORVMgPSBnbGVudW0uTElORVM7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmFibGUuTElORV9MT09QID0gZ2xlbnVtLkxJTkVfTE9PUDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5MSU5FX1NUUklQID0gZ2xlbnVtLkxJTkVfU1RSSVA7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmFibGUuVFJJQU5HTEVTID0gZ2xlbnVtLlRSSUFOR0xFUztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5UUklBTkdMRV9TVFJJUCA9IGdsZW51bS5UUklBTkdMRV9TVFJJUDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5UUklBTkdMRV9GQU4gPSBnbGVudW0uVFJJQU5HTEVfRkFOO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJhYmxlLkJBQ0sgPSBnbGVudW0uQkFDSztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5GUk9OVCA9IGdsZW51bS5GUk9OVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5GUk9OVF9BTkRfQkFDSyA9IGdsZW51bS5GUk9OVF9BTkRfQkFDSztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5DVyA9IGdsZW51bS5DVztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5DQ1cgPSBnbGVudW0uQ0NXO1xuXG5SZW5kZXJhYmxlLlJlbmRlckluZm8gPSBSZW5kZXJJbmZvO1xuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJhYmxlO1xuIiwiaW1wb3J0IFJlbmRlcmFibGUgZnJvbSAnLi9SZW5kZXJhYmxlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4vVGV4dHVyZTJEJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5NZXNoXG4gKiBAZXh0ZW5kcyBjbGF5LlJlbmRlcmFibGVcbiAqL1xudmFyIE1lc2ggPSBSZW5kZXJhYmxlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5NZXNoIyAqL1xue1xuICAgIC8qKlxuICAgICAqIFVzZWQgd2hlbiBpdCBpcyBhIHNraW5uZWQgbWVzaFxuICAgICAqIEB0eXBlIHtjbGF5LlNrZWxldG9ufVxuICAgICAqL1xuICAgIHNrZWxldG9uOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEpvaW50cyBpbmRpY2VzIE1lc2hlcyBjYW4gc2hhcmUgdGhlIG9uZSBza2VsZXRvbiBpbnN0YW5jZSBhbmQgZWFjaCBtZXNoIGNhbiB1c2Ugb25lIHBhcnQgb2Ygam9pbnRzLiBKb2ludHMgaW5kaWNlcyBpbmRpY2F0ZSB0aGUgaW5kZXggb2Ygam9pbnQgaW4gdGhlIHNrZWxldG9uIGluc3RhbmNlXG4gICAgICogQHR5cGUge251bWJlcltdfVxuICAgICAqL1xuICAgIGpvaW50czogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIElmIHN0b3JlIHRoZSBza2luIG1hdHJpY2VzIGluIHZlcnRleCB0ZXh0dXJlXG4gICAgICogQHR5cGUge2Jvb2x9XG4gICAgICovXG4gICAgdXNlU2tpbk1hdHJpY2VzVGV4dHVyZTogZmFsc2VcblxufSwgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5qb2ludHMpIHtcbiAgICAgICAgdGhpcy5qb2ludHMgPSBbXTtcbiAgICB9XG59LCB7XG5cbiAgICBpc1NraW5uZWRNZXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLnNrZWxldG9uICYmIHRoaXMuam9pbnRzICYmIHRoaXMuam9pbnRzLmxlbmd0aCA+IDApO1xuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2hhZGVyLCBwcm9ncmFtKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgLy8gU2V0IHBvc2UgbWF0cmljZXMgb2Ygc2tpbm5lZCBtZXNoXG4gICAgICAgIGlmICh0aGlzLnNrZWxldG9uKSB7XG4gICAgICAgICAgICAvLyBUT0RPIE11bHRpcGxlIG1lc2ggc2hhcmUgc2FtZSBza2VsZXRvblxuICAgICAgICAgICAgdGhpcy5za2VsZXRvbi51cGRhdGUoKTtcblxuICAgICAgICAgICAgdmFyIHNraW5NYXRyaWNlc0FycmF5ID0gdGhpcy5za2VsZXRvbi5nZXRTdWJTa2luTWF0cmljZXModGhpcy5fX3VpZF9fLCB0aGlzLmpvaW50cyk7XG5cbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnVzZVNraW5NYXRyaWNlc1RleHR1cmUpIHtcbiAgICAgICAgICAgIC8vICAgICB2YXIgc2l6ZTtcbiAgICAgICAgICAgIC8vICAgICB2YXIgbnVtSm9pbnRzID0gdGhpcy5qb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgLy8gICAgIGlmIChudW1Kb2ludHMgPiAyNTYpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgc2l6ZSA9IDY0O1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBlbHNlIGlmIChudW1Kb2ludHMgPiA2NCkge1xuICAgICAgICAgICAgLy8gICAgICAgICBzaXplID0gMzI7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGVsc2UgaWYgKG51bUpvaW50cyA+IDE2KSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHNpemUgPSAxNjtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHNpemUgPSA4O1xuICAgICAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAgICAgLy8gICAgIHZhciB0ZXh0dXJlID0gdGhpcy5nZXRTa2luTWF0cmljZXNUZXh0dXJlKCk7XG4gICAgICAgICAgICAvLyAgICAgdGV4dHVyZS53aWR0aCA9IHNpemU7XG4gICAgICAgICAgICAvLyAgICAgdGV4dHVyZS5oZWlnaHQgPSBzaXplO1xuXG4gICAgICAgICAgICAvLyAgICAgaWYgKCF0ZXh0dXJlLnBpeGVscyB8fCB0ZXh0dXJlLnBpeGVscy5sZW5ndGggIT09IHNpemUgKiBzaXplICogNCkge1xuICAgICAgICAgICAgLy8gICAgICAgICB0ZXh0dXJlLnBpeGVscyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIHNpemUgKiA0KTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgdGV4dHVyZS5waXhlbHMuc2V0KHNraW5NYXRyaWNlc0FycmF5KTtcbiAgICAgICAgICAgIC8vICAgICB0ZXh0dXJlLmRpcnR5KCk7XG5cbiAgICAgICAgICAgIC8vICAgICBzaGFkZXIuc2V0VW5pZm9ybShfZ2wsICcxZicsICdza2luTWF0cmljZXNUZXh0dXJlU2l6ZScsIHNpemUpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ1NLSU5fTUFUUklYJywgc2tpbk1hdHJpY2VzQXJyYXkpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlbmRlcmFibGUucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMsIHJlbmRlcmVyLCBzaGFkZXIsIHByb2dyYW0pO1xuICAgIH0sXG5cbiAgICBnZXRTa2luTWF0cmljZXNUZXh0dXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9za2luTWF0cmljZXNUZXh0dXJlIHx8IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgdHlwZTogZ2xlbnVtLkZMT0FULFxuICAgICAgICAgICAgbWluRmlsdGVyOiBnbGVudW0uTkVBUkVTVCxcbiAgICAgICAgICAgIG1hZ0ZpbHRlcjogZ2xlbnVtLk5FQVJFU1QsXG4gICAgICAgICAgICB1c2VNaXBtYXA6IGZhbHNlLFxuICAgICAgICAgICAgZmxpcFk6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9za2luTWF0cmljZXNUZXh0dXJlO1xuICAgIH1cbn0pO1xuXG4vLyBFbnVtc1xuTWVzaC5QT0lOVFMgPSBnbGVudW0uUE9JTlRTO1xuTWVzaC5MSU5FUyA9IGdsZW51bS5MSU5FUztcbk1lc2guTElORV9MT09QID0gZ2xlbnVtLkxJTkVfTE9PUDtcbk1lc2guTElORV9TVFJJUCA9IGdsZW51bS5MSU5FX1NUUklQO1xuTWVzaC5UUklBTkdMRVMgPSBnbGVudW0uVFJJQU5HTEVTO1xuTWVzaC5UUklBTkdMRV9TVFJJUCA9IGdsZW51bS5UUklBTkdMRV9TVFJJUDtcbk1lc2guVFJJQU5HTEVfRkFOID0gZ2xlbnVtLlRSSUFOR0xFX0ZBTjtcblxuTWVzaC5CQUNLID0gZ2xlbnVtLkJBQ0s7XG5NZXNoLkZST05UID0gZ2xlbnVtLkZST05UO1xuTWVzaC5GUk9OVF9BTkRfQkFDSyA9IGdsZW51bS5GUk9OVF9BTkRfQkFDSztcbk1lc2guQ1cgPSBnbGVudW0uQ1c7XG5NZXNoLkNDVyA9IGdsZW51bS5DQ1c7XG5cbmV4cG9ydCBkZWZhdWx0IE1lc2g7XG4iLCJpbXBvcnQgQ2FtZXJhIGZyb20gJy4uL0NhbWVyYSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY2FtZXJhLlBlcnNwZWN0aXZlXG4gKiBAZXh0ZW5kcyBjbGF5LkNhbWVyYVxuICovXG52YXIgUGVyc3BlY3RpdmUgPSBDYW1lcmEuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LmNhbWVyYS5QZXJzcGVjdGl2ZSMgKi9cbntcbiAgICAvKipcbiAgICAgKiBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGZvdjogNTAsXG4gICAgLyoqXG4gICAgICogQXNwZWN0IHJhdGlvLCB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGggLyBoZWlnaHRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGFzcGVjdDogMSxcbiAgICAvKipcbiAgICAgKiBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBuZWFyOiAwLjEsXG4gICAgLyoqXG4gICAgICogRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBmYXI6IDIwMDBcbn0sXG4vKiogQGxlbmRzIGNsYXkuY2FtZXJhLlBlcnNwZWN0aXZlLnByb3RvdHlwZSAqL1xue1xuXG4gICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByYWQgPSB0aGlzLmZvdiAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeC5wZXJzcGVjdGl2ZShyYWQsIHRoaXMuYXNwZWN0LCB0aGlzLm5lYXIsIHRoaXMuZmFyKTtcbiAgICB9LFxuICAgIGRlY29tcG9zZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzLnByb2plY3Rpb25NYXRyaXguYXJyYXk7XG4gICAgICAgIHZhciByYWQgPSBNYXRoLmF0YW4oMSAvIG1bNV0pICogMjtcbiAgICAgICAgdGhpcy5mb3YgPSByYWQgLyBNYXRoLlBJICogMTgwO1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG1bNV0gLyBtWzBdO1xuICAgICAgICB0aGlzLm5lYXIgPSBtWzE0XSAvIChtWzEwXSAtIDEpO1xuICAgICAgICB0aGlzLmZhciA9IG1bMTRdIC8gKG1bMTBdICsgMSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmNhbWVyYS5QZXJzcGVjdGl2ZX1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjYW1lcmEgPSBDYW1lcmEucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIGNhbWVyYS5mb3YgPSB0aGlzLmZvdjtcbiAgICAgICAgY2FtZXJhLmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuICAgICAgICBjYW1lcmEubmVhciA9IHRoaXMubmVhcjtcbiAgICAgICAgY2FtZXJhLmZhciA9IHRoaXMuZmFyO1xuXG4gICAgICAgIHJldHVybiBjYW1lcmE7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFBlcnNwZWN0aXZlO1xuIiwiaW1wb3J0IENhbWVyYSBmcm9tICcuLi9DYW1lcmEnO1xuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jYW1lcmEuT3J0aG9ncmFwaGljXG4gKiBAZXh0ZW5kcyBjbGF5LkNhbWVyYVxuICovXG52YXIgT3J0aG9ncmFwaGljID0gQ2FtZXJhLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5jYW1lcmEuT3J0aG9ncmFwaGljIyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgbGVmdDogLTEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICByaWdodDogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIG5lYXI6IC0xLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZmFyOiAxLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdG9wOiAxLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgYm90dG9tOiAtMVxufSxcbi8qKiBAbGVuZHMgY2xheS5jYW1lcmEuT3J0aG9ncmFwaGljLnByb3RvdHlwZSAqL1xue1xuXG4gICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeC5vcnRobyh0aGlzLmxlZnQsIHRoaXMucmlnaHQsIHRoaXMuYm90dG9tLCB0aGlzLnRvcCwgdGhpcy5uZWFyLCB0aGlzLmZhcik7XG4gICAgfSxcblxuICAgIGRlY29tcG9zZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzLnByb2plY3Rpb25NYXRyaXguYXJyYXk7XG4gICAgICAgIHRoaXMubGVmdCA9ICgtMSAtIG1bMTJdKSAvIG1bMF07XG4gICAgICAgIHRoaXMucmlnaHQgPSAoMSAtIG1bMTJdKSAvIG1bMF07XG4gICAgICAgIHRoaXMudG9wID0gKDEgLSBtWzEzXSkgLyBtWzVdO1xuICAgICAgICB0aGlzLmJvdHRvbSA9ICgtMSAtIG1bMTNdKSAvIG1bNV07XG4gICAgICAgIHRoaXMubmVhciA9IC0oLTEgLSBtWzE0XSkgLyBtWzEwXTtcbiAgICAgICAgdGhpcy5mYXIgPSAtKDEgLSBtWzE0XSkgLyBtWzEwXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkuY2FtZXJhLk9ydGhvZ3JhcGhpY31cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjYW1lcmEgPSBDYW1lcmEucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIGNhbWVyYS5sZWZ0ID0gdGhpcy5sZWZ0O1xuICAgICAgICBjYW1lcmEucmlnaHQgPSB0aGlzLnJpZ2h0O1xuICAgICAgICBjYW1lcmEubmVhciA9IHRoaXMubmVhcjtcbiAgICAgICAgY2FtZXJhLmZhciA9IHRoaXMuZmFyO1xuICAgICAgICBjYW1lcmEudG9wID0gdGhpcy50b3A7XG4gICAgICAgIGNhbWVyYS5ib3R0b20gPSB0aGlzLmJvdHRvbTtcblxuICAgICAgICByZXR1cm4gY2FtZXJhO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBPcnRob2dyYXBoaWM7XG4iLCJmdW5jdGlvbiBnZXQob3B0aW9ucykge1xuXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgeGhyLm9wZW4oJ2dldCcsIG9wdGlvbnMudXJsKTtcbiAgICAvLyBXaXRoIHJlc3BvbnNlIHR5cGUgc2V0IGJyb3dzZXIgY2FuIGdldCBhbmQgcHV0IGJpbmFyeSBkYXRhXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vWE1MSHR0cFJlcXVlc3QvU2VuZGluZ19hbmRfUmVjZWl2aW5nX0JpbmFyeV9EYXRhXG4gICAgLy8gRGVmYXVsdCBpcyB0ZXh0LCBhbmQgaXQgY2FuIGJlIHNldFxuICAgIC8vIGFycmF5YnVmZmVyLCBibG9iLCBkb2N1bWVudCwganNvbiwgdGV4dFxuICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBpZiAob3B0aW9ucy5vbnByb2dyZXNzKSB7XG4gICAgICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vWE1MSHR0cFJlcXVlc3QvVXNpbmdfWE1MSHR0cFJlcXVlc3RcbiAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAoZS5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWw7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbnByb2dyZXNzKHBlcmNlbnQsIGUubG9hZGVkLCBlLnRvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25wcm9ncmVzcyhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uZXJyb3IgJiYgb3B0aW9ucy5vbmVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm9ubG9hZCAmJiBvcHRpb25zLm9ubG9hZCh4aHIucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5vbmVycm9yKSB7XG4gICAgICAgIHhoci5vbmVycm9yID0gb3B0aW9ucy5vbmVycm9yO1xuICAgIH1cbiAgICB4aHIuc2VuZChudWxsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCA6IGdldFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LnN0YW5kYXJkLnZlcnRleFxcbiNkZWZpbmUgU0hBREVSX05BTUUgc3RhbmRhcmRcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSBtYXQ0IHdvcmxkSW52ZXJzZVRyYW5zcG9zZSA6IFdPUkxESU5WRVJTRVRSQU5TUE9TRTtcXG51bmlmb3JtIG1hdDQgd29ybGQgOiBXT1JMRDtcXG51bmlmb3JtIHZlYzIgdXZSZXBlYXQgOiBbMS4wLCAxLjBdO1xcbnVuaWZvcm0gdmVjMiB1dk9mZnNldCA6IFswLjAsIDAuMF07XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZCA6IFRFWENPT1JEXzA7XFxuI2lmIGRlZmluZWQoQU9NQVBfRU5BQkxFRClcXG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZDIgOiBURVhDT09SRF8xO1xcbiNlbmRpZlxcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbCA6IE5PUk1BTDtcXG5hdHRyaWJ1dGUgdmVjNCB0YW5nZW50IDogVEFOR0VOVDtcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuYXR0cmlidXRlIHZlYzQgYV9Db2xvciA6IENPTE9SO1xcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbmF0dHJpYnV0ZSB2ZWMzIGJhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG4jaWYgZGVmaW5lZChQQVJBTExBWE9DQ0xVU0lPTk1BUF9FTkFCTEVEKSB8fCBkZWZpbmVkKE5PUk1BTE1BUF9FTkFCTEVEKVxcbnZhcnlpbmcgdmVjMyB2X1RhbmdlbnQ7XFxudmFyeWluZyB2ZWMzIHZfQml0YW5nZW50O1xcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKEFPTUFQX0VOQUJMRUQpXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQyO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiAgICB2ZWMzIHNraW5uZWROb3JtYWwgPSBub3JtYWw7XFxuICAgIHZlYzMgc2tpbm5lZFRhbmdlbnQgPSB0YW5nZW50Lnh5ejtcXG4jaWZkZWYgU0tJTk5JTkdcXG4gICAgQGltcG9ydCBjbGF5LmNodW5rLnNraW5fbWF0cml4XFxuICAgIHNraW5uZWRQb3NpdGlvbiA9IChza2luTWF0cml4V1MgKiB2ZWM0KHBvc2l0aW9uLCAxLjApKS54eXo7XFxuICAgIHNraW5uZWROb3JtYWwgPSAoc2tpbk1hdHJpeFdTICogdmVjNChub3JtYWwsIDAuMCkpLnh5ejtcXG4gICAgc2tpbm5lZFRhbmdlbnQgPSAoc2tpbk1hdHJpeFdTICogdmVjNCh0YW5nZW50Lnh5eiwgMC4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkICogdXZSZXBlYXQgKyB1dk9mZnNldDtcXG4gICAgdl9Xb3JsZFBvc2l0aW9uID0gKHdvcmxkICogdmVjNChza2lubmVkUG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbiAgICB2X05vcm1hbCA9IG5vcm1hbGl6ZSgod29ybGRJbnZlcnNlVHJhbnNwb3NlICogdmVjNChza2lubmVkTm9ybWFsLCAwLjApKS54eXopO1xcbiNpZiBkZWZpbmVkKFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRUQpIHx8IGRlZmluZWQoTk9STUFMTUFQX0VOQUJMRUQpXFxuICAgIHZfVGFuZ2VudCA9IG5vcm1hbGl6ZSgod29ybGRJbnZlcnNlVHJhbnNwb3NlICogdmVjNChza2lubmVkVGFuZ2VudCwgMC4wKSkueHl6KTtcXG4gICAgdl9CaXRhbmdlbnQgPSBub3JtYWxpemUoY3Jvc3Modl9Ob3JtYWwsIHZfVGFuZ2VudCkgKiB0YW5nZW50LncpO1xcbiNlbmRpZlxcbiNpZmRlZiBWRVJURVhfQ09MT1JcXG4gICAgdl9Db2xvciA9IGFfQ29sb3I7XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoQU9NQVBfRU5BQkxFRClcXG4gICAgdl9UZXhjb29yZDIgPSB0ZXhjb29yZDI7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuc3RhbmRhcmQuZnJhZ21lbnRcXG4jZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzlcXG4jZGVmaW5lIEdMT1NTSU5FU1NfQ0hBTk5FTCAwXFxuI2RlZmluZSBST1VHSE5FU1NfQ0hBTk5FTCAwXFxuI2RlZmluZSBNRVRBTE5FU1NfQ0hBTk5FTCAxXFxudW5pZm9ybSBtYXQ0IHZpZXdJbnZlcnNlIDogVklFV0lOVkVSU0U7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudmFyeWluZyB2ZWMzIHZfTm9ybWFsO1xcbnZhcnlpbmcgdmVjMyB2X1dvcmxkUG9zaXRpb247XFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRUQpIHx8IGRlZmluZWQoTk9STUFMTUFQX0VOQUJMRUQpXFxudmFyeWluZyB2ZWMzIHZfVGFuZ2VudDtcXG52YXJ5aW5nIHZlYzMgdl9CaXRhbmdlbnQ7XFxuI2VuZGlmXFxuI2lmZGVmIE5PUk1BTE1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBESUZGVVNFTUFQX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBkaWZmdXNlTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBTUEVDVUxBUk1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NcXG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcyA6IDAuNTtcXG4gICAgI2lmZGVmIFJPVUdITkVTU01BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiAgICAjZW5kaWZcXG4jZWxzZVxcbnVuaWZvcm0gZmxvYXQgZ2xvc3NpbmVzczogMC41O1xcbiAgICAjaWZkZWYgR0xPU1NJTkVTU01BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgZ2xvc3NpbmVzc01hcDtcXG4gICAgI2VuZGlmXFxuI2VuZGlmXFxuI2lmZGVmIE1FVEFMTkVTU01BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBFTlZJUk9OTUVOVE1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZpcm9ubWVudE1hcDtcXG4gICAgI2lmZGVmIFBBUkFMTEFYX0NPUlJFQ1RFRFxcbnVuaWZvcm0gdmVjMyBlbnZpcm9ubWVudEJveE1pbjtcXG51bmlmb3JtIHZlYzMgZW52aXJvbm1lbnRCb3hNYXg7XFxuICAgICNlbmRpZlxcbiNlbmRpZlxcbiNpZmRlZiBCUkRGTE9PS1VQX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBicmRmTG9va3VwO1xcbiNlbmRpZlxcbiNpZmRlZiBFTUlTU0lWRU1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFNTQU9NQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHNzYW9NYXA7XFxudW5pZm9ybSB2ZWM0IHZpZXdwb3J0IDogVklFV1BPUlQ7XFxuI2VuZGlmXFxuI2lmZGVmIEFPTUFQX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG51bmlmb3JtIGZsb2F0IGFvSW50ZW5zaXR5O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkMjtcXG4jZW5kaWZcXG51bmlmb3JtIHZlYzMgY29sb3IgOiBbMS4wLCAxLjAsIDEuMF07XFxudW5pZm9ybSBmbG9hdCBhbHBoYSA6IDEuMDtcXG4jaWZkZWYgQUxQSEFfVEVTVFxcbnVuaWZvcm0gZmxvYXQgYWxwaGFDdXRvZmY6IDAuOTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX01FVEFMTkVTU1xcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzIDogMC4wO1xcbiNlbHNlXFxudW5pZm9ybSB2ZWMzIHNwZWN1bGFyQ29sb3IgOiBbMC4xLCAwLjEsIDAuMV07XFxuI2VuZGlmXFxudW5pZm9ybSB2ZWMzIGVtaXNzaW9uIDogWzAuMCwgMC4wLCAwLjBdO1xcbnVuaWZvcm0gZmxvYXQgZW1pc3Npb25JbnRlbnNpdHk6IDE7XFxudW5pZm9ybSBmbG9hdCBsaW5lV2lkdGggOiAwLjA7XFxudW5pZm9ybSB2ZWM0IGxpbmVDb2xvciA6IFswLjAsIDAuMCwgMC4wLCAwLjZdO1xcbnZhcnlpbmcgdmVjMyB2X0JhcnljZW50cmljO1xcbiNpZmRlZiBFTlZJUk9OTUVOVE1BUF9QUkVGSUxURVJcXG51bmlmb3JtIGZsb2F0IG1heE1pcG1hcExldmVsOiA1O1xcbiNlbmRpZlxcbiNpZmRlZiBBTUJJRU5UX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5hbWJpZW50X2xpZ2h0XFxuI2VuZGlmXFxuI2lmZGVmIEFNQklFTlRfU0hfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLmFtYmllbnRfc2hfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgQU1CSUVOVF9DVUJFTUFQX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5hbWJpZW50X2N1YmVtYXBfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgUE9JTlRfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLnBvaW50X2xpZ2h0XFxuI2VuZGlmXFxuI2lmZGVmIERJUkVDVElPTkFMX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5kaXJlY3Rpb25hbF9saWdodFxcbiNlbmRpZlxcbiNpZmRlZiBTUE9UX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5zcG90X2xpZ2h0XFxuI2VuZGlmXFxuQGltcG9ydCBjbGF5LnV0aWwuY2FsY3VsYXRlX2F0dGVudWF0aW9uXFxuQGltcG9ydCBjbGF5LnV0aWwuZWRnZV9mYWN0b3JcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuQGltcG9ydCBjbGF5LnV0aWwuc3JnYlxcbkBpbXBvcnQgY2xheS5wbHVnaW4uY29tcHV0ZV9zaGFkb3dfbWFwXFxuQGltcG9ydCBjbGF5LnV0aWwucGFyYWxsYXhfY29ycmVjdFxcbkBpbXBvcnQgY2xheS51dGlsLkFDRVNcXG5mbG9hdCBHX1NtaXRoKGZsb2F0IGcsIGZsb2F0IG5kdiwgZmxvYXQgbmRsKVxcbntcXG4gICAgZmxvYXQgcm91Z2huZXNzID0gMS4wIC0gZztcXG4gICAgZmxvYXQgayA9IHJvdWdobmVzcyAqIHJvdWdobmVzcyAvIDIuMDtcXG4gICAgZmxvYXQgRzFWID0gbmR2IC8gKG5kdiAqICgxLjAgLSBrKSArIGspO1xcbiAgICBmbG9hdCBHMUwgPSBuZGwgLyAobmRsICogKDEuMCAtIGspICsgayk7XFxuICAgIHJldHVybiBHMUwgKiBHMVY7XFxufVxcbnZlYzMgRl9TY2hsaWNrKGZsb2F0IG5kdiwgdmVjMyBzcGVjKSB7XFxuICAgIHJldHVybiBzcGVjICsgKDEuMCAtIHNwZWMpICogcG93KDEuMCAtIG5kdiwgNS4wKTtcXG59XFxuZmxvYXQgRF9QaG9uZyhmbG9hdCBnLCBmbG9hdCBuZGgpIHtcXG4gICAgZmxvYXQgYSA9IHBvdyg4MTkyLjAsIGcpO1xcbiAgICByZXR1cm4gKGEgKyAyLjApIC8gOC4wICogcG93KG5kaCwgYSk7XFxufVxcbmZsb2F0IERfR0dYKGZsb2F0IGcsIGZsb2F0IG5kaCkge1xcbiAgICBmbG9hdCByID0gMS4wIC0gZztcXG4gICAgZmxvYXQgYSA9IHIgKiByO1xcbiAgICBmbG9hdCB0bXAgPSBuZGggKiBuZGggKiAoYSAtIDEuMCkgKyAxLjA7XFxuICAgIHJldHVybiBhIC8gKFBJICogdG1wICogdG1wKTtcXG59XFxuI2lmZGVmIFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRURcXG51bmlmb3JtIGZsb2F0IHBhcmFsbGF4T2NjbHVzaW9uU2NhbGUgOiAwLjAyO1xcbnVuaWZvcm0gZmxvYXQgcGFyYWxsYXhNYXhMYXllcnMgOiAyMDtcXG51bmlmb3JtIGZsb2F0IHBhcmFsbGF4TWluTGF5ZXJzIDogNTtcXG51bmlmb3JtIHNhbXBsZXIyRCBwYXJhbGxheE9jY2x1c2lvbk1hcDtcXG5tYXQzIHRyYW5zcG9zZShpbiBtYXQzIGluTWF0KVxcbntcXG4gICAgdmVjMyBpMCA9IGluTWF0WzBdO1xcbiAgICB2ZWMzIGkxID0gaW5NYXRbMV07XFxuICAgIHZlYzMgaTIgPSBpbk1hdFsyXTtcXG4gICAgcmV0dXJuIG1hdDMoXFxuICAgICAgICB2ZWMzKGkwLngsIGkxLngsIGkyLngpLFxcbiAgICAgICAgdmVjMyhpMC55LCBpMS55LCBpMi55KSxcXG4gICAgICAgIHZlYzMoaTAueiwgaTEueiwgaTIueilcXG4gICAgKTtcXG59XFxudmVjMiBwYXJhbGxheFV2KHZlYzIgdXYsIHZlYzMgdmlld0RpcilcXG57XFxuICAgIGZsb2F0IG51bUxheWVycyA9IG1peChwYXJhbGxheE1heExheWVycywgcGFyYWxsYXhNaW5MYXllcnMsIGFicyhkb3QodmVjMygwLjAsIDAuMCwgMS4wKSwgdmlld0RpcikpKTtcXG4gICAgZmxvYXQgbGF5ZXJIZWlnaHQgPSAxLjAgLyBudW1MYXllcnM7XFxuICAgIGZsb2F0IGN1ckxheWVySGVpZ2h0ID0gMC4wO1xcbiAgICB2ZWMyIGRlbHRhVXYgPSB2aWV3RGlyLnh5ICogcGFyYWxsYXhPY2NsdXNpb25TY2FsZSAvICh2aWV3RGlyLnogKiBudW1MYXllcnMpO1xcbiAgICB2ZWMyIGN1clV2ID0gdXY7XFxuICAgIGZsb2F0IGhlaWdodCA9IDEuMCAtIHRleHR1cmUyRChwYXJhbGxheE9jY2x1c2lvbk1hcCwgY3VyVXYpLnI7XFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzA7IGkrKykge1xcbiAgICAgICAgY3VyTGF5ZXJIZWlnaHQgKz0gbGF5ZXJIZWlnaHQ7XFxuICAgICAgICBjdXJVdiAtPSBkZWx0YVV2O1xcbiAgICAgICAgaGVpZ2h0ID0gMS4wIC0gdGV4dHVyZTJEKHBhcmFsbGF4T2NjbHVzaW9uTWFwLCBjdXJVdikucjtcXG4gICAgICAgIGlmIChoZWlnaHQgPCBjdXJMYXllckhlaWdodCkge1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHZlYzIgcHJldlV2ID0gY3VyVXYgKyBkZWx0YVV2O1xcbiAgICBmbG9hdCBuZXh0ID0gaGVpZ2h0IC0gY3VyTGF5ZXJIZWlnaHQ7XFxuICAgIGZsb2F0IHByZXYgPSAxLjAgLSB0ZXh0dXJlMkQocGFyYWxsYXhPY2NsdXNpb25NYXAsIHByZXZVdikuciAtIGN1ckxheWVySGVpZ2h0ICsgbGF5ZXJIZWlnaHQ7XFxuICAgIHJldHVybiBtaXgoY3VyVXYsIHByZXZVdiwgbmV4dCAvIChuZXh0IC0gcHJldikpO1xcbn1cXG4jZW5kaWZcXG52b2lkIG1haW4oKSB7XFxuICAgIHZlYzQgYWxiZWRvQ29sb3IgPSB2ZWM0KGNvbG9yLCBhbHBoYSk7XFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbiAgICBhbGJlZG9Db2xvciAqPSB2X0NvbG9yO1xcbiNlbmRpZlxcbiAgICB2ZWMzIGV5ZVBvcyA9IHZpZXdJbnZlcnNlWzNdLnh5ejtcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvcyAtIHZfV29ybGRQb3NpdGlvbik7XFxuICAgIHZlYzIgdXYgPSB2X1RleGNvb3JkO1xcbiNpZiBkZWZpbmVkKFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRUQpIHx8IGRlZmluZWQoTk9STUFMTUFQX0VOQUJMRUQpXFxuICAgIG1hdDMgdGJuID0gbWF0Myh2X1RhbmdlbnQsIHZfQml0YW5nZW50LCB2X05vcm1hbCk7XFxuI2VuZGlmXFxuI2lmZGVmIFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRURcXG4gICAgdXYgPSBwYXJhbGxheFV2KHZfVGV4Y29vcmQsIG5vcm1hbGl6ZSh0cmFuc3Bvc2UodGJuKSAqIC1WKSk7XFxuI2VuZGlmXFxuI2lmZGVmIERJRkZVU0VNQVBfRU5BQkxFRFxcbiAgICB2ZWM0IHRleGVsID0gdGV4dHVyZTJEKGRpZmZ1c2VNYXAsIHV2KTtcXG4gICAgI2lmZGVmIFNSR0JfREVDT0RFXFxuICAgIHRleGVsID0gc1JHQlRvTGluZWFyKHRleGVsKTtcXG4gICAgI2VuZGlmXFxuICAgIGFsYmVkb0NvbG9yLnJnYiAqPSB0ZXhlbC5yZ2I7XFxuICAgICNpZmRlZiBESUZGVVNFTUFQX0FMUEhBX0FMUEhBXFxuICAgIGFsYmVkb0NvbG9yLmEgKj0gdGV4ZWwuYTtcXG4gICAgI2VuZGlmXFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NcXG4gICAgZmxvYXQgbSA9IG1ldGFsbmVzcztcXG4gICAgI2lmZGVmIE1FVEFMTkVTU01BUF9FTkFCTEVEXFxuICAgIGZsb2F0IG0yID0gdGV4dHVyZTJEKG1ldGFsbmVzc01hcCwgdXYpW01FVEFMTkVTU19DSEFOTkVMXTtcXG4gICAgbSA9IGNsYW1wKG0yICsgKG0gLSAwLjUpICogMi4wLCAwLjAsIDEuMCk7XFxuICAgICNlbmRpZlxcbiAgICB2ZWMzIGJhc2VDb2xvciA9IGFsYmVkb0NvbG9yLnJnYjtcXG4gICAgYWxiZWRvQ29sb3IucmdiID0gYmFzZUNvbG9yICogKDEuMCAtIG0pO1xcbiAgICB2ZWMzIHNwZWMgPSBtaXgodmVjMygwLjA0KSwgYmFzZUNvbG9yLCBtKTtcXG4jZWxzZVxcbiAgICB2ZWMzIHNwZWMgPSBzcGVjdWxhckNvbG9yO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfUk9VR0hORVNTXFxuICAgIGZsb2F0IGcgPSAxLjAgLSByb3VnaG5lc3M7XFxuICAgICNpZmRlZiBST1VHSE5FU1NNQVBfRU5BQkxFRFxcbiAgICBmbG9hdCBnMiA9IDEuMCAtIHRleHR1cmUyRChyb3VnaG5lc3NNYXAsIHV2KVtST1VHSE5FU1NfQ0hBTk5FTF07XFxuICAgIGcgPSBjbGFtcChnMiArIChnIC0gMC41KSAqIDIuMCwgMC4wLCAxLjApO1xcbiAgICAjZW5kaWZcXG4jZWxzZVxcbiAgICBmbG9hdCBnID0gZ2xvc3NpbmVzcztcXG4gICAgI2lmZGVmIEdMT1NTSU5FU1NNQVBfRU5BQkxFRFxcbiAgICBmbG9hdCBnMiA9IHRleHR1cmUyRChnbG9zc2luZXNzTWFwLCB1dilbR0xPU1NJTkVTU19DSEFOTkVMXTtcXG4gICAgZyA9IGNsYW1wKGcyICsgKGcgLSAwLjUpICogMi4wLCAwLjAsIDEuMCk7XFxuICAgICNlbmRpZlxcbiNlbmRpZlxcbiNpZmRlZiBTUEVDVUxBUk1BUF9FTkFCTEVEXFxuICAgIHNwZWMgKj0gc1JHQlRvTGluZWFyKHRleHR1cmUyRChzcGVjdWxhck1hcCwgdXYpKS5yZ2I7XFxuI2VuZGlmXFxuICAgIHZlYzMgTiA9IHZfTm9ybWFsO1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG4gICAgaWYgKGRvdChOLCBWKSA8IDAuMCkge1xcbiAgICAgICAgTiA9IC1OO1xcbiAgICB9XFxuI2VuZGlmXFxuI2lmZGVmIE5PUk1BTE1BUF9FTkFCTEVEXFxuICAgIGlmIChkb3Qodl9UYW5nZW50LCB2X1RhbmdlbnQpID4gMC4wKSB7XFxuICAgICAgICB2ZWMzIG5vcm1hbFRleGVsID0gdGV4dHVyZTJEKG5vcm1hbE1hcCwgdXYpLnh5ejtcXG4gICAgICAgIGlmIChkb3Qobm9ybWFsVGV4ZWwsIG5vcm1hbFRleGVsKSA+IDAuMCkgeyAgICAgICAgICAgIE4gPSBub3JtYWxUZXhlbCAqIDIuMCAtIDEuMDtcXG4gICAgICAgICAgICB0Ym5bMV0gPSAtdGJuWzFdO1xcbiAgICAgICAgICAgIE4gPSBub3JtYWxpemUodGJuICogTik7XFxuICAgICAgICB9XFxuICAgIH1cXG4jZW5kaWZcXG4gICAgdmVjMyBkaWZmdXNlVGVybSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuICAgIHZlYzMgc3BlY3VsYXJUZXJtID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIHZlYzMgZnJlc25lbFRlcm0gPSBGX1NjaGxpY2sobmR2LCBzcGVjKTtcXG4jaWZkZWYgQU1CSUVOVF9MSUdIVF9DT1VOVFxcbiAgICBmb3IoaW50IF9pZHhfID0gMDsgX2lkeF8gPCBBTUJJRU5UX0xJR0hUX0NPVU5UOyBfaWR4XysrKVxcbiAgICB7e1xcbiAgICAgICAgZGlmZnVzZVRlcm0gKz0gYW1iaWVudExpZ2h0Q29sb3JbX2lkeF9dO1xcbiAgICB9fVxcbiNlbmRpZlxcbiNpZmRlZiBBTUJJRU5UX1NIX0xJR0hUX0NPVU5UXFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IEFNQklFTlRfU0hfTElHSFRfQ09VTlQ7IF9pZHhfKyspXFxuICAgIHt7XFxuICAgICAgICBkaWZmdXNlVGVybSArPSBjYWxjQW1iaWVudFNITGlnaHQoX2lkeF8sIE4pICogYW1iaWVudFNITGlnaHRDb2xvcltfaWR4X107XFxuICAgIH19XFxuI2VuZGlmXFxuI2lmZGVmIFBPSU5UX0xJR0hUX0NPVU5UXFxuI2lmIGRlZmluZWQoUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICBmbG9hdCBzaGFkb3dDb250cmlic1BvaW50W1BPSU5UX0xJR0hUX0NPVU5UXTtcXG4gICAgaWYoc2hhZG93RW5hYmxlZClcXG4gICAge1xcbiAgICAgICAgY29tcHV0ZVNoYWRvd09mUG9pbnRMaWdodHModl9Xb3JsZFBvc2l0aW9uLCBzaGFkb3dDb250cmlic1BvaW50KTtcXG4gICAgfVxcbiNlbmRpZlxcbiAgICBmb3IoaW50IF9pZHhfID0gMDsgX2lkeF8gPCBQT0lOVF9MSUdIVF9DT1VOVDsgX2lkeF8rKylcXG4gICAge3tcXG4gICAgICAgIHZlYzMgbGlnaHRQb3NpdGlvbiA9IHBvaW50TGlnaHRQb3NpdGlvbltfaWR4X107XFxuICAgICAgICB2ZWMzIGxjID0gcG9pbnRMaWdodENvbG9yW19pZHhfXTtcXG4gICAgICAgIGZsb2F0IHJhbmdlID0gcG9pbnRMaWdodFJhbmdlW19pZHhfXTtcXG4gICAgICAgIHZlYzMgTCA9IGxpZ2h0UG9zaXRpb24gLSB2X1dvcmxkUG9zaXRpb247XFxuICAgICAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKEwpO1xcbiAgICAgICAgZmxvYXQgYXR0ZW51YXRpb24gPSBsaWdodEF0dGVudWF0aW9uKGRpc3QsIHJhbmdlKTtcXG4gICAgICAgIEwgLz0gZGlzdDtcXG4gICAgICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBjbGFtcChkb3QoTiwgTCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxuICAgICAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic1BvaW50W19pZHhfXTtcXG4gICAgICAgIH1cXG4jZW5kaWZcXG4gICAgICAgIHZlYzMgbGkgPSBsYyAqIG5kbCAqIGF0dGVudWF0aW9uICogc2hhZG93Q29udHJpYjtcXG4gICAgICAgIGRpZmZ1c2VUZXJtICs9IGxpO1xcbiAgICAgICAgc3BlY3VsYXJUZXJtICs9IGxpICogZnJlc25lbFRlcm0gKiBEX1Bob25nKGcsIG5kaCk7XFxuICAgIH19XFxuI2VuZGlmXFxuI2lmZGVmIERJUkVDVElPTkFMX0xJR0hUX0NPVU5UXFxuI2lmIGRlZmluZWQoRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICBmbG9hdCBzaGFkb3dDb250cmlic0RpcltESVJFQ1RJT05BTF9MSUdIVF9DT1VOVF07XFxuICAgIGlmKHNoYWRvd0VuYWJsZWQpXFxuICAgIHtcXG4gICAgICAgIGNvbXB1dGVTaGFkb3dPZkRpcmVjdGlvbmFsTGlnaHRzKHZfV29ybGRQb3NpdGlvbiwgc2hhZG93Q29udHJpYnNEaXIpO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IERJUkVDVElPTkFMX0xJR0hUX0NPVU5UOyBfaWR4XysrKVxcbiAgICB7e1xcbiAgICAgICAgdmVjMyBMID0gLW5vcm1hbGl6ZShkaXJlY3Rpb25hbExpZ2h0RGlyZWN0aW9uW19pZHhfXSk7XFxuICAgICAgICB2ZWMzIGxjID0gZGlyZWN0aW9uYWxMaWdodENvbG9yW19pZHhfXTtcXG4gICAgICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBjbGFtcChkb3QoTiwgTCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChESVJFQ1RJT05BTF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxuICAgICAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic0RpcltfaWR4X107XFxuICAgICAgICB9XFxuI2VuZGlmXFxuICAgICAgICB2ZWMzIGxpID0gbGMgKiBuZGwgKiBzaGFkb3dDb250cmliO1xcbiAgICAgICAgZGlmZnVzZVRlcm0gKz0gbGk7XFxuICAgICAgICBzcGVjdWxhclRlcm0gKz0gbGkgKiBmcmVzbmVsVGVybSAqIERfUGhvbmcoZywgbmRoKTtcXG4gICAgfX1cXG4jZW5kaWZcXG4jaWZkZWYgU1BPVF9MSUdIVF9DT1VOVFxcbiNpZiBkZWZpbmVkKFNQT1RfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICBmbG9hdCBzaGFkb3dDb250cmlic1Nwb3RbU1BPVF9MSUdIVF9DT1VOVF07XFxuICAgIGlmKHNoYWRvd0VuYWJsZWQpXFxuICAgIHtcXG4gICAgICAgIGNvbXB1dGVTaGFkb3dPZlNwb3RMaWdodHModl9Xb3JsZFBvc2l0aW9uLCBzaGFkb3dDb250cmlic1Nwb3QpO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGZvcihpbnQgaSA9IDA7IGkgPCBTUE9UX0xJR0hUX0NPVU5UOyBpKyspXFxuICAgIHtcXG4gICAgICAgIHZlYzMgbGlnaHRQb3NpdGlvbiA9IHNwb3RMaWdodFBvc2l0aW9uW2ldO1xcbiAgICAgICAgdmVjMyBzcG90TGlnaHREaXJlY3Rpb24gPSAtbm9ybWFsaXplKHNwb3RMaWdodERpcmVjdGlvbltpXSk7XFxuICAgICAgICB2ZWMzIGxjID0gc3BvdExpZ2h0Q29sb3JbaV07XFxuICAgICAgICBmbG9hdCByYW5nZSA9IHNwb3RMaWdodFJhbmdlW2ldO1xcbiAgICAgICAgZmxvYXQgYSA9IHNwb3RMaWdodFVtYnJhQW5nbGVDb3NpbmVbaV07XFxuICAgICAgICBmbG9hdCBiID0gc3BvdExpZ2h0UGVudW1icmFBbmdsZUNvc2luZVtpXTtcXG4gICAgICAgIGZsb2F0IGZhbGxvZmZGYWN0b3IgPSBzcG90TGlnaHRGYWxsb2ZmRmFjdG9yW2ldO1xcbiAgICAgICAgdmVjMyBMID0gbGlnaHRQb3NpdGlvbiAtIHZfV29ybGRQb3NpdGlvbjtcXG4gICAgICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoTCk7XFxuICAgICAgICBmbG9hdCBhdHRlbnVhdGlvbiA9IGxpZ2h0QXR0ZW51YXRpb24oZGlzdCwgcmFuZ2UpO1xcbiAgICAgICAgTCAvPSBkaXN0O1xcbiAgICAgICAgZmxvYXQgYyA9IGRvdChzcG90TGlnaHREaXJlY3Rpb24sIEwpO1xcbiAgICAgICAgZmxvYXQgZmFsbG9mZjtcXG4gICAgICAgIGZhbGxvZmYgPSBjbGFtcCgoYyAtIGEpIC8oIGIgLSBhKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmFsbG9mZiA9IHBvdyhmYWxsb2ZmLCBmYWxsb2ZmRmFjdG9yKTtcXG4gICAgICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBjbGFtcChkb3QoTiwgTCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgICAgIGlmIChzaGFkb3dFbmFibGVkKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic1Nwb3RbaV07XFxuICAgICAgICB9XFxuI2VuZGlmXFxuICAgICAgICB2ZWMzIGxpID0gbGMgKiBhdHRlbnVhdGlvbiAqICgxLjAgLSBmYWxsb2ZmKSAqIHNoYWRvd0NvbnRyaWIgKiBuZGw7XFxuICAgICAgICBkaWZmdXNlVGVybSArPSBsaTtcXG4gICAgICAgIHNwZWN1bGFyVGVybSArPSBsaSAqIGZyZXNuZWxUZXJtICogRF9QaG9uZyhnLCBuZGgpO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIHZlYzQgb3V0Q29sb3IgPSBhbGJlZG9Db2xvcjtcXG4gICAgb3V0Q29sb3IucmdiICo9IGRpZmZ1c2VUZXJtO1xcbiAgICBvdXRDb2xvci5yZ2IgKz0gc3BlY3VsYXJUZXJtO1xcbiNpZmRlZiBBTUJJRU5UX0NVQkVNQVBfTElHSFRfQ09VTlRcXG4gICAgdmVjMyBMID0gcmVmbGVjdCgtViwgTik7XFxuICAgIGZsb2F0IHJvdWdoMiA9IGNsYW1wKDEuMCAtIGcsIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgYmlhczIgPSByb3VnaDIgKiA1LjA7XFxuICAgIHZlYzIgYnJkZlBhcmFtMiA9IHRleHR1cmUyRChhbWJpZW50Q3ViZW1hcExpZ2h0QlJERkxvb2t1cFswXSwgdmVjMihyb3VnaDIsIG5kdikpLnh5O1xcbiAgICB2ZWMzIGVudldlaWdodDIgPSBzcGVjICogYnJkZlBhcmFtMi54ICsgYnJkZlBhcmFtMi55O1xcbiAgICB2ZWMzIGVudlRleGVsMjtcXG4gICAgZm9yKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgQU1CSUVOVF9DVUJFTUFQX0xJR0hUX0NPVU5UOyBfaWR4XysrKVxcbiAgICB7e1xcbiAgICAgICAgZW52VGV4ZWwyID0gUkdCTURlY29kZSh0ZXh0dXJlQ3ViZUxvZEVYVChhbWJpZW50Q3ViZW1hcExpZ2h0Q3ViZW1hcFtfaWR4X10sIEwsIGJpYXMyKSwgNTEuNSk7XFxuICAgICAgICBvdXRDb2xvci5yZ2IgKz0gYW1iaWVudEN1YmVtYXBMaWdodENvbG9yW19pZHhfXSAqIGVudlRleGVsMiAqIGVudldlaWdodDI7XFxuICAgIH19XFxuI2VuZGlmXFxuI2lmZGVmIEVOVklST05NRU5UTUFQX0VOQUJMRURcXG4gICAgdmVjMyBlbnZXZWlnaHQgPSBnICogZnJlc25lbFRlcm07XFxuICAgIHZlYzMgTCA9IHJlZmxlY3QoLVYsIE4pO1xcbiAgICAjaWZkZWYgUEFSQUxMQVhfQ09SUkVDVEVEXFxuICAgIEwgPSBwYXJhbGxheENvcnJlY3QoTCwgdl9Xb3JsZFBvc2l0aW9uLCBlbnZpcm9ubWVudEJveE1pbiwgZW52aXJvbm1lbnRCb3hNYXgpO1xcbiAgICAjZW5kaWZcXG4gICAgI2lmZGVmIEVOVklST05NRU5UTUFQX1BSRUZJTFRFUlxcbiAgICBmbG9hdCByb3VnaCA9IGNsYW1wKDEuMCAtIGcsIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgYmlhcyA9IHJvdWdoICogbWF4TWlwbWFwTGV2ZWw7XFxuICAgIHZlYzMgZW52VGV4ZWwgPSBkZWNvZGVIRFIodGV4dHVyZUN1YmVMb2RFWFQoZW52aXJvbm1lbnRNYXAsIEwsIGJpYXMpKS5yZ2I7XFxuICAgICAgICAjaWZkZWYgQlJERkxPT0tVUF9FTkFCTEVEXFxuICAgIHZlYzIgYnJkZlBhcmFtID0gdGV4dHVyZTJEKGJyZGZMb29rdXAsIHZlYzIocm91Z2gsIG5kdikpLnh5O1xcbiAgICBlbnZXZWlnaHQgPSBzcGVjICogYnJkZlBhcmFtLnggKyBicmRmUGFyYW0ueTtcXG4gICAgICAgICNlbmRpZlxcbiAgICAjZWxzZVxcbiAgICB2ZWMzIGVudlRleGVsID0gdGV4dHVyZUN1YmUoZW52aXJvbm1lbnRNYXAsIEwpLnh5ejtcXG4gICAgI2VuZGlmXFxuICAgIG91dENvbG9yLnJnYiArPSBlbnZUZXhlbCAqIGVudldlaWdodDtcXG4jZW5kaWZcXG4gICAgZmxvYXQgYW9GYWN0b3IgPSAxLjA7XFxuI2lmZGVmIFNTQU9NQVBfRU5BQkxFRFxcbiAgICBhb0ZhY3RvciA9IG1pbih0ZXh0dXJlMkQoc3Nhb01hcCwgKGdsX0ZyYWdDb29yZC54eSAtIHZpZXdwb3J0Lnh5KSAvIHZpZXdwb3J0Lnp3KS5yLCBhb0ZhY3Rvcik7XFxuI2VuZGlmXFxuI2lmZGVmIEFPTUFQX0VOQUJMRURcXG4gICAgYW9GYWN0b3IgPSBtaW4oMS4wIC0gY2xhbXAoKDEuMCAtIHRleHR1cmUyRChhb01hcCwgdl9UZXhjb29yZDIpLnIpICogYW9JbnRlbnNpdHksIDAuMCwgMS4wKSwgYW9GYWN0b3IpO1xcbiNlbmRpZlxcbiAgICBvdXRDb2xvci5yZ2IgKj0gYW9GYWN0b3I7XFxuICAgIHZlYzMgbEVtaXNzaW9uID0gZW1pc3Npb247XFxuI2lmZGVmIEVNSVNTSVZFTUFQX0VOQUJMRURcXG4gICAgbEVtaXNzaW9uICo9IHRleHR1cmUyRChlbWlzc2l2ZU1hcCwgdXYpLnJnYjtcXG4jZW5kaWZcXG4gICAgb3V0Q29sb3IucmdiICs9IGxFbWlzc2lvbiAqIGVtaXNzaW9uSW50ZW5zaXR5O1xcbiNpZmRlZiBHQU1NQV9FTkNPREVcXG4gICAgb3V0Q29sb3IucmdiID0gcG93KG91dENvbG9yLnJnYiwgdmVjMygxIC8gMi4yKSk7XFxuI2VuZGlmXFxuICAgIGlmKGxpbmVXaWR0aCA+IDAuKVxcbiAgICB7XFxuICAgICAgICBvdXRDb2xvci5yZ2IgPSBtaXgob3V0Q29sb3IucmdiLCBsaW5lQ29sb3IucmdiLCAoMS4wIC0gZWRnZUZhY3RvcihsaW5lV2lkdGgpKSAqIGxpbmVDb2xvci5hKTtcXG4gICAgfVxcbiNpZmRlZiBBTFBIQV9URVNUXFxuICAgIGlmIChvdXRDb2xvci5hIDwgYWxwaGFDdXRvZmYpIHtcXG4gICAgICAgIGRpc2NhcmQ7XFxuICAgIH1cXG4jZW5kaWZcXG4jaWZkZWYgVE9ORU1BUFBJTkdcXG4gICAgb3V0Q29sb3IucmdiID0gQUNFU1RvbmVNYXBwaW5nKG91dENvbG9yLnJnYik7XFxuI2VuZGlmXFxuI2lmZGVmIFNSR0JfRU5DT0RFXFxuICAgIG91dENvbG9yID0gbGluZWFyVG9zUkdCKG91dENvbG9yKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKG91dENvbG9yKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5zdGFuZGFyZE1SLnZlcnRleFxcbkBpbXBvcnQgY2xheS5zdGFuZGFyZC52ZXJ0ZXhcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnN0YW5kYXJkTVIuZnJhZ21lbnRcXG4jZGVmaW5lIFVTRV9NRVRBTE5FU1NcXG4jZGVmaW5lIFVTRV9ST1VHSE5FU1NcXG5AaW1wb3J0IGNsYXkuc3RhbmRhcmQuZnJhZ21lbnRcXG5AZW5kXCI7XG4iLCJpbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi9NYXRlcmlhbCc7XG5cbmltcG9ydCBTaGFkZXIgZnJvbSAnLi9TaGFkZXInO1xuaW1wb3J0IHN0YW5kYXJkRXNzbCBmcm9tICcuL3NoYWRlci9zb3VyY2Uvc3RhbmRhcmQuZ2xzbC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5cbi8vIEltcG9ydCBzdGFuZGFyZCBzaGFkZXJcblNoYWRlclsnaW1wb3J0J10oc3RhbmRhcmRFc3NsKTtcblxudmFyIFRFWFRVUkVfUFJPUEVSVElFUyA9IFsnZGlmZnVzZU1hcCcsICdub3JtYWxNYXAnLCAncm91Z2huZXNzTWFwJywgJ21ldGFsbmVzc01hcCcsICdlbWlzc2l2ZU1hcCcsICdlbnZpcm9ubWVudE1hcCcsICdicmRmTG9va3VwJywgJ3NzYW9NYXAnLCAnYW9NYXAnXTtcbnZhciBTSU1QTEVfUFJPUEVSVElFUyA9IFsnY29sb3InLCAnZW1pc3Npb24nLCAnZW1pc3Npb25JbnRlbnNpdHknLCAnYWxwaGEnLCAncm91Z2huZXNzJywgJ21ldGFsbmVzcycsICd1dlJlcGVhdCcsICd1dk9mZnNldCcsICdhb0ludGVuc2l0eScsICdhbHBoYUN1dG9mZiddO1xudmFyIFBST1BFUlRJRVNfQ0hBTkdFX1NIQURFUiA9IFsnbGluZWFyJywgJ2VuY29kZVJHQk0nLCAnZGVjb2RlUkdCTScsICdkb3VibGVTaWRlZCcsICdhbHBoYVRlc3QnLCAncm91Z2huZXNzQ2hhbm5lbCcsICdtZXRhbG5lc3NDaGFubmVsJywgJ2Vudmlyb25tZW50TWFwUHJlZmlsdGVyZWQnXTtcblxudmFyIE5VTV9ERUZJTkVfTUFQID0ge1xuICAgICdyb3VnaG5lc3NDaGFubmVsJzogJ1JPVUdITkVTU19DSEFOTkVMJyxcbiAgICAnbWV0YWxuZXNzQ2hhbm5lbCc6ICdNRVRBTE5FU1NfQ0hBTk5FTCdcbn07XG52YXIgQk9PTF9ERUZJTkVfTUFQID0ge1xuICAgICdsaW5lYXInOiAnU1JHQl9ERUNPREUnLFxuICAgICdlbmNvZGVSR0JNJzogJ1JHQk1fRU5DT0RFJyxcbiAgICAnZGVjb2RlUkdCTSc6ICdSR0JNX0RFQ09ERScsXG4gICAgJ2RvdWJsZVNpZGVkJzogJ0RPVUJMRV9TSURFRCcsXG4gICAgJ2FscGhhVGVzdCc6ICdBTFBIQV9URVNUJyxcbiAgICAnZW52aXJvbm1lbnRNYXBQcmVmaWx0ZXJlZCc6ICdFTlZJUk9OTUVOVE1BUF9QUkVGSUxURVInXG59XG5cblxudmFyIHN0YW5kYXJkU2hhZGVyO1xuLyoqXG4gKiBTdGFuZGFyZCBtYXRlcmlhbCB3aXRob3V0IGN1c3RvbSBzaGFkZXIuXG4gKiBAY29uc3RydWN0b3IgY2xheS5TdGFuZGFyZE1hdGVyaWFsXG4gKiBAZXh0ZW5kcyBjbGF5LkJhc2VcbiAqIEBleGFtcGxlXG4gKiB2YXIgbWF0ID0gbmV3IGNsYXkuU3RhbmRhcmRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IFsxLCAxLCAxXSxcbiAqICAgICBkaWZmdXNlTWFwOiBkaWZmdXNlVGV4dHVyZVxuICogfSk7XG4gKiBtYXQucm91Z2huZXNzID0gMTtcbiAqL1xudmFyIFN0YW5kYXJkTWF0ZXJpYWwgPSBNYXRlcmlhbC5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RhbmRhcmRTaGFkZXIpIHtcbiAgICAgICAgc3RhbmRhcmRTaGFkZXIgPSBuZXcgU2hhZGVyKFNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmQudmVydGV4JyksIFNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmQuZnJhZ21lbnQnKSk7XG4gICAgfVxuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuU3RhbmRhcmRNYXRlcmlhbCMgKi8ge1xuICAgICAgICBzaGFkZXI6IHN0YW5kYXJkU2hhZGVyXG4gICAgfTtcbn0sIGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAvLyBQRU5ESU5HXG4gICAgdXRpbC5leHRlbmQodGhpcywgb3B0aW9uKTtcbiAgICAvLyBFeHRlbmQgYWZ0ZXIgc2hhZGVyIGlzIGNyZWF0ZWQuXG4gICAgdXRpbC5kZWZhdWx0cyh0aGlzLCAvKiogQGxlbmRzIGNsYXkuU3RhbmRhcmRNYXRlcmlhbCMgKi8gIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn1cbiAgICAgICAgICogQGRlZmF1bHQgWzEsIDEsIDFdXG4gICAgICAgICAqL1xuICAgICAgICBjb2xvcjogWzEsIDEsIDFdLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59XG4gICAgICAgICAqIEBkZWZhdWx0IFswLCAwLCAwXVxuICAgICAgICAgKi9cbiAgICAgICAgZW1pc3Npb246IFswLCAwLCAwXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgZW1pc3Npb25JbnRlbnNpdHk6IDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDAuNVxuICAgICAgICAgKi9cbiAgICAgICAgcm91Z2huZXNzOiAwLjUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIG1ldGFsbmVzczogMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgYWxwaGE6IDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgYWxwaGFUZXN0OiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3V0b2ZmIHRocmVzaG9sZCBmb3IgYWxwaGEgdGVzdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgYWxwaGFDdXRvZmY6IDAuOSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICAvLyBUT0RPIE11c3QgZGlzYWJsZSBjdWxsaW5nLlxuICAgICAgICBkb3VibGVTaWRlZDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlQ3ViZX1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCUkRGIExvb2t1cCBpcyBnZW5lcmF0ZWQgYnkgY2xheS51dGlsLmN1YmVtYXAuaW50ZWdyYXRlQnJkZlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59XG4gICAgICAgICAqIEBkZWZhdWx0IFsxLCAxXVxuICAgICAgICAgKi9cbiAgICAgICAgdXZSZXBlYXQ6IFsxLCAxXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fVxuICAgICAgICAgKiBAZGVmYXVsdCBbMCwgMF1cbiAgICAgICAgICovXG4gICAgICAgIHV2T2Zmc2V0OiBbMCwgMF0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIGFvSW50ZW5zaXR5OiAxLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGVudmlyb25tZW50TWFwUHJlZmlsdGVyZWQ6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmVhcjogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZW5jb2RlUkdCTTogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZGVjb2RlUkdCTTogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICByb3VnaG5lc3NDaGFubmVsOiAwLFxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIG1ldGFsbmVzc0NoYW5uZWw6IDFcbiAgICB9KTtcblxuICAgIHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfTUVUQUxORVNTJyk7XG4gICAgdGhpcy5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9ST1VHSE5FU1MnKTtcbn0sIHtcbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgU3RhbmRhcmRNYXRlcmlhbCh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIFRFWFRVUkVfUFJPUEVSVElFUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxbcHJvcE5hbWVdID0gdGhpc1twcm9wTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICBTSU1QTEVfUFJPUEVSVElFUy5jb25jYXQoUFJPUEVSVElFU19DSEFOR0VfU0hBREVSKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgbWF0ZXJpYWxbcHJvcE5hbWVdID0gdGhpc1twcm9wTmFtZV07XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfVxufSk7XG5cblNJTVBMRV9QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLCBwcm9wTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChwcm9wTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFVuaWZvcm0ocHJvcE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cblRFWFRVUkVfUFJPUEVSVElFUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSwgcHJvcE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQocHJvcE5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRVbmlmb3JtKHByb3BOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5QUk9QRVJUSUVTX0NIQU5HRV9TSEFERVIuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICB2YXIgcHJpdmF0ZUtleSA9ICdfJyArIHByb3BOYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSwgcHJvcE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1twcml2YXRlS2V5XTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbcHJpdmF0ZUtleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSBpbiBOVU1fREVGSU5FX01BUCkge1xuICAgICAgICAgICAgICAgIHZhciBkZWZpbmVOYW1lID0gTlVNX0RFRklORV9NQVBbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsIGRlZmluZU5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBkZWZpbmVOYW1lID0gQk9PTF9ERUZJTkVfTUFQW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA/IHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsIGRlZmluZU5hbWUpIDogdGhpcy51bmRlZmluZSgnZnJhZ21lbnQnLCBkZWZpbmVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSwgJ2Vudmlyb25tZW50Qm94Jywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW52Qm94ID0gdGhpcy5fZW52aXJvbm1lbnRCb3g7XG4gICAgICAgIGlmIChlbnZCb3gpIHtcbiAgICAgICAgICAgIGVudkJveC5taW4uc2V0QXJyYXkodGhpcy5nZXQoJ2Vudmlyb25tZW50Qm94TWluJykpO1xuICAgICAgICAgICAgZW52Qm94Lm1heC5zZXRBcnJheSh0aGlzLmdldCgnZW52aXJvbm1lbnRCb3hNYXgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudkJveDtcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZW52aXJvbm1lbnRCb3ggPSB2YWx1ZTtcblxuICAgICAgICB2YXIgdW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zID0gdGhpcy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdW5pZm9ybXNbJ2Vudmlyb25tZW50Qm94TWluJ10gPSB1bmlmb3Jtc1snZW52aXJvbm1lbnRCb3hNaW4nXSB8fCB7XG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB1bmlmb3Jtc1snZW52aXJvbm1lbnRCb3hNYXgnXSA9IHVuaWZvcm1zWydlbnZpcm9ubWVudEJveE1heCddIHx8IHtcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETyBDYW4ndCBkZXRlY3Qgb3BlcmF0aW9uIGxpa2UgYm94Lm1pbiA9IG5ldyBWZWN0b3IoKVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VW5pZm9ybSgnZW52aXJvbm1lbnRCb3hNaW4nLCB2YWx1ZS5taW4uYXJyYXkpO1xuICAgICAgICAgICAgdGhpcy5zZXRVbmlmb3JtKCdlbnZpcm9ubWVudEJveE1heCcsIHZhbHVlLm1heC5hcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsICdQQVJBTExBWF9DT1JSRUNURUQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BBUkFMTEFYX0NPUlJFQ1RFRCcpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0YW5kYXJkTWF0ZXJpYWw7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2NvcmUvQmFzZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuSm9pbnRcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBKb2ludCA9IEJhc2UuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LkpvaW50IyAqL1xue1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9pc3N1ZXMvMTkzI2lzc3VlY29tbWVudC0yOTIxNjU3NlxuICAgIC8qKlxuICAgICAqIEpvaW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIG5hbWU6ICcnLFxuICAgIC8qKlxuICAgICAqIEluZGV4IG9mIGpvaW50IGluIHRoZSBza2VsZXRvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgaW5kZXg6IC0xLFxuXG4gICAgLyoqXG4gICAgICogU2NlbmUgbm9kZSBhdHRhY2hlZCB0b1xuICAgICAqIEB0eXBlIHtjbGF5Lk5vZGV9XG4gICAgICovXG4gICAgbm9kZTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFJvb3Qgc2NlbmUgbm9kZSBvZiB0aGUgc2tlbGV0b24sIHdoaWNoIHBhcmVudCBub2RlIGlzIG51bGwgb3IgZG9uJ3QgaGF2ZSBhIGpvaW50XG4gICAgICogQHR5cGUge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICByb290Tm9kZTogbnVsbFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEpvaW50O1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IEpvaW50IGZyb20gJy4vSm9pbnQnO1xuXG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LlNrZWxldG9uXG4gKi9cbnZhciBTa2VsZXRvbiA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LlNrZWxldG9uIyAqL3tcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpdmUgcm9vdCBub2RlIHRoYXQgbm90IGFmZmVjdCB0cmFuc2Zvcm0gb2Ygam9pbnQuXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lk5vZGV9XG4gICAgICAgICAqL1xuICAgICAgICByZWxhdGl2ZVJvb3ROb2RlOiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBqb2ludHNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxjbGF5LkpvaW50Pn1cbiAgICAgICAgICovXG4gICAgICAgIGpvaW50czogW10sXG5cbiAgICAgICAgX2NsaXBzOiBbXSxcblxuICAgICAgICAvLyBNYXRyaXggdG8gam9pbnQgc3BhY2UgKHJlbGF0aXZlIHRvIHJvb3Qgam9pbnQpXG4gICAgICAgIF9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXk6IG51bGwsXG5cbiAgICAgICAgLy8gVXNlIHN1YmFycmF5IGluc3RlYWQgb2YgY29weSBiYWNrIGVhY2ggdGltZSBjb21wdXRpbmcgbWF0cml4XG4gICAgICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL3N1YmFycmF5LXZzLWNvcHktZm9yLWFycmF5LXRyYW5zZm9ybS81XG4gICAgICAgIF9qb2ludE1hdHJpY2VzU3ViQXJyYXlzOiBbXSxcblxuICAgICAgICAvLyBqb2ludE1hdHJpeCAqIGN1cnJlbnRQb3NlTWF0cml4XG4gICAgICAgIC8vIHdvcmxkVHJhbnNmb3JtIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IGJvbmVcbiAgICAgICAgLy8gc3RpbGwgaW4gbW9kZWwgc3BhY2Ugbm90IHdvcmxkIHNwYWNlXG4gICAgICAgIF9za2luTWF0cmljZXNBcnJheTogbnVsbCxcblxuICAgICAgICBfc2tpbk1hdHJpY2VzU3ViQXJyYXlzOiBbXSxcblxuICAgICAgICBfc3ViU2tpbk1hdHJpY2VzQXJyYXk6IHt9XG4gICAgfTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuU2tlbGV0b24ucHJvdG90eXBlICovXG57XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBza2lubmluZyBjbGlwIGFuZCBjcmVhdGUgYSBtYXAgYmV0d2VlbiBjbGlwIGFuZCBza2VsZXRvblxuICAgICAqIEBwYXJhbSB7Y2xheS5hbmltYXRpb24uU2tpbm5pbmdDbGlwfSBjbGlwXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFttYXBSdWxlXSBNYXAgYmV0d2VlbiBqb2ludCBuYW1lIGluIHNrZWxldG9uIGFuZCBqb2ludCBuYW1lIGluIGNsaXBcbiAgICAgKi9cbiAgICBhZGRDbGlwOiBmdW5jdGlvbiAoY2xpcCwgbWFwUnVsZSkge1xuICAgICAgICAvLyBDbGlwIGhhdmUgYmVlbiBleGlzdHMgaW5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jbGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NsaXBzW2ldLmNsaXAgPT09IGNsaXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFwIHRoZSBqb2ludCBpbmRleCBpbiBza2VsZXRvbiB0byBqb2ludCBwb3NlIGluZGV4IGluIGNsaXBcbiAgICAgICAgdmFyIG1hcHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmpvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbWFwc1tpXSA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhdmF0YXJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmpvaW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBqb2ludCA9IHRoaXMuam9pbnRzW2pdO1xuICAgICAgICAgICAgICAgIHZhciB0cmFjayA9IGNsaXAudHJhY2tzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBqb2ludE5hbWUgPSBqb2ludC5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChtYXBSdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW50TmFtZSA9IG1hcFJ1bGVbam9pbnROYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrLm5hbWUgPT09IGpvaW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXBzW2pdID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xpcHMucHVzaCh7XG4gICAgICAgICAgICBtYXBzOiBtYXBzLFxuICAgICAgICAgICAgY2xpcDogY2xpcFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpcHMubGVuZ3RoIC0gMTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtjbGF5LmFuaW1hdGlvbi5Ta2lubmluZ0NsaXB9IGNsaXBcbiAgICAgKi9cbiAgICByZW1vdmVDbGlwOiBmdW5jdGlvbiAoY2xpcCkge1xuICAgICAgICB2YXIgaWR4ID0gLTE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fY2xpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGlwc1tpXS5jbGlwID09PSBjbGlwKSB7XG4gICAgICAgICAgICAgICAgaWR4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2xpcHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgY2xpcHNcbiAgICAgKi9cbiAgICByZW1vdmVDbGlwc0FsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jbGlwcyA9IFtdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpcCBieSBpbmRleFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gaW5kZXhcbiAgICAgKi9cbiAgICBnZXRDbGlwOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsaXBzW2luZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsaXBzW2luZGV4XS5jbGlwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDbGlwTnVtYmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGlwcy5sZW5ndGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBqb2ludCBtYXRyaWNlcyBmcm9tIG5vZGUgdHJhbnNmb3JtXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdXBkYXRlSm9pbnRNYXRyaWNlczogKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgbTQgPSBtYXQ0LmNyZWF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuam9pbnRzLmxlbmd0aCAqIDE2KTtcbiAgICAgICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmpvaW50cy5sZW5ndGggKiAxNik7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5qb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSB0aGlzLmpvaW50c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5yZWxhdGl2ZVJvb3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIG1hdDQuaW52ZXJ0KG00LCB0aGlzLnJlbGF0aXZlUm9vdE5vZGUud29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICAgICAgICAgIC8vICAgICBtYXQ0Lm11bHRpcGx5KFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgbTQsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtNCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGpvaW50Lm5vZGUud29ybGRUcmFuc2Zvcm0uYXJyYXlcbiAgICAgICAgICAgICAgICAvLyAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgbWF0NC5pbnZlcnQobTQsIG00KTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdDQuY29weShtNCwgam9pbnQubm9kZS53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIG1hdDQuaW52ZXJ0KG00LCBtNCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGkgKiAxNjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5W29mZnNldCArIGpdID0gbTRbal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpY2VzU3ViQXJyYXlzKCk7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIHNldEpvaW50TWF0cmljZXNBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICB0aGlzLl9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXkgPSBhcnI7XG4gICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShhcnIubGVuZ3RoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNYXRyaWNlc1N1YkFycmF5cygpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVNYXRyaWNlc1N1YkFycmF5czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9qb2ludE1hdHJpY2VzU3ViQXJyYXlzW2ldID0gdGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5LnN1YmFycmF5KGkgKiAxNiwgKGkrMSkgKiAxNik7XG4gICAgICAgICAgICB0aGlzLl9za2luTWF0cmljZXNTdWJBcnJheXNbaV0gPSB0aGlzLl9za2luTWF0cmljZXNBcnJheS5zdWJhcnJheShpICogMTYsIChpKzEpICogMTYpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBza2lubmluZyBtYXRyaWNlc1xuICAgICAqL1xuICAgIHVwZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdmFyIG00ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5qb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSB0aGlzLmpvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBtYXQ0Lm11bHRpcGx5KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2luTWF0cmljZXNTdWJBcnJheXNbaV0sXG4gICAgICAgICAgICAgICAgICAgIGpvaW50Lm5vZGUud29ybGRUcmFuc2Zvcm0uYXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2pvaW50TWF0cmljZXNTdWJBcnJheXNbaV1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gSm9pbnQgc3BhY2UgaXMgcmVsYXRpdmUgdG8gcm9vdCwgaWYgaGF2ZVxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLnJlbGF0aXZlUm9vdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbWF0NC5pbnZlcnQobTQsIHRoaXMucmVsYXRpdmVSb290Tm9kZS53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIG1hdDQubXVsdGlwbHkoXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLl9za2luTWF0cmljZXNTdWJBcnJheXNbaV0sXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtNCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc1N1YkFycmF5c1tpXVxuICAgICAgICAgICAgICAgIC8vICAgICApO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgZ2V0U3ViU2tpbk1hdHJpY2VzOiBmdW5jdGlvbiAobWVzaElkLCBqb2ludHMpIHtcbiAgICAgICAgdmFyIHN1YkFycmF5ID0gdGhpcy5fc3ViU2tpbk1hdHJpY2VzQXJyYXlbbWVzaElkXTtcbiAgICAgICAgaWYgKCFzdWJBcnJheSkge1xuICAgICAgICAgICAgc3ViQXJyYXlcbiAgICAgICAgICAgICAgICA9IHRoaXMuX3N1YlNraW5NYXRyaWNlc0FycmF5W21lc2hJZF1cbiAgICAgICAgICAgICAgICA9IG5ldyBGbG9hdDMyQXJyYXkoam9pbnRzLmxlbmd0aCAqIDE2KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3Vyc29yID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpZHggPSBqb2ludHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdWJBcnJheVtjdXJzb3IrK10gPSB0aGlzLl9za2luTWF0cmljZXNBcnJheVtpZHggKiAxNiArIGpdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWJBcnJheTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHBvc2UgYW5kIHVwZGF0ZSBza2lubmluZyBtYXRyaWNlc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbGlwSW5kZXhcbiAgICAgKi9cbiAgICBzZXRQb3NlOiBmdW5jdGlvbiAoY2xpcEluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGlwc1tjbGlwSW5kZXhdKSB7XG4gICAgICAgICAgICB2YXIgY2xpcCA9IHRoaXMuX2NsaXBzW2NsaXBJbmRleF0uY2xpcDtcbiAgICAgICAgICAgIHZhciBtYXBzID0gdGhpcy5fY2xpcHNbY2xpcEluZGV4XS5tYXBzO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGpvaW50ID0gdGhpcy5qb2ludHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG1hcHNbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zZSA9IGNsaXAudHJhY2tzW21hcHNbaV1dO1xuXG4gICAgICAgICAgICAgICAgLy8gTm90IHVwZGF0ZSBpZiB0aGVyZSBpcyBubyBkYXRhLlxuICAgICAgICAgICAgICAgIC8vIFBFTkRJTkcgSWYgc3luYyBwb3NlLnBvc2l0aW9uLCBwb3NlLnJvdGF0aW9uLCBwb3NlLnNjYWxlXG4gICAgICAgICAgICAgICAgaWYgKHBvc2UuY2hhbm5lbHMucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjMy5jb3B5KGpvaW50Lm5vZGUucG9zaXRpb24uYXJyYXksIHBvc2UucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocG9zZS5jaGFubmVscy5yb3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBxdWF0LmNvcHkoam9pbnQubm9kZS5yb3RhdGlvbi5hcnJheSwgcG9zZS5yb3RhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3NlLmNoYW5uZWxzLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzMuY29weShqb2ludC5ub2RlLnNjYWxlLmFycmF5LCBwb3NlLnNjYWxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBqb2ludC5ub2RlLnBvc2l0aW9uLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgam9pbnQubm9kZS5yb3RhdGlvbi5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGpvaW50Lm5vZGUuc2NhbGUuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH0sXG5cbiAgICBjbG9uZTogZnVuY3Rpb24gKHJvb3ROb2RlLCBuZXdSb290Tm9kZSkge1xuICAgICAgICB2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oKTtcbiAgICAgICAgc2tlbGV0b24ubmFtZSA9IHRoaXMubmFtZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3Sm9pbnQgPSBuZXcgSm9pbnQoKTtcbiAgICAgICAgICAgIG5ld0pvaW50Lm5hbWUgPSB0aGlzLmpvaW50c1tpXS5uYW1lO1xuICAgICAgICAgICAgbmV3Sm9pbnQuaW5kZXggPSB0aGlzLmpvaW50c1tpXS5pbmRleDtcblxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLmpvaW50c1tpXS5ub2RlLmdldFBhdGgocm9vdE5vZGUpO1xuICAgICAgICAgICAgdmFyIHJvb3ROb2RlUGF0aCA9IHRoaXMuam9pbnRzW2ldLnJvb3ROb2RlLmdldFBhdGgocm9vdE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHJvb3ROb2RlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3Sm9pbnQubm9kZSA9IG5ld1Jvb3ROb2RlLnF1ZXJ5Tm9kZShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFBFTkRJTkdcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NvbWV0aGluZyB3cm9uZyBpbiBjbG9uZSwgbWF5IGJlIHRoZSBza2VsZXRvbiByb290IG5vZGVzIGlzIG5vdCBtb3VudGVkIG9uIHRoZSBjbG9uZWQgcm9vdCBub2RlLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBza2VsZXRvbi5qb2ludHMucHVzaChuZXdKb2ludCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5KSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5Lmxlbmd0aDtcbiAgICAgICAgICAgIHNrZWxldG9uLl9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2tlbGV0b24uX2ludkJpbmRQb3NlTWF0cmljZXNBcnJheVtpXSA9IHRoaXMuX2ludkJpbmRQb3NlTWF0cmljZXNBcnJheVtpXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2tlbGV0b24uX3NraW5NYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuXG4gICAgICAgICAgICBza2VsZXRvbi51cGRhdGVNYXRyaWNlc1N1YkFycmF5cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2tlbGV0b24udXBkYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNrZWxldG9uO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LnV0aWwucmFuZFxcbmhpZ2hwIGZsb2F0IHJhbmQodmVjMiB1dikge1xcbiAgICBjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XFxuICAgIGhpZ2hwIGZsb2F0IGR0ID0gZG90KHV2Lnh5LCB2ZWMyKGEsYikpLCBzbiA9IG1vZChkdCwgMy4xNDE1OTI2NTM1ODk3OTMpO1xcbiAgICByZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnV0aWwuY2FsY3VsYXRlX2F0dGVudWF0aW9uXFxudW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkZhY3RvciA6IDUuMDtcXG5mbG9hdCBsaWdodEF0dGVudWF0aW9uKGZsb2F0IGRpc3QsIGZsb2F0IHJhbmdlKVxcbntcXG4gICAgZmxvYXQgYXR0ZW51YXRpb24gPSAxLjA7XFxuICAgIGF0dGVudWF0aW9uID0gZGlzdCpkaXN0LyhyYW5nZSpyYW5nZSsxLjApO1xcbiAgICBmbG9hdCBhdHRfcyA9IGF0dGVudWF0aW9uRmFjdG9yO1xcbiAgICBhdHRlbnVhdGlvbiA9IDEuMC8oYXR0ZW51YXRpb24qYXR0X3MrMS4wKTtcXG4gICAgYXR0X3MgPSAxLjAvKGF0dF9zKzEuMCk7XFxuICAgIGF0dGVudWF0aW9uID0gYXR0ZW51YXRpb24gLSBhdHRfcztcXG4gICAgYXR0ZW51YXRpb24gLz0gMS4wIC0gYXR0X3M7XFxuICAgIHJldHVybiBjbGFtcChhdHRlbnVhdGlvbiwgMC4wLCAxLjApO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnV0aWwuZWRnZV9mYWN0b3JcXG5mbG9hdCBlZGdlRmFjdG9yKGZsb2F0IHdpZHRoKVxcbntcXG4gICAgdmVjMyBkID0gZndpZHRoKHZfQmFyeWNlbnRyaWMpO1xcbiAgICB2ZWMzIGEzID0gc21vb3Roc3RlcCh2ZWMzKDAuMCksIGQgKiB3aWR0aCwgdl9CYXJ5Y2VudHJpYyk7XFxuICAgIHJldHVybiBtaW4obWluKGEzLngsIGEzLnkpLCBhMy56KTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLmVuY29kZV9mbG9hdFxcbnZlYzQgZW5jb2RlRmxvYXQoY29uc3QgaW4gZmxvYXQgZGVwdGgpXFxue1xcbiAgICBjb25zdCB2ZWM0IGJpdFNoaWZ0cyA9IHZlYzQoMjU2LjAqMjU2LjAqMjU2LjAsIDI1Ni4wKjI1Ni4wLCAyNTYuMCwgMS4wKTtcXG4gICAgY29uc3QgdmVjNCBiaXRfbWFzayAgPSB2ZWM0KDAuMCwgMS4wLzI1Ni4wLCAxLjAvMjU2LjAsIDEuMC8yNTYuMCk7XFxuICAgIHZlYzQgcmVzID0gZnJhY3QoZGVwdGggKiBiaXRTaGlmdHMpO1xcbiAgICByZXMgLT0gcmVzLnh4eXogKiBiaXRfbWFzaztcXG4gICAgcmV0dXJuIHJlcztcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbmZsb2F0IGRlY29kZUZsb2F0KGNvbnN0IGluIHZlYzQgY29sb3IpXFxue1xcbiAgICBjb25zdCB2ZWM0IGJpdFNoaWZ0cyA9IHZlYzQoMS4wLygyNTYuMCoyNTYuMCoyNTYuMCksIDEuMC8oMjU2LjAqMjU2LjApLCAxLjAvMjU2LjAsIDEuMCk7XFxuICAgIHJldHVybiBkb3QoY29sb3IsIGJpdFNoaWZ0cyk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkudXRpbC5mbG9hdFxcbkBpbXBvcnQgY2xheS51dGlsLmVuY29kZV9mbG9hdFxcbkBpbXBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbkBlbmRcXG5AZXhwb3J0IGNsYXkudXRpbC5yZ2JtX2RlY29kZVxcbnZlYzMgUkdCTURlY29kZSh2ZWM0IHJnYm0sIGZsb2F0IHJhbmdlKSB7XFxuICByZXR1cm4gcmFuZ2UgKiByZ2JtLnJnYiAqIHJnYm0uYTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnJnYm1fZW5jb2RlXFxudmVjNCBSR0JNRW5jb2RlKHZlYzMgY29sb3IsIGZsb2F0IHJhbmdlKSB7XFxuICAgIGlmIChkb3QoY29sb3IsIGNvbG9yKSA9PSAwLjApIHtcXG4gICAgICAgIHJldHVybiB2ZWM0KDAuMCk7XFxuICAgIH1cXG4gICAgdmVjNCByZ2JtO1xcbiAgICBjb2xvciAvPSByYW5nZTtcXG4gICAgcmdibS5hID0gY2xhbXAobWF4KG1heChjb2xvci5yLCBjb2xvci5nKSwgbWF4KGNvbG9yLmIsIDFlLTYpKSwgMC4wLCAxLjApO1xcbiAgICByZ2JtLmEgPSBjZWlsKHJnYm0uYSAqIDI1NS4wKSAvIDI1NS4wO1xcbiAgICByZ2JtLnJnYiA9IGNvbG9yIC8gcmdibS5hO1xcbiAgICByZXR1cm4gcmdibTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtX2RlY29kZVxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1fZW5jb2RlXFxudmVjNCBkZWNvZGVIRFIodmVjNCBjb2xvcilcXG57XFxuI2lmIGRlZmluZWQoUkdCTV9ERUNPREUpIHx8IGRlZmluZWQoUkdCTSlcXG4gICAgcmV0dXJuIHZlYzQoUkdCTURlY29kZShjb2xvciwgNTEuNSksIDEuMCk7XFxuI2Vsc2VcXG4gICAgcmV0dXJuIGNvbG9yO1xcbiNlbmRpZlxcbn1cXG52ZWM0IGVuY29kZUhEUih2ZWM0IGNvbG9yKVxcbntcXG4jaWYgZGVmaW5lZChSR0JNX0VOQ09ERSkgfHwgZGVmaW5lZChSR0JNKVxcbiAgICByZXR1cm4gUkdCTUVuY29kZShjb2xvci54eXosIDUxLjUpO1xcbiNlbHNlXFxuICAgIHJldHVybiBjb2xvcjtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnNyZ2JcXG52ZWM0IHNSR0JUb0xpbmVhcihpbiB2ZWM0IHZhbHVlKSB7XFxuICAgIHJldHVybiB2ZWM0KG1peChwb3codmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMygwLjA1MjEzMjcwMTQpLCB2ZWMzKDIuNCkpLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMobGVzc1RoYW5FcXVhbCh2YWx1ZS5yZ2IsIHZlYzMoMC4wNDA0NSkpKSksIHZhbHVlLncpO1xcbn1cXG52ZWM0IGxpbmVhclRvc1JHQihpbiB2ZWM0IHZhbHVlKSB7XFxuICAgIHJldHVybiB2ZWM0KG1peChwb3codmFsdWUucmdiLCB2ZWMzKDAuNDE2NjYpKSAqIDEuMDU1IC0gdmVjMygwLjA1NSksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKGxlc3NUaGFuRXF1YWwodmFsdWUucmdiLCB2ZWMzKDAuMDAzMTMwOCkpKSksIHZhbHVlLncpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNodW5rLnNraW5uaW5nX2hlYWRlclxcbiNpZmRlZiBTS0lOTklOR1xcbmF0dHJpYnV0ZSB2ZWMzIHdlaWdodCA6IFdFSUdIVDtcXG5hdHRyaWJ1dGUgdmVjNCBqb2ludCA6IEpPSU5UO1xcbnVuaWZvcm0gbWF0NCBza2luTWF0cml4W0pPSU5UX0NPVU5UXSA6IFNLSU5fTUFUUklYO1xcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBpZHgpIHtcXG4gICAgcmV0dXJuIHNraW5NYXRyaXhbaW50KGlkeCldO1xcbn1cXG4jZW5kaWZcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNodW5rLnNraW5fbWF0cml4XFxubWF0NCBza2luTWF0cml4V1MgPSBnZXRTa2luTWF0cml4KGpvaW50LngpICogd2VpZ2h0Lng7XFxuaWYgKHdlaWdodC55ID4gMWUtNClcXG57XFxuICAgIHNraW5NYXRyaXhXUyArPSBnZXRTa2luTWF0cml4KGpvaW50LnkpICogd2VpZ2h0Lnk7XFxufVxcbmlmICh3ZWlnaHQueiA+IDFlLTQpXFxue1xcbiAgICBza2luTWF0cml4V1MgKz0gZ2V0U2tpbk1hdHJpeChqb2ludC56KSAqIHdlaWdodC56O1xcbn1cXG5mbG9hdCB3ZWlnaHRXID0gMS4wLXdlaWdodC54LXdlaWdodC55LXdlaWdodC56O1xcbmlmICh3ZWlnaHRXID4gMWUtNClcXG57XFxuICAgIHNraW5NYXRyaXhXUyArPSBnZXRTa2luTWF0cml4KGpvaW50LncpICogd2VpZ2h0VztcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnBhcmFsbGF4X2NvcnJlY3RcXG52ZWMzIHBhcmFsbGF4Q29ycmVjdChpbiB2ZWMzIGRpciwgaW4gdmVjMyBwb3MsIGluIHZlYzMgYm94TWluLCBpbiB2ZWMzIGJveE1heCkge1xcbiAgICB2ZWMzIGZpcnN0ID0gKGJveE1heCAtIHBvcykgLyBkaXI7XFxuICAgIHZlYzMgc2Vjb25kID0gKGJveE1pbiAtIHBvcykgLyBkaXI7XFxuICAgIHZlYzMgZnVydGhlciA9IG1heChmaXJzdCwgc2Vjb25kKTtcXG4gICAgZmxvYXQgZGlzdCA9IG1pbihmdXJ0aGVyLngsIG1pbihmdXJ0aGVyLnksIGZ1cnRoZXIueikpO1xcbiAgICB2ZWMzIGZpeGVkUG9zID0gcG9zICsgZGlyICogZGlzdDtcXG4gICAgdmVjMyBib3hDZW50ZXIgPSAoYm94TWF4ICsgYm94TWluKSAqIDAuNTtcXG4gICAgcmV0dXJuIG5vcm1hbGl6ZShmaXhlZFBvcyAtIGJveENlbnRlcik7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkudXRpbC5jbGFtcF9zYW1wbGVcXG52ZWM0IGNsYW1wU2FtcGxlKGNvbnN0IGluIHNhbXBsZXIyRCB0ZXh0dXJlLCBjb25zdCBpbiB2ZWMyIGNvb3JkKVxcbntcXG4jaWZkZWYgU1RFUkVPXFxuICAgIGZsb2F0IGV5ZSA9IHN0ZXAoMC41LCBjb29yZC54KSAqIDAuNTtcXG4gICAgdmVjMiBjb29yZENsYW1wZWQgPSBjbGFtcChjb29yZCwgdmVjMihleWUsIDAuMCksIHZlYzIoMC41ICsgZXllLCAxLjApKTtcXG4jZWxzZVxcbiAgICB2ZWMyIGNvb3JkQ2xhbXBlZCA9IGNsYW1wKGNvb3JkLCB2ZWMyKDAuMCksIHZlYzIoMS4wKSk7XFxuI2VuZGlmXFxuICAgIHJldHVybiB0ZXh0dXJlMkQodGV4dHVyZSwgY29vcmRDbGFtcGVkKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLkFDRVNcXG52ZWMzIEFDRVNUb25lTWFwcGluZyh2ZWMzIGNvbG9yKVxcbntcXG4gICAgY29uc3QgZmxvYXQgQSA9IDIuNTE7XFxuICAgIGNvbnN0IGZsb2F0IEIgPSAwLjAzO1xcbiAgICBjb25zdCBmbG9hdCBDID0gMi40MztcXG4gICAgY29uc3QgZmxvYXQgRCA9IDAuNTk7XFxuICAgIGNvbnN0IGZsb2F0IEUgPSAwLjE0O1xcbiAgICByZXR1cm4gKGNvbG9yICogKEEgKiBjb2xvciArIEIpKSAvIChjb2xvciAqIChDICogY29sb3IgKyBEKSArIEUpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5iYXNpYy52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSB2ZWMyIHV2UmVwZWF0IDogWzEuMCwgMS4wXTtcXG51bmlmb3JtIHZlYzIgdXZPZmZzZXQgOiBbMC4wLCAwLjBdO1xcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkIDogVEVYQ09PUkRfMDtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMzIGJhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuYXR0cmlidXRlIHZlYzQgYV9Db2xvciA6IENPTE9SO1xcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiNpZmRlZiBTS0lOTklOR1xcbiAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgc2tpbm5lZFBvc2l0aW9uID0gKHNraW5NYXRyaXhXUyAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4jZW5kaWZcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkICogdXZSZXBlYXQgKyB1dk9mZnNldDtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuICAgIHZfQ29sb3IgPSBhX0NvbG9yO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmJhc2ljLmZyYWdtZW50XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgZGlmZnVzZU1hcDtcXG51bmlmb3JtIHZlYzMgY29sb3IgOiBbMS4wLCAxLjAsIDEuMF07XFxudW5pZm9ybSB2ZWMzIGVtaXNzaW9uIDogWzAuMCwgMC4wLCAwLjBdO1xcbnVuaWZvcm0gZmxvYXQgYWxwaGEgOiAxLjA7XFxuI2lmZGVmIEFMUEhBX1RFU1RcXG51bmlmb3JtIGZsb2F0IGFscGhhQ3V0b2ZmOiAwLjk7XFxuI2VuZGlmXFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoIDogMC4wO1xcbnVuaWZvcm0gdmVjNCBsaW5lQ29sb3IgOiBbMC4wLCAwLjAsIDAuMCwgMC42XTtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG5AaW1wb3J0IGNsYXkudXRpbC5lZGdlX2ZhY3RvclxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5zcmdiXFxuQGltcG9ydCBjbGF5LnV0aWwuQUNFU1xcbnZvaWQgbWFpbigpXFxue1xcbiNpZmRlZiBSRU5ERVJfVEVYQ09PUkRcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2X1RleGNvb3JkLCAxLjAsIDEuMCk7XFxuICAgIHJldHVybjtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgYWxwaGEpO1xcbiNpZmRlZiBWRVJURVhfQ09MT1JcXG4gICAgZ2xfRnJhZ0NvbG9yICo9IHZfQ29sb3I7XFxuI2VuZGlmXFxuI2lmZGVmIERJRkZVU0VNQVBfRU5BQkxFRFxcbiAgICB2ZWM0IHRleCA9IGRlY29kZUhEUih0ZXh0dXJlMkQoZGlmZnVzZU1hcCwgdl9UZXhjb29yZCkpO1xcbiNpZmRlZiBTUkdCX0RFQ09ERVxcbiAgICB0ZXggPSBzUkdCVG9MaW5lYXIodGV4KTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZChESUZGVVNFTUFQX0FMUEhBX0FMUEhBKVxcbiAgICBnbF9GcmFnQ29sb3IuYSA9IHRleC5hO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IHRleC5yZ2I7XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKz0gZW1pc3Npb247XFxuICAgIGlmKCBsaW5lV2lkdGggPiAwLilcXG4gICAge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peChnbF9GcmFnQ29sb3IucmdiLCBsaW5lQ29sb3IucmdiLCAoMS4wIC0gZWRnZUZhY3RvcihsaW5lV2lkdGgpKSAqIGxpbmVDb2xvci5hKTtcXG4gICAgfVxcbiNpZmRlZiBHQU1NQV9FTkNPREVcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHBvdyhnbF9GcmFnQ29sb3IucmdiLCB2ZWMzKDEgLyAyLjIpKTtcXG4jZW5kaWZcXG4jaWZkZWYgQUxQSEFfVEVTVFxcbiAgICBpZiAoZ2xfRnJhZ0NvbG9yLmEgPCBhbHBoYUN1dG9mZikge1xcbiAgICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiNlbmRpZlxcbiNpZmRlZiBUT05FTUFQUElOR1xcbiAgICBnbF9GcmFnQ29sb3IucmdiID0gQUNFU1RvbmVNYXBwaW5nKGdsX0ZyYWdDb2xvci5yZ2IpO1xcbiNlbmRpZlxcbiNpZmRlZiBTUkdCX0VOQ09ERVxcbiAgICBnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb3NSR0IoZ2xfRnJhZ0NvbG9yKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGdsX0ZyYWdDb2xvcik7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LmxhbWJlcnQudmVydGV4XFxudW5pZm9ybSBtYXQ0IHdvcmxkVmlld1Byb2plY3Rpb24gOiBXT1JMRFZJRVdQUk9KRUNUSU9OO1xcbnVuaWZvcm0gbWF0NCB3b3JsZEludmVyc2VUcmFuc3Bvc2UgOiBXT1JMRElOVkVSU0VUUkFOU1BPU0U7XFxudW5pZm9ybSBtYXQ0IHdvcmxkIDogV09STEQ7XFxudW5pZm9ybSB2ZWMyIHV2UmVwZWF0IDogWzEuMCwgMS4wXTtcXG51bmlmb3JtIHZlYzIgdXZPZmZzZXQgOiBbMC4wLCAwLjBdO1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uIDogUE9TSVRJT047XFxuYXR0cmlidXRlIHZlYzIgdGV4Y29vcmQgOiBURVhDT09SRF8wO1xcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbCA6IE5PUk1BTDtcXG5hdHRyaWJ1dGUgdmVjMyBiYXJ5Y2VudHJpYztcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuYXR0cmlidXRlIHZlYzQgYV9Db2xvciA6IENPTE9SO1xcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMyBza2lubmVkUG9zaXRpb24gPSBwb3NpdGlvbjtcXG4gICAgdmVjMyBza2lubmVkTm9ybWFsID0gbm9ybWFsO1xcbiNpZmRlZiBTS0lOTklOR1xcbiAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgc2tpbm5lZFBvc2l0aW9uID0gKHNraW5NYXRyaXhXUyAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gICAgc2tpbm5lZE5vcm1hbCA9IChza2luTWF0cml4V1MgKiB2ZWM0KG5vcm1hbCwgMC4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KCBza2lubmVkUG9zaXRpb24sIDEuMCApO1xcbiAgICB2X1RleGNvb3JkID0gdGV4Y29vcmQgKiB1dlJlcGVhdCArIHV2T2Zmc2V0O1xcbiAgICB2X05vcm1hbCA9IG5vcm1hbGl6ZSggKCB3b3JsZEludmVyc2VUcmFuc3Bvc2UgKiB2ZWM0KHNraW5uZWROb3JtYWwsIDAuMCkgKS54eXogKTtcXG4gICAgdl9Xb3JsZFBvc2l0aW9uID0gKCB3b3JsZCAqIHZlYzQoIHNraW5uZWRQb3NpdGlvbiwgMS4wKSApLnh5ejtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbiNpZmRlZiBWRVJURVhfQ09MT1JcXG4gICAgdl9Db2xvciA9IGFfQ29sb3I7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkubGFtYmVydC5mcmFnbWVudFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnZhcnlpbmcgdmVjMyB2X05vcm1hbDtcXG52YXJ5aW5nIHZlYzMgdl9Xb3JsZFBvc2l0aW9uO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGRpZmZ1c2VNYXA7XFxudW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XFxudW5pZm9ybSB2ZWMzIGNvbG9yIDogWzEuMCwgMS4wLCAxLjBdO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2lvbiA6IFswLjAsIDAuMCwgMC4wXTtcXG51bmlmb3JtIGZsb2F0IGFscGhhIDogMS4wO1xcbiNpZmRlZiBBTFBIQV9URVNUXFxudW5pZm9ybSBmbG9hdCBhbHBoYUN1dG9mZjogMC45O1xcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoIDogMC4wO1xcbnVuaWZvcm0gdmVjNCBsaW5lQ29sb3IgOiBbMC4wLCAwLjAsIDAuMCwgMC42XTtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxudmFyeWluZyB2ZWM0IHZfQ29sb3I7XFxuI2VuZGlmXFxuI2lmZGVmIEFNQklFTlRfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLmFtYmllbnRfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgQU1CSUVOVF9TSF9MSUdIVF9DT1VOVFxcbkBpbXBvcnQgY2xheS5oZWFkZXIuYW1iaWVudF9zaF9saWdodFxcbiNlbmRpZlxcbiNpZmRlZiBQT0lOVF9MSUdIVF9DT1VOVFxcbkBpbXBvcnQgY2xheS5oZWFkZXIucG9pbnRfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgRElSRUNUSU9OQUxfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLmRpcmVjdGlvbmFsX2xpZ2h0XFxuI2VuZGlmXFxuI2lmZGVmIFNQT1RfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLnNwb3RfbGlnaHRcXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkudXRpbC5jYWxjdWxhdGVfYXR0ZW51YXRpb25cXG5AaW1wb3J0IGNsYXkudXRpbC5lZGdlX2ZhY3RvclxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkucGx1Z2luLmNvbXB1dGVfc2hhZG93X21hcFxcbkBpbXBvcnQgY2xheS51dGlsLkFDRVNcXG52b2lkIG1haW4oKVxcbntcXG4jaWZkZWYgUkVOREVSX05PUk1BTFxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZfTm9ybWFsICogMC41ICsgMC41LCAxLjApO1xcbiAgICByZXR1cm47XFxuI2VuZGlmXFxuI2lmZGVmIFJFTkRFUl9URVhDT09SRFxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZfVGV4Y29vcmQsIDEuMCwgMS4wKTtcXG4gICAgcmV0dXJuO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBhbHBoYSk7XFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbiAgICBnbF9GcmFnQ29sb3IgKj0gdl9Db2xvcjtcXG4jZW5kaWZcXG4jaWZkZWYgRElGRlVTRU1BUF9FTkFCTEVEXFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCBkaWZmdXNlTWFwLCB2X1RleGNvb3JkICk7XFxuI2lmZGVmIFNSR0JfREVDT0RFXFxuICAgIHRleC5yZ2IgPSBwb3codGV4LnJnYiwgdmVjMygyLjIpKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiAqPSB0ZXgucmdiO1xcbiNpZmRlZiBESUZGVVNFTUFQX0FMUEhBX0FMUEhBXFxuICAgIGdsX0ZyYWdDb2xvci5hICo9IHRleC5hO1xcbiNlbmRpZlxcbiNlbmRpZlxcbiAgICB2ZWMzIGRpZmZ1c2VDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuI2lmZGVmIEFNQklFTlRfTElHSFRfQ09VTlRcXG4gICAgZm9yKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgQU1CSUVOVF9MSUdIVF9DT1VOVDsgX2lkeF8rKylcXG4gICAge1xcbiAgICAgICAgZGlmZnVzZUNvbG9yICs9IGFtYmllbnRMaWdodENvbG9yW19pZHhfXTtcXG4gICAgfVxcbiNlbmRpZlxcbiNpZmRlZiBBTUJJRU5UX1NIX0xJR0hUX0NPVU5UXFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IEFNQklFTlRfU0hfTElHSFRfQ09VTlQ7IF9pZHhfKyspXFxuICAgIHt7XFxuICAgICAgICBkaWZmdXNlQ29sb3IgKz0gY2FsY0FtYmllbnRTSExpZ2h0KF9pZHhfLCB2X05vcm1hbCkgKiBhbWJpZW50U0hMaWdodENvbG9yW19pZHhfXTtcXG4gICAgfX1cXG4jZW5kaWZcXG4jaWZkZWYgUE9JTlRfTElHSFRfQ09VTlRcXG4jaWYgZGVmaW5lZChQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWJzUG9pbnRbUE9JTlRfTElHSFRfQ09VTlRdO1xcbiAgICBpZiggc2hhZG93RW5hYmxlZCApXFxuICAgIHtcXG4gICAgICAgIGNvbXB1dGVTaGFkb3dPZlBvaW50TGlnaHRzKHZfV29ybGRQb3NpdGlvbiwgc2hhZG93Q29udHJpYnNQb2ludCk7XFxuICAgIH1cXG4jZW5kaWZcXG4gICAgZm9yKGludCBpID0gMDsgaSA8IFBPSU5UX0xJR0hUX0NPVU5UOyBpKyspXFxuICAgIHtcXG4gICAgICAgIHZlYzMgbGlnaHRQb3NpdGlvbiA9IHBvaW50TGlnaHRQb3NpdGlvbltpXTtcXG4gICAgICAgIHZlYzMgbGlnaHRDb2xvciA9IHBvaW50TGlnaHRDb2xvcltpXTtcXG4gICAgICAgIGZsb2F0IHJhbmdlID0gcG9pbnRMaWdodFJhbmdlW2ldO1xcbiAgICAgICAgdmVjMyBsaWdodERpcmVjdGlvbiA9IGxpZ2h0UG9zaXRpb24gLSB2X1dvcmxkUG9zaXRpb247XFxuICAgICAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIGZsb2F0IGF0dGVudWF0aW9uID0gbGlnaHRBdHRlbnVhdGlvbihkaXN0LCByYW5nZSk7XFxuICAgICAgICBsaWdodERpcmVjdGlvbiAvPSBkaXN0O1xcbiAgICAgICAgZmxvYXQgbmRsID0gZG90KCB2X05vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcXG4gICAgICAgIGZsb2F0IHNoYWRvd0NvbnRyaWIgPSAxLjA7XFxuI2lmIGRlZmluZWQoUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICAgICAgaWYoIHNoYWRvd0VuYWJsZWQgKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic1BvaW50W2ldO1xcbiAgICAgICAgfVxcbiNlbmRpZlxcbiAgICAgICAgZGlmZnVzZUNvbG9yICs9IGxpZ2h0Q29sb3IgKiBjbGFtcChuZGwsIDAuMCwgMS4wKSAqIGF0dGVudWF0aW9uICogc2hhZG93Q29udHJpYjtcXG4gICAgfVxcbiNlbmRpZlxcbiNpZmRlZiBESVJFQ1RJT05BTF9MSUdIVF9DT1VOVFxcbiNpZiBkZWZpbmVkKERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYnNEaXJbRElSRUNUSU9OQUxfTElHSFRfQ09VTlRdO1xcbiAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICB7XFxuICAgICAgICBjb21wdXRlU2hhZG93T2ZEaXJlY3Rpb25hbExpZ2h0cyh2X1dvcmxkUG9zaXRpb24sIHNoYWRvd0NvbnRyaWJzRGlyKTtcXG4gICAgfVxcbiNlbmRpZlxcbiAgICBmb3IoaW50IGkgPSAwOyBpIDwgRElSRUNUSU9OQUxfTElHSFRfQ09VTlQ7IGkrKylcXG4gICAge1xcbiAgICAgICAgdmVjMyBsaWdodERpcmVjdGlvbiA9IC1kaXJlY3Rpb25hbExpZ2h0RGlyZWN0aW9uW2ldO1xcbiAgICAgICAgdmVjMyBsaWdodENvbG9yID0gZGlyZWN0aW9uYWxMaWdodENvbG9yW2ldO1xcbiAgICAgICAgZmxvYXQgbmRsID0gZG90KHZfTm9ybWFsLCBub3JtYWxpemUobGlnaHREaXJlY3Rpb24pKTtcXG4gICAgICAgIGZsb2F0IHNoYWRvd0NvbnRyaWIgPSAxLjA7XFxuI2lmIGRlZmluZWQoRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICAgICAgaWYoIHNoYWRvd0VuYWJsZWQgKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic0RpcltpXTtcXG4gICAgICAgIH1cXG4jZW5kaWZcXG4gICAgICAgIGRpZmZ1c2VDb2xvciArPSBsaWdodENvbG9yICogY2xhbXAobmRsLCAwLjAsIDEuMCkgKiBzaGFkb3dDb250cmliO1xcbiAgICB9XFxuI2VuZGlmXFxuI2lmZGVmIFNQT1RfTElHSFRfQ09VTlRcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYnNTcG90W1NQT1RfTElHSFRfQ09VTlRdO1xcbiAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICB7XFxuICAgICAgICBjb21wdXRlU2hhZG93T2ZTcG90TGlnaHRzKHZfV29ybGRQb3NpdGlvbiwgc2hhZG93Q29udHJpYnNTcG90KTtcXG4gICAgfVxcbiNlbmRpZlxcbiAgICBmb3IoaW50IGkgPSAwOyBpIDwgU1BPVF9MSUdIVF9DT1VOVDsgaSsrKVxcbiAgICB7XFxuICAgICAgICB2ZWMzIGxpZ2h0UG9zaXRpb24gPSAtc3BvdExpZ2h0UG9zaXRpb25baV07XFxuICAgICAgICB2ZWMzIHNwb3RMaWdodERpcmVjdGlvbiA9IC1ub3JtYWxpemUoIHNwb3RMaWdodERpcmVjdGlvbltpXSApO1xcbiAgICAgICAgdmVjMyBsaWdodENvbG9yID0gc3BvdExpZ2h0Q29sb3JbaV07XFxuICAgICAgICBmbG9hdCByYW5nZSA9IHNwb3RMaWdodFJhbmdlW2ldO1xcbiAgICAgICAgZmxvYXQgYSA9IHNwb3RMaWdodFVtYnJhQW5nbGVDb3NpbmVbaV07XFxuICAgICAgICBmbG9hdCBiID0gc3BvdExpZ2h0UGVudW1icmFBbmdsZUNvc2luZVtpXTtcXG4gICAgICAgIGZsb2F0IGZhbGxvZmZGYWN0b3IgPSBzcG90TGlnaHRGYWxsb2ZmRmFjdG9yW2ldO1xcbiAgICAgICAgdmVjMyBsaWdodERpcmVjdGlvbiA9IGxpZ2h0UG9zaXRpb24gLSB2X1dvcmxkUG9zaXRpb247XFxuICAgICAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIGZsb2F0IGF0dGVudWF0aW9uID0gbGlnaHRBdHRlbnVhdGlvbihkaXN0LCByYW5nZSk7XFxuICAgICAgICBsaWdodERpcmVjdGlvbiAvPSBkaXN0O1xcbiAgICAgICAgZmxvYXQgYyA9IGRvdChzcG90TGlnaHREaXJlY3Rpb24sIGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIGZsb2F0IGZhbGxvZmY7XFxuICAgICAgICBmYWxsb2ZmID0gY2xhbXAoKGMgLSBhKSAvKCBiIC0gYSksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZhbGxvZmYgPSBwb3coZmFsbG9mZiwgZmFsbG9mZkZhY3Rvcik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBkb3Qodl9Ob3JtYWwsIGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIG5kbCA9IGNsYW1wKG5kbCwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgICAgIGlmKCBzaGFkb3dFbmFibGVkIClcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBzaGFkb3dDb250cmliID0gc2hhZG93Q29udHJpYnNTcG90W2ldO1xcbiAgICAgICAgfVxcbiNlbmRpZlxcbiAgICAgICAgZGlmZnVzZUNvbG9yICs9IGxpZ2h0Q29sb3IgKiBuZGwgKiBhdHRlbnVhdGlvbiAqICgxLjAtZmFsbG9mZikgKiBzaGFkb3dDb250cmliO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKj0gZGlmZnVzZUNvbG9yO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiICs9IGVtaXNzaW9uO1xcbiAgICBpZihsaW5lV2lkdGggPiAwLilcXG4gICAge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peChnbF9GcmFnQ29sb3IucmdiLCBsaW5lQ29sb3IucmdiLCAoMS4wIC0gZWRnZUZhY3RvcihsaW5lV2lkdGgpKSAqIGxpbmVDb2xvci5hKTtcXG4gICAgfVxcbiNpZmRlZiBBTFBIQV9URVNUXFxuICAgIGlmIChnbF9GcmFnQ29sb3IuYSA8IGFscGhhQ3V0b2ZmKSB7XFxuICAgICAgICBkaXNjYXJkO1xcbiAgICB9XFxuI2VuZGlmXFxuI2lmZGVmIFRPTkVNQVBQSU5HXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBBQ0VTVG9uZU1hcHBpbmcoZ2xfRnJhZ0NvbG9yLnJnYik7XFxuI2VuZGlmXFxuI2lmZGVmIFNSR0JfRU5DT0RFXFxuICAgIGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvc1JHQihnbF9GcmFnQ29sb3IpO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoZ2xfRnJhZ0NvbG9yKTtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkud2lyZWZyYW1lLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG51bmlmb3JtIG1hdDQgd29ybGQgOiBXT1JMRDtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMzIGJhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMyBza2lubmVkUG9zaXRpb24gPSBwb3NpdGlvbjtcXG4jaWZkZWYgU0tJTk5JTkdcXG4gICAgQGltcG9ydCBjbGF5LmNodW5rLnNraW5fbWF0cml4XFxuICAgIHNraW5uZWRQb3NpdGlvbiA9IChza2luTWF0cml4V1MgKiB2ZWM0KHBvc2l0aW9uLCAxLjApKS54eXo7XFxuI2VuZGlmXFxuICAgIGdsX1Bvc2l0aW9uID0gd29ybGRWaWV3UHJvamVjdGlvbiAqIHZlYzQoc2tpbm5lZFBvc2l0aW9uLCAxLjAgKTtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LndpcmVmcmFtZS5mcmFnbWVudFxcbnVuaWZvcm0gdmVjMyBjb2xvciA6IFswLjAsIDAuMCwgMC4wXTtcXG51bmlmb3JtIGZsb2F0IGFscGhhIDogMS4wO1xcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoIDogMS4wO1xcbnZhcnlpbmcgdmVjMyB2X0JhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS51dGlsLmVkZ2VfZmFjdG9yXFxudm9pZCBtYWluKClcXG57XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBjb2xvcjtcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAoMS4wLWVkZ2VGYWN0b3IobGluZVdpZHRoKSkgKiBhbHBoYTtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuc2t5Ym94LnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZCA6IFdPUkxEO1xcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbnZhcnlpbmcgdmVjMyB2X1dvcmxkUG9zaXRpb247XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZfV29ybGRQb3NpdGlvbiA9ICh3b3JsZCAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gICAgZ2xfUG9zaXRpb24gPSB3b3JsZFZpZXdQcm9qZWN0aW9uICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5za3lib3guZnJhZ21lbnRcXG51bmlmb3JtIG1hdDQgdmlld0ludmVyc2UgOiBWSUVXSU5WRVJTRTtcXG51bmlmb3JtIHNhbXBsZXJDdWJlIGVudmlyb25tZW50TWFwO1xcbnVuaWZvcm0gZmxvYXQgbG9kOiAwLjA7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzMgZXllUG9zID0gdmlld0ludmVyc2VbM10ueHl6O1xcbiAgICB2ZWMzIHZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodl9Xb3JsZFBvc2l0aW9uIC0gZXllUG9zKTtcXG4gICAgdmVjMyB0ZXggPSBkZWNvZGVIRFIodGV4dHVyZUN1YmVMb2RFWFQoZW52aXJvbm1lbnRNYXAsIHZpZXdEaXJlY3Rpb24sIGxvZCkpLnJnYjtcXG4jaWZkZWYgU1JHQl9ERUNPREVcXG4gICAgdGV4LnJnYiA9IHBvdyh0ZXgucmdiLCB2ZWMzKDIuMikpO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNCh0ZXgsIDEuMCkpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmNvbG9yYWRqdXN0XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGJyaWdodG5lc3MgOiAwLjA7XFxudW5pZm9ybSBmbG9hdCBjb250cmFzdCA6IDEuMDtcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlIDogMC4wO1xcbnVuaWZvcm0gZmxvYXQgZ2FtbWEgOiAxLjA7XFxudW5pZm9ybSBmbG9hdCBzYXR1cmF0aW9uIDogMS4wO1xcbmNvbnN0IHZlYzMgdyA9IHZlYzMoMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSk7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCB0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IGNsYW1wKHRleC5yZ2IgKyB2ZWMzKGJyaWdodG5lc3MpLCAwLjAsIDEuMCk7XFxuICAgIGNvbG9yID0gY2xhbXAoIChjb2xvci12ZWMzKDAuNSkpKmNvbnRyYXN0K3ZlYzMoMC41KSwgMC4wLCAxLjApO1xcbiAgICBjb2xvciA9IGNsYW1wKCBjb2xvciAqIHBvdygyLjAsIGV4cG9zdXJlKSwgMC4wLCAxLjApO1xcbiAgICBjb2xvciA9IGNsYW1wKCBwb3coY29sb3IsIHZlYzMoZ2FtbWEpKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBsdW1pbmFuY2UgPSBkb3QoIGNvbG9yLCB3ICk7XFxuICAgIGNvbG9yID0gbWl4KHZlYzMobHVtaW5hbmNlKSwgY29sb3IsIHNhdHVyYXRpb24pO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXguYSk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5icmlnaHRuZXNzXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGJyaWdodG5lc3MgOiAwLjA7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCB0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHRleC5yZ2IgKyB2ZWMzKGJyaWdodG5lc3MpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXguYSk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5jb250cmFzdFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSBmbG9hdCBjb250cmFzdCA6IDEuMDtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjNCB0ZXggPSB0ZXh0dXJlMkQoIHRleHR1cmUsIHZfVGV4Y29vcmQpO1xcbiAgICB2ZWMzIGNvbG9yID0gKHRleC5yZ2ItdmVjMygwLjUpKSpjb250cmFzdCt2ZWMzKDAuNSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleC5hKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmV4cG9zdXJlXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlIDogMC4wO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleCA9IHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHRleC5yZ2IgKiBwb3coMi4wLCBleHBvc3VyZSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleC5hKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmdhbW1hXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGdhbW1hIDogMS4wO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleCA9IHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHBvdyh0ZXgucmdiLCB2ZWMzKGdhbW1hKSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleC5hKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLnNhdHVyYXRpb25cXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gZmxvYXQgc2F0dXJhdGlvbiA6IDEuMDtcXG5jb25zdCB2ZWMzIHcgPSB2ZWMzKDAuMjEyNSwgMC43MTU0LCAwLjA3MjEpO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleCA9IHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHRleC5yZ2I7XFxuICAgIGZsb2F0IGx1bWluYW5jZSA9IGRvdChjb2xvciwgdyk7XFxuICAgIGNvbG9yID0gbWl4KHZlYzMobHVtaW5hbmNlKSwgY29sb3IsIHNhdHVyYXRpb24pO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXguYSk7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3Iua2VybmVsLmdhdXNzaWFuXzlcXG5mbG9hdCBnYXVzc2lhbktlcm5lbFs5XTtcXG5nYXVzc2lhbktlcm5lbFswXSA9IDAuMDc7XFxuZ2F1c3NpYW5LZXJuZWxbMV0gPSAwLjA5O1xcbmdhdXNzaWFuS2VybmVsWzJdID0gMC4xMjtcXG5nYXVzc2lhbktlcm5lbFszXSA9IDAuMTQ7XFxuZ2F1c3NpYW5LZXJuZWxbNF0gPSAwLjE2O1xcbmdhdXNzaWFuS2VybmVsWzVdID0gMC4xNDtcXG5nYXVzc2lhbktlcm5lbFs2XSA9IDAuMTI7XFxuZ2F1c3NpYW5LZXJuZWxbN10gPSAwLjA5O1xcbmdhdXNzaWFuS2VybmVsWzhdID0gMC4wNztcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3Iua2VybmVsLmdhdXNzaWFuXzEzXFxuZmxvYXQgZ2F1c3NpYW5LZXJuZWxbMTNdO1xcbmdhdXNzaWFuS2VybmVsWzBdID0gMC4wMjtcXG5nYXVzc2lhbktlcm5lbFsxXSA9IDAuMDM7XFxuZ2F1c3NpYW5LZXJuZWxbMl0gPSAwLjA2O1xcbmdhdXNzaWFuS2VybmVsWzNdID0gMC4wODtcXG5nYXVzc2lhbktlcm5lbFs0XSA9IDAuMTE7XFxuZ2F1c3NpYW5LZXJuZWxbNV0gPSAwLjEzO1xcbmdhdXNzaWFuS2VybmVsWzZdID0gMC4xNDtcXG5nYXVzc2lhbktlcm5lbFs3XSA9IDAuMTM7XFxuZ2F1c3NpYW5LZXJuZWxbOF0gPSAwLjExO1xcbmdhdXNzaWFuS2VybmVsWzldID0gMC4wODtcXG5nYXVzc2lhbktlcm5lbFsxMF0gPSAwLjA2O1xcbmdhdXNzaWFuS2VybmVsWzExXSA9IDAuMDM7XFxuZ2F1c3NpYW5LZXJuZWxbMTJdID0gMC4wMjtcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZ2F1c3NpYW5fYmx1clxcbiNkZWZpbmUgU0hBREVSX05BTUUgZ2F1c3NpYW5fYmx1clxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7dmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBmbG9hdCBibHVyU2l6ZSA6IDIuMDtcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemUgOiBbNTEyLjAsIDUxMi4wXTtcXG51bmlmb3JtIGZsb2F0IGJsdXJEaXIgOiAwLjA7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS51dGlsLmNsYW1wX3NhbXBsZVxcbnZvaWQgbWFpbiAodm9pZClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5jb21wb3NpdG9yLmtlcm5lbC5nYXVzc2lhbl85XFxuICAgIHZlYzIgb2ZmID0gYmx1clNpemUgLyB0ZXh0dXJlU2l6ZTtcXG4gICAgb2ZmICo9IHZlYzIoMS4wIC0gYmx1ckRpciwgYmx1ckRpcik7XFxuICAgIHZlYzQgc3VtID0gdmVjNCgwLjApO1xcbiAgICBmbG9hdCB3ZWlnaHRBbGwgPSAwLjA7XFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7XFxuICAgICAgICBmbG9hdCB3ID0gZ2F1c3NpYW5LZXJuZWxbaV07XFxuICAgICAgICB2ZWM0IHRleGVsID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBmbG9hdChpIC0gNCkgKiBvZmYpKTtcXG4gICAgICAgIHN1bSArPSB0ZXhlbCAqIHc7XFxuICAgICAgICB3ZWlnaHRBbGwgKz0gdztcXG4gICAgfVxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoc3VtIC8gbWF4KHdlaWdodEFsbCwgMC4wMSkpO1xcbn1cXG5AZW5kXFxuXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmhkci5sb2dfbHVtXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG5jb25zdCB2ZWMzIHcgPSB2ZWMzKDAuMjEyNSwgMC43MTU0LCAwLjA3MjEpO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjNCB0ZXggPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHZfVGV4Y29vcmQpKTtcXG4gICAgZmxvYXQgbHVtaW5hbmNlID0gZG90KHRleC5yZ2IsIHcpO1xcbiAgICBsdW1pbmFuY2UgPSBsb2cobHVtaW5hbmNlICsgMC4wMDEpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNCh2ZWMzKGx1bWluYW5jZSksIDEuMCkpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuaGRyLmx1bV9hZGFwdGlvblxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGFkYXB0ZWRMdW07XFxudW5pZm9ybSBzYW1wbGVyMkQgY3VycmVudEx1bTtcXG51bmlmb3JtIGZsb2F0IGZyYW1lVGltZSA6IDAuMDI7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICBmbG9hdCBmQWRhcHRlZEx1bSA9IGRlY29kZUhEUih0ZXh0dXJlMkQoYWRhcHRlZEx1bSwgdmVjMigwLjUsIDAuNSkpKS5yO1xcbiAgICBmbG9hdCBmQ3VycmVudEx1bSA9IGV4cChlbmNvZGVIRFIodGV4dHVyZTJEKGN1cnJlbnRMdW0sIHZlYzIoMC41LCAwLjUpKSkucik7XFxuICAgIGZBZGFwdGVkTHVtICs9IChmQ3VycmVudEx1bSAtIGZBZGFwdGVkTHVtKSAqICgxLjAgLSBwb3coMC45OCwgMzAuMCAqIGZyYW1lVGltZSkpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNCh2ZWMzKGZBZGFwdGVkTHVtKSwgMS4wKSk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5sdW1cXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbmNvbnN0IHZlYzMgdyA9IHZlYzMoMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSk7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCB0ZXh0dXJlLCB2X1RleGNvb3JkICk7XFxuICAgIGZsb2F0IGx1bWluYW5jZSA9IGRvdCh0ZXgucmdiLCB3KTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2ZWMzKGx1bWluYW5jZSksIDEuMCk7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IubHV0XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIHNhbXBsZXIyRCBsb29rdXA7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKHRleHR1cmUsIHZfVGV4Y29vcmQpO1xcbiAgICBmbG9hdCBibHVlQ29sb3IgPSB0ZXguYiAqIDYzLjA7XFxuICAgIHZlYzIgcXVhZDE7XFxuICAgIHF1YWQxLnkgPSBmbG9vcihmbG9vcihibHVlQ29sb3IpIC8gOC4wKTtcXG4gICAgcXVhZDEueCA9IGZsb29yKGJsdWVDb2xvcikgLSAocXVhZDEueSAqIDguMCk7XFxuICAgIHZlYzIgcXVhZDI7XFxuICAgIHF1YWQyLnkgPSBmbG9vcihjZWlsKGJsdWVDb2xvcikgLyA4LjApO1xcbiAgICBxdWFkMi54ID0gY2VpbChibHVlQ29sb3IpIC0gKHF1YWQyLnkgKiA4LjApO1xcbiAgICB2ZWMyIHRleFBvczE7XFxuICAgIHRleFBvczEueCA9IChxdWFkMS54ICogMC4xMjUpICsgMC41LzUxMi4wICsgKCgwLjEyNSAtIDEuMC81MTIuMCkgKiB0ZXgucik7XFxuICAgIHRleFBvczEueSA9IChxdWFkMS55ICogMC4xMjUpICsgMC41LzUxMi4wICsgKCgwLjEyNSAtIDEuMC81MTIuMCkgKiB0ZXguZyk7XFxuICAgIHZlYzIgdGV4UG9zMjtcXG4gICAgdGV4UG9zMi54ID0gKHF1YWQyLnggKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIHRleC5yKTtcXG4gICAgdGV4UG9zMi55ID0gKHF1YWQyLnkgKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIHRleC5nKTtcXG4gICAgdmVjNCBuZXdDb2xvcjEgPSB0ZXh0dXJlMkQobG9va3VwLCB0ZXhQb3MxKTtcXG4gICAgdmVjNCBuZXdDb2xvcjIgPSB0ZXh0dXJlMkQobG9va3VwLCB0ZXhQb3MyKTtcXG4gICAgdmVjNCBuZXdDb2xvciA9IG1peChuZXdDb2xvcjEsIG5ld0NvbG9yMiwgZnJhY3QoYmx1ZUNvbG9yKSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobmV3Q29sb3IucmdiLCB0ZXgudyk7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IudmlnbmV0dGVcXG4jZGVmaW5lIE9VVFBVVF9BTFBIQVxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSBmbG9hdCBkYXJrbmVzczogMTtcXG51bmlmb3JtIGZsb2F0IG9mZnNldDogMTtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ZWwgPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHZfVGV4Y29vcmQpKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHRleGVsLnJnYjtcXG4gICAgdmVjMiB1diA9ICh2X1RleGNvb3JkIC0gdmVjMigwLjUpKSAqIHZlYzIob2Zmc2V0KTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKHZlYzQobWl4KHRleGVsLnJnYiwgdmVjMygxLjAgLSBkYXJrbmVzcyksIGRvdCh1diwgdXYpKSwgdGV4ZWwuYSkpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLm91dHB1dFxcbiNkZWZpbmUgT1VUUFVUX0FMUEhBXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSk7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSB0ZXgucmdiO1xcbiNpZmRlZiBPVVRQVVRfQUxQSEFcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSB0ZXguYTtcXG4jZWxzZVxcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGdsX0ZyYWdDb2xvcik7XFxuI2lmZGVmIFBSRU1VTFRJUExZX0FMUEhBXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuYnJpZ2h0XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IHRocmVzaG9sZCA6IDE7XFxudW5pZm9ybSBmbG9hdCBzY2FsZSA6IDEuMDtcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemU6IFs1MTIsIDUxMl07XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuY29uc3QgdmVjMyBsdW1XZWlnaHQgPSB2ZWMzKDAuMjEyNSwgMC43MTU0LCAwLjA3MjEpO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG52ZWM0IG1lZGlhbih2ZWM0IGEsIHZlYzQgYiwgdmVjNCBjKVxcbntcXG4gICAgcmV0dXJuIGEgKyBiICsgYyAtIG1pbihtaW4oYSwgYiksIGMpIC0gbWF4KG1heChhLCBiKSwgYyk7XFxufVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleGVsID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSk7XFxuI2lmZGVmIEFOVElfRkxJQ0tFUlxcbiAgICB2ZWMzIGQgPSAxLjAgLyB0ZXh0dXJlU2l6ZS54eXggKiB2ZWMzKDEuMCwgMS4wLCAwLjApO1xcbiAgICB2ZWM0IHMxID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkIC0gZC54eikpO1xcbiAgICB2ZWM0IHMyID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54eikpO1xcbiAgICB2ZWM0IHMzID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkIC0gZC56eSkpO1xcbiAgICB2ZWM0IHM0ID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56eSkpO1xcbiAgICB0ZXhlbCA9IG1lZGlhbihtZWRpYW4odGV4ZWwsIHMxLCBzMiksIHMzLCBzNCk7XFxuI2VuZGlmXFxuICAgIGZsb2F0IGx1bSA9IGRvdCh0ZXhlbC5yZ2IgLCBsdW1XZWlnaHQpO1xcbiAgICB2ZWM0IGNvbG9yO1xcbiAgICBpZiAobHVtID4gdGhyZXNob2xkICYmIHRleGVsLmEgPiAwLjApXFxuICAgIHtcXG4gICAgICAgIGNvbG9yID0gdmVjNCh0ZXhlbC5yZ2IgKiBzY2FsZSwgdGV4ZWwuYSAqIHNjYWxlKTtcXG4gICAgfVxcbiAgICBlbHNlXFxuICAgIHtcXG4gICAgICAgIGNvbG9yID0gdmVjNCgwLjApO1xcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvcik7XFxufVxcbkBlbmRcXG5cIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG93bnNhbXBsZVxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuZmxvYXQgYnJpZ2h0bmVzcyh2ZWMzIGMpXFxue1xcbiAgICByZXR1cm4gbWF4KG1heChjLnIsIGMuZyksIGMuYik7XFxufVxcbkBpbXBvcnQgY2xheS51dGlsLmNsYW1wX3NhbXBsZVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsIDEuMCwgMS4wKSAvIHRleHR1cmVTaXplLnh5eHk7XFxuI2lmZGVmIEFOVElfRkxJQ0tFUlxcbiAgICB2ZWMzIHMxID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnh5KSkucmdiO1xcbiAgICB2ZWMzIHMyID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnp5KSkucmdiO1xcbiAgICB2ZWMzIHMzID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnh3KSkucmdiO1xcbiAgICB2ZWMzIHM0ID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnp3KSkucmdiO1xcbiAgICBmbG9hdCBzMXcgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzMSkgKyAxLjApO1xcbiAgICBmbG9hdCBzMncgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzMikgKyAxLjApO1xcbiAgICBmbG9hdCBzM3cgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzMykgKyAxLjApO1xcbiAgICBmbG9hdCBzNHcgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzNCkgKyAxLjApO1xcbiAgICBmbG9hdCBvbmVEaXZpZGVTdW0gPSAxLjAgLyAoczF3ICsgczJ3ICsgczN3ICsgczR3KTtcXG4gICAgdmVjNCBjb2xvciA9IHZlYzQoXFxuICAgICAgICAoczEgKiBzMXcgKyBzMiAqIHMydyArIHMzICogczN3ICsgczQgKiBzNHcpICogb25lRGl2aWRlU3VtLFxcbiAgICAgICAgMS4wXFxuICAgICk7XFxuI2Vsc2VcXG4gICAgdmVjNCBjb2xvciA9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54eSkpO1xcbiAgICBjb2xvciArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQuenkpKTtcXG4gICAgY29sb3IgKz0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnh3KSk7XFxuICAgIGNvbG9yICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56dykpO1xcbiAgICBjb2xvciAqPSAwLjI1O1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoY29sb3IpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIlxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLnVwc2FtcGxlXFxuI2RlZmluZSBISUdIX1FVQUxJVFlcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gdmVjMiB0ZXh0dXJlU2l6ZSA6IFs1MTIsIDUxMl07XFxudW5pZm9ybSBmbG9hdCBzYW1wbGVTY2FsZTogMC41O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5jbGFtcF9zYW1wbGVcXG52b2lkIG1haW4oKVxcbntcXG4jaWZkZWYgSElHSF9RVUFMSVRZXFxuICAgIHZlYzQgZCA9IHZlYzQoMS4wLCAxLjAsIC0xLjAsIDAuMCkgLyB0ZXh0dXJlU2l6ZS54eXh5ICogc2FtcGxlU2NhbGU7XFxuICAgIHZlYzQgcztcXG4gICAgcyAgPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAtIGQueHkpKTtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAtIGQud3kpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAtIGQuenkpKTtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQuencpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAgICAgICApKSAqIDQuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQueHcpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQuenkpKTtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQud3kpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQueHkpKTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKHMgLyAxNi4wKTtcXG4jZWxzZVxcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsICsxLjAsICsxLjApIC8gdGV4dHVyZVNpemUueHl4eTtcXG4gICAgdmVjNCBzO1xcbiAgICBzICA9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54eSkpO1xcbiAgICBzICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56eSkpO1xcbiAgICBzICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54dykpO1xcbiAgICBzICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56dykpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIocyAvIDQuMCk7XFxuI2VuZGlmXFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuaGRyLmNvbXBvc2l0ZVxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxuI2lmZGVmIEJMT09NX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBibG9vbTtcXG4jZW5kaWZcXG4jaWZkZWYgTEVOU0ZMQVJFX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBsZW5zZmxhcmU7XFxudW5pZm9ybSBzYW1wbGVyMkQgbGVuc2RpcnQ7XFxuI2VuZGlmXFxuI2lmZGVmIExVTV9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgbHVtO1xcbiNlbmRpZlxcbiNpZmRlZiBMVVRfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIGx1dDtcXG4jZW5kaWZcXG4jaWZkZWYgQ09MT1JfQ09SUkVDVElPTlxcbnVuaWZvcm0gZmxvYXQgYnJpZ2h0bmVzcyA6IDAuMDtcXG51bmlmb3JtIGZsb2F0IGNvbnRyYXN0IDogMS4wO1xcbnVuaWZvcm0gZmxvYXQgc2F0dXJhdGlvbiA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVklHTkVUVEVcXG51bmlmb3JtIGZsb2F0IHZpZ25ldHRlRGFya25lc3M6IDEuMDtcXG51bmlmb3JtIGZsb2F0IHZpZ25ldHRlT2Zmc2V0OiAxLjA7XFxuI2VuZGlmXFxudW5pZm9ybSBmbG9hdCBleHBvc3VyZSA6IDEuMDtcXG51bmlmb3JtIGZsb2F0IGJsb29tSW50ZW5zaXR5IDogMC4yNTtcXG51bmlmb3JtIGZsb2F0IGxlbnNmbGFyZUludGVuc2l0eSA6IDE7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwuc3JnYlxcbnZlYzMgQUNFU1RvbmVNYXBwaW5nKHZlYzMgY29sb3IpXFxue1xcbiAgICBjb25zdCBmbG9hdCBBID0gMi41MTtcXG4gICAgY29uc3QgZmxvYXQgQiA9IDAuMDM7XFxuICAgIGNvbnN0IGZsb2F0IEMgPSAyLjQzO1xcbiAgICBjb25zdCBmbG9hdCBEID0gMC41OTtcXG4gICAgY29uc3QgZmxvYXQgRSA9IDAuMTQ7XFxuICAgIHJldHVybiAoY29sb3IgKiAoQSAqIGNvbG9yICsgQikpIC8gKGNvbG9yICogKEMgKiBjb2xvciArIEQpICsgRSk7XFxufVxcbmZsb2F0IGV5ZUFkYXB0aW9uKGZsb2F0IGZMdW0pXFxue1xcbiAgICByZXR1cm4gbWl4KDAuMiwgZkx1bSwgMC41KTtcXG59XFxuI2lmZGVmIExVVF9FTkFCTEVEXFxudmVjMyBsdXRUcmFuc2Zvcm0odmVjMyBjb2xvcikge1xcbiAgICBmbG9hdCBibHVlQ29sb3IgPSBjb2xvci5iICogNjMuMDtcXG4gICAgdmVjMiBxdWFkMTtcXG4gICAgcXVhZDEueSA9IGZsb29yKGZsb29yKGJsdWVDb2xvcikgLyA4LjApO1xcbiAgICBxdWFkMS54ID0gZmxvb3IoYmx1ZUNvbG9yKSAtIChxdWFkMS55ICogOC4wKTtcXG4gICAgdmVjMiBxdWFkMjtcXG4gICAgcXVhZDIueSA9IGZsb29yKGNlaWwoYmx1ZUNvbG9yKSAvIDguMCk7XFxuICAgIHF1YWQyLnggPSBjZWlsKGJsdWVDb2xvcikgLSAocXVhZDIueSAqIDguMCk7XFxuICAgIHZlYzIgdGV4UG9zMTtcXG4gICAgdGV4UG9zMS54ID0gKHF1YWQxLnggKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIGNvbG9yLnIpO1xcbiAgICB0ZXhQb3MxLnkgPSAocXVhZDEueSAqIDAuMTI1KSArIDAuNS81MTIuMCArICgoMC4xMjUgLSAxLjAvNTEyLjApICogY29sb3IuZyk7XFxuICAgIHZlYzIgdGV4UG9zMjtcXG4gICAgdGV4UG9zMi54ID0gKHF1YWQyLnggKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIGNvbG9yLnIpO1xcbiAgICB0ZXhQb3MyLnkgPSAocXVhZDIueSAqIDAuMTI1KSArIDAuNS81MTIuMCArICgoMC4xMjUgLSAxLjAvNTEyLjApICogY29sb3IuZyk7XFxuICAgIHZlYzQgbmV3Q29sb3IxID0gdGV4dHVyZTJEKGx1dCwgdGV4UG9zMSk7XFxuICAgIHZlYzQgbmV3Q29sb3IyID0gdGV4dHVyZTJEKGx1dCwgdGV4UG9zMik7XFxuICAgIHZlYzQgbmV3Q29sb3IgPSBtaXgobmV3Q29sb3IxLCBuZXdDb2xvcjIsIGZyYWN0KGJsdWVDb2xvcikpO1xcbiAgICByZXR1cm4gbmV3Q29sb3IucmdiO1xcbn1cXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ZWwgPSB2ZWM0KDAuMCk7XFxuICAgIHZlYzQgb3JpZ2luYWxUZXhlbCA9IHZlYzQoMC4wKTtcXG4jaWZkZWYgVEVYVFVSRV9FTkFCTEVEXFxuICAgIHRleGVsID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSk7XFxuICAgIG9yaWdpbmFsVGV4ZWwgPSB0ZXhlbDtcXG4jZW5kaWZcXG4jaWZkZWYgQkxPT01fRU5BQkxFRFxcbiAgICB2ZWM0IGJsb29tVGV4ZWwgPSBkZWNvZGVIRFIodGV4dHVyZTJEKGJsb29tLCB2X1RleGNvb3JkKSk7XFxuICAgIHRleGVsLnJnYiArPSBibG9vbVRleGVsLnJnYiAqIGJsb29tSW50ZW5zaXR5O1xcbiAgICB0ZXhlbC5hICs9IGJsb29tVGV4ZWwuYSAqIGJsb29tSW50ZW5zaXR5O1xcbiNlbmRpZlxcbiNpZmRlZiBMRU5TRkxBUkVfRU5BQkxFRFxcbiAgICB0ZXhlbCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKGxlbnNmbGFyZSwgdl9UZXhjb29yZCkpICogdGV4dHVyZTJEKGxlbnNkaXJ0LCB2X1RleGNvb3JkKSAqIGxlbnNmbGFyZUludGVuc2l0eTtcXG4jZW5kaWZcXG4gICAgdGV4ZWwuYSA9IG1pbih0ZXhlbC5hLCAxLjApO1xcbiNpZmRlZiBMVU1fRU5BQkxFRFxcbiAgICBmbG9hdCBmTHVtID0gdGV4dHVyZTJEKGx1bSwgdmVjMigwLjUsIDAuNSkpLnI7XFxuICAgIGZsb2F0IGFkYXB0ZWRMdW1EZXN0ID0gMy4wIC8gKG1heCgwLjEsIDEuMCArIDEwLjAqZXllQWRhcHRpb24oZkx1bSkpKTtcXG4gICAgZmxvYXQgZXhwb3N1cmVCaWFzID0gYWRhcHRlZEx1bURlc3QgKiBleHBvc3VyZTtcXG4jZWxzZVxcbiAgICBmbG9hdCBleHBvc3VyZUJpYXMgPSBleHBvc3VyZTtcXG4jZW5kaWZcXG4gICAgdGV4ZWwucmdiICo9IGV4cG9zdXJlQmlhcztcXG4gICAgdGV4ZWwucmdiID0gQUNFU1RvbmVNYXBwaW5nKHRleGVsLnJnYik7XFxuICAgIHRleGVsID0gbGluZWFyVG9zUkdCKHRleGVsKTtcXG4jaWZkZWYgTFVUX0VOQUJMRURcXG4gICAgdGV4ZWwucmdiID0gbHV0VHJhbnNmb3JtKGNsYW1wKHRleGVsLnJnYix2ZWMzKDAuMCksdmVjMygxLjApKSk7XFxuI2VuZGlmXFxuI2lmZGVmIENPTE9SX0NPUlJFQ1RJT05cXG4gICAgdGV4ZWwucmdiID0gY2xhbXAodGV4ZWwucmdiICsgdmVjMyhicmlnaHRuZXNzKSwgMC4wLCAxLjApO1xcbiAgICB0ZXhlbC5yZ2IgPSBjbGFtcCgodGV4ZWwucmdiIC0gdmVjMygwLjUpKSpjb250cmFzdCt2ZWMzKDAuNSksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgbHVtID0gZG90KHRleGVsLnJnYiwgdmVjMygwLjIxMjUsIDAuNzE1NCwgMC4wNzIxKSk7XFxuICAgIHRleGVsLnJnYiA9IG1peCh2ZWMzKGx1bSksIHRleGVsLnJnYiwgc2F0dXJhdGlvbik7XFxuI2VuZGlmXFxuI2lmZGVmIFZJR05FVFRFXFxuICAgIHZlYzIgdXYgPSAodl9UZXhjb29yZCAtIHZlYzIoMC41KSkgKiB2ZWMyKHZpZ25ldHRlT2Zmc2V0KTtcXG4gICAgdGV4ZWwucmdiID0gbWl4KHRleGVsLnJnYiwgdmVjMygxLjAgLSB2aWduZXR0ZURhcmtuZXNzKSwgZG90KHV2LCB1dikpO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodGV4ZWwpO1xcbiNpZmRlZiBERUJVR1xcbiAgICAjaWYgREVCVUcgPT0gMVxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSkpO1xcbiAgICAjZWxpZiBERUJVRyA9PSAyXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihkZWNvZGVIRFIodGV4dHVyZTJEKGJsb29tLCB2X1RleGNvb3JkKSkgKiBibG9vbUludGVuc2l0eSk7XFxuICAgICNlbGlmIERFQlVHID09IDNcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGRlY29kZUhEUih0ZXh0dXJlMkQobGVuc2ZsYXJlLCB2X1RleGNvb3JkKSAqIGxlbnNmbGFyZUludGVuc2l0eSkpO1xcbiAgICAjZW5kaWZcXG4jZW5kaWZcXG4gICAgaWYgKG9yaWdpbmFsVGV4ZWwuYSA8PSAwLjAxICYmIGdsX0ZyYWdDb2xvci5hID4gMWUtNSkge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yLmEgPSBkb3QoZ2xfRnJhZ0NvbG9yLnJnYiwgdmVjMygwLjIxMjUsIDAuNzE1NCwgMC4wNzIxKSk7XFxuICAgIH1cXG4jaWZkZWYgUFJFTVVMVElQTFlfQUxQSEFcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuY29jXFxudW5pZm9ybSBzYW1wbGVyMkQgZGVwdGg7XFxudW5pZm9ybSBmbG9hdCB6TmVhcjogMC4xO1xcbnVuaWZvcm0gZmxvYXQgekZhcjogMjAwMDtcXG51bmlmb3JtIGZsb2F0IGZvY2FsRGlzdDogMztcXG51bmlmb3JtIGZsb2F0IGZvY2FsUmFuZ2U6IDE7XFxudW5pZm9ybSBmbG9hdCBmb2NhbExlbmd0aDogMzA7XFxudW5pZm9ybSBmbG9hdCBmc3RvcDogMi44O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLmVuY29kZV9mbG9hdFxcbnZvaWQgbWFpbigpXFxue1xcbiAgICBmbG9hdCB6ID0gdGV4dHVyZTJEKGRlcHRoLCB2X1RleGNvb3JkKS5yICogMi4wIC0gMS4wO1xcbiAgICBmbG9hdCBkaXN0ID0gMi4wICogek5lYXIgKiB6RmFyIC8gKHpGYXIgKyB6TmVhciAtIHogKiAoekZhciAtIHpOZWFyKSk7XFxuICAgIGZsb2F0IGFwZXJ0dXJlID0gZm9jYWxMZW5ndGggLyBmc3RvcDtcXG4gICAgZmxvYXQgY29jO1xcbiAgICBmbG9hdCB1cHBwZXIgPSBmb2NhbERpc3QgKyBmb2NhbFJhbmdlO1xcbiAgICBmbG9hdCBsb3dlciA9IGZvY2FsRGlzdCAtIGZvY2FsUmFuZ2U7XFxuICAgIGlmIChkaXN0IDw9IHVwcHBlciAmJiBkaXN0ID49IGxvd2VyKSB7XFxuICAgICAgICBjb2MgPSAwLjU7XFxuICAgIH1cXG4gICAgZWxzZSB7XFxuICAgICAgICBmbG9hdCBmb2NhbEFkanVzdGVkID0gZGlzdCA+IHVwcHBlciA/IHVwcHBlciA6IGxvd2VyO1xcbiAgICAgICAgY29jID0gYWJzKGFwZXJ0dXJlICogKGZvY2FsTGVuZ3RoICogKGRpc3QgLSBmb2NhbEFkanVzdGVkKSkgLyAoZGlzdCAqIChmb2NhbEFkanVzdGVkIC0gZm9jYWxMZW5ndGgpKSk7XFxuICAgICAgICBjb2MgPSBjbGFtcChjb2MsIDAuMCwgMC40KSAvIDAuNDAwMDAwMTtcXG4gICAgICAgIGlmIChkaXN0IDwgbG93ZXIpIHtcXG4gICAgICAgICAgICBjb2MgPSAtY29jO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29jID0gY29jICogMC41ICsgMC41O1xcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KGNvYyk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YucHJlbXVsdGlwbHlcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNvYztcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuQGltcG9ydCBjbGF5LnV0aWwuZGVjb2RlX2Zsb2F0XFxudm9pZCBtYWluKCkge1xcbiAgICBmbG9hdCBmQ29jID0gbWF4KGFicyhkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkKSkgKiAyLjAgLSAxLjApLCAwLjEpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoXFxuICAgICAgICB2ZWM0KGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgdl9UZXhjb29yZCkpLnJnYiAqIGZDb2MsIDEuMClcXG4gICAgKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmRvZi5taW5fY29jXFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gdmVjMiB0ZXh0dXJlU2l6ZSA6IFs1MTIuMCwgNTEyLjBdO1xcbkBpbXBvcnQgY2xheS51dGlsLmZsb2F0XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgZCA9IHZlYzQoLTEuMCwgLTEuMCwgMS4wLCAxLjApIC8gdGV4dHVyZVNpemUueHl4eTtcXG4gICAgZmxvYXQgZkNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnh5KSk7XFxuICAgIGZDb2MgPSBtaW4oZkNvYywgZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuenkpKSk7XFxuICAgIGZDb2MgPSBtaW4oZkNvYywgZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQueHcpKSk7XFxuICAgIGZDb2MgPSBtaW4oZkNvYywgZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuencpKSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KGZDb2MpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLm1heF9jb2NcXG51bmlmb3JtIHNhbXBsZXIyRCBjb2M7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMi4wLCA1MTIuMF07XFxuQGltcG9ydCBjbGF5LnV0aWwuZmxvYXRcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjNCBkID0gdmVjNCgtMS4wLCAtMS4wLCAxLjAsIDEuMCkgLyB0ZXh0dXJlU2l6ZS54eXh5O1xcbiAgICBmbG9hdCBmQ29jID0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQueHkpKTtcXG4gICAgZkNvYyA9IG1heChmQ29jLCBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC56eSkpKTtcXG4gICAgZkNvYyA9IG1heChmQ29jLCBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC54dykpKTtcXG4gICAgZkNvYyA9IG1heChmQ29jLCBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC56dykpKTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlRmxvYXQoZkNvYyk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuY29jX3Vwc2FtcGxlXFxuI2RlZmluZSBISUdIX1FVQUxJVFlcXG51bmlmb3JtIHNhbXBsZXIyRCBjb2M7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG51bmlmb3JtIGZsb2F0IHNhbXBsZVNjYWxlOiAwLjU7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwuZmxvYXRcXG52b2lkIG1haW4oKVxcbntcXG4jaWZkZWYgSElHSF9RVUFMSVRZXFxuICAgIHZlYzQgZCA9IHZlYzQoMS4wLCAxLjAsIC0xLjAsIDAuMCkgLyB0ZXh0dXJlU2l6ZS54eXh5ICogc2FtcGxlU2NhbGU7XFxuICAgIGZsb2F0IHM7XFxuICAgIHMgID0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCAtIGQueHkpKTtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkIC0gZC53eSkpICogMi4wO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgLSBkLnp5KSk7XFxuICAgIHMgKz0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuencpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICAgICAgICkpICogNC4wO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnh3KSkgKiAyLjA7XFxuICAgIHMgKz0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuenkpKTtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC53eSkpICogMi4wO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnh5KSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KHMgLyAxNi4wKTtcXG4jZWxzZVxcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsICsxLjAsICsxLjApIC8gdGV4dHVyZVNpemUueHl4eTtcXG4gICAgZmxvYXQgcztcXG4gICAgcyAgPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC54eSkpO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnp5KSk7XFxuICAgIHMgKz0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQueHcpKTtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC56dykpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdChzIC8gNC4wKTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmRvZi51cHNhbXBsZVxcbiNkZWZpbmUgSElHSF9RVUFMSVRZXFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG51bmlmb3JtIGZsb2F0IHNhbXBsZVNjYWxlOiAwLjU7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbmZsb2F0IHRhcCh2ZWMyIHV2LCBpbm91dCB2ZWM0IGNvbG9yLCBmbG9hdCBiYXNlV2VpZ2h0KSB7XFxuICAgIGZsb2F0IHdlaWdodCA9IGFicyhkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB1dikpICogMi4wIC0gMS4wKSAqIGJhc2VXZWlnaHQ7XFxuICAgIGNvbG9yICs9IGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgdXYpKSAqIHdlaWdodDtcXG4gICAgcmV0dXJuIHdlaWdodDtcXG59XFxudm9pZCBtYWluKClcXG57XFxuI2lmZGVmIEhJR0hfUVVBTElUWVxcbiAgICB2ZWM0IGQgPSB2ZWM0KDEuMCwgMS4wLCAtMS4wLCAwLjApIC8gdGV4dHVyZVNpemUueHl4eSAqIHNhbXBsZVNjYWxlO1xcbiAgICB2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcbiAgICBmbG9hdCBiYXNlV2VpZ2h0ID0gMS4wIC8gMTYuMDtcXG4gICAgZmxvYXQgdyAgPSB0YXAodl9UZXhjb29yZCAtIGQueHksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCAtIGQud3ksIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCAtIGQuenksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQuencsIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCAgICAgICAsIGNvbG9yLCBiYXNlV2VpZ2h0ICogNC4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQueHcsIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQuenksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQud3ksIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQueHksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGNvbG9yIC8gdyk7XFxuI2Vsc2VcXG4gICAgdmVjNCBkID0gdmVjNCgtMS4wLCAtMS4wLCArMS4wLCArMS4wKSAvIHRleHR1cmVTaXplLnh5eHk7XFxuICAgIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XFxuICAgIGZsb2F0IGJhc2VXZWlnaHQgPSAxLjAgLyA0LjA7XFxuICAgIGZsb2F0IHcgID0gdGFwKHZfVGV4Y29vcmQgKyBkLnh5LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIHcgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnp5LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIHcgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnh3LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIHcgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnp3LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvciAvIHcpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmRvd25zYW1wbGVcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNvYztcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemUgOiBbNTEyLCA1MTJdO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5kZWNvZGVfZmxvYXRcXG5mbG9hdCB0YXAodmVjMiB1diwgaW5vdXQgdmVjNCBjb2xvcikge1xcbiAgICBmbG9hdCB3ZWlnaHQgPSBhYnMoZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdXYpKSAqIDIuMCAtIDEuMCkgKiAwLjI1O1xcbiAgICBjb2xvciArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHV2KSkgKiB3ZWlnaHQ7XFxuICAgIHJldHVybiB3ZWlnaHQ7XFxufVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsIDEuMCwgMS4wKSAvIHRleHR1cmVTaXplLnh5eHk7XFxuICAgIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XFxuICAgIGZsb2F0IHdlaWdodCA9IHRhcCh2X1RleGNvb3JkICsgZC54eSwgY29sb3IpO1xcbiAgICB3ZWlnaHQgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnp5LCBjb2xvcik7XFxuICAgIHdlaWdodCArPSB0YXAodl9UZXhjb29yZCArIGQueHcsIGNvbG9yKTtcXG4gICAgd2VpZ2h0ICs9IHRhcCh2X1RleGNvb3JkICsgZC56dywgY29sb3IpO1xcbiAgICBjb2xvciAvPSB3ZWlnaHQ7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvcik7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuaGV4YWdvbmFsX2JsdXJfZnJhZ1xcbkBpbXBvcnQgY2xheS51dGlsLmZsb2F0XFxudmVjNCBkb0JsdXIoc2FtcGxlcjJEIHRhcmdldFRleHR1cmUsIHZlYzIgb2Zmc2V0KSB7XFxuI2lmZGVmIEJMVVJfQ09DXFxuICAgIGZsb2F0IGNvY1N1bSA9IDAuMDtcXG4jZWxzZVxcbiAgICB2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcbiNlbmRpZlxcbiAgICBmbG9hdCB3ZWlnaHRTdW0gPSAwLjA7XFxuICAgIGZsb2F0IGtlcm5lbFdlaWdodCA9IDEuMCAvIGZsb2F0KEtFUk5FTF9TSVpFKTtcXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLRVJORUxfU0laRTsgaSsrKSB7XFxuICAgICAgICB2ZWMyIGNvb3JkID0gdl9UZXhjb29yZCArIG9mZnNldCAqIGZsb2F0KGkpO1xcbiAgICAgICAgZmxvYXQgdyA9IGtlcm5lbFdlaWdodDtcXG4jaWZkZWYgQkxVUl9DT0NcXG4gICAgICAgIGZsb2F0IGZDb2MgPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQodGFyZ2V0VGV4dHVyZSwgY29vcmQpKSAqIDIuMCAtIDEuMDtcXG4gICAgICAgIGNvY1N1bSArPSBjbGFtcChmQ29jLCAtMS4wLCAwLjApICogdztcXG4jZWxzZVxcbiAgICAgICAgZmxvYXQgZkNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIGNvb3JkKSkgKiAyLjAgLSAxLjA7XFxuICAgICAgICB2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHRhcmdldFRleHR1cmUsIGNvb3JkKTtcXG4gICAgI2lmICFkZWZpbmVkKEJMVVJfTkVBUkZJRUxEKVxcbiAgICAgICAgdyAqPSBhYnMoZkNvYyk7XFxuICAgICNlbmRpZlxcbiAgICAgICAgY29sb3IgKz0gZGVjb2RlSERSKHRleGVsKSAqIHc7XFxuI2VuZGlmXFxuICAgICAgICB3ZWlnaHRTdW0gKz0gdztcXG4gICAgfVxcbiNpZmRlZiBCTFVSX0NPQ1xcbiAgICByZXR1cm4gZW5jb2RlRmxvYXQoY2xhbXAoY29jU3VtIC8gd2VpZ2h0U3VtLCAtMS4wLCAwLjApICogMC41ICsgMC41KTtcXG4jZWxzZVxcbiAgICByZXR1cm4gY29sb3IgLyB3ZWlnaHRTdW07XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuaGV4YWdvbmFsX2JsdXJfMVxcbiNkZWZpbmUgS0VSTkVMX1NJWkUgNVxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gZmxvYXQgYmx1clNpemUgOiAxLjA7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMi4wLCA1MTIuMF07XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS5jb21wb3NpdG9yLmRvZi5oZXhhZ29uYWxfYmx1cl9mcmFnXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzIgb2Zmc2V0ID0gYmx1clNpemUgLyB0ZXh0dXJlU2l6ZTtcXG4jaWYgIWRlZmluZWQoQkxVUl9ORUFSRklFTEQpICYmICFkZWZpbmVkKEJMVVJfQ09DKVxcbiAgICBvZmZzZXQgKj0gYWJzKGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQpKSAqIDIuMCAtIDEuMCk7XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvciA9IGRvQmx1cih0ZXh0dXJlLCB2ZWMyKDAuMCwgb2Zmc2V0LnkpKTtcXG4jaWYgIWRlZmluZWQoQkxVUl9DT0MpXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihnbF9GcmFnQ29sb3IpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmhleGFnb25hbF9ibHVyXzJcXG4jZGVmaW5lIEtFUk5FTF9TSVpFIDVcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNvYztcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG51bmlmb3JtIGZsb2F0IGJsdXJTaXplIDogMS4wO1xcbnVuaWZvcm0gdmVjMiB0ZXh0dXJlU2l6ZSA6IFs1MTIuMCwgNTEyLjBdO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuaGV4YWdvbmFsX2JsdXJfZnJhZ1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMyIG9mZnNldCA9IGJsdXJTaXplIC8gdGV4dHVyZVNpemU7XFxuI2lmICFkZWZpbmVkKEJMVVJfTkVBUkZJRUxEKSAmJiAhZGVmaW5lZChCTFVSX0NPQylcXG4gICAgb2Zmc2V0ICo9IGFicyhkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkKSkgKiAyLjAgLSAxLjApO1xcbiNlbmRpZlxcbiAgICBvZmZzZXQueSAvPSAyLjA7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGRvQmx1cih0ZXh0dXJlLCAtb2Zmc2V0KTtcXG4jaWYgIWRlZmluZWQoQkxVUl9DT0MpXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihnbF9GcmFnQ29sb3IpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmhleGFnb25hbF9ibHVyXzNcXG4jZGVmaW5lIEtFUk5FTF9TSVpFIDVcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMTtcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMjtcXG51bmlmb3JtIHNhbXBsZXIyRCBjb2M7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBmbG9hdCBibHVyU2l6ZSA6IDEuMDtcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemUgOiBbNTEyLjAsIDUxMi4wXTtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuQGltcG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmhleGFnb25hbF9ibHVyX2ZyYWdcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMiBvZmZzZXQgPSBibHVyU2l6ZSAvIHRleHR1cmVTaXplO1xcbiNpZiAhZGVmaW5lZChCTFVSX05FQVJGSUVMRCkgJiYgIWRlZmluZWQoQkxVUl9DT0MpXFxuICAgIG9mZnNldCAqPSBhYnMoZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCkpICogMi4wIC0gMS4wKTtcXG4jZW5kaWZcXG4gICAgb2Zmc2V0LnkgLz0gMi4wO1xcbiAgICB2ZWMyIHZEb3duUmlnaHQgPSB2ZWMyKG9mZnNldC54LCAtb2Zmc2V0LnkpO1xcbiAgICB2ZWM0IHRleGVsMSA9IGRvQmx1cih0ZXh0dXJlMSwgLW9mZnNldCk7XFxuICAgIHZlYzQgdGV4ZWwyID0gZG9CbHVyKHRleHR1cmUxLCB2RG93blJpZ2h0KTtcXG4gICAgdmVjNCB0ZXhlbDMgPSBkb0JsdXIodGV4dHVyZTIsIHZEb3duUmlnaHQpO1xcbiNpZmRlZiBCTFVSX0NPQ1xcbiAgICBmbG9hdCBjb2MxID0gZGVjb2RlRmxvYXQodGV4ZWwxKSAqIDIuMCAtIDEuMDtcXG4gICAgZmxvYXQgY29jMiA9IGRlY29kZUZsb2F0KHRleGVsMikgKiAyLjAgLSAxLjA7XFxuICAgIGZsb2F0IGNvYzMgPSBkZWNvZGVGbG9hdCh0ZXhlbDMpICogMi4wIC0gMS4wO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdChcXG4gICAgICAgICgoY29jMSArIGNvYzIgKyBjb2MzKSAvIDMuMCkgKiAwLjUgKyAwLjVcXG4gICAgKTtcXG4jZWxzZVxcbiAgICB2ZWM0IGNvbG9yID0gKHRleGVsMSArIHRleGVsMiArIHRleGVsMykgLyAzLjA7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvcik7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuY29tcG9zaXRlXFxuI2RlZmluZSBERUJVRyAwXFxudW5pZm9ybSBzYW1wbGVyMkQgb3JpZ2luYWw7XFxudW5pZm9ybSBzYW1wbGVyMkQgYmx1cnJlZDtcXG51bmlmb3JtIHNhbXBsZXIyRCBuZWFyZmllbGQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnVuaWZvcm0gc2FtcGxlcjJEIG5lYXJjb2M7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS51dGlsLmZsb2F0XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgYmx1cnJlZENvbG9yID0gZGVjb2RlSERSKHRleHR1cmUyRChibHVycmVkLCB2X1RleGNvb3JkKSk7XFxuICAgIHZlYzQgb3JpZ2luYWxDb2xvciA9IGRlY29kZUhEUih0ZXh0dXJlMkQob3JpZ2luYWwsIHZfVGV4Y29vcmQpKTtcXG4gICAgZmxvYXQgZkNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQpKTtcXG4gICAgZkNvYyA9IGFicyhmQ29jICogMi4wIC0gMS4wKTtcXG4gICAgZmxvYXQgd2VpZ2h0ID0gc21vb3Roc3RlcCgwLjAsIDEuMCwgZkNvYyk7XFxuI2lmZGVmIE5FQVJGSUVMRF9FTkFCTEVEXFxuICAgIHZlYzQgbmVhcmZpZWxkQ29sb3IgPSBkZWNvZGVIRFIodGV4dHVyZTJEKG5lYXJmaWVsZCwgdl9UZXhjb29yZCkpO1xcbiAgICBmbG9hdCBmTmVhckNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChuZWFyY29jLCB2X1RleGNvb3JkKSk7XFxuICAgIGZOZWFyQ29jID0gYWJzKGZOZWFyQ29jICogMi4wIC0gMS4wKTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKFxcbiAgICAgICAgbWl4KFxcbiAgICAgICAgICAgIG5lYXJmaWVsZENvbG9yLCBtaXgob3JpZ2luYWxDb2xvciwgYmx1cnJlZENvbG9yLCB3ZWlnaHQpLFxcbiAgICAgICAgICAgIHBvdygxLjAgLSBmTmVhckNvYywgNC4wKVxcbiAgICAgICAgKVxcbiAgICApO1xcbiNlbHNlXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihtaXgob3JpZ2luYWxDb2xvciwgYmx1cnJlZENvbG9yLCB3ZWlnaHQpKTtcXG4jZW5kaWZcXG4jaWYgREVCVUcgPT0gMVxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoZkNvYyksIDEuMCk7XFxuI2VsaWYgREVCVUcgPT0gMlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoZk5lYXJDb2MpLCAxLjApO1xcbiNlbGlmIERFQlVHID09IDNcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGJsdXJyZWRDb2xvcik7XFxuI2VsaWYgREVCVUcgPT0gNFxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIobmVhcmZpZWxkQ29sb3IpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmxlbnNmbGFyZVxcbiNkZWZpbmUgU0FNUExFX05VTUJFUiA4XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIHNhbXBsZXIyRCBsZW5zY29sb3I7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG51bmlmb3JtIGZsb2F0IGRpc3BlcnNhbCA6IDAuMztcXG51bmlmb3JtIGZsb2F0IGhhbG9XaWR0aCA6IDAuNDtcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb24gOiAxLjA7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbnZlYzQgdGV4dHVyZURpc3RvcnRlZChcXG4gICAgaW4gdmVjMiB0ZXhjb29yZCxcXG4gICAgaW4gdmVjMiBkaXJlY3Rpb24sXFxuICAgIGluIHZlYzMgZGlzdG9ydGlvblxcbikge1xcbiAgICByZXR1cm4gdmVjNChcXG4gICAgICAgIGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgdGV4Y29vcmQgKyBkaXJlY3Rpb24gKiBkaXN0b3J0aW9uLnIpKS5yLFxcbiAgICAgICAgZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB0ZXhjb29yZCArIGRpcmVjdGlvbiAqIGRpc3RvcnRpb24uZykpLmcsXFxuICAgICAgICBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHRleGNvb3JkICsgZGlyZWN0aW9uICogZGlzdG9ydGlvbi5iKSkuYixcXG4gICAgICAgIDEuMFxcbiAgICApO1xcbn1cXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMiB0ZXhjb29yZCA9IC12X1RleGNvb3JkICsgdmVjMigxLjApOyAgICB2ZWMyIHRleHR1cmVPZmZzZXQgPSAxLjAgLyB0ZXh0dXJlU2l6ZTtcXG4gICAgdmVjMiBnaG9zdFZlYyA9ICh2ZWMyKDAuNSkgLSB0ZXhjb29yZCkgKiBkaXNwZXJzYWw7XFxuICAgIHZlYzIgaGFsb1ZlYyA9IG5vcm1hbGl6ZShnaG9zdFZlYykgKiBoYWxvV2lkdGg7XFxuICAgIHZlYzMgZGlzdG9ydGlvbiA9IHZlYzMoLXRleHR1cmVPZmZzZXQueCAqIGRpc3RvcnRpb24sIDAuMCwgdGV4dHVyZU9mZnNldC54ICogZGlzdG9ydGlvbik7XFxuICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNBTVBMRV9OVU1CRVI7IGkrKylcXG4gICAge1xcbiAgICAgICAgdmVjMiBvZmZzZXQgPSBmcmFjdCh0ZXhjb29yZCArIGdob3N0VmVjICogZmxvYXQoaSkpO1xcbiAgICAgICAgZmxvYXQgd2VpZ2h0ID0gbGVuZ3RoKHZlYzIoMC41KSAtIG9mZnNldCkgLyBsZW5ndGgodmVjMigwLjUpKTtcXG4gICAgICAgIHdlaWdodCA9IHBvdygxLjAgLSB3ZWlnaHQsIDEwLjApO1xcbiAgICAgICAgcmVzdWx0ICs9IHRleHR1cmVEaXN0b3J0ZWQob2Zmc2V0LCBub3JtYWxpemUoZ2hvc3RWZWMpLCBkaXN0b3J0aW9uKSAqIHdlaWdodDtcXG4gICAgfVxcbiAgICByZXN1bHQgKj0gdGV4dHVyZTJEKGxlbnNjb2xvciwgdmVjMihsZW5ndGgodmVjMigwLjUpIC0gdGV4Y29vcmQpKSAvIGxlbmd0aCh2ZWMyKDAuNSkpKTtcXG4gICAgZmxvYXQgd2VpZ2h0ID0gbGVuZ3RoKHZlYzIoMC41KSAtIGZyYWN0KHRleGNvb3JkICsgaGFsb1ZlYykpIC8gbGVuZ3RoKHZlYzIoMC41KSk7XFxuICAgIHdlaWdodCA9IHBvdygxLjAgLSB3ZWlnaHQsIDEwLjApO1xcbiAgICB2ZWMyIG9mZnNldCA9IGZyYWN0KHRleGNvb3JkICsgaGFsb1ZlYyk7XFxuICAgIHJlc3VsdCArPSB0ZXh0dXJlRGlzdG9ydGVkKG9mZnNldCwgbm9ybWFsaXplKGdob3N0VmVjKSwgZGlzdG9ydGlvbikgKiB3ZWlnaHQ7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHJlc3VsdDtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5ibGVuZFxcbiNkZWZpbmUgU0hBREVSX05BTUUgYmxlbmRcXG4jaWZkZWYgVEVYVFVSRTFfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUxO1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0MSA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTJfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUyO1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0MiA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTNfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUzO1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0MyA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTRfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU0O1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0NCA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTVfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU1O1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0NSA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTZfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU2O1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0NiA6IDEuMDtcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdmVjNCgwLjApO1xcbiNpZmRlZiBURVhUVVJFMV9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUxLCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQxO1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFMl9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUyLCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQyO1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFM19FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUzLCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQzO1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFNF9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmU0LCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQ0O1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFNV9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmU1LCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQ1O1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFNl9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmU2LCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQ2O1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodGV4KTtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5meGFhXFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIHZlYzQgdmlld3BvcnQgOiBWSUVXUE9SVDtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG4jZGVmaW5lIEZYQUFfUkVEVUNFX01JTiAgICgxLjAvMTI4LjApXFxuI2RlZmluZSBGWEFBX1JFRFVDRV9NVUwgICAoMS4wLzguMClcXG4jZGVmaW5lIEZYQUFfU1BBTl9NQVggICAgIDguMFxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMiByZXNvbHV0aW9uID0gMS4wIC8gdmlld3BvcnQuenc7XFxuICAgIHZlYzMgcmdiTlcgPSAgZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggLTEuMCwgLTEuMCApICkgKiByZXNvbHV0aW9uICkgKS54eXo7XFxuICAgIHZlYzMgcmdiTkUgPSBkZWNvZGVIRFIoIHRleHR1cmUyRCggdGV4dHVyZSwgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAxLjAsIC0xLjAgKSApICogcmVzb2x1dGlvbiApICkueHl6O1xcbiAgICB2ZWMzIHJnYlNXID0gZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggLTEuMCwgMS4wICkgKSAqIHJlc29sdXRpb24gKSApLnh5ejtcXG4gICAgdmVjMyByZ2JTRSA9IGRlY29kZUhEUiggdGV4dHVyZTJEKCB0ZXh0dXJlLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDEuMCwgMS4wICkgKSAqIHJlc29sdXRpb24gKSApLnh5ejtcXG4gICAgdmVjNCByZ2JhTSAgPSBkZWNvZGVIRFIoIHRleHR1cmUyRCggdGV4dHVyZSwgIGdsX0ZyYWdDb29yZC54eSAgKiByZXNvbHV0aW9uICkgKTtcXG4gICAgdmVjMyByZ2JNICA9IHJnYmFNLnh5ejtcXG4gICAgZmxvYXQgb3BhY2l0eSAgPSByZ2JhTS53O1xcbiAgICB2ZWMzIGx1bWEgPSB2ZWMzKCAwLjI5OSwgMC41ODcsIDAuMTE0ICk7XFxuICAgIGZsb2F0IGx1bWFOVyA9IGRvdCggcmdiTlcsIGx1bWEgKTtcXG4gICAgZmxvYXQgbHVtYU5FID0gZG90KCByZ2JORSwgbHVtYSApO1xcbiAgICBmbG9hdCBsdW1hU1cgPSBkb3QoIHJnYlNXLCBsdW1hICk7XFxuICAgIGZsb2F0IGx1bWFTRSA9IGRvdCggcmdiU0UsIGx1bWEgKTtcXG4gICAgZmxvYXQgbHVtYU0gID0gZG90KCByZ2JNLCAgbHVtYSApO1xcbiAgICBmbG9hdCBsdW1hTWluID0gbWluKCBsdW1hTSwgbWluKCBtaW4oIGx1bWFOVywgbHVtYU5FICksIG1pbiggbHVtYVNXLCBsdW1hU0UgKSApICk7XFxuICAgIGZsb2F0IGx1bWFNYXggPSBtYXgoIGx1bWFNLCBtYXgoIG1heCggbHVtYU5XLCBsdW1hTkUpICwgbWF4KCBsdW1hU1csIGx1bWFTRSApICkgKTtcXG4gICAgdmVjMiBkaXI7XFxuICAgIGRpci54ID0gLSgobHVtYU5XICsgbHVtYU5FKSAtIChsdW1hU1cgKyBsdW1hU0UpKTtcXG4gICAgZGlyLnkgPSAgKChsdW1hTlcgKyBsdW1hU1cpIC0gKGx1bWFORSArIGx1bWFTRSkpO1xcbiAgICBmbG9hdCBkaXJSZWR1Y2UgPSBtYXgoICggbHVtYU5XICsgbHVtYU5FICsgbHVtYVNXICsgbHVtYVNFICkgKiAoIDAuMjUgKiBGWEFBX1JFRFVDRV9NVUwgKSwgRlhBQV9SRURVQ0VfTUlOICk7XFxuICAgIGZsb2F0IHJjcERpck1pbiA9IDEuMCAvICggbWluKCBhYnMoIGRpci54ICksIGFicyggZGlyLnkgKSApICsgZGlyUmVkdWNlICk7XFxuICAgIGRpciA9IG1pbiggdmVjMiggRlhBQV9TUEFOX01BWCwgIEZYQUFfU1BBTl9NQVgpLFxcbiAgICAgICAgICBtYXgoIHZlYzIoLUZYQUFfU1BBTl9NQVgsIC1GWEFBX1NQQU5fTUFYKSxcXG4gICAgICAgICAgICAgICAgZGlyICogcmNwRGlyTWluKSkgKiByZXNvbHV0aW9uO1xcbiAgICB2ZWMzIHJnYkEgPSBkZWNvZGVIRFIoIHRleHR1cmUyRCggdGV4dHVyZSwgZ2xfRnJhZ0Nvb3JkLnh5ICAqIHJlc29sdXRpb24gKyBkaXIgKiAoIDEuMCAvIDMuMCAtIDAuNSApICkgKS54eXo7XFxuICAgIHJnYkEgKz0gZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsIGdsX0ZyYWdDb29yZC54eSAgKiByZXNvbHV0aW9uICsgZGlyICogKCAyLjAgLyAzLjAgLSAwLjUgKSApICkueHl6O1xcbiAgICByZ2JBICo9IDAuNTtcXG4gICAgdmVjMyByZ2JCID0gZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsIGdsX0ZyYWdDb29yZC54eSAgKiByZXNvbHV0aW9uICsgZGlyICogLTAuNSApICkueHl6O1xcbiAgICByZ2JCICs9IGRlY29kZUhEUiggdGV4dHVyZTJEKCB0ZXh0dXJlLCBnbF9GcmFnQ29vcmQueHkgICogcmVzb2x1dGlvbiArIGRpciAqIDAuNSApICkueHl6O1xcbiAgICByZ2JCICo9IDAuMjU7XFxuICAgIHJnYkIgKz0gcmdiQSAqIDAuNTtcXG4gICAgZmxvYXQgbHVtYUIgPSBkb3QoIHJnYkIsIGx1bWEgKTtcXG4gICAgaWYgKCAoIGx1bWFCIDwgbHVtYU1pbiApIHx8ICggbHVtYUIgPiBsdW1hTWF4ICkgKVxcbiAgICB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KCByZ2JBLCBvcGFjaXR5ICk7XFxuICAgIH1cXG4gICAgZWxzZSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KCByZ2JCLCBvcGFjaXR5ICk7XFxuICAgIH1cXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5meGFhM1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSB2ZWM0IHZpZXdwb3J0IDogVklFV1BPUlQ7XFxudW5pZm9ybSBmbG9hdCBzdWJwaXhlbDogMC43NTtcXG51bmlmb3JtIGZsb2F0IGVkZ2VUaHJlc2hvbGQ6IDAuMTI1O1xcbnVuaWZvcm0gZmxvYXQgZWRnZVRocmVzaG9sZE1pbjogMC4wNjI1O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5mbG9hdCBGeGFhTHVtYSh2ZWM0IHJnYmEpIHsgcmV0dXJuIHJnYmEueTsgfVxcbnZlYzQgRnhhYVBpeGVsU2hhZGVyKFxcbiAgICB2ZWMyIHBvc1xcbiAgICAsc2FtcGxlcjJEIHRleFxcbiAgICAsdmVjMiBmeGFhUXVhbGl0eVJjcEZyYW1lXFxuICAgICxmbG9hdCBmeGFhUXVhbGl0eVN1YnBpeFxcbiAgICAsZmxvYXQgZnhhYVF1YWxpdHlFZGdlVGhyZXNob2xkXFxuICAgICxmbG9hdCBmeGFhUXVhbGl0eUVkZ2VUaHJlc2hvbGRNaW5cXG4pIHtcXG4gICAgdmVjMiBwb3NNO1xcbiAgICBwb3NNLnggPSBwb3MueDtcXG4gICAgcG9zTS55ID0gcG9zLnk7XFxuICAgIHZlYzQgcmdieU0gPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc00sIDAuMCkpO1xcbiAgICBmbG9hdCBsdW1hUyA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAwLjAsIDEuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hRSA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAxLjAsIDAuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hTiA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAwLjAsLTEuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hVyA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKC0xLjAsIDAuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBtYXhTTSA9IG1heChsdW1hUywgcmdieU0ueSk7XFxuICAgIGZsb2F0IG1pblNNID0gbWluKGx1bWFTLCByZ2J5TS55KTtcXG4gICAgZmxvYXQgbWF4RVNNID0gbWF4KGx1bWFFLCBtYXhTTSk7XFxuICAgIGZsb2F0IG1pbkVTTSA9IG1pbihsdW1hRSwgbWluU00pO1xcbiAgICBmbG9hdCBtYXhXTiA9IG1heChsdW1hTiwgbHVtYVcpO1xcbiAgICBmbG9hdCBtaW5XTiA9IG1pbihsdW1hTiwgbHVtYVcpO1xcbiAgICBmbG9hdCByYW5nZU1heCA9IG1heChtYXhXTiwgbWF4RVNNKTtcXG4gICAgZmxvYXQgcmFuZ2VNaW4gPSBtaW4obWluV04sIG1pbkVTTSk7XFxuICAgIGZsb2F0IHJhbmdlTWF4U2NhbGVkID0gcmFuZ2VNYXggKiBmeGFhUXVhbGl0eUVkZ2VUaHJlc2hvbGQ7XFxuICAgIGZsb2F0IHJhbmdlID0gcmFuZ2VNYXggLSByYW5nZU1pbjtcXG4gICAgZmxvYXQgcmFuZ2VNYXhDbGFtcGVkID0gbWF4KGZ4YWFRdWFsaXR5RWRnZVRocmVzaG9sZE1pbiwgcmFuZ2VNYXhTY2FsZWQpO1xcbiAgICBib29sIGVhcmx5RXhpdCA9IHJhbmdlIDwgcmFuZ2VNYXhDbGFtcGVkO1xcbiAgICBpZihlYXJseUV4aXQpIHJldHVybiByZ2J5TTtcXG4gICAgZmxvYXQgbHVtYU5XID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NNICsgKHZlYzIoLTEuMCwtMS4wKSAqIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpLCAwLjApKSk7XFxuICAgIGZsb2F0IGx1bWFTRSA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAxLjAsIDEuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hTkUgPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc00gKyAodmVjMiggMS4wLC0xLjApICogZnhhYVF1YWxpdHlSY3BGcmFtZS54eSksIDAuMCkpKTtcXG4gICAgZmxvYXQgbHVtYVNXID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NNICsgKHZlYzIoLTEuMCwgMS4wKSAqIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpLCAwLjApKSk7XFxuICAgIGZsb2F0IGx1bWFOUyA9IGx1bWFOICsgbHVtYVM7XFxuICAgIGZsb2F0IGx1bWFXRSA9IGx1bWFXICsgbHVtYUU7XFxuICAgIGZsb2F0IHN1YnBpeFJjcFJhbmdlID0gMS4wL3JhbmdlO1xcbiAgICBmbG9hdCBzdWJwaXhOU1dFID0gbHVtYU5TICsgbHVtYVdFO1xcbiAgICBmbG9hdCBlZGdlSG9yejEgPSAoLTIuMCAqIHJnYnlNLnkpICsgbHVtYU5TO1xcbiAgICBmbG9hdCBlZGdlVmVydDEgPSAoLTIuMCAqIHJnYnlNLnkpICsgbHVtYVdFO1xcbiAgICBmbG9hdCBsdW1hTkVTRSA9IGx1bWFORSArIGx1bWFTRTtcXG4gICAgZmxvYXQgbHVtYU5XTkUgPSBsdW1hTlcgKyBsdW1hTkU7XFxuICAgIGZsb2F0IGVkZ2VIb3J6MiA9ICgtMi4wICogbHVtYUUpICsgbHVtYU5FU0U7XFxuICAgIGZsb2F0IGVkZ2VWZXJ0MiA9ICgtMi4wICogbHVtYU4pICsgbHVtYU5XTkU7XFxuICAgIGZsb2F0IGx1bWFOV1NXID0gbHVtYU5XICsgbHVtYVNXO1xcbiAgICBmbG9hdCBsdW1hU1dTRSA9IGx1bWFTVyArIGx1bWFTRTtcXG4gICAgZmxvYXQgZWRnZUhvcno0ID0gKGFicyhlZGdlSG9yejEpICogMi4wKSArIGFicyhlZGdlSG9yejIpO1xcbiAgICBmbG9hdCBlZGdlVmVydDQgPSAoYWJzKGVkZ2VWZXJ0MSkgKiAyLjApICsgYWJzKGVkZ2VWZXJ0Mik7XFxuICAgIGZsb2F0IGVkZ2VIb3J6MyA9ICgtMi4wICogbHVtYVcpICsgbHVtYU5XU1c7XFxuICAgIGZsb2F0IGVkZ2VWZXJ0MyA9ICgtMi4wICogbHVtYVMpICsgbHVtYVNXU0U7XFxuICAgIGZsb2F0IGVkZ2VIb3J6ID0gYWJzKGVkZ2VIb3J6MykgKyBlZGdlSG9yejQ7XFxuICAgIGZsb2F0IGVkZ2VWZXJ0ID0gYWJzKGVkZ2VWZXJ0MykgKyBlZGdlVmVydDQ7XFxuICAgIGZsb2F0IHN1YnBpeE5XU1dORVNFID0gbHVtYU5XU1cgKyBsdW1hTkVTRTtcXG4gICAgZmxvYXQgbGVuZ3RoU2lnbiA9IGZ4YWFRdWFsaXR5UmNwRnJhbWUueDtcXG4gICAgYm9vbCBob3J6U3BhbiA9IGVkZ2VIb3J6ID49IGVkZ2VWZXJ0O1xcbiAgICBmbG9hdCBzdWJwaXhBID0gc3VicGl4TlNXRSAqIDIuMCArIHN1YnBpeE5XU1dORVNFO1xcbiAgICBpZighaG9yelNwYW4pIGx1bWFOID0gbHVtYVc7XFxuICAgIGlmKCFob3J6U3BhbikgbHVtYVMgPSBsdW1hRTtcXG4gICAgaWYoaG9yelNwYW4pIGxlbmd0aFNpZ24gPSBmeGFhUXVhbGl0eVJjcEZyYW1lLnk7XFxuICAgIGZsb2F0IHN1YnBpeEIgPSAoc3VicGl4QSAqICgxLjAvMTIuMCkpIC0gcmdieU0ueTtcXG4gICAgZmxvYXQgZ3JhZGllbnROID0gbHVtYU4gLSByZ2J5TS55O1xcbiAgICBmbG9hdCBncmFkaWVudFMgPSBsdW1hUyAtIHJnYnlNLnk7XFxuICAgIGZsb2F0IGx1bWFOTiA9IGx1bWFOICsgcmdieU0ueTtcXG4gICAgZmxvYXQgbHVtYVNTID0gbHVtYVMgKyByZ2J5TS55O1xcbiAgICBib29sIHBhaXJOID0gYWJzKGdyYWRpZW50TikgPj0gYWJzKGdyYWRpZW50Uyk7XFxuICAgIGZsb2F0IGdyYWRpZW50ID0gbWF4KGFicyhncmFkaWVudE4pLCBhYnMoZ3JhZGllbnRTKSk7XFxuICAgIGlmKHBhaXJOKSBsZW5ndGhTaWduID0gLWxlbmd0aFNpZ247XFxuICAgIGZsb2F0IHN1YnBpeEMgPSBjbGFtcChhYnMoc3VicGl4QikgKiBzdWJwaXhSY3BSYW5nZSwgMC4wLCAxLjApO1xcbiAgICB2ZWMyIHBvc0I7XFxuICAgIHBvc0IueCA9IHBvc00ueDtcXG4gICAgcG9zQi55ID0gcG9zTS55O1xcbiAgICB2ZWMyIG9mZk5QO1xcbiAgICBvZmZOUC54ID0gKCFob3J6U3BhbikgPyAwLjAgOiBmeGFhUXVhbGl0eVJjcEZyYW1lLng7XFxuICAgIG9mZk5QLnkgPSAoIGhvcnpTcGFuKSA/IDAuMCA6IGZ4YWFRdWFsaXR5UmNwRnJhbWUueTtcXG4gICAgaWYoIWhvcnpTcGFuKSBwb3NCLnggKz0gbGVuZ3RoU2lnbiAqIDAuNTtcXG4gICAgaWYoIGhvcnpTcGFuKSBwb3NCLnkgKz0gbGVuZ3RoU2lnbiAqIDAuNTtcXG4gICAgdmVjMiBwb3NOO1xcbiAgICBwb3NOLnggPSBwb3NCLnggLSBvZmZOUC54ICogMS4wO1xcbiAgICBwb3NOLnkgPSBwb3NCLnkgLSBvZmZOUC55ICogMS4wO1xcbiAgICB2ZWMyIHBvc1A7XFxuICAgIHBvc1AueCA9IHBvc0IueCArIG9mZk5QLnggKiAxLjA7XFxuICAgIHBvc1AueSA9IHBvc0IueSArIG9mZk5QLnkgKiAxLjA7XFxuICAgIGZsb2F0IHN1YnBpeEQgPSAoKC0yLjApKnN1YnBpeEMpICsgMy4wO1xcbiAgICBmbG9hdCBsdW1hRW5kTiA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTiwgMC4wKSkpO1xcbiAgICBmbG9hdCBzdWJwaXhFID0gc3VicGl4QyAqIHN1YnBpeEM7XFxuICAgIGZsb2F0IGx1bWFFbmRQID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NQLCAwLjApKSk7XFxuICAgIGlmKCFwYWlyTikgbHVtYU5OID0gbHVtYVNTO1xcbiAgICBmbG9hdCBncmFkaWVudFNjYWxlZCA9IGdyYWRpZW50ICogMS4wLzQuMDtcXG4gICAgZmxvYXQgbHVtYU1NID0gcmdieU0ueSAtIGx1bWFOTiAqIDAuNTtcXG4gICAgZmxvYXQgc3VicGl4RiA9IHN1YnBpeEQgKiBzdWJwaXhFO1xcbiAgICBib29sIGx1bWFNTFRaZXJvID0gbHVtYU1NIDwgMC4wO1xcbiAgICBsdW1hRW5kTiAtPSBsdW1hTk4gKiAwLjU7XFxuICAgIGx1bWFFbmRQIC09IGx1bWFOTiAqIDAuNTtcXG4gICAgYm9vbCBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgIGJvb2wgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICBpZighZG9uZU4pIHBvc04ueCAtPSBvZmZOUC54ICogMS41O1xcbiAgICBpZighZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogMS41O1xcbiAgICBib29sIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgICBpZighZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogMS41O1xcbiAgICBpZighZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogMS41O1xcbiAgICBpZihkb25lTlApIHtcXG4gICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc04ueHksIDAuMCkpKTtcXG4gICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc1AueHksIDAuMCkpKTtcXG4gICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBsdW1hRW5kTiAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgIGRvbmVQID0gYWJzKGx1bWFFbmRQKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgIGlmKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiAyLjA7XFxuICAgICAgICBpZighZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogMi4wO1xcbiAgICAgICAgZG9uZU5QID0gKCFkb25lTikgfHwgKCFkb25lUCk7XFxuICAgICAgICBpZighZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogMi4wO1xcbiAgICAgICAgaWYoIWRvbmVQKSBwb3NQLnkgKz0gb2ZmTlAueSAqIDIuMDtcXG4gICAgICAgIGlmKGRvbmVOUCkge1xcbiAgICAgICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc04ueHksIDAuMCkpKTtcXG4gICAgICAgICAgICBpZighZG9uZVApIGx1bWFFbmRQID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NQLnh5LCAwLjApKSk7XFxuICAgICAgICAgICAgaWYoIWRvbmVOKSBsdW1hRW5kTiA9IGx1bWFFbmROIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgIGlmKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiA0LjA7XFxuICAgICAgICAgICAgaWYoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIDQuMDtcXG4gICAgICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgICAgICBpZighZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogNC4wO1xcbiAgICAgICAgICAgIGlmKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiA0LjA7XFxuICAgICAgICAgICAgaWYoZG9uZU5QKSB7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc04ueHksIDAuMCkpKTtcXG4gICAgICAgICAgICAgICAgaWYoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zUC54eSwgMC4wKSkpO1xcbiAgICAgICAgICAgICAgICBpZighZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICAgICAgZG9uZU4gPSBhYnMobHVtYUVuZE4pID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICBkb25lUCA9IGFicyhsdW1hRW5kUCkgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiAxMi4wO1xcbiAgICAgICAgICAgICAgICBpZighZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogMTIuMDtcXG4gICAgICAgICAgICAgICAgZG9uZU5QID0gKCFkb25lTikgfHwgKCFkb25lUCk7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lUCkgcG9zUC54ICs9IG9mZk5QLnggKiAxMi4wO1xcbiAgICAgICAgICAgICAgICBpZighZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogMTIuMDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZmxvYXQgZHN0TiA9IHBvc00ueCAtIHBvc04ueDtcXG4gICAgZmxvYXQgZHN0UCA9IHBvc1AueCAtIHBvc00ueDtcXG4gICAgaWYoIWhvcnpTcGFuKSBkc3ROID0gcG9zTS55IC0gcG9zTi55O1xcbiAgICBpZighaG9yelNwYW4pIGRzdFAgPSBwb3NQLnkgLSBwb3NNLnk7XFxuICAgIGJvb2wgZ29vZFNwYW5OID0gKGx1bWFFbmROIDwgMC4wKSAhPSBsdW1hTUxUWmVybztcXG4gICAgZmxvYXQgc3Bhbkxlbmd0aCA9IChkc3RQICsgZHN0Tik7XFxuICAgIGJvb2wgZ29vZFNwYW5QID0gKGx1bWFFbmRQIDwgMC4wKSAhPSBsdW1hTUxUWmVybztcXG4gICAgZmxvYXQgc3Bhbkxlbmd0aFJjcCA9IDEuMC9zcGFuTGVuZ3RoO1xcbiAgICBib29sIGRpcmVjdGlvbk4gPSBkc3ROIDwgZHN0UDtcXG4gICAgZmxvYXQgZHN0ID0gbWluKGRzdE4sIGRzdFApO1xcbiAgICBib29sIGdvb2RTcGFuID0gZGlyZWN0aW9uTiA/IGdvb2RTcGFuTiA6IGdvb2RTcGFuUDtcXG4gICAgZmxvYXQgc3VicGl4RyA9IHN1YnBpeEYgKiBzdWJwaXhGO1xcbiAgICBmbG9hdCBwaXhlbE9mZnNldCA9IChkc3QgKiAoLXNwYW5MZW5ndGhSY3ApKSArIDAuNTtcXG4gICAgZmxvYXQgc3VicGl4SCA9IHN1YnBpeEcgKiBmeGFhUXVhbGl0eVN1YnBpeDtcXG4gICAgZmxvYXQgcGl4ZWxPZmZzZXRHb29kID0gZ29vZFNwYW4gPyBwaXhlbE9mZnNldCA6IDAuMDtcXG4gICAgZmxvYXQgcGl4ZWxPZmZzZXRTdWJwaXggPSBtYXgocGl4ZWxPZmZzZXRHb29kLCBzdWJwaXhIKTtcXG4gICAgaWYoIWhvcnpTcGFuKSBwb3NNLnggKz0gcGl4ZWxPZmZzZXRTdWJwaXggKiBsZW5ndGhTaWduO1xcbiAgICBpZiggaG9yelNwYW4pIHBvc00ueSArPSBwaXhlbE9mZnNldFN1YnBpeCAqIGxlbmd0aFNpZ247XFxuICAgIHJldHVybiB2ZWM0KGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSwgMC4wKSkueHl6LCByZ2J5TS55KTtcXG59XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgY29sb3IgPSBGeGFhUGl4ZWxTaGFkZXIoXFxuICAgICAgICB2X1RleGNvb3JkLFxcbiAgICAgICAgdGV4dHVyZSxcXG4gICAgICAgIHZlYzIoMS4wKSAvIHZpZXdwb3J0Lnp3LFxcbiAgICAgICAgc3VicGl4ZWwsXFxuICAgICAgICBlZGdlVGhyZXNob2xkLFxcbiAgICAgICAgZWRnZVRocmVzaG9sZE1pblxcbiAgICApO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiwgMS4wKTtcXG59XFxuQGVuZFwiO1xuIiwiaW1wb3J0IGxpZ2h0RXNzbCBmcm9tICcuL3NvdXJjZS9oZWFkZXIvbGlnaHQnO1xuaW1wb3J0IHV0aWxFc3NsIGZyb20gJy4vc291cmNlL3V0aWwuZ2xzbC5qcyc7XG5cbmltcG9ydCBiYXNpY0Vzc2wgZnJvbSAnLi9zb3VyY2UvYmFzaWMuZ2xzbC5qcyc7XG5pbXBvcnQgbGFtYmVydEVzc2wgZnJvbSAnLi9zb3VyY2UvbGFtYmVydC5nbHNsLmpzJztcbmltcG9ydCBzdGFuZGFyZEVzc2wgZnJvbSAnLi9zb3VyY2Uvc3RhbmRhcmQuZ2xzbC5qcyc7XG5pbXBvcnQgd2lyZWZyYW1lRXNzbCBmcm9tICcuL3NvdXJjZS93aXJlZnJhbWUuZ2xzbC5qcyc7XG5pbXBvcnQgc2t5Ym94RXNzbCBmcm9tICcuL3NvdXJjZS9za3lib3guZ2xzbC5qcyc7XG5pbXBvcnQgcHJlekVzc2wgZnJvbSAnLi9zb3VyY2UvcHJlei5nbHNsLmpzJztcblxuaW1wb3J0IGxpYnJhcnkgZnJvbSAnLi9saWJyYXJ5JztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcblxuXG5TaGFkZXJbJ2ltcG9ydCddKGxpZ2h0RXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKHV0aWxFc3NsKTtcblxuLy8gU29tZSBidWlsZCBpbiBzaGFkZXJzXG5TaGFkZXJbJ2ltcG9ydCddKGJhc2ljRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGxhbWJlcnRFc3NsKTtcblNoYWRlclsnaW1wb3J0J10oc3RhbmRhcmRFc3NsKTtcblNoYWRlclsnaW1wb3J0J10od2lyZWZyYW1lRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKHNreWJveEVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShwcmV6RXNzbCk7XG5cbmxpYnJhcnkudGVtcGxhdGUoJ2NsYXkuYmFzaWMnLCBTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLmZyYWdtZW50JykpO1xubGlicmFyeS50ZW1wbGF0ZSgnY2xheS5sYW1iZXJ0JywgU2hhZGVyLnNvdXJjZSgnY2xheS5sYW1iZXJ0LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LmxhbWJlcnQuZnJhZ21lbnQnKSk7XG5saWJyYXJ5LnRlbXBsYXRlKCdjbGF5LndpcmVmcmFtZScsIFNoYWRlci5zb3VyY2UoJ2NsYXkud2lyZWZyYW1lLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LndpcmVmcmFtZS5mcmFnbWVudCcpKTtcbmxpYnJhcnkudGVtcGxhdGUoJ2NsYXkuc2t5Ym94JywgU2hhZGVyLnNvdXJjZSgnY2xheS5za3lib3gudmVydGV4JyksIFNoYWRlci5zb3VyY2UoJ2NsYXkuc2t5Ym94LmZyYWdtZW50JykpO1xubGlicmFyeS50ZW1wbGF0ZSgnY2xheS5wcmV6JywgU2hhZGVyLnNvdXJjZSgnY2xheS5wcmV6LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnByZXouZnJhZ21lbnQnKSk7XG5saWJyYXJ5LnRlbXBsYXRlKCdjbGF5LnN0YW5kYXJkJywgU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZC52ZXJ0ZXgnKSwgU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZC5mcmFnbWVudCcpKTtcbmxpYnJhcnkudGVtcGxhdGUoJ2NsYXkuc3RhbmRhcmRNUicsIFNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmRNUi52ZXJ0ZXgnKSwgU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZE1SLmZyYWdtZW50JykpO1xuXG5cbmltcG9ydCBjb2xvcmFkanVzdEVzc2wgZnJvbSAnLi9zb3VyY2UvY29tcG9zaXRvci9jb2xvcmFkanVzdC5nbHNsLmpzJztcbmltcG9ydCBibHVyRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2JsdXIuZ2xzbC5qcyc7XG5pbXBvcnQgbHVtRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2x1bS5nbHNsLmpzJztcbmltcG9ydCBsdXRFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvbHV0Lmdsc2wuanMnO1xuaW1wb3J0IHZpZ2VudHRlRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL3ZpZ25ldHRlLmdsc2wuanMnO1xuaW1wb3J0IG91dHB1dEVzc2wgZnJvbSAnLi9zb3VyY2UvY29tcG9zaXRvci9vdXRwdXQuZ2xzbC5qcyc7XG5pbXBvcnQgYnJpZ2h0RXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2JyaWdodC5nbHNsLmpzJztcbmltcG9ydCBkb3duc2FtcGxlRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2Rvd25zYW1wbGUuZ2xzbC5qcyc7XG5pbXBvcnQgdXBzYW1wbGVFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvdXBzYW1wbGUuZ2xzbC5qcyc7XG5pbXBvcnQgaGRyRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2hkci5nbHNsLmpzJztcbmltcG9ydCBkb2ZFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvZG9mLmdsc2wuanMnO1xuaW1wb3J0IGxlbnNmbGFyZUVzc2wgZnJvbSAnLi9zb3VyY2UvY29tcG9zaXRvci9sZW5zZmxhcmUuZ2xzbC5qcyc7XG5pbXBvcnQgYmxlbmRFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvYmxlbmQuZ2xzbC5qcyc7XG5cbmltcG9ydCBmeGFhRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2Z4YWEuZ2xzbC5qcyc7XG5pbXBvcnQgZnhhYTNFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvZnhhYTMuZ2xzbC5qcyc7XG5cbi8vIFNvbWUgYnVpbGQgaW4gc2hhZGVyc1xuU2hhZGVyWydpbXBvcnQnXShjb2xvcmFkanVzdEVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShibHVyRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGx1bUVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShsdXRFc3NsKTtcblNoYWRlclsnaW1wb3J0J10odmlnZW50dGVFc3NsKTtcblNoYWRlclsnaW1wb3J0J10ob3V0cHV0RXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGJyaWdodEVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShkb3duc2FtcGxlRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKHVwc2FtcGxlRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGhkckVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShkb2ZFc3NsKTtcblNoYWRlclsnaW1wb3J0J10obGVuc2ZsYXJlRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGJsZW5kRXNzbCk7XG5cblNoYWRlclsnaW1wb3J0J10oZnhhYUVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShmeGFhM0Vzc2wpO1xuIiwiLyoqXG4gKiBnbFRGIExvYWRlclxuICogU3BlY2lmaWNhdGlvbiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi9SRUFETUUubWRcbiAqXG4gKiBUT0RPIE1vcnBoIHRhcmdldHNcbiAqL1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vY29yZS9CYXNlJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL2NvcmUvcmVxdWVzdCc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9jb3JlL3V0aWwnO1xuaW1wb3J0IHZlbmRvciBmcm9tICcuLi9jb3JlL3ZlbmRvcic7XG5cbmltcG9ydCBTY2VuZSBmcm9tICcuLi9TY2VuZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IFN0YW5kYXJkTWF0ZXJpYWwgZnJvbSAnLi4vU3RhbmRhcmRNYXRlcmlhbCc7XG5pbXBvcnQgTWVzaCBmcm9tICcuLi9NZXNoJztcbmltcG9ydCBOb2RlIGZyb20gJy4uL05vZGUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgc2hhZGVyTGlicmFyeSBmcm9tICcuLi9zaGFkZXIvbGlicmFyeSc7XG5pbXBvcnQgU2tlbGV0b24gZnJvbSAnLi4vU2tlbGV0b24nO1xuaW1wb3J0IEpvaW50IGZyb20gJy4uL0pvaW50JztcbmltcG9ydCBQZXJzcGVjdGl2ZUNhbWVyYSBmcm9tICcuLi9jYW1lcmEvUGVyc3BlY3RpdmUnO1xuaW1wb3J0IE9ydGhvZ3JhcGhpY0NhbWVyYSBmcm9tICcuLi9jYW1lcmEvT3J0aG9ncmFwaGljJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi4vY29yZS9nbGVudW0nO1xuXG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi4vbWF0aC9Cb3VuZGluZ0JveCc7XG5cbmltcG9ydCBUcmFja0NsaXAgZnJvbSAnLi4vYW5pbWF0aW9uL1RyYWNrQ2xpcCc7XG5pbXBvcnQgU2FtcGxlclRyYWNrIGZyb20gJy4uL2FuaW1hdGlvbi9TYW1wbGVyVHJhY2snO1xuXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuXG4vLyBJbXBvcnQgYnVpbHRpbiBzaGFkZXJcbmltcG9ydCAnLi4vc2hhZGVyL2J1aWx0aW4nO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuXG52YXIgc2VtYW50aWNBdHRyaWJ1dGVNYXAgPSB7XG4gICAgJ05PUk1BTCc6ICdub3JtYWwnLFxuICAgICdQT1NJVElPTic6ICdwb3NpdGlvbicsXG4gICAgJ1RFWENPT1JEXzAnOiAndGV4Y29vcmQwJyxcbiAgICAnVEVYQ09PUkRfMSc6ICd0ZXhjb29yZDEnLFxuICAgICdXRUlHSFRTXzAnOiAnd2VpZ2h0JyxcbiAgICAnSk9JTlRTXzAnOiAnam9pbnQnLFxuICAgICdDT0xPUic6ICdjb2xvcidcbn07XG5cbnZhciBBUlJBWV9DVE9SX01BUCA9IHtcbiAgICA1MTIwOiB2ZW5kb3IuSW50OEFycmF5LFxuICAgIDUxMjE6IHZlbmRvci5VaW50OEFycmF5LFxuICAgIDUxMjI6IHZlbmRvci5JbnQxNkFycmF5LFxuICAgIDUxMjM6IHZlbmRvci5VaW50MTZBcnJheSxcbiAgICA1MTI1OiB2ZW5kb3IuVWludDMyQXJyYXksXG4gICAgNTEyNjogdmVuZG9yLkZsb2F0MzJBcnJheVxufTtcbnZhciBTSVpFX01BUCA9IHtcbiAgICBTQ0FMQVI6IDEsXG4gICAgVkVDMjogMixcbiAgICBWRUMzOiAzLFxuICAgIFZFQzQ6IDQsXG4gICAgTUFUMjogNCxcbiAgICBNQVQzOiA5LFxuICAgIE1BVDQ6IDE2XG59O1xuXG5mdW5jdGlvbiBnZXRBY2Nlc3NvckRhdGEoanNvbiwgbGliLCBhY2Nlc3NvcklkeCwgaXNJbmRpY2VzKSB7XG4gICAgdmFyIGFjY2Vzc29ySW5mbyA9IGpzb24uYWNjZXNzb3JzW2FjY2Vzc29ySWR4XTtcblxuICAgIHZhciBidWZmZXIgPSBsaWIuYnVmZmVyVmlld3NbYWNjZXNzb3JJbmZvLmJ1ZmZlclZpZXddO1xuICAgIHZhciBieXRlT2Zmc2V0ID0gYWNjZXNzb3JJbmZvLmJ5dGVPZmZzZXQgfHwgMDtcbiAgICB2YXIgQXJyYXlDdG9yID0gQVJSQVlfQ1RPUl9NQVBbYWNjZXNzb3JJbmZvLmNvbXBvbmVudFR5cGVdIHx8IHZlbmRvci5GbG9hdDMyQXJyYXk7XG5cbiAgICB2YXIgc2l6ZSA9IFNJWkVfTUFQW2FjY2Vzc29ySW5mby50eXBlXTtcbiAgICBpZiAoc2l6ZSA9PSBudWxsICYmIGlzSW5kaWNlcykge1xuICAgICAgICBzaXplID0gMTtcbiAgICB9XG4gICAgdmFyIGFyciA9IG5ldyBBcnJheUN0b3IoYnVmZmVyLCBieXRlT2Zmc2V0LCBzaXplICogYWNjZXNzb3JJbmZvLmNvdW50KTtcblxuICAgIHZhciBxdWFudGl6ZUV4dGVuc2lvbiA9IGFjY2Vzc29ySW5mby5leHRlbnNpb25zICYmIGFjY2Vzc29ySW5mby5leHRlbnNpb25zWydXRUIzRF9xdWFudGl6ZWRfYXR0cmlidXRlcyddO1xuICAgIGlmIChxdWFudGl6ZUV4dGVuc2lvbikge1xuICAgICAgICB2YXIgZGVjb2RlZEFyciA9IG5ldyB2ZW5kb3IuRmxvYXQzMkFycmF5KHNpemUgKiBhY2Nlc3NvckluZm8uY291bnQpO1xuICAgICAgICB2YXIgZGVjb2RlTWF0cml4ID0gcXVhbnRpemVFeHRlbnNpb24uZGVjb2RlTWF0cml4O1xuICAgICAgICB2YXIgZGVjb2RlT2Zmc2V0LCBkZWNvZGVTY2FsZTtcbiAgICAgICAgdmFyIGRlY29kZU9mZnNldCA9IG5ldyBBcnJheShzaXplKTtcbiAgICAgICAgdmFyIGRlY29kZVNjYWxlID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNpemU7IGsrKykge1xuICAgICAgICAgICAgZGVjb2RlT2Zmc2V0W2tdID0gZGVjb2RlTWF0cml4W3NpemUgKiAoc2l6ZSArIDEpICsga107XG4gICAgICAgICAgICBkZWNvZGVTY2FsZVtrXSA9IGRlY29kZU1hdHJpeFtrICogKHNpemUgKyAxKSArIGtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXNzb3JJbmZvLmNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlZEFycltpICogc2l6ZSArIGtdID0gYXJyW2kgKiBzaXplICsga10gKiBkZWNvZGVTY2FsZVtrXSArIGRlY29kZU9mZnNldFtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFyciA9IGRlY29kZWRBcnI7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gY2xheS5sb2FkZXIuR0xURi5JUmVzdWx0XG4gKiBAcHJvcGVydHkge09iamVjdH0ganNvblxuICogQHByb3BlcnR5IHtjbGF5LlNjZW5lfSBzY2VuZVxuICogQHByb3BlcnR5IHtjbGF5Lk5vZGV9IHJvb3ROb2RlXG4gKiBAcHJvcGVydHkge2NsYXkuQ2FtZXJhW119IGNhbWVyYXNcbiAqIEBwcm9wZXJ0eSB7Y2xheS5UZXh0dXJlW119IHRleHR1cmVzXG4gKiBAcHJvcGVydHkge2NsYXkuTWF0ZXJpYWxbXX0gbWF0ZXJpYWxzXG4gKiBAcHJvcGVydHkge2NsYXkuU2tlbGV0b25bXX0gc2tlbGV0b25zXG4gKiBAcHJvcGVydHkge2NsYXkuTWVzaFtdfSBtZXNoZXNcbiAqIEBwcm9wZXJ0eSB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwW119IGNsaXBzXG4gKiBAcHJvcGVydHkge2NsYXkuTm9kZVtdfSBub2Rlc1xuICovXG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkubG9hZGVyLkdMVEZcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBHTFRGTG9hZGVyID0gQmFzZS5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkubG9hZGVyLkdMVEYjICovXG57XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIHJvb3ROb2RlOiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJvb3QgcGF0aCBmb3IgdXJpIHBhcnNpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICByb290UGF0aDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFJvb3QgcGF0aCBmb3IgdGV4dHVyZSB1cmkgcGFyc2luZy4gRGVmYXVsdGx5IHVzZSB0aGUgcm9vdFBhdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRleHR1cmVSb290UGF0aDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFJvb3QgcGF0aCBmb3IgYnVmZmVyIHVyaSBwYXJzaW5nLiBEZWZhdWx0bHkgdXNlIHRoZSByb290UGF0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgYnVmZmVyUm9vdFBhdGg6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBTaGFkZXIgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBtYXRlcmlhbHMuXG4gICAgICogQHR5cGUge3N0cmluZ3xjbGF5LlNoYWRlcn1cbiAgICAgKiBAZGVmYXVsdCAnY2xheS5zdGFuZGFyZCdcbiAgICAgKi9cbiAgICBzaGFkZXI6ICdjbGF5LnN0YW5kYXJkJyxcblxuICAgIC8qKlxuICAgICAqIElmIHVzZSB7QGxpbmsgY2xheS5TdGFuZGFyZE1hdGVyaWFsfVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdXNlU3RhbmRhcmRNYXRlcmlhbDogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBJZiBsb2FkaW5nIHRoZSBjYW1lcmFzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGluY2x1ZGVDYW1lcmE6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBJZiBsb2FkaW5nIHRoZSBhbmltYXRpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGluY2x1ZGVBbmltYXRpb246IHRydWUsXG4gICAgLyoqXG4gICAgICogSWYgbG9hZGluZyB0aGUgbWVzaGVzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5jbHVkZU1lc2g6IHRydWUsXG4gICAgLyoqXG4gICAgICogSWYgbG9hZGluZyB0aGUgdGV4dHVyZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5jbHVkZVRleHR1cmU6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGNyb3NzT3JpZ2luOiAnJyxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9pc3N1ZXMvNjc0XG4gICAgICovXG4gICAgdGV4dHVyZUZsaXBZOiBmYWxzZSxcblxuICAgIHNoYWRlckxpYnJhcnk6IG51bGxcbn0sXG5mdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNoYWRlckxpYnJhcnkpIHtcbiAgICAgICAgdGhpcy5zaGFkZXJMaWJyYXJ5ID0gc2hhZGVyTGlicmFyeS5jcmVhdGVMaWJyYXJ5KCk7XG4gICAgfVxufSxcbi8qKiBAbGVuZHMgY2xheS5sb2FkZXIuR0xURi5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24gKHVybCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBpc0JpbmFyeSA9IHVybC5lbmRzV2l0aCgnLmdsYicpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvb3RQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdFBhdGggPSB1cmwuc2xpY2UoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5nZXQoe1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBvbnByb2dyZXNzOiBmdW5jdGlvbiAocGVyY2VudCwgbG9hZGVkLCB0b3RhbCkge1xuICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigncHJvZ3Jlc3MnLCBwZXJjZW50LCBsb2FkZWQsIHRvdGFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcignZXJyb3InLCBlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IGlzQmluYXJ5ID8gJ2FycmF5YnVmZmVyJyA6ICd0ZXh0JyxcbiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZUJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2UoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgZ2xURiBiaW5hcnlcbiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBidWZmZXJcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmxvYWRlci5HTFRGLklSZXN1bHR9XG4gICAgICovXG4gICAgcGFyc2VCaW5hcnk6IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IG5ldyBVaW50MzJBcnJheShidWZmZXIsIDAsIDQpO1xuICAgICAgICBpZiAoaGVhZGVyWzBdICE9PSAweDQ2NTQ2QzY3KSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgJ0ludmFsaWQgZ2xURiBiaW5hcnkgZm9ybWF0OiBJbnZhbGlkIGhlYWRlcicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJbMF0gPCAyKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgJ09ubHkgZ2xURjIuMCBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyLCAxMik7XG5cbiAgICAgICAgdmFyIGpzb247XG4gICAgICAgIHZhciBidWZmZXJzID0gW107XG4gICAgICAgIC8vIFJlYWQgY2h1bmtzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVZpZXcuYnl0ZUxlbmd0aDspIHtcbiAgICAgICAgICAgIHZhciBjaHVua0xlbmd0aCA9IGRhdGFWaWV3LmdldFVpbnQzMihpLCB0cnVlKTtcbiAgICAgICAgICAgIGkgKz0gNDtcbiAgICAgICAgICAgIHZhciBjaHVua1R5cGUgPSBkYXRhVmlldy5nZXRVaW50MzIoaSwgdHJ1ZSk7XG4gICAgICAgICAgICBpICs9IDQ7XG5cbiAgICAgICAgICAgIC8vIGpzb25cbiAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPT09IDB4NEU0RjUzNEEpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBpICsgMTIsIGNodW5rTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPLCBmb3IgdGhlIGJyb3dzZXIgbm90IHN1cHBvcnQgVGV4dERlY29kZXIuXG4gICAgICAgICAgICAgICAgdmFyIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gZGVjb2Rlci5kZWNvZGUoYXJyKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgJ0pTT04gUGFyc2UgZXJyb3I6JyArIGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaHVua1R5cGUgPT09IDB4MDA0RTQ5NDIpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyLnNsaWNlKGkgKyAxMiwgaSArIDEyICsgY2h1bmtMZW5ndGgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSArPSBjaHVua0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWpzb24pIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCAnSW52YWxpZCBnbFRGIGJpbmFyeSBmb3JtYXQ6IENhblxcJ3QgZmluZCBKU09OLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoanNvbiwgYnVmZmVycyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBqc29uXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcltdfSBbYnVmZmVyXVxuICAgICAqIEByZXR1cm4ge2NsYXkubG9hZGVyLkdMVEYuSVJlc3VsdH1cbiAgICAgKi9cbiAgICBwYXJzZTogZnVuY3Rpb24gKGpzb24sIGJ1ZmZlcnMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBsaWIgPSB7XG4gICAgICAgICAgICBqc29uOiBqc29uLFxuICAgICAgICAgICAgYnVmZmVyczogW10sXG4gICAgICAgICAgICBidWZmZXJWaWV3czogW10sXG4gICAgICAgICAgICBtYXRlcmlhbHM6IFtdLFxuICAgICAgICAgICAgdGV4dHVyZXM6IFtdLFxuICAgICAgICAgICAgbWVzaGVzOiBbXSxcbiAgICAgICAgICAgIGpvaW50czogW10sXG4gICAgICAgICAgICBza2VsZXRvbnM6IFtdLFxuICAgICAgICAgICAgY2FtZXJhczogW10sXG4gICAgICAgICAgICBub2RlczogW10sXG4gICAgICAgICAgICBjbGlwczogW11cbiAgICAgICAgfTtcbiAgICAgICAgLy8gTW91bnQgb24gdGhlIHJvb3Qgbm9kZSBpZiBnaXZlblxuICAgICAgICB2YXIgcm9vdE5vZGUgPSB0aGlzLnJvb3ROb2RlIHx8IG5ldyBTY2VuZSgpO1xuXG4gICAgICAgIHZhciBsb2FkaW5nID0gMDtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2FkKCkge1xuICAgICAgICAgICAgbG9hZGluZy0tO1xuICAgICAgICAgICAgaWYgKGxvYWRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhZnRlckxvYWRCdWZmZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhbHJlYWR5IGxvYWQgYnVmZmVyc1xuICAgICAgICBpZiAoYnVmZmVycykge1xuICAgICAgICAgICAgbGliLmJ1ZmZlcnMgPSBidWZmZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBhZnRlckxvYWRCdWZmZXIodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMb2FkIGJ1ZmZlcnNcbiAgICAgICAgICAgIHV0aWwuZWFjaChqc29uLmJ1ZmZlcnMsIGZ1bmN0aW9uIChidWZmZXJJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nKys7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGggPSBidWZmZXJJbmZvLnVyaTtcblxuICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRCdWZmZXIocGF0aCwgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBsaWIuYnVmZmVyc1tpZHhdID0gYnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWQoKTtcbiAgICAgICAgICAgICAgICB9LCBjaGVja0xvYWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBnZXRSZXN1bHQoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGpzb246IGpzb24sXG4gICAgICAgICAgICAgICAgc2NlbmU6IHNlbGYucm9vdE5vZGUgPyBudWxsIDogcm9vdE5vZGUsXG4gICAgICAgICAgICAgICAgcm9vdE5vZGU6IHNlbGYucm9vdE5vZGUgPyByb290Tm9kZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgY2FtZXJhczogbGliLmNhbWVyYXMsXG4gICAgICAgICAgICAgICAgdGV4dHVyZXM6IGxpYi50ZXh0dXJlcyxcbiAgICAgICAgICAgICAgICBtYXRlcmlhbHM6IGxpYi5tYXRlcmlhbHMsXG4gICAgICAgICAgICAgICAgc2tlbGV0b25zOiBsaWIuc2tlbGV0b25zLFxuICAgICAgICAgICAgICAgIG1lc2hlczogbGliLm1lc2hlcyxcbiAgICAgICAgICAgICAgICBjbGlwczogbGliLmNsaXBzLFxuICAgICAgICAgICAgICAgIG5vZGVzOiBsaWIubm9kZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhZnRlckxvYWRCdWZmZXIoaW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBub3QgbG9hZCBjb21wbGV0ZS5cbiAgICAgICAgICAgIGlmIChsaWIuYnVmZmVycy5sZW5ndGggIT09IGpzb24uYnVmZmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCdlcnJvcicsICdCdWZmZXIgbm90IGxvYWQgY29tcGxldGUuJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBqc29uLmJ1ZmZlclZpZXdzLmZvckVhY2goZnVuY3Rpb24gKGJ1ZmZlclZpZXdJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgICAgICAvLyBQRU5ESU5HIFBlcmZvcm1hbmNlXG4gICAgICAgICAgICAgICAgbGliLmJ1ZmZlclZpZXdzW2lkeF0gPSBsaWIuYnVmZmVyc1tidWZmZXJWaWV3SW5mby5idWZmZXJdXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShidWZmZXJWaWV3SW5mby5ieXRlT2Zmc2V0IHx8IDAsIChidWZmZXJWaWV3SW5mby5ieXRlT2Zmc2V0IHx8IDApICsgKGJ1ZmZlclZpZXdJbmZvLmJ5dGVMZW5ndGggfHwgMCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsaWIuYnVmZmVycyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoc2VsZi5pbmNsdWRlTWVzaCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmluY2x1ZGVUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlVGV4dHVyZXMoanNvbiwgbGliKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VNYXRlcmlhbHMoanNvbiwgbGliKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZU1lc2hlcyhqc29uLCBsaWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5fcGFyc2VOb2Rlcyhqc29uLCBsaWIpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgb25lIHNjZW5lLlxuICAgICAgICAgICAgaWYgKGpzb24uc2NlbmVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjZW5lSW5mbyA9IGpzb24uc2NlbmVzW2pzb24uc2NlbmUgfHwgMF07IC8vIERlZmF1bHQgdXNlIHRoZSBmaXJzdCBzY2VuZS5cbiAgICAgICAgICAgICAgICBpZiAoc2NlbmVJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmVJbmZvLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGxpYi5ub2Rlc1tzY2VuZUluZm8ubm9kZXNbaV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlLmFkZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlbGYuaW5jbHVkZU1lc2gpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZVNraW5zKGpzb24sIGxpYik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmluY2x1ZGVBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZUFuaW1hdGlvbnMoanNvbiwgbGliKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBnZXRSZXN1bHQoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBnZXRSZXN1bHQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEJpbmFyeSBmaWxlIHBhdGggcmVzb2x2ZXIuIFVzZXIgY2FuIG92ZXJyaWRlIGl0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKi9cbiAgICByZXNvbHZlQmluYXJ5UGF0aDogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgaWYgKHBhdGggJiYgcGF0aC5tYXRjaCgvXmRhdGE6KC4qPyliYXNlNjQsLykpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvb3RQYXRoID0gdGhpcy5idWZmZXJSb290UGF0aDtcbiAgICAgICAgaWYgKHJvb3RQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3RQYXRoID0gdGhpcy5yb290UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5yZWxhdGl2ZTJhYnNvbHV0ZShwYXRoLCByb290UGF0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRleHR1cmUgZmlsZSBwYXRoIHJlc29sdmVyLiBVc2VyIGNhbiBvdmVycmlkZSBpdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICovXG4gICAgcmVzb2x2ZVRleHR1cmVQYXRoOiBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICBpZiAocGF0aCAmJiBwYXRoLm1hdGNoKC9eZGF0YTooLio/KWJhc2U2NCwvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcm9vdFBhdGggPSB0aGlzLnRleHR1cmVSb290UGF0aDtcbiAgICAgICAgaWYgKHJvb3RQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3RQYXRoID0gdGhpcy5yb290UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5yZWxhdGl2ZTJhYnNvbHV0ZShwYXRoLCByb290UGF0aCk7XG4gICAgfSxcblxuICAgIF9nZXRTaGFkZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNoYWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRlckxpYnJhcnkuZ2V0KHRoaXMuc2hhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNoYWRlciBpbnN0YW5jZW9mIFNoYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZGVyO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9sb2FkQnVmZmVyOiBmdW5jdGlvbiAocGF0aCwgb25zdWNjZXNzLCBvbmVycm9yKSB7XG4gICAgICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgICAgICAgIHVybDogdGhpcy5yZXNvbHZlQmluYXJ5UGF0aChwYXRoKSxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIG9uc3VjY2VzcyAmJiBvbnN1Y2Nlc3MoYnVmZmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgb25lcnJvciAmJiBvbmVycm9yKGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvaXNzdWVzLzEwMFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9pc3N1ZXMvMTkzXG4gICAgX3BhcnNlU2tpbnM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcblxuICAgICAgICAvLyBDcmVhdGUgc2tlbGV0b25zIGFuZCBqb2ludHNcbiAgICAgICAgdmFyIGhhdmVJbnZCaW5kTWF0cmljZXMgPSBmYWxzZTtcbiAgICAgICAgdXRpbC5lYWNoKGpzb24uc2tpbnMsIGZ1bmN0aW9uIChza2luSW5mbywgaWR4KSB7XG4gICAgICAgICAgICB2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oe1xuICAgICAgICAgICAgICAgIG5hbWU6IHNraW5JbmZvLm5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBza2luSW5mby5qb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZUlkeCA9IHNraW5JbmZvLmpvaW50c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGxpYi5ub2Rlc1tub2RlSWR4XTtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSBuZXcgSm9pbnQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBza2VsZXRvbi5qb2ludHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2tlbGV0b24uam9pbnRzLnB1c2goam9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2tlbGV0b24ucmVsYXRpdmVSb290Tm9kZSA9IGxpYi5ub2Rlc1tza2luSW5mby5za2VsZXRvbl0gfHwgdGhpcy5yb290Tm9kZTtcbiAgICAgICAgICAgIGlmIChza2luSW5mby5pbnZlcnNlQmluZE1hdHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgaGF2ZUludkJpbmRNYXRyaWNlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIElCTUluZm8gPSBqc29uLmFjY2Vzc29yc1tza2luSW5mby5pbnZlcnNlQmluZE1hdHJpY2VzXTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gbGliLmJ1ZmZlclZpZXdzW0lCTUluZm8uYnVmZmVyVmlld107XG5cbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gSUJNSW5mby5ieXRlT2Zmc2V0IHx8IDA7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSBJQk1JbmZvLmNvdW50ICogMTY7XG5cbiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheShidWZmZXIsIG9mZnNldCwgc2l6ZSk7XG5cbiAgICAgICAgICAgICAgICBza2VsZXRvbi5zZXRKb2ludE1hdHJpY2VzQXJyYXkoYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2tlbGV0b24udXBkYXRlSm9pbnRNYXRyaWNlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGliLnNrZWxldG9uc1tpZHhdID0gc2tlbGV0b247XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVuYWJsZVNraW5uaW5nRm9yTWVzaChtZXNoLCBza2VsZXRvbiwgam9pbnRJbmRpY2VzKSB7XG4gICAgICAgICAgICBtZXNoLnNrZWxldG9uID0gc2tlbGV0b247XG4gICAgICAgICAgICBtZXNoLmpvaW50cyA9IGpvaW50SW5kaWNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldEpvaW50SW5kZXgoam9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBqb2ludC5pbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHV0aWwuZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbiAobm9kZUluZm8sIG5vZGVJZHgpIHtcbiAgICAgICAgICAgIGlmIChub2RlSW5mby5za2luICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2tpbklkeCA9IG5vZGVJbmZvLnNraW47XG4gICAgICAgICAgICAgICAgdmFyIHNrZWxldG9uID0gbGliLnNrZWxldG9uc1tza2luSWR4XTtcblxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gbGliLm5vZGVzW25vZGVJZHhdO1xuICAgICAgICAgICAgICAgIHZhciBqb2ludEluZGljZXMgPSBza2VsZXRvbi5qb2ludHMubWFwKGdldEpvaW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTWVzaCkge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVTa2lubmluZ0Zvck1lc2gobm9kZSwgc2tlbGV0b24sIGpvaW50SW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNZXNoIGhhdmUgbXVsdGlwbGUgcHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVNraW5uaW5nRm9yTWVzaChjaGlsZHJlbltpXSwgc2tlbGV0b24sIGpvaW50SW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKGpzb24sIGxpYikge1xuICAgICAgICB1dGlsLmVhY2goanNvbi50ZXh0dXJlcywgZnVuY3Rpb24gKHRleHR1cmVJbmZvLCBpZHgpe1xuICAgICAgICAgICAgLy8gc2FtcGxlcnMgaXMgb3B0aW9uYWxcbiAgICAgICAgICAgIHZhciBzYW1wbGVySW5mbyA9IChqc29uLnNhbXBsZXJzICYmIGpzb24uc2FtcGxlcnNbdGV4dHVyZUluZm8uc2FtcGxlcl0pIHx8IHt9O1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB7fTtcbiAgICAgICAgICAgIFsnd3JhcFMnLCAnd3JhcFQnLCAnbWFnRmlsdGVyJywgJ21pbkZpbHRlciddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzYW1wbGVySW5mb1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1dGlsLmRlZmF1bHRzKHBhcmFtZXRlcnMsIHtcbiAgICAgICAgICAgICAgICB3cmFwUzogVGV4dHVyZS5SRVBFQVQsXG4gICAgICAgICAgICAgICAgd3JhcFQ6IFRleHR1cmUuUkVQRUFULFxuICAgICAgICAgICAgICAgIGZsaXBZOiB0aGlzLnRleHR1cmVGbGlwWVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0ZXh0dXJlSW5mby50YXJnZXQgfHwgZ2xlbnVtLlRFWFRVUkVfMkQ7XG4gICAgICAgICAgICB2YXIgZm9ybWF0ID0gdGV4dHVyZUluZm8uZm9ybWF0O1xuICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGdsZW51bS5URVhUVVJFXzJEKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIHZhciBpbWFnZUluZm8gPSBqc29uLmltYWdlc1t0ZXh0dXJlSW5mby5zb3VyY2VdO1xuICAgICAgICAgICAgICAgIHZhciB1cmk7XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlSW5mby51cmkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpID0gdGhpcy5yZXNvbHZlVGV4dHVyZVBhdGgoaW1hZ2VJbmZvLnVyaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGltYWdlSW5mby5idWZmZXJWaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbGliLmJ1ZmZlclZpZXdzW2ltYWdlSW5mby5idWZmZXJWaWV3XV0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGltYWdlSW5mby5taW1lVHlwZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1cmkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5sb2FkKHVyaSwgdGhpcy5jcm9zc09yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGxpYi50ZXh0dXJlc1tpZHhdID0gdGV4dHVyZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfS0hSQ29tbW9uTWF0ZXJpYWxUb1N0YW5kYXJkOiBmdW5jdGlvbiAobWF0ZXJpYWxJbmZvLCBsaWIpIHtcbiAgICAgICAgdmFyIHVuaWZvcm1zID0ge307XG4gICAgICAgIHZhciBjb21tb25NYXRlcmlhbEluZm8gPSBtYXRlcmlhbEluZm8uZXh0ZW5zaW9uc1snS0hSX21hdGVyaWFsc19jb21tb24nXTtcbiAgICAgICAgdW5pZm9ybXMgPSBjb21tb25NYXRlcmlhbEluZm8udmFsdWVzIHx8IHt9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybXMuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHVuaWZvcm1zLmRpZmZ1c2UgPSBsaWIudGV4dHVyZXNbdW5pZm9ybXMuZGlmZnVzZV0gfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1zLmVtaXNzaW9uID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdW5pZm9ybXMuZW1pc3Npb24gPSBsaWIudGV4dHVyZXNbdW5pZm9ybXMuZW1pc3Npb25dIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5hYmxlZFRleHR1cmVzID0gW107XG4gICAgICAgIGlmICh1bmlmb3Jtc1snZGlmZnVzZSddIGluc3RhbmNlb2YgVGV4dHVyZTJEKSB7XG4gICAgICAgICAgICBlbmFibGVkVGV4dHVyZXMucHVzaCgnZGlmZnVzZU1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8ubm9ybWFsVGV4dHVyZSkge1xuICAgICAgICAgICAgZW5hYmxlZFRleHR1cmVzLnB1c2goJ25vcm1hbE1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlmb3Jtc1snZW1pc3Npb24nXSBpbnN0YW5jZW9mIFRleHR1cmUyRCkge1xuICAgICAgICAgICAgZW5hYmxlZFRleHR1cmVzLnB1c2goJ2VtaXNzaXZlTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hdGVyaWFsO1xuICAgICAgICB2YXIgaXNTdGFuZGFyZE1hdGVyaWFsID0gdGhpcy51c2VTdGFuZGFyZE1hdGVyaWFsO1xuICAgICAgICBpZiAoaXNTdGFuZGFyZE1hdGVyaWFsKSB7XG4gICAgICAgICAgICBtYXRlcmlhbCA9IG5ldyBTdGFuZGFyZE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICBkb3VibGVTaWRlZDogbWF0ZXJpYWxJbmZvLmRvdWJsZVNpZGVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICBzaGFkZXI6IHRoaXMuX2dldFNoYWRlcigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfUk9VR0hORVNTJyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9NRVRBTE5FU1MnKTtcblxuICAgICAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5kb3VibGVTaWRlZCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pZm9ybXMudHJhbnNwYXJlbnQpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICAgICAgbWF0ZXJpYWwuZGVwdGhUZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmdXNlUHJvcCA9IHVuaWZvcm1zWydkaWZmdXNlJ107XG4gICAgICAgIGlmIChkaWZmdXNlUHJvcCkge1xuICAgICAgICAgICAgLy8gQ29sb3JcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpZmZ1c2VQcm9wKSkge1xuICAgICAgICAgICAgICAgIGRpZmZ1c2VQcm9wID0gZGlmZnVzZVByb3Auc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICAgICAgaXNTdGFuZGFyZE1hdGVyaWFsID8gKG1hdGVyaWFsLmNvbG9yID0gZGlmZnVzZVByb3ApXG4gICAgICAgICAgICAgICAgICAgIDogbWF0ZXJpYWwuc2V0KCdjb2xvcicsIGRpZmZ1c2VQcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBUZXh0dXJlXG4gICAgICAgICAgICAgICAgaXNTdGFuZGFyZE1hdGVyaWFsID8gKG1hdGVyaWFsLmRpZmZ1c2VNYXAgPSBkaWZmdXNlUHJvcClcbiAgICAgICAgICAgICAgICAgICAgOiBtYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlUHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtaXNzaW9uUHJvcCA9IHVuaWZvcm1zWydlbWlzc2lvbiddO1xuICAgICAgICBpZiAoZW1pc3Npb25Qcm9wICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENvbG9yXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbWlzc2lvblByb3ApKSB7XG4gICAgICAgICAgICAgICAgZW1pc3Npb25Qcm9wID0gZW1pc3Npb25Qcm9wLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgICAgIGlzU3RhbmRhcmRNYXRlcmlhbCA/IChtYXRlcmlhbC5lbWlzc2lvbiA9IGVtaXNzaW9uUHJvcClcbiAgICAgICAgICAgICAgICAgICAgOiBtYXRlcmlhbC5zZXQoJ2VtaXNzaW9uJywgZW1pc3Npb25Qcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBUZXh0dXJlXG4gICAgICAgICAgICAgICAgaXNTdGFuZGFyZE1hdGVyaWFsID8gKG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZW1pc3Npb25Qcm9wKVxuICAgICAgICAgICAgICAgICAgICA6IG1hdGVyaWFsLnNldCgnZW1pc3NpdmVNYXAnLCBlbWlzc2lvblByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8ubm9ybWFsVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHRleENvb3JkXG4gICAgICAgICAgICB2YXIgbm9ybWFsVGV4dHVyZUluZGV4ID0gbWF0ZXJpYWxJbmZvLm5vcm1hbFRleHR1cmUuaW5kZXg7XG4gICAgICAgICAgICBpZiAoaXNTdGFuZGFyZE1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwubm9ybWFsTWFwID0gbGliLnRleHR1cmVzW25vcm1hbFRleHR1cmVJbmRleF0gfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnbm9ybWFsTWFwJywgbGliLnRleHR1cmVzW25vcm1hbFRleHR1cmVJbmRleF0gfHwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaWZvcm1zWydzaGluaW5lc3MnXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZ2xvc3NpbmVzcyA9IE1hdGgubG9nKHVuaWZvcm1zWydzaGluaW5lc3MnXSkgLyBNYXRoLmxvZyg4MTkyKTtcbiAgICAgICAgICAgIC8vIFVuaWZvcm0gZ2xvc3NpbmVzc1xuICAgICAgICAgICAgbWF0ZXJpYWwuc2V0KCdnbG9zc2luZXNzJywgZ2xvc3NpbmVzcyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5zZXQoJ3JvdWdobmVzcycsIDEgLSBnbG9zc2luZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnZ2xvc3NpbmVzcycsIDAuMyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5zZXQoJ3JvdWdobmVzcycsIDAuMyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaWZvcm1zWydzcGVjdWxhciddICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnc3BlY3VsYXJDb2xvcicsIHVuaWZvcm1zWydzcGVjdWxhciddLnNsaWNlKDAsIDMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pZm9ybXNbJ3RyYW5zcGFyZW5jeSddICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnYWxwaGEnLCB1bmlmb3Jtc1sndHJhbnNwYXJlbmN5J10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGVyaWFsO1xuICAgIH0sXG5cbiAgICBfcGJyTWV0YWxsaWNSb3VnaG5lc3NUb1N0YW5kYXJkOiBmdW5jdGlvbiAobWF0ZXJpYWxJbmZvLCBtZXRhbGxpY1JvdWdobmVzc01hdEluZm8sIGxpYikge1xuICAgICAgICB2YXIgYWxwaGFUZXN0ID0gbWF0ZXJpYWxJbmZvLmFscGhhTW9kZSA9PT0gJ01BU0snO1xuXG4gICAgICAgIHZhciBpc1N0YW5kYXJkTWF0ZXJpYWwgPSB0aGlzLnVzZVN0YW5kYXJkTWF0ZXJpYWw7XG4gICAgICAgIHZhciBtYXRlcmlhbDtcbiAgICAgICAgdmFyIGRpZmZ1c2VNYXAsIHJvdWdobmVzc01hcCwgbWV0YWxuZXNzTWFwLCBub3JtYWxNYXAsIGVtaXNzaXZlTWFwO1xuICAgICAgICB2YXIgZW5hYmxlZFRleHR1cmVzID0gW107XG4gICAgICAgICAgICAvLyBUT0RPIHRleENvb3JkXG4gICAgICAgIGlmIChtZXRhbGxpY1JvdWdobmVzc01hdEluZm8uYmFzZUNvbG9yVGV4dHVyZSkge1xuICAgICAgICAgICAgZGlmZnVzZU1hcCA9IGxpYi50ZXh0dXJlc1ttZXRhbGxpY1JvdWdobmVzc01hdEluZm8uYmFzZUNvbG9yVGV4dHVyZS5pbmRleF0gfHwgbnVsbDtcbiAgICAgICAgICAgIGRpZmZ1c2VNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ2RpZmZ1c2VNYXAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWxsaWNSb3VnaG5lc3NNYXRJbmZvLm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZSkge1xuICAgICAgICAgICAgcm91Z2huZXNzTWFwID0gbWV0YWxuZXNzTWFwID0gbGliLnRleHR1cmVzW21ldGFsbGljUm91Z2huZXNzTWF0SW5mby5tZXRhbGxpY1JvdWdobmVzc1RleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICByb3VnaG5lc3NNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ21ldGFsbmVzc01hcCcsICdyb3VnaG5lc3NNYXAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0ZXJpYWxJbmZvLm5vcm1hbFRleHR1cmUpIHtcbiAgICAgICAgICAgIG5vcm1hbE1hcCA9IGxpYi50ZXh0dXJlc1ttYXRlcmlhbEluZm8ubm9ybWFsVGV4dHVyZS5pbmRleF0gfHwgbnVsbDtcbiAgICAgICAgICAgIG5vcm1hbE1hcCAmJiBlbmFibGVkVGV4dHVyZXMucHVzaCgnbm9ybWFsTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5lbWlzc2l2ZVRleHR1cmUpIHtcbiAgICAgICAgICAgIGVtaXNzaXZlTWFwID0gbGliLnRleHR1cmVzW21hdGVyaWFsSW5mby5lbWlzc2l2ZVRleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICBlbWlzc2l2ZU1hcCAmJiBlbmFibGVkVGV4dHVyZXMucHVzaCgnZW1pc3NpdmVNYXAnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFzZUNvbG9yID0gbWV0YWxsaWNSb3VnaG5lc3NNYXRJbmZvLmJhc2VDb2xvckZhY3RvciB8fCBbMSwgMSwgMSwgMV07XG5cbiAgICAgICAgdmFyIGNvbW1vblByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBkaWZmdXNlTWFwOiBkaWZmdXNlTWFwIHx8IG51bGwsXG4gICAgICAgICAgICByb3VnaG5lc3NNYXA6IHJvdWdobmVzc01hcCB8fCBudWxsLFxuICAgICAgICAgICAgbWV0YWxuZXNzTWFwOiBtZXRhbG5lc3NNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIG5vcm1hbE1hcDogbm9ybWFsTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBlbWlzc2l2ZU1hcDogZW1pc3NpdmVNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIGNvbG9yOiBiYXNlQ29sb3Iuc2xpY2UoMCwgMyksXG4gICAgICAgICAgICBhbHBoYTogYmFzZUNvbG9yWzNdLFxuICAgICAgICAgICAgbWV0YWxuZXNzOiBtZXRhbGxpY1JvdWdobmVzc01hdEluZm8ubWV0YWxsaWNGYWN0b3IgfHwgMCxcbiAgICAgICAgICAgIHJvdWdobmVzczogbWV0YWxsaWNSb3VnaG5lc3NNYXRJbmZvLnJvdWdobmVzc0ZhY3RvciB8fCAwLFxuICAgICAgICAgICAgZW1pc3Npb246IG1hdGVyaWFsSW5mby5lbWlzc2l2ZUZhY3RvciB8fCBbMCwgMCwgMF0sXG4gICAgICAgICAgICBhbHBoYUN1dG9mZjogbWF0ZXJpYWxJbmZvLmFscGhhQ3V0b2ZmIHx8IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbW1vblByb3BlcnRpZXMucm91Z2huZXNzTWFwKSB7XG4gICAgICAgICAgICAvLyBJbiBnbFRGIG1ldGFsbGljRmFjdG9yIHdpbGwgZG8gbXVsdGlwbHksIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFN0YW5kYXJkTWF0ZXJpYWwuXG4gICAgICAgICAgICAvLyBTbyBzaW1wbHkgaWdub3JlIGl0XG4gICAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLm1ldGFsbmVzcyA9IDAuNTtcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMucm91Z2huZXNzID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0YW5kYXJkTWF0ZXJpYWwpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IFN0YW5kYXJkTWF0ZXJpYWwodXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IG1hdGVyaWFsSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIGFscGhhVGVzdDogYWxwaGFUZXN0LFxuICAgICAgICAgICAgICAgIGRvdWJsZVNpZGVkOiBtYXRlcmlhbEluZm8uZG91YmxlU2lkZWQsXG4gICAgICAgICAgICAgICAgLy8gRyBjaGFubmVsXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzQ2hhbm5lbDogMSxcbiAgICAgICAgICAgICAgICAvLyBCIENoYW5uZWxcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3NDaGFubmVsOiAyXG4gICAgICAgICAgICB9LCBjb21tb25Qcm9wZXJ0aWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICBzaGFkZXI6IHRoaXMuX2dldFNoYWRlcigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfUk9VR0hORVNTJyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9NRVRBTE5FU1MnKTtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUk9VR0hORVNTX0NIQU5ORUwnLCAxKTtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnTUVUQUxORVNTX0NIQU5ORUwnLCAyKTtcblxuICAgICAgICAgICAgaWYgKGFscGhhVGVzdCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnQUxQSEFfVEVTVCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5kb3VibGVTaWRlZCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hdGVyaWFsLnNldChjb21tb25Qcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8uYWxwaGFNb2RlID09PSAnQkxFTkQnKSB7XG4gICAgICAgICAgICBtYXRlcmlhbC5kZXB0aE1hc2sgPSBmYWxzZTtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoVGVzdCA9IHRydWU7XG4gICAgICAgICAgICBtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfSxcblxuICAgIF9wYnJTcGVjdWxhckdsb3NzaW5lc3NUb1N0YW5kYXJkOiBmdW5jdGlvbiAobWF0ZXJpYWxJbmZvLCBzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLCBsaWIpIHtcbiAgICAgICAgdmFyIGFscGhhVGVzdCA9IG1hdGVyaWFsSW5mby5hbHBoYU1vZGUgPT09ICdNQVNLJztcblxuICAgICAgICBpZiAodGhpcy51c2VTdGFuZGFyZE1hdGVyaWFsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTdGFuZGFyZE1hdGVyaWFsIGRvZXNuXFwndCBzdXBwb3J0IHNwZWN1bGFyIGdsb3NzaW5lc3Mgd29ya2Zsb3cgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWF0ZXJpYWw7XG4gICAgICAgIHZhciBkaWZmdXNlTWFwLCBnbG9zc2luZXNzTWFwLCBzcGVjdWxhck1hcCwgbm9ybWFsTWFwLCBlbWlzc2l2ZU1hcDtcbiAgICAgICAgdmFyIGVuYWJsZWRUZXh0dXJlcyA9IFtdO1xuICAgICAgICAgICAgLy8gVE9ETyB0ZXhDb29yZFxuICAgICAgICBpZiAoc3BlY3VsYXJHbG9zc2luZXNzTWF0SW5mby5kaWZmdXNlVGV4dHVyZSkge1xuICAgICAgICAgICAgZGlmZnVzZU1hcCA9IGxpYi50ZXh0dXJlc1tzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLmRpZmZ1c2VUZXh0dXJlLmluZGV4XSB8fCBudWxsO1xuICAgICAgICAgICAgZGlmZnVzZU1hcCAmJiBlbmFibGVkVGV4dHVyZXMucHVzaCgnZGlmZnVzZU1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLnNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUpIHtcbiAgICAgICAgICAgIGdsb3NzaW5lc3NNYXAgPSBzcGVjdWxhck1hcCA9IGxpYi50ZXh0dXJlc1tzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLnNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICBnbG9zc2luZXNzTWFwICYmIGVuYWJsZWRUZXh0dXJlcy5wdXNoKCdzcGVjdWxhck1hcCcsICdnbG9zc2luZXNzTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5ub3JtYWxUZXh0dXJlKSB7XG4gICAgICAgICAgICBub3JtYWxNYXAgPSBsaWIudGV4dHVyZXNbbWF0ZXJpYWxJbmZvLm5vcm1hbFRleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICBub3JtYWxNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ25vcm1hbE1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8uZW1pc3NpdmVUZXh0dXJlKSB7XG4gICAgICAgICAgICBlbWlzc2l2ZU1hcCA9IGxpYi50ZXh0dXJlc1ttYXRlcmlhbEluZm8uZW1pc3NpdmVUZXh0dXJlLmluZGV4XSB8fCBudWxsO1xuICAgICAgICAgICAgZW1pc3NpdmVNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ2VtaXNzaXZlTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpZmZ1c2VDb2xvciA9IHNwZWN1bGFyR2xvc3NpbmVzc01hdEluZm8uZGlmZnVzZUZhY3RvciB8fCBbMSwgMSwgMSwgMV07XG5cbiAgICAgICAgdmFyIGNvbW1vblByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBkaWZmdXNlTWFwOiBkaWZmdXNlTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBnbG9zc2luZXNzTWFwOiBnbG9zc2luZXNzTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBzcGVjdWxhck1hcDogc3BlY3VsYXJNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIG5vcm1hbE1hcDogbm9ybWFsTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBlbWlzc2l2ZU1hcDogZW1pc3NpdmVNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIGNvbG9yOiBkaWZmdXNlQ29sb3Iuc2xpY2UoMCwgMyksXG4gICAgICAgICAgICBhbHBoYTogZGlmZnVzZUNvbG9yWzNdLFxuICAgICAgICAgICAgc3BlY3VsYXJDb2xvcjogc3BlY3VsYXJHbG9zc2luZXNzTWF0SW5mby5zcGVjdWxhckZhY3RvciB8fCBbMSwgMSwgMV0sXG4gICAgICAgICAgICBnbG9zc2luZXNzOiBzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLmdsb3NzaW5lc3NGYWN0b3IgfHwgMCxcbiAgICAgICAgICAgIGVtaXNzaW9uOiBtYXRlcmlhbEluZm8uZW1pc3NpdmVGYWN0b3IgfHwgWzAsIDAsIDBdLFxuICAgICAgICAgICAgYWxwaGFDdXRvZmY6IG1hdGVyaWFsSW5mby5hbHBoYUN1dG9mZiA9PSBudWxsID8gMC45IDogbWF0ZXJpYWxJbmZvLmFscGhhQ3V0b2ZmXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb21tb25Qcm9wZXJ0aWVzLmdsb3NzaW5lc3NNYXApIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBzcGVjdWxhckZhY3RvclxuICAgICAgICAgICAgY29tbW9uUHJvcGVydGllcy5nbG9zc2luZXNzID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb25Qcm9wZXJ0aWVzLnNwZWN1bGFyTWFwKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgc3BlY3VsYXJGYWN0b3JcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuc3BlY3VsYXJDb2xvciA9IFsxLCAxLCAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgIG5hbWU6IG1hdGVyaWFsSW5mby5uYW1lLFxuICAgICAgICAgICAgc2hhZGVyOiB0aGlzLl9nZXRTaGFkZXIoKVxuICAgICAgICB9KTtcblxuICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ0dMT1NTSU5FU1NfQ0hBTk5FTCcsIDMpO1xuXG4gICAgICAgIGlmIChhbHBoYVRlc3QpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnQUxQSEFfVEVTVCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8uZG91YmxlU2lkZWQpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRlcmlhbC5zZXQoY29tbW9uUHJvcGVydGllcyk7XG5cbiAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5hbHBoYU1vZGUgPT09ICdCTEVORCcpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICAgICAgbWF0ZXJpYWwuZGVwdGhUZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRlcmlhbDtcbiAgICB9LFxuXG4gICAgX3BhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoanNvbiwgbGliKSB7XG4gICAgICAgIHV0aWwuZWFjaChqc29uLm1hdGVyaWFscywgZnVuY3Rpb24gKG1hdGVyaWFsSW5mbywgaWR4KSB7XG4gICAgICAgICAgICBpZiAobWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnNbJ0tIUl9tYXRlcmlhbHNfY29tbW9uJ10pIHtcbiAgICAgICAgICAgICAgICBsaWIubWF0ZXJpYWxzW2lkeF0gPSB0aGlzLl9LSFJDb21tb25NYXRlcmlhbFRvU3RhbmRhcmQobWF0ZXJpYWxJbmZvLCBsaWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnNbJ0tIUl9tYXRlcmlhbHNfcGJyU3BlY3VsYXJHbG9zc2luZXNzJ10pIHtcbiAgICAgICAgICAgICAgICBsaWIubWF0ZXJpYWxzW2lkeF0gPSB0aGlzLl9wYnJTcGVjdWxhckdsb3NzaW5lc3NUb1N0YW5kYXJkKG1hdGVyaWFsSW5mbywgbWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnNbJ0tIUl9tYXRlcmlhbHNfcGJyU3BlY3VsYXJHbG9zc2luZXNzJ10sIGxpYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaWIubWF0ZXJpYWxzW2lkeF0gPSB0aGlzLl9wYnJNZXRhbGxpY1JvdWdobmVzc1RvU3RhbmRhcmQobWF0ZXJpYWxJbmZvLCBtYXRlcmlhbEluZm8ucGJyTWV0YWxsaWNSb3VnaG5lc3MgfHwge30sIGxpYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VNZXNoZXM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHV0aWwuZWFjaChqc29uLm1lc2hlcywgZnVuY3Rpb24gKG1lc2hJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgIGxpYi5tZXNoZXNbaWR4XSA9IFtdO1xuICAgICAgICAgICAgLy8gR2VvbWV0cnlcbiAgICAgICAgICAgIGZvciAodmFyIHBwID0gMDsgcHAgPCBtZXNoSW5mby5wcmltaXRpdmVzLmxlbmd0aDsgcHArKykge1xuICAgICAgICAgICAgICAgIHZhciBwcmltaXRpdmVJbmZvID0gbWVzaEluZm8ucHJpbWl0aXZlc1twcF07XG4gICAgICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIFBFTkRJR05cbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbWVzaEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdCb3g6IG5ldyBCb3VuZGluZ0JveCgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpY3MgPSBPYmplY3Qua2V5cyhwcmltaXRpdmVJbmZvLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHNzID0gMDsgc3MgPCBzZW1hbnRpY3MubGVuZ3RoOyBzcysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpYyA9IHNlbWFudGljc1tzc107XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY2Nlc3NvcklkeCA9IHByaW1pdGl2ZUluZm8uYXR0cmlidXRlc1tzZW1hbnRpY107XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVJbmZvID0ganNvbi5hY2Nlc3NvcnNbYWNjZXNzb3JJZHhdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHNlbWFudGljQXR0cmlidXRlTWFwW3NlbWFudGljXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IFNJWkVfTUFQW2F0dHJpYnV0ZUluZm8udHlwZV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVBcnJheSA9IGdldEFjY2Vzc29yRGF0YShqc29uLCBsaWIsIGFjY2Vzc29ySWR4KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2ViR0wgYXR0cmlidXRlIGJ1ZmZlciBub3Qgc3VwcG9ydCB1aW50MzIuXG4gICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCB1c2UgRmxvYXQzMkFycmF5IG1heSBhbHNvIGhhdmUgaXNzdWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5VaW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGF0dHJpYnV0ZUFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMgPT09ICdXRUlHSFRTXzAnICYmIHNpemUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlaWdodCBkYXRhIGluIFFURUsgaGFzIG9ubHkgMyBjb21wb25lbnQsIHRoZSBsYXN0IGNvbXBvbmVudCBjYW4gYmUgZXZhbHVhdGVkIHNpbmNlIGl0IGlzIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ZWlnaHRBcnJheSA9IG5ldyBhdHRyaWJ1dGVBcnJheS5jb25zdHJ1Y3RvcihhdHRyaWJ1dGVJbmZvLmNvdW50ICogMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUluZm8uY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpNCA9IGkgKiA0LCBpMyA9IGkgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3MSA9IGF0dHJpYnV0ZUFycmF5W2k0XSwgdzIgPSBhdHRyaWJ1dGVBcnJheVtpNCArIDFdLCB3MyA9IGF0dHJpYnV0ZUFycmF5W2k0ICsgMl0sIHc0ID0gYXR0cmlidXRlQXJyYXlbaTQgKyAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd1N1bSA9IHcxICsgdzIgKyB3MyArIHc0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodEFycmF5W2kzXSA9IHcxIC8gd1N1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRBcnJheVtpMyArIDFdID0gdzIgLyB3U3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodEFycmF5W2kzICsgMl0gPSB3MyAvIHdTdW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnZhbHVlID0gd2VpZ2h0QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnZhbHVlID0gYXR0cmlidXRlQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZVR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlQXJyYXkgaW5zdGFuY2VvZiB2ZW5kb3IuVWludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUgPSAndXNob3J0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5JbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVUeXBlID0gJ3Nob3J0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5VaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVUeXBlID0gJ3VieXRlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5JbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUgPSAnYnl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS50eXBlID0gYXR0cmlidXRlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMgPT09ICdQT1NJVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIEJveFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IGF0dHJpYnV0ZUluZm8ubWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IGF0dHJpYnV0ZUluZm8ubWF4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi5zZXQobWluWzBdLCBtaW5bMV0sIG1pblsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnNldChtYXhbMF0sIG1heFsxXSwgbWF4WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGluZGljZXNcbiAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlSW5mby5pbmRpY2VzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IGdldEFjY2Vzc29yRGF0YShqc29uLCBsaWIsIHByaW1pdGl2ZUluZm8uaW5kaWNlcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW9tZXRyeS52ZXJ0ZXhDb3VudCA8PSAweGZmZmYgJiYgZ2VvbWV0cnkuaW5kaWNlcyBpbnN0YW5jZW9mIHZlbmRvci5VaW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyB2ZW5kb3IuVWludDE2QXJyYXkoZ2VvbWV0cnkuaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoZ2VvbWV0cnkuaW5kaWNlcyBpbnN0YW5jZW9mIHZlbmRvci5VaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzID0gbmV3IHZlbmRvci5VaW50MTZBcnJheShnZW9tZXRyeS5pbmRpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IGxpYi5tYXRlcmlhbHNbcHJpbWl0aXZlSW5mby5tYXRlcmlhbF07XG4gICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsSW5mbyA9IChqc29uLm1hdGVyaWFscyB8fCBbXSlbcHJpbWl0aXZlSW5mby5tYXRlcmlhbF07XG4gICAgICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcjogc2VsZi5fZ2V0U2hhZGVyKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBtZXNoID0gbmV3IE1lc2goe1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogW01lc2guUE9JTlRTLCBNZXNoLkxJTkVTLCBNZXNoLkxJTkVfTE9PUCwgTWVzaC5MSU5FX1NUUklQLCBNZXNoLlRSSUFOR0xFUywgTWVzaC5UUklBTkdMRV9TVFJJUCwgTWVzaC5UUklBTkdMRV9GQU5dW3ByaW1pdGl2ZUluZm8ubW9kZV0gfHwgTWVzaC5UUklBTkdMRVMsXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUdCdWZmZXI6IG1hdGVyaWFsLnRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsSW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc2guY3VsbGluZyA9ICFtYXRlcmlhbEluZm8uZG91YmxlU2lkZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWVzaC5nZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNoLmdlb21ldHJ5LmdlbmVyYXRlVmVydGV4Tm9ybWFscygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKChtYXRlcmlhbCBpbnN0YW5jZW9mIFN0YW5kYXJkTWF0ZXJpYWwpICYmIG1hdGVyaWFsLm5vcm1hbE1hcClcbiAgICAgICAgICAgICAgICAgICAgfHwgKG1hdGVyaWFsLmlzVGV4dHVyZUVuYWJsZWQoJ25vcm1hbE1hcCcpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1lc2guZ2VvbWV0cnkuYXR0cmlidXRlcy50YW5nZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmdlb21ldHJ5LmdlbmVyYXRlVGFuZ2VudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG1lc2gubmFtZSA9IEdMVEZMb2FkZXIuZ2VuZXJhdGVNZXNoTmFtZShqc29uLm1lc2hlcywgaWR4LCBwcCk7XG5cbiAgICAgICAgICAgICAgICBsaWIubWVzaGVzW2lkeF0ucHVzaChtZXNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfSxcblxuICAgIF9pbnN0YW5jZUNhbWVyYTogZnVuY3Rpb24gKGpzb24sIG5vZGVJbmZvKSB7XG4gICAgICAgIHZhciBjYW1lcmFJbmZvID0ganNvbi5jYW1lcmFzW25vZGVJbmZvLmNhbWVyYV07XG5cbiAgICAgICAgaWYgKGNhbWVyYUluZm8udHlwZSA9PT0gJ3BlcnNwZWN0aXZlJykge1xuICAgICAgICAgICAgdmFyIHBlcnNwZWN0aXZlSW5mbyA9IGNhbWVyYUluZm8ucGVyc3BlY3RpdmUgfHwge307XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIGFzcGVjdDogcGVyc3BlY3RpdmVJbmZvLmFzcGVjdFJhdGlvLFxuICAgICAgICAgICAgICAgIGZvdjogcGVyc3BlY3RpdmVJbmZvLnlmb3YsXG4gICAgICAgICAgICAgICAgZmFyOiBwZXJzcGVjdGl2ZUluZm8uemZhcixcbiAgICAgICAgICAgICAgICBuZWFyOiBwZXJzcGVjdGl2ZUluZm8uem5lYXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG9ydGhvZ3JhcGhpY0luZm8gPSBjYW1lcmFJbmZvLm9ydGhvZ3JhcGhpYyB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIHRvcDogb3J0aG9ncmFwaGljSW5mby55bWFnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBvcnRob2dyYXBoaWNJbmZvLnhtYWcsXG4gICAgICAgICAgICAgICAgbGVmdDogLW9ydGhvZ3JhcGhpY0luZm8ueG1hZyxcbiAgICAgICAgICAgICAgICBib3R0b206IC1vcnRob2dyYXBoaWNJbmZvLnltYWcsXG4gICAgICAgICAgICAgICAgbmVhcjogb3J0aG9ncmFwaGljSW5mby56bmVhcixcbiAgICAgICAgICAgICAgICBmYXI6IG9ydGhvZ3JhcGhpY0luZm8uemZhclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3BhcnNlTm9kZXM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbnN0YW5jZU1lc2gobWVzaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtZXNoLm5hbWUsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IG1lc2guZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWw6IG1lc2gubWF0ZXJpYWwsXG4gICAgICAgICAgICAgICAgY3VsbGluZzogbWVzaC5jdWxsaW5nLFxuICAgICAgICAgICAgICAgIG1vZGU6IG1lc2gubW9kZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB1dGlsLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24gKG5vZGVJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBub2RlO1xuICAgICAgICAgICAgaWYgKG5vZGVJbmZvLmNhbWVyYSAhPSBudWxsICYmIHRoaXMuaW5jbHVkZUNhbWVyYSkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLl9pbnN0YW5jZUNhbWVyYShqc29uLCBub2RlSW5mbyk7XG4gICAgICAgICAgICAgICAgbGliLmNhbWVyYXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVJbmZvLm1lc2ggIT0gbnVsbCAmJiB0aGlzLmluY2x1ZGVNZXNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByaW1pdGl2ZXMgPSBsaWIubWVzaGVzW25vZGVJbmZvLm1lc2hdO1xuICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgbm9kZSB3aXRoIG1lc2ggZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBpbnN0YW5jZU1lc2gocHJpbWl0aXZlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldE5hbWUobm9kZUluZm8ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0TmFtZShub2RlSW5mby5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJpbWl0aXZlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkKGluc3RhbmNlTWVzaChwcmltaXRpdmVzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTtcbiAgICAgICAgICAgICAgICAvLyBQRU5ESU5HIER1bHBsaWNhdGUgbmFtZS5cbiAgICAgICAgICAgICAgICBub2RlLnNldE5hbWUobm9kZUluZm8ubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZUluZm8ubWF0cml4KSB7XG4gICAgICAgICAgICAgICAgbm9kZS5sb2NhbFRyYW5zZm9ybS5zZXRBcnJheShub2RlSW5mby5tYXRyaXgpO1xuICAgICAgICAgICAgICAgIG5vZGUuZGVjb21wb3NlTG9jYWxUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5mby50cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnBvc2l0aW9uLnNldEFycmF5KG5vZGVJbmZvLnRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVJbmZvLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucm90YXRpb24uc2V0QXJyYXkobm9kZUluZm8ucm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zY2FsZS5zZXRBcnJheShub2RlSW5mby5zY2FsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaWIubm9kZXNbaWR4XSA9IG5vZGU7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGhpZXJhcmNoeVxuICAgICAgICB1dGlsLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24gKG5vZGVJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gbGliLm5vZGVzW2lkeF07XG4gICAgICAgICAgICBpZiAobm9kZUluZm8uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVJbmZvLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZElkeCA9IG5vZGVJbmZvLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBsaWIubm9kZXNbY2hpbGRJZHhdO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgIF9wYXJzZUFuaW1hdGlvbnM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tDaGFubmVsUGF0aChjaGFubmVsSW5mbykge1xuICAgICAgICAgICAgaWYgKGNoYW5uZWxJbmZvLnBhdGggPT09ICd3ZWlnaHRzJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignR0xURkxvYWRlciBub3Qgc3VwcG9ydCBtb3JwaCB0YXJnZXRzIHlldC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldENoYW5uZWxIYXNoKGNoYW5uZWxJbmZvLCBhbmltYXRpb25JbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhbm5lbEluZm8udGFyZ2V0Lm5vZGUgKyAnXycgKyBhbmltYXRpb25JbmZvLnNhbXBsZXJzW2NoYW5uZWxJbmZvLnNhbXBsZXJdLmlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRpbWVBY2Nlc3Nvck11bHRpcGxpZWQgPSB7fTtcbiAgICAgICAgdXRpbC5lYWNoKGpzb24uYW5pbWF0aW9ucywgZnVuY3Rpb24gKGFuaW1hdGlvbkluZm8sIGlkeCkge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWxzID0gYW5pbWF0aW9uSW5mby5jaGFubmVscy5maWx0ZXIoY2hlY2tDaGFubmVsUGF0aCk7XG5cbiAgICAgICAgICAgIGlmICghY2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRyYWNrcyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGFubmVsSW5mbyA9IGNoYW5uZWxzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBjaGFubmVsSGFzaCA9IGdldENoYW5uZWxIYXNoKGNoYW5uZWxJbmZvLCBhbmltYXRpb25JbmZvKTtcblxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXROb2RlID0gbGliLm5vZGVzW2NoYW5uZWxJbmZvLnRhcmdldC5ub2RlXTtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2sgPSB0cmFja3NbY2hhbm5lbEhhc2hdO1xuICAgICAgICAgICAgICAgIHZhciBzYW1wbGVySW5mbyA9IGFuaW1hdGlvbkluZm8uc2FtcGxlcnNbY2hhbm5lbEluZm8uc2FtcGxlcl07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrID0gdHJhY2tzW2NoYW5uZWxIYXNoXSA9IG5ldyBTYW1wbGVyVHJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGFyZ2V0Tm9kZSA/IHRhcmdldE5vZGUubmFtZSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXROb2RlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cmFjay50YXJnZXROb2RlSW5kZXggPSBjaGFubmVsSW5mby50YXJnZXQubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2suY2hhbm5lbHMudGltZSA9IGdldEFjY2Vzc29yRGF0YShqc29uLCBsaWIsIHNhbXBsZXJJbmZvLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lTGVuID0gdHJhY2suY2hhbm5lbHMudGltZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGltZUFjY2Vzc29yTXVsdGlwbGllZFtzYW1wbGVySW5mby5pbnB1dF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZnJhbWVMZW47IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxzLnRpbWVba10gKj0gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVBY2Nlc3Nvck11bHRpcGxpZWRbc2FtcGxlckluZm8uaW5wdXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBpbnRlcnBvbGF0aW9uID0gc2FtcGxlckluZm8uaW50ZXJwb2xhdGlvbiB8fCAnTElORUFSJztcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbiAhPT0gJ0xJTkVBUicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdHTFRGTG9hZGVyIG9ubHkgc3VwcG9ydCBMSU5FQVIgaW50ZXJwb2xhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGNoYW5uZWxJbmZvLnRhcmdldC5wYXRoO1xuICAgICAgICAgICAgICAgIGlmIChwYXRoID09PSAndHJhbnNsYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSAncG9zaXRpb24nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxzW3BhdGhdID0gZ2V0QWNjZXNzb3JEYXRhKGpzb24sIGxpYiwgc2FtcGxlckluZm8ub3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbGlwID0gbmV3IFRyYWNrQ2xpcCh7XG4gICAgICAgICAgICAgICAgbmFtZTogYW5pbWF0aW9uSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIGxvb3A6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaGFzaCBpbiB0cmFja3MpIHtcbiAgICAgICAgICAgICAgICBjbGlwLmFkZFRyYWNrKHRyYWNrc1toYXNoXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGlwLmNhbGNMaWZlRnJvbVRyYWNrcygpO1xuICAgICAgICAgICAgbGliLmNsaXBzLnB1c2goY2xpcCk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG5cbiAgICAgICAgLy8gUEVORElOR1xuICAgICAgICB2YXIgbWF4TGlmZSA9IGxpYi5jbGlwcy5yZWR1Y2UoZnVuY3Rpb24gKG1heFRpbWUsIGNsaXApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChtYXhUaW1lLCBjbGlwLmxpZmUpO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgbGliLmNsaXBzLmZvckVhY2goZnVuY3Rpb24gKGNsaXApIHtcbiAgICAgICAgICAgIGNsaXAubGlmZSA9IG1heExpZmU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBsaWIuY2xpcHM7XG4gICAgfVxufSk7XG5cbkdMVEZMb2FkZXIuZ2VuZXJhdGVNZXNoTmFtZSA9IGZ1bmN0aW9uIChtZXNoZXMsIGlkeCwgcHJpbWl0aXZlSWR4KSB7XG4gICAgdmFyIG1lc2hJbmZvID0gbWVzaGVzW2lkeF07XG4gICAgdmFyIG1lc2hOYW1lID0gbWVzaEluZm8ubmFtZSB8fCAoJ21lc2hfJyArIGlkeCk7XG4gICAgcmV0dXJuIHByaW1pdGl2ZUlkeCA9PT0gMCA/IG1lc2hOYW1lIDogKG1lc2hOYW1lICsgJyQnICsgcHJpbWl0aXZlSWR4KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdMVEZMb2FkZXI7XG4iLCJpbXBvcnQgTGlnaHQgZnJvbSAnLi4vTGlnaHQnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5EaXJlY3Rpb25hbFxuICogQGV4dGVuZHMgY2xheS5MaWdodFxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgdmFyIGxpZ2h0ID0gbmV3IGNsYXkubGlnaHQuRGlyZWN0aW9uYWwoe1xuICogICAgICAgICBpbnRlbnNpdHk6IDAuNSxcbiAqICAgICAgICAgY29sb3I6IFsxLjAsIDAuMCwgMC4wXVxuICogICAgIH0pO1xuICogICAgIGxpZ2h0LnBvc2l0aW9uLnNldCgxMCwgMTAsIDEwKTtcbiAqICAgICBsaWdodC5sb29rQXQoY2xheS5tYXRoLlZlY3RvcjMuWkVSTyk7XG4gKiAgICAgc2NlbmUuYWRkKGxpZ2h0KTtcbiAqL1xudmFyIERpcmVjdGlvbmFsTGlnaHQgPSBMaWdodC5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkubGlnaHQuRGlyZWN0aW9uYWwjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBzaGFkb3dCaWFzOiAwLjAwMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNoYWRvd1Nsb3BlU2NhbGU6IDIuMCxcbiAgICAvKipcbiAgICAgKiBTaGFkb3cgY2FzY2FkZS5cbiAgICAgKiBVc2UgUFNTTSB0ZWNobmlxdWUgd2hlbiBpdCBpcyBsYXJnZXIgdGhhbiAxIGFuZCBoYXZlIGEgdW5pcXVlIGRpcmVjdGlvbmFsIGxpZ2h0IGluIHNjZW5lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2hhZG93Q2FzY2FkZTogMSxcblxuICAgIC8qKlxuICAgICAqIEF2YWlsYWJsZSB3aGVuIHNoYWRvd0Nhc2NhZGUgaXMgbGFyZ2VyIHRoYW4gMSBhbmQgaGF2ZSBhIHVuaXF1ZSBkaXJlY3Rpb25hbCBsaWdodCBpbiBzY2VuZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNhc2NhZGVTcGxpdExvZ0ZhY3RvcjogMC4yXG59LCB7XG5cbiAgICB0eXBlOiAnRElSRUNUSU9OQUxfTElHSFQnLFxuXG4gICAgdW5pZm9ybVRlbXBsYXRlczoge1xuICAgICAgICBkaXJlY3Rpb25hbExpZ2h0RGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLl9fZGlyID0gaW5zdGFuY2UuX19kaXIgfHwgbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Rpb24gaXMgdGFyZ2V0IHRvIGV5ZVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fX2Rpci5jb3B5KGluc3RhbmNlLndvcmxkVHJhbnNmb3JtLnopLm5vcm1hbGl6ZSgpLm5lZ2F0ZSgpLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkaXJlY3Rpb25hbExpZ2h0Q29sb3I6IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gaW5zdGFuY2UuY29sb3I7XG4gICAgICAgICAgICAgICAgdmFyIGludGVuc2l0eSA9IGluc3RhbmNlLmludGVuc2l0eTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2NvbG9yWzBdICogaW50ZW5zaXR5LCBjb2xvclsxXSAqIGludGVuc2l0eSwgY29sb3JbMl0gKiBpbnRlbnNpdHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmxpZ2h0LkRpcmVjdGlvbmFsfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmxpZ2h0LkRpcmVjdGlvbmFsLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaWdodCA9IExpZ2h0LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO1xuICAgICAgICBsaWdodC5zaGFkb3dCaWFzID0gdGhpcy5zaGFkb3dCaWFzO1xuICAgICAgICBsaWdodC5zaGFkb3dTbG9wZVNjYWxlID0gdGhpcy5zaGFkb3dTbG9wZVNjYWxlO1xuICAgICAgICByZXR1cm4gbGlnaHQ7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IERpcmVjdGlvbmFsTGlnaHQ7XG4iLCJpbXBvcnQgTGlnaHQgZnJvbSAnLi4vTGlnaHQnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LmxpZ2h0LlBvaW50XG4gKiBAZXh0ZW5kcyBjbGF5LkxpZ2h0XG4gKi9cbnZhciBQb2ludExpZ2h0ID0gTGlnaHQuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LmxpZ2h0LlBvaW50IyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFuZ2U6IDEwMCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgY2FzdFNoYWRvdzogZmFsc2Vcbn0sIHtcblxuICAgIHR5cGU6ICdQT0lOVF9MSUdIVCcsXG5cbiAgICB1bmlmb3JtVGVtcGxhdGVzOiB7XG4gICAgICAgIHBvaW50TGlnaHRQb3NpdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHBvaW50TGlnaHRSYW5nZToge1xuICAgICAgICAgICAgdHlwZTogJzFmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnRMaWdodENvbG9yOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gaW5zdGFuY2UuY29sb3IsXG4gICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGluc3RhbmNlLmludGVuc2l0eTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWyBjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5IF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkubGlnaHQuUG9pbnR9XG4gICAgICogQG1lbWJlck9mIGNsYXkubGlnaHQuUG9pbnQucHJvdG90eXBlXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbGlnaHQgPSBMaWdodC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICAgICAgbGlnaHQucmFuZ2UgPSB0aGlzLnJhbmdlO1xuICAgICAgICByZXR1cm4gbGlnaHQ7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50TGlnaHQ7XG4iLCJpbXBvcnQgTGlnaHQgZnJvbSAnLi4vTGlnaHQnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5TcG90XG4gKiBAZXh0ZW5kcyBjbGF5LkxpZ2h0XG4gKi9cbnZhciBTcG90TGlnaHQgPSBMaWdodC5leHRlbmQoXG4vKipAbGVuZHMgY2xheS5saWdodC5TcG90ICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICByYW5nZTogMjAsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB1bWJyYUFuZ2xlOiAzMCxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHBlbnVtYnJhQW5nbGU6IDQ1LFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZmFsbG9mZkZhY3RvcjogMi4wLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2hhZG93QmlhczogMC4wMDAyLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2hhZG93U2xvcGVTY2FsZTogMi4wXG59LHtcblxuICAgIHR5cGU6ICdTUE9UX0xJR0hUJyxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgc3BvdExpZ2h0UG9zaXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLmdldFdvcmxkUG9zaXRpb24oKS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BvdExpZ2h0UmFuZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICcxZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJhbmdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzcG90TGlnaHRVbWJyYUFuZ2xlQ29zaW5lOiB7XG4gICAgICAgICAgICB0eXBlOiAnMWYnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmNvcyhpbnN0YW5jZS51bWJyYUFuZ2xlICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwb3RMaWdodFBlbnVtYnJhQW5nbGVDb3NpbmU6IHtcbiAgICAgICAgICAgIHR5cGU6ICcxZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguY29zKGluc3RhbmNlLnBlbnVtYnJhQW5nbGUgKiBNYXRoLlBJIC8gMTgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BvdExpZ2h0RmFsbG9mZkZhY3Rvcjoge1xuICAgICAgICAgICAgdHlwZTogJzFmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuZmFsbG9mZkZhY3RvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BvdExpZ2h0RGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLl9fZGlyID0gaW5zdGFuY2UuX19kaXIgfHwgbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Rpb24gaXMgdGFyZ2V0IHRvIGV5ZVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fX2Rpci5jb3B5KGluc3RhbmNlLndvcmxkVHJhbnNmb3JtLnopLm5lZ2F0ZSgpLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzcG90TGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBpbnN0YW5jZS5jb2xvcjtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZW5zaXR5ID0gaW5zdGFuY2UuaW50ZW5zaXR5O1xuICAgICAgICAgICAgICAgIHJldHVybiBbY29sb3JbMF0gKiBpbnRlbnNpdHksIGNvbG9yWzFdICogaW50ZW5zaXR5LCBjb2xvclsyXSAqIGludGVuc2l0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkubGlnaHQuU3BvdH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5TcG90LnByb3RvdHlwZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaWdodCA9IExpZ2h0LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO1xuICAgICAgICBsaWdodC5yYW5nZSA9IHRoaXMucmFuZ2U7XG4gICAgICAgIGxpZ2h0LnVtYnJhQW5nbGUgPSB0aGlzLnVtYnJhQW5nbGU7XG4gICAgICAgIGxpZ2h0LnBlbnVtYnJhQW5nbGUgPSB0aGlzLnBlbnVtYnJhQW5nbGU7XG4gICAgICAgIGxpZ2h0LmZhbGxvZmZGYWN0b3IgPSB0aGlzLmZhbGxvZmZGYWN0b3I7XG4gICAgICAgIGxpZ2h0LnNoYWRvd0JpYXMgPSB0aGlzLnNoYWRvd0JpYXM7XG4gICAgICAgIGxpZ2h0LnNoYWRvd1Nsb3BlU2NhbGUgPSB0aGlzLnNoYWRvd1Nsb3BlU2NhbGU7XG4gICAgICAgIHJldHVybiBsaWdodDtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU3BvdExpZ2h0O1xuIiwiaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5BbWJpZW50XG4gKiBAZXh0ZW5kcyBjbGF5LkxpZ2h0XG4gKi9cbnZhciBBbWJpZW50TGlnaHQgPSBMaWdodC5leHRlbmQoe1xuXG4gICAgY2FzdFNoYWRvdzogZmFsc2VcblxufSwge1xuXG4gICAgdHlwZTogJ0FNQklFTlRfTElHSFQnLFxuXG4gICAgdW5pZm9ybVRlbXBsYXRlczoge1xuICAgICAgICBhbWJpZW50TGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEByZXR1cm4ge2NsYXkubGlnaHQuQW1iaWVudH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50LnByb3RvdHlwZVxuICAgICAqL1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEFtYmllbnRMaWdodDtcbiIsImltcG9ydCBUZXh0dXJlIGZyb20gJy4vVGV4dHVyZSc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4vY29yZS9nbGVudW0nO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi9jb3JlL3V0aWwnO1xuaW1wb3J0IG1hdGhVdGlsIGZyb20gJy4vbWF0aC91dGlsJztcbnZhciBpc1Bvd2VyT2ZUd28gPSBtYXRoVXRpbC5pc1Bvd2VyT2ZUd287XG5cbnZhciB0YXJnZXRMaXN0ID0gWydweCcsICdueCcsICdweScsICdueScsICdweicsICdueiddO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LlRleHR1cmVDdWJlXG4gKiBAZXh0ZW5kcyBjbGF5LlRleHR1cmVcbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIC4uLlxuICogICAgIHZhciBtYXQgPSBuZXcgY2xheS5NYXRlcmlhbCh7XG4gKiAgICAgICAgIHNoYWRlcjogY2xheS5zaGFkZXIubGlicmFyeS5nZXQoJ2NsYXkucGhvbmcnLCAnZW52aXJvbm1lbnRNYXAnKVxuICogICAgIH0pO1xuICogICAgIHZhciBlbnZNYXAgPSBuZXcgY2xheS5UZXh0dXJlQ3ViZSgpO1xuICogICAgIGVudk1hcC5sb2FkKHtcbiAqICAgICAgICAgJ3B4JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvcHguanBnJyxcbiAqICAgICAgICAgJ254JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvbnguanBnJ1xuICogICAgICAgICAncHknOiAnYXNzZXRzL3RleHR1cmVzL3NreS9weS5qcGcnXG4gKiAgICAgICAgICdueSc6ICdhc3NldHMvdGV4dHVyZXMvc2t5L255LmpwZydcbiAqICAgICAgICAgJ3B6JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvcHouanBnJ1xuICogICAgICAgICAnbnonOiAnYXNzZXRzL3RleHR1cmVzL3NreS9uei5qcGcnXG4gKiAgICAgfSk7XG4gKiAgICAgbWF0LnNldCgnZW52aXJvbm1lbnRNYXAnLCBlbnZNYXApO1xuICogICAgIC4uLlxuICogICAgIGVudk1hcC5zdWNjZXNzKGZ1bmN0aW9uICgpIHtcbiAqICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNreSB0ZXh0dXJlIGxvYWRlZFxuICogICAgICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24gKGZyYW1lVGltZSkge1xuICogICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICogICAgICAgICB9KTtcbiAqICAgICB9KTtcbiAqL1xudmFyIFRleHR1cmVDdWJlID0gVGV4dHVyZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuVGV4dHVyZUN1YmUjICove1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gcHhcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gbnhcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gcHlcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gbnlcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gcHpcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gbnpcbiAgICAgICAgICovXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICBweDogbnVsbCxcbiAgICAgICAgICAgIG54OiBudWxsLFxuICAgICAgICAgICAgcHk6IG51bGwsXG4gICAgICAgICAgICBueTogbnVsbCxcbiAgICAgICAgICAgIHB6OiBudWxsLFxuICAgICAgICAgICAgbno6IG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBpeGVscyBkYXRhIG9mIGVhY2ggc2lkZS4gV2lsbCBiZSBpZ25vcmVkIGlmIGltYWdlcyBhcmUgc2V0LlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBweFxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBueFxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBweVxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBueVxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBwelxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBuelxuICAgICAgICAgKi9cbiAgICAgICAgcGl4ZWxzOiB7XG4gICAgICAgICAgICBweDogbnVsbCxcbiAgICAgICAgICAgIG54OiBudWxsLFxuICAgICAgICAgICAgcHk6IG51bGwsXG4gICAgICAgICAgICBueTogbnVsbCxcbiAgICAgICAgICAgIHB6OiBudWxsLFxuICAgICAgICAgICAgbno6IG51bGxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxPYmplY3Q+fVxuICAgICAgICAgKi9cbiAgICAgICAgbWlwbWFwczogW11cbiAgICB9O1xufSwge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLl9jYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21tb24ocmVuZGVyZXIpO1xuXG4gICAgICAgIHZhciBnbEZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgICAgICB2YXIgZ2xUeXBlID0gdGhpcy50eXBlO1xuXG4gICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHRoaXMuZ2V0QXZhaWxhYmxlV3JhcFMoKSk7XG4gICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIHRoaXMuZ2V0QXZhaWxhYmxlV3JhcFQoKSk7XG5cbiAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIHRoaXMuZ2V0QXZhaWxhYmxlTWFnRmlsdGVyKCkpO1xuICAgICAgICBfZ2wudGV4UGFyYW1ldGVyaShfZ2wuVEVYVFVSRV9DVUJFX01BUCwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGhpcy5nZXRBdmFpbGFibGVNaW5GaWx0ZXIoKSk7XG5cbiAgICAgICAgdmFyIGFuaXNvdHJvcGljRXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpO1xuICAgICAgICBpZiAoYW5pc290cm9waWNFeHQgJiYgdGhpcy5hbmlzb3Ryb3BpYyA+IDEpIHtcbiAgICAgICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJmKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBhbmlzb3Ryb3BpY0V4dC5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgdGhpcy5hbmlzb3Ryb3BpYyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsYmFjayB0byBmbG9hdCB0eXBlIGlmIGJyb3dzZXIgZG9uJ3QgaGF2ZSBoYWxmIGZsb2F0IGV4dGVuc2lvblxuICAgICAgICBpZiAoZ2xUeXBlID09PSAzNjE5Mykge1xuICAgICAgICAgICAgdmFyIGhhbGZGbG9hdEV4dCA9IHJlbmRlcmVyLmdldEdMRXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Jyk7XG4gICAgICAgICAgICBpZiAoIWhhbGZGbG9hdEV4dCkge1xuICAgICAgICAgICAgICAgIGdsVHlwZSA9IGdsZW51bS5GTE9BVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1pcG1hcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1pcG1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbWlwbWFwID0gdGhpcy5taXBtYXBzW2ldO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRleHR1cmVEYXRhKF9nbCwgbWlwbWFwLCBpLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlKTtcbiAgICAgICAgICAgICAgICB3aWR0aCAvPSAyO1xuICAgICAgICAgICAgICAgIGhlaWdodCAvPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZURhdGEoX2dsLCB0aGlzLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5OUE9UICYmIHRoaXMudXNlTWlwbWFwKSB7XG4gICAgICAgICAgICAgICAgX2dsLmdlbmVyYXRlTWlwbWFwKF9nbC5URVhUVVJFX0NVQkVfTUFQKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9nbC5iaW5kVGV4dHVyZShfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbnVsbCk7XG4gICAgfSxcblxuICAgIF91cGRhdGVUZXh0dXJlRGF0YTogZnVuY3Rpb24gKF9nbCwgZGF0YSwgbGV2ZWwsIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRMaXN0W2ldO1xuICAgICAgICAgICAgdmFyIGltZyA9IGRhdGEuaW1hZ2UgJiYgZGF0YS5pbWFnZVt0YXJnZXRdO1xuICAgICAgICAgICAgaWYgKGltZykge1xuICAgICAgICAgICAgICAgIF9nbC50ZXhJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBsZXZlbCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfZ2wudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgbGV2ZWwsIGdsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBkYXRhLnBpeGVscyAmJiBkYXRhLnBpeGVsc1t0YXJnZXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBtZW1iZXJPZiBjbGF5LlRleHR1cmVDdWJlLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGdlbmVyYXRlTWlwbWFwOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBpZiAodGhpcy51c2VNaXBtYXAgJiYgIXRoaXMuTlBPVCkge1xuICAgICAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLl9jYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKSk7XG4gICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfQ1VCRV9NQVApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLmdldFdlYkdMVGV4dHVyZShyZW5kZXJlcikpO1xuICAgIH0sXG5cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcndyaXRlIHRoZSBpc1Bvd2VyT2ZUd28gbWV0aG9kXG4gICAgaXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlLnB4KSB7XG4gICAgICAgICAgICByZXR1cm4gaXNQb3dlck9mVHdvKHRoaXMuaW1hZ2UucHgud2lkdGgpXG4gICAgICAgICAgICAgICAgJiYgaXNQb3dlck9mVHdvKHRoaXMuaW1hZ2UucHguaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc1Bvd2VyT2ZUd28odGhpcy53aWR0aClcbiAgICAgICAgICAgICAgICAmJiBpc1Bvd2VyT2ZUd28odGhpcy5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGlzUmVuZGVyYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZS5weCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzSW1hZ2VSZW5kZXJhYmxlKHRoaXMuaW1hZ2UucHgpXG4gICAgICAgICAgICAgICAgJiYgaXNJbWFnZVJlbmRlcmFibGUodGhpcy5pbWFnZS5ueClcbiAgICAgICAgICAgICAgICAmJiBpc0ltYWdlUmVuZGVyYWJsZSh0aGlzLmltYWdlLnB5KVxuICAgICAgICAgICAgICAgICYmIGlzSW1hZ2VSZW5kZXJhYmxlKHRoaXMuaW1hZ2UubnkpXG4gICAgICAgICAgICAgICAgJiYgaXNJbWFnZVJlbmRlcmFibGUodGhpcy5pbWFnZS5weilcbiAgICAgICAgICAgICAgICAmJiBpc0ltYWdlUmVuZGVyYWJsZSh0aGlzLmltYWdlLm56KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhISh0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkOiBmdW5jdGlvbiAoaW1hZ2VMaXN0LCBjcm9zc09yaWdpbikge1xuICAgICAgICB2YXIgbG9hZGluZyA9IDA7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdXRpbC5lYWNoKGltYWdlTGlzdCwgZnVuY3Rpb24gKHNyYywgdGFyZ2V0KXtcbiAgICAgICAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaWYgKGNyb3NzT3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nIC0tO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkaW5nID09PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmcgLS07XG4gICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IG51bGw7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsb2FkaW5nKys7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBzcmM7XG4gICAgICAgICAgICBzZWxmLmltYWdlW3RhcmdldF0gPSBpbWFnZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZXh0dXJlQ3ViZS5wcm90b3R5cGUsICd3aWR0aCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UgJiYgdGhpcy5pbWFnZS5weCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2UucHgud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UgJiYgdGhpcy5pbWFnZS5weCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUZXh0dXJlIGZyb20gaW1hZ2UgY2FuXFwndCBzZXQgd2lkdGgnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dHVyZUN1YmUucHJvdG90eXBlLCAnaGVpZ2h0Jywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZSAmJiB0aGlzLmltYWdlLnB4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZS5weC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlICYmIHRoaXMuaW1hZ2UucHgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGV4dHVyZSBmcm9tIGltYWdlIGNhblxcJ3Qgc2V0IGhlaWdodCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuZnVuY3Rpb24gaXNJbWFnZVJlbmRlcmFibGUoaW1hZ2UpIHtcbiAgICByZXR1cm4gaW1hZ2Uubm9kZU5hbWUgPT09ICdDQU5WQVMnIHx8XG4gICAgICAgICAgICBpbWFnZS5ub2RlTmFtZSA9PT0gJ1ZJREVPJyB8fFxuICAgICAgICAgICAgaW1hZ2UuY29tcGxldGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHR1cmVDdWJlO1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9UZXh0dXJlJztcbmltcG9ydCBUZXh0dXJlQ3ViZSBmcm9tICcuL1RleHR1cmVDdWJlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgQ2FjaGUgZnJvbSAnLi9jb3JlL0NhY2hlJztcblxudmFyIEtFWV9GUkFNRUJVRkZFUiA9ICdmcmFtZWJ1ZmZlcic7XG52YXIgS0VZX1JFTkRFUkJVRkZFUiA9ICdyZW5kZXJidWZmZXInO1xudmFyIEtFWV9SRU5ERVJCVUZGRVJfV0lEVEggPSBLRVlfUkVOREVSQlVGRkVSICsgJ193aWR0aCc7XG52YXIgS0VZX1JFTkRFUkJVRkZFUl9IRUlHSFQgPSBLRVlfUkVOREVSQlVGRkVSICsgJ19oZWlnaHQnO1xudmFyIEtFWV9SRU5ERVJCVUZGRVJfQVRUQUNIRUQgPSBLRVlfUkVOREVSQlVGRkVSICsgJ19hdHRhY2hlZCc7XG52YXIgS0VZX0RFUFRIVEVYVFVSRV9BVFRBQ0hFRCA9ICdkZXB0aHRleHR1cmVfYXR0YWNoZWQnO1xuXG52YXIgR0xfRlJBTUVCVUZGRVIgPSBnbGVudW0uRlJBTUVCVUZGRVI7XG52YXIgR0xfUkVOREVSQlVGRkVSID0gZ2xlbnVtLlJFTkRFUkJVRkZFUjtcbnZhciBHTF9ERVBUSF9BVFRBQ0hNRU5UID0gZ2xlbnVtLkRFUFRIX0FUVEFDSE1FTlQ7XG52YXIgR0xfQ09MT1JfQVRUQUNITUVOVDAgPSBnbGVudW0uQ09MT1JfQVRUQUNITUVOVDA7XG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LkZyYW1lQnVmZmVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRnJhbWVCdWZmZXIgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5GcmFtZUJ1ZmZlciMgKi9cbntcbiAgICAvKipcbiAgICAgKiBJZiB1c2UgZGVwdGggYnVmZmVyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZGVwdGhCdWZmZXI6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZpZXdwb3J0OiBudWxsLFxuXG4gICAgX3dpZHRoOiAwLFxuICAgIF9oZWlnaHQ6IDAsXG5cbiAgICBfdGV4dHVyZXM6IG51bGwsXG5cbiAgICBfYm91bmRSZW5kZXJlcjogbnVsbCxcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBVc2UgY2FjaGVcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBDYWNoZSgpO1xuXG4gICAgdGhpcy5fdGV4dHVyZXMgPSB7fTtcbn0sXG5cbi8qKkBsZW5kcyBjbGF5LkZyYW1lQnVmZmVyLnByb3RvdHlwZS4gKi9cbntcbiAgICAvKipcbiAgICAgKiBHZXQgYXR0YWNoZWQgdGV4dHVyZSB3aWR0aFxuICAgICAqIHtudW1iZXJ9XG4gICAgICovXG4gICAgLy8gRklYTUUgQ2FuJ3QgdXNlIGJlZm9yZSAjYmluZFxuICAgIGdldFRleHR1cmVXaWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhdHRhY2hlZCB0ZXh0dXJlIGhlaWdodFxuICAgICAqIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VGV4dHVyZUhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBCaW5kIHRoZSBmcmFtZWJ1ZmZlciB0byBnaXZlbiByZW5kZXJlciBiZWZvcmUgcmVuZGVyaW5nXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBiaW5kOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcblxuICAgICAgICBpZiAocmVuZGVyZXIuX19jdXJyZW50RnJhbWVCdWZmZXIpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYm91bmRcbiAgICAgICAgICAgIGlmIChyZW5kZXJlci5fX2N1cnJlbnRGcmFtZUJ1ZmZlciA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW5kZXJlciBhbHJlYWR5IGJvdW5kIHdpdGggYW5vdGhlciBmcmFtZWJ1ZmZlci4gVW5iaW5kIGl0IGZpcnN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZXIuX19jdXJyZW50RnJhbWVCdWZmZXIgPSB0aGlzO1xuXG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcblxuICAgICAgICBfZ2wuYmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCB0aGlzLl9nZXRGcmFtZUJ1ZmZlckdMKHJlbmRlcmVyKSk7XG4gICAgICAgIHRoaXMuX2JvdW5kUmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUucHV0KCd2aWV3cG9ydCcsIHJlbmRlcmVyLnZpZXdwb3J0KTtcblxuICAgICAgICB2YXIgaGFzVGV4dHVyZUF0dGFjaGVkID0gZmFsc2U7XG4gICAgICAgIHZhciB3aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodDtcbiAgICAgICAgZm9yICh2YXIgYXR0YWNobWVudCBpbiB0aGlzLl90ZXh0dXJlcykge1xuICAgICAgICAgICAgaGFzVGV4dHVyZUF0dGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLl90ZXh0dXJlc1thdHRhY2htZW50XTtcbiAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIERvIHdpZHRoLCBoZWlnaHQgY2hlY2tpbmcsIG1ha2Ugc3VyZSBzaXplIGFyZSBzYW1lXG4gICAgICAgICAgICAgICAgd2lkdGggPSBvYmoudGV4dHVyZS53aWR0aDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBvYmoudGV4dHVyZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRleHR1cmVzXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9BdHRhY2gocmVuZGVyZXIsIG9iai50ZXh0dXJlLCBhdHRhY2htZW50LCBvYmoudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcblxuICAgICAgICBpZiAoIWhhc1RleHR1cmVBdHRhY2hlZCAmJiB0aGlzLmRlcHRoQnVmZmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdNdXN0IGF0dGFjaCB0ZXh0dXJlIGJlZm9yZSBiaW5kLCBvciByZW5kZXJidWZmZXIgbWF5IGhhdmUgaW5jb3JyZWN0IHdpZHRoIGFuZCBoZWlnaHQuJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0KSB7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCh0aGlzLnZpZXdwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF0dGFjaGVkVGV4dHVyZXMgPSBjYWNoZS5nZXQoJ2F0dGFjaGVkX3RleHR1cmVzJyk7XG4gICAgICAgIGlmIChhdHRhY2hlZFRleHR1cmVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIGF0dGFjaGVkVGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3RleHR1cmVzW2F0dGFjaG1lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb0RldGFjaChfZ2wsIGF0dGFjaG1lbnQsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2FjaGUuZ2V0KEtFWV9ERVBUSFRFWFRVUkVfQVRUQUNIRUQpICYmIHRoaXMuZGVwdGhCdWZmZXIpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByZW5kZXIgYnVmZmVyXG4gICAgICAgICAgICBpZiAoY2FjaGUubWlzcyhLRVlfUkVOREVSQlVGRkVSKSkge1xuICAgICAgICAgICAgICAgIGNhY2hlLnB1dChLRVlfUkVOREVSQlVGRkVSLCBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlbmRlcmJ1ZmZlciA9IGNhY2hlLmdldChLRVlfUkVOREVSQlVGRkVSKTtcblxuICAgICAgICAgICAgaWYgKHdpZHRoICE9PSBjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUl9XSURUSClcbiAgICAgICAgICAgICAgICAgICAgfHwgaGVpZ2h0ICE9PSBjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUl9IRUlHSFQpKSB7XG4gICAgICAgICAgICAgICAgX2dsLmJpbmRSZW5kZXJidWZmZXIoR0xfUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpO1xuICAgICAgICAgICAgICAgIF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKEdMX1JFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX0NPTVBPTkVOVDE2LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXQoS0VZX1JFTkRFUkJVRkZFUl9XSURUSCwgd2lkdGgpO1xuICAgICAgICAgICAgICAgIGNhY2hlLnB1dChLRVlfUkVOREVSQlVGRkVSX0hFSUdIVCwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBfZ2wuYmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUl9BVFRBQ0hFRCkpIHtcbiAgICAgICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsIEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXQoS0VZX1JFTkRFUkJVRkZFUl9BVFRBQ0hFRCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kIHRoZSBmcmFtZSBidWZmZXIgYWZ0ZXIgcmVuZGVyaW5nXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICAvLyBSZW1vdmUgc3RhdHVzIHJlY29yZCBvbiByZW5kZXJlclxuICAgICAgICByZW5kZXJlci5fX2N1cnJlbnRGcmFtZUJ1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIF9nbC5iaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlcmVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jYWNoZS51c2UocmVuZGVyZXIuX191aWRfXyk7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IHRoaXMuX2NhY2hlLmdldCgndmlld3BvcnQnKTtcbiAgICAgICAgLy8gUmVzZXQgdmlld3BvcnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0Vmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVNaXBtYXAocmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICAvLyBCZWNhdXNlIHRoZSBkYXRhIG9mIHRleHR1cmUgaXMgY2hhbmdlZCBvdmVyIHRpbWUsXG4gICAgLy8gSGVyZSB1cGRhdGUgdGhlIG1pcG1hcHMgb2YgdGV4dHVyZSBlYWNoIHRpbWUgYWZ0ZXIgcmVuZGVyZWQ7XG4gICAgdXBkYXRlTWlwbWFwOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIHRoaXMuX3RleHR1cmVzKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5fdGV4dHVyZXNbYXR0YWNobWVudF07XG4gICAgICAgICAgICBpZiAob2JqKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBvYmoudGV4dHVyZTtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBzb21lIHRleHR1cmUgZm9ybWF0IGNhbid0IGdlbmVyYXRlIG1pcG1hcFxuICAgICAgICAgICAgICAgIGlmICghdGV4dHVyZS5OUE9UICYmIHRleHR1cmUudXNlTWlwbWFwXG4gICAgICAgICAgICAgICAgICAgICYmIHRleHR1cmUubWluRmlsdGVyID09PSBUZXh0dXJlLkxJTkVBUl9NSVBNQVBfTElORUFSKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0ZXh0dXJlIGluc3RhbmNlb2YgVGV4dHVyZUN1YmUgPyBnbGVudW0uVEVYVFVSRV9DVUJFX01BUCA6IGdsZW51bS5URVhUVVJFXzJEO1xuICAgICAgICAgICAgICAgICAgICBfZ2wuYmluZFRleHR1cmUodGFyZ2V0LCB0ZXh0dXJlLmdldFdlYkdMVGV4dHVyZShyZW5kZXJlcikpO1xuICAgICAgICAgICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgX2dsLmJpbmRUZXh0dXJlKHRhcmdldCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8gMHg4Q0Q1LCAzNjA1MywgRlJBTUVCVUZGRVJfQ09NUExFVEVcbiAgICAvLyAweDhDRDYsIDM2MDU0LCBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRcbiAgICAvLyAweDhDRDcsIDM2MDU1LCBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVFxuICAgIC8vIDB4OENEOSwgMzYwNTcsIEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU1xuICAgIC8vIDB4OENERCwgMzYwNjEsIEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEXG4gICAgY2hlY2tTdGF0dXM6IGZ1bmN0aW9uIChfZ2wpIHtcbiAgICAgICAgcmV0dXJuIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTtcbiAgICB9LFxuXG4gICAgX2dldEZyYW1lQnVmZmVyR0w6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuXG4gICAgICAgIGlmIChjYWNoZS5taXNzKEtFWV9GUkFNRUJVRkZFUikpIHtcbiAgICAgICAgICAgIGNhY2hlLnB1dChLRVlfRlJBTUVCVUZGRVIsIHJlbmRlcmVyLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChLRVlfRlJBTUVCVUZGRVIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2ggYSB0ZXh0dXJlKFJUVCkgdG8gdGhlIGZyYW1lYnVmZmVyXG4gICAgICogQHBhcmFtICB7Y2xheS5UZXh0dXJlfSB0ZXh0dXJlXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbYXR0YWNobWVudD1nbC5DT0xPUl9BVFRBQ0hNRU5UMF1cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IFt0YXJnZXQ9Z2wuVEVYVFVSRV8yRF1cbiAgICAgKi9cbiAgICBhdHRhY2g6IGZ1bmN0aW9uICh0ZXh0dXJlLCBhdHRhY2htZW50LCB0YXJnZXQpIHtcblxuICAgICAgICBpZiAoIXRleHR1cmUud2lkdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHRleHR1cmUgYXR0YWNoZWQgdG8gY29sb3IgYnVmZmVyIGlzIG5vdCBhIHZhbGlkLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gd2lkdGggYW5kIGhlaWdodCBjaGVja1xuXG4gICAgICAgIC8vIElmIHRoZSBkZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBpcyBlbmFibGVkLCBkZXZlbG9wZXJzXG4gICAgICAgIC8vIENhbiBhdHRhY2ggYSBkZXB0aCB0ZXh0dXJlIHRvIHRoZSBkZXB0aCBidWZmZXJcbiAgICAgICAgLy8gaHR0cDovL2Jsb2cudG9qaWNvZGUuY29tLzIwMTIvMDcvdXNpbmctd2ViZ2xkZXB0aHRleHR1cmUuaHRtbFxuICAgICAgICBhdHRhY2htZW50ID0gYXR0YWNobWVudCB8fCBHTF9DT0xPUl9BVFRBQ0hNRU5UMDtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGdsZW51bS5URVhUVVJFXzJEO1xuXG4gICAgICAgIHZhciBib3VuZFJlbmRlcmVyID0gdGhpcy5fYm91bmRSZW5kZXJlcjtcbiAgICAgICAgdmFyIF9nbCA9IGJvdW5kUmVuZGVyZXIgJiYgYm91bmRSZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGF0dGFjaGVkVGV4dHVyZXM7XG5cbiAgICAgICAgaWYgKF9nbCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgICAgICAgICBjYWNoZS51c2UoYm91bmRSZW5kZXJlci5fX3VpZF9fKTtcbiAgICAgICAgICAgIGF0dGFjaGVkVGV4dHVyZXMgPSBjYWNoZS5nZXQoJ2F0dGFjaGVkX3RleHR1cmVzJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0ZXh0dXJlIGF0dGFjaGVkXG4gICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuX3RleHR1cmVzW2F0dGFjaG1lbnRdO1xuICAgICAgICBpZiAocHJldmlvdXMgJiYgcHJldmlvdXMudGFyZ2V0ID09PSB0YXJnZXRcbiAgICAgICAgICAgICYmIHByZXZpb3VzLnRleHR1cmUgPT09IHRleHR1cmVcbiAgICAgICAgICAgICYmIChhdHRhY2hlZFRleHR1cmVzICYmIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0gIT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FuQXR0YWNoID0gdHJ1ZTtcbiAgICAgICAgaWYgKGJvdW5kUmVuZGVyZXIpIHtcbiAgICAgICAgICAgIGNhbkF0dGFjaCA9IHRoaXMuX2RvQXR0YWNoKGJvdW5kUmVuZGVyZXIsIHRleHR1cmUsIGF0dGFjaG1lbnQsIHRhcmdldCk7XG4gICAgICAgICAgICAvLyBTZXQgdmlld3BvcnQgYWdhaW4gaW5jYXNlIGF0dGFjaGVkIHRvIGRpZmZlcmVudCBzaXplIHRleHR1cmVzLlxuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgYm91bmRSZW5kZXJlci5zZXRWaWV3cG9ydCgwLCAwLCB0ZXh0dXJlLndpZHRoLCB0ZXh0dXJlLmhlaWdodCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FuQXR0YWNoKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0dXJlc1thdHRhY2htZW50XSA9IHRoaXMuX3RleHR1cmVzW2F0dGFjaG1lbnRdIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZXNbYXR0YWNobWVudF0udGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLl90ZXh0dXJlc1thdHRhY2htZW50XS50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2RvQXR0YWNoOiBmdW5jdGlvbiAocmVuZGVyZXIsIHRleHR1cmUsIGF0dGFjaG1lbnQsIHRhcmdldCkge1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0dXJlIGlzIGFsd2F5cyB1cGRhdGVkXG4gICAgICAgIC8vIEJlY2F1c2UgdGV4dHVyZSB3aWR0aCBvciBoZWlnaHQgbWF5IGJlIGNoYW5nZWQgYW5kIGluIHRoaXMgd2UgY2FuJ3QgYmUgbm90aWZpZWRcbiAgICAgICAgLy8gRklYTUUgYXdrd2FyZDtcbiAgICAgICAgdmFyIHdlYmdsVGV4dHVyZSA9IHRleHR1cmUuZ2V0V2ViR0xUZXh0dXJlKHJlbmRlcmVyKTtcbiAgICAgICAgLy8gQXNzdW1lIGNhY2hlIGhhcyBiZWVuIHVzZWQuXG4gICAgICAgIHZhciBhdHRhY2hlZFRleHR1cmVzID0gdGhpcy5fY2FjaGUuZ2V0KCdhdHRhY2hlZF90ZXh0dXJlcycpO1xuICAgICAgICBpZiAoYXR0YWNoZWRUZXh0dXJlcyAmJiBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gYXR0YWNoZWRUZXh0dXJlc1thdHRhY2htZW50XTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRleHR1cmUgYW5kIHRhcmdldCBub3QgY2hhbmdlZFxuICAgICAgICAgICAgaWYgKG9iai50ZXh0dXJlID09PSB0ZXh0dXJlICYmIG9iai50YXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRhY2htZW50ID0gK2F0dGFjaG1lbnQ7XG5cbiAgICAgICAgdmFyIGNhbkF0dGFjaCA9IHRydWU7XG4gICAgICAgIGlmIChhdHRhY2htZW50ID09PSBHTF9ERVBUSF9BVFRBQ0hNRU5UIHx8IGF0dGFjaG1lbnQgPT09IGdsZW51bS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHtcbiAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSByZW5kZXJlci5nZXRHTEV4dGVuc2lvbignV0VCR0xfZGVwdGhfdGV4dHVyZScpO1xuXG4gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlcHRoIHRleHR1cmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlcicpO1xuICAgICAgICAgICAgICAgIGNhbkF0dGFjaCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRleHR1cmUuZm9ybWF0ICE9PSBnbGVudW0uREVQVEhfQ09NUE9ORU5UXG4gICAgICAgICAgICAgICAgJiYgdGV4dHVyZS5mb3JtYXQgIT09IGdsZW51bS5ERVBUSF9TVEVOQ0lMXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgdGV4dHVyZSBhdHRhY2hlZCB0byBkZXB0aCBidWZmZXIgaXMgbm90IGEgdmFsaWQuJyk7XG4gICAgICAgICAgICAgICAgY2FuQXR0YWNoID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc3Bvc2UgcmVuZGVyIGJ1ZmZlciBjcmVhdGVkIHByZXZpb3VzXG4gICAgICAgICAgICBpZiAoY2FuQXR0YWNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbmRlcmJ1ZmZlciA9IHRoaXMuX2NhY2hlLmdldChLRVlfUkVOREVSQlVGRkVSKTtcbiAgICAgICAgICAgICAgICBpZiAocmVuZGVyYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgR0xfREVQVEhfQVRUQUNITUVOVCwgR0xfUkVOREVSQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5wdXQoS0VZX1JFTkRFUkJVRkZFUiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChLRVlfUkVOREVSQlVGRkVSX0FUVEFDSEVELCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KEtFWV9ERVBUSFRFWFRVUkVfQVRUQUNIRUQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWlwbWFwIGxldmVsIGNhbiBvbmx5IGJlIDBcbiAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0YXJnZXQsIHdlYmdsVGV4dHVyZSwgMCk7XG5cbiAgICAgICAgaWYgKCFhdHRhY2hlZFRleHR1cmVzKSB7XG4gICAgICAgICAgICBhdHRhY2hlZFRleHR1cmVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5wdXQoJ2F0dGFjaGVkX3RleHR1cmVzJywgYXR0YWNoZWRUZXh0dXJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNoZWRUZXh0dXJlc1thdHRhY2htZW50XSA9IGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0gfHwge307XG4gICAgICAgIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0udGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0udGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgICAgIHJldHVybiBjYW5BdHRhY2g7XG4gICAgfSxcblxuICAgIF9kb0RldGFjaDogZnVuY3Rpb24gKF9nbCwgYXR0YWNobWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIERldGFjaCBhIHRleHR1cmUgZnJvbSBmcmFtZWJ1ZmZlclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1dlYkdML2Jsb2IvbWFzdGVyL2NvbmZvcm1hbmNlLXN1aXRlcy8xLjAuMC9jb25mb3JtYW5jZS9mcmFtZWJ1ZmZlci10ZXN0Lmh0bWwjTDE0NVxuICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRhcmdldCwgbnVsbCwgMCk7XG5cbiAgICAgICAgLy8gQXNzdW1lIGNhY2hlIGhhcyBiZWVuIHVzZWQuXG4gICAgICAgIHZhciBhdHRhY2hlZFRleHR1cmVzID0gdGhpcy5fY2FjaGUuZ2V0KCdhdHRhY2hlZF90ZXh0dXJlcycpO1xuICAgICAgICBpZiAoYXR0YWNoZWRUZXh0dXJlcyAmJiBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdKSB7XG4gICAgICAgICAgICBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRhY2htZW50ID09PSBHTF9ERVBUSF9BVFRBQ0hNRU5UIHx8IGF0dGFjaG1lbnQgPT09IGdsZW51bS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChLRVlfREVQVEhURVhUVVJFX0FUVEFDSEVELCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoIGEgdGV4dHVyZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gW2F0dGFjaG1lbnQ9Z2wuQ09MT1JfQVRUQUNITUVOVDBdXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbdGFyZ2V0PWdsLlRFWFRVUkVfMkRdXG4gICAgICovXG4gICAgZGV0YWNoOiBmdW5jdGlvbiAoYXR0YWNobWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIFRPRE8gZGVwdGggZXh0ZW5zaW9uIGNoZWNrID9cbiAgICAgICAgdGhpcy5fdGV4dHVyZXNbYXR0YWNobWVudF0gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fYm91bmRSZW5kZXJlcikge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgICAgICAgICBjYWNoZS51c2UodGhpcy5fYm91bmRSZW5kZXJlci5fX3VpZF9fKTtcbiAgICAgICAgICAgIHRoaXMuX2RvRGV0YWNoKHRoaXMuX2JvdW5kUmVuZGVyZXIuZ2wsIGF0dGFjaG1lbnQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VcbiAgICAgKiBAcGFyYW0gIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IF9nbFxuICAgICAqL1xuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuXG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuXG4gICAgICAgIHZhciByZW5kZXJCdWZmZXIgPSBjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUik7XG4gICAgICAgIGlmIChyZW5kZXJCdWZmZXIpIHtcbiAgICAgICAgICAgIF9nbC5kZWxldGVSZW5kZXJidWZmZXIocmVuZGVyQnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnJhbWVCdWZmZXIgPSBjYWNoZS5nZXQoS0VZX0ZSQU1FQlVGRkVSKTtcbiAgICAgICAgaWYgKGZyYW1lQnVmZmVyKSB7XG4gICAgICAgICAgICBfZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlLmRlbGV0ZUNvbnRleHQocmVuZGVyZXIuX191aWRfXyk7XG5cbiAgICAgICAgLy8gQ2xlYXIgY2FjaGUgZm9yIHJldXNpbmdcbiAgICAgICAgdGhpcy5fdGV4dHVyZXMgPSB7fTtcblxuICAgIH1cbn0pO1xuXG5GcmFtZUJ1ZmZlci5ERVBUSF9BVFRBQ0hNRU5UID0gR0xfREVQVEhfQVRUQUNITUVOVDtcbkZyYW1lQnVmZmVyLkNPTE9SX0FUVEFDSE1FTlQwID0gR0xfQ09MT1JfQVRUQUNITUVOVDA7XG5GcmFtZUJ1ZmZlci5TVEVOQ0lMX0FUVEFDSE1FTlQgPSBnbGVudW0uU1RFTkNJTF9BVFRBQ0hNRU5UO1xuRnJhbWVCdWZmZXIuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UID0gZ2xlbnVtLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDtcblxuZXhwb3J0IGRlZmF1bHQgRnJhbWVCdWZmZXI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIlxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkIDogVEVYQ09PUkRfMDtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbn1cXG5AZW5kXCI7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IE9ydGhvQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9PcnRob2dyYXBoaWMnO1xuaW1wb3J0IFBsYW5lIGZyb20gJy4uL2dlb21ldHJ5L1BsYW5lJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5pbXBvcnQgTWVzaCBmcm9tICcuLi9NZXNoJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi4vY29yZS9nbGVudW0nO1xuaW1wb3J0IHZlcnRleEVzc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL3ZlcnRleC5nbHNsLmpzJztcblxuU2hhZGVyWydpbXBvcnQnXSh2ZXJ0ZXhFc3NsKTtcblxudmFyIHBsYW5lR2VvID0gbmV3IFBsYW5lKCk7XG52YXIgbWVzaCA9IG5ldyBNZXNoKHtcbiAgICBnZW9tZXRyeTogcGxhbmVHZW8sXG4gICAgZnJ1c3R1bUN1bGxpbmc6IGZhbHNlXG59KTtcbnZhciBjYW1lcmEgPSBuZXcgT3J0aG9DYW1lcmEoKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jb21wb3NpdG9yLlBhc3NcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBQYXNzID0gQmFzZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuY29tcG9zaXRvci5QYXNzIyAqLyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGcmFnbWVudCBzaGFkZXIgc3RyaW5nXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICAvLyBQRU5ESU5HIHNoYWRlciBvciBmcmFnbWVudCA/XG4gICAgICAgIGZyYWdtZW50IDogJycsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRzIDogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2NsYXkuTWF0ZXJpYWx9XG4gICAgICAgICAqL1xuICAgICAgICBtYXRlcmlhbCA6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgYmxlbmRXaXRoUHJldmlvdXM6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGNsZWFyQ29sb3I6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGNsZWFyRGVwdGg6IHRydWVcbiAgICB9O1xufSwgZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIgc2hhZGVyID0gbmV3IFNoYWRlcihTaGFkZXIuc291cmNlKCdjbGF5LmNvbXBvc2l0b3IudmVydGV4JyksIHRoaXMuZnJhZ21lbnQpO1xuICAgIHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgIHNoYWRlcjogc2hhZGVyXG4gICAgfSk7XG4gICAgbWF0ZXJpYWwuZW5hYmxlVGV4dHVyZXNBbGwoKTtcblxuICAgIHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblxufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLlBhc3MucHJvdG90eXBlICovXG57XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRVbmlmb3JtIDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tYXRlcmlhbC5zZXRVbmlmb3JtKG5hbWUsIHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm4ge31cbiAgICAgKi9cbiAgICBnZXRVbmlmb3JtIDogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICB2YXIgdW5pZm9ybSA9IHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbbmFtZV07XG4gICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5pZm9ybS52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5UZXh0dXJlfSB0ZXh0dXJlXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBhdHRhY2htZW50XG4gICAgICovXG4gICAgYXR0YWNoT3V0cHV0IDogZnVuY3Rpb24odGV4dHVyZSwgYXR0YWNobWVudCkge1xuICAgICAgICBpZiAoIXRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNobWVudCA9IGF0dGFjaG1lbnQgfHwgZ2xlbnVtLkNPTE9SX0FUVEFDSE1FTlQwO1xuICAgICAgICB0aGlzLm91dHB1dHNbYXR0YWNobWVudF0gPSB0ZXh0dXJlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5UZXh0dXJlfSB0ZXh0dXJlXG4gICAgICovXG4gICAgZGV0YWNoT3V0cHV0IDogZnVuY3Rpb24odGV4dHVyZSkge1xuICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3V0cHV0c1thdHRhY2htZW50XSA9PT0gdGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0c1thdHRhY2htZW50XSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZCA6IGZ1bmN0aW9uKHJlbmRlcmVyLCBmcmFtZUJ1ZmZlcikge1xuXG4gICAgICAgIGlmICh0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGF0dGFjaG1lbnQgaW4gdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLm91dHB1dHNbYXR0YWNobWVudF07XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRleHR1cmUsIGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFtZUJ1ZmZlcikge1xuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdW5iaW5kIDogZnVuY3Rpb24ocmVuZGVyZXIsIGZyYW1lQnVmZmVyKSB7XG4gICAgICAgIGZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSAge2NsYXkuRnJhbWVCdWZmZXJ9IFtmcmFtZUJ1ZmZlcl1cbiAgICAgKi9cbiAgICByZW5kZXIgOiBmdW5jdGlvbihyZW5kZXJlciwgZnJhbWVCdWZmZXIpIHtcblxuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgaWYgKGZyYW1lQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmQocmVuZGVyZXIsIGZyYW1lQnVmZmVyKTtcbiAgICAgICAgICAgIC8vIE1SVCBTdXBwb3J0IGluIGNocm9tZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc2RrL3Rlc3RzL2NvbmZvcm1hbmNlL2V4dGVuc2lvbnMvZXh0LWRyYXctYnVmZmVycy5odG1sXG4gICAgICAgICAgICB2YXIgZXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ0VYVF9kcmF3X2J1ZmZlcnMnKTtcbiAgICAgICAgICAgIGlmIChleHQgJiYgdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50ID0gK2F0dGFjaG1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50ID49IF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCAmJiBhdHRhY2htZW50IDw9IF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnMucHVzaChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleHQuZHJhd0J1ZmZlcnNFWFQoYnVmcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcicsIHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvLyBGSVhNRSBEb24ndCBjbGVhciBpbiBlYWNoIHBhc3MgaW4gZGVmYXVsdCwgbGV0IHRoZSBjb2xvciBvdmVyd3JpdGUgdGhlIGJ1ZmZlclxuICAgICAgICAvLyBGSVhNRSBwaXhlbHMgbWF5IGJlIGRpc2NhcmRcbiAgICAgICAgdmFyIGNsZWFyQml0ID0gdGhpcy5jbGVhckRlcHRoID8gX2dsLkRFUFRIX0JVRkZFUl9CSVQgOiAwO1xuICAgICAgICBfZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5jbGVhckNvbG9yKSB7XG4gICAgICAgICAgICBjbGVhckJpdCA9IGNsZWFyQml0IHwgX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG4gICAgICAgICAgICBfZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgdmFyIGNjID0gdGhpcy5jbGVhckNvbG9yO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2MpKSB7XG4gICAgICAgICAgICAgICAgX2dsLmNsZWFyQ29sb3IoY2NbMF0sIGNjWzFdLCBjY1syXSwgY2NbM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9nbC5jbGVhcihjbGVhckJpdCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYmxlbmRXaXRoUHJldmlvdXMpIHtcbiAgICAgICAgICAgIC8vIEJsZW5kIHdpdGggcHJldmlvdXMgcmVuZGVyZWQgc2NlbmUgaW4gdGhlIGZpbmFsIG91dHB1dFxuICAgICAgICAgICAgLy8gRklYTUUgQ29uZmlndXJlIGJsZW5kLlxuICAgICAgICAgICAgLy8gRklYTUUgSXQgd2lsbCBjYXVzZSBzY3JlZW4gYmxpbmvvvJ9cbiAgICAgICAgICAgIF9nbC5lbmFibGUoX2dsLkJMRU5EKTtcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX2dsLmRpc2FibGUoX2dsLkJMRU5EKTtcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyUXVhZChyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdhZnRlcnJlbmRlcicsIHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICBpZiAoZnJhbWVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMudW5iaW5kKHJlbmRlcmVyLCBmcmFtZUJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2ltcGx5IGRvIHF1YWQgcmVuZGVyaW5nXG4gICAgICovXG4gICAgcmVuZGVyUXVhZDogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIG1lc2gubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKFttZXNoXSwgY2FtZXJhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHt9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgUGFzcztcbiIsIi8vIFRPRE8gU2hvdWxkIG5vdCBkZXJpdmVkIGZyb20gbWVzaD9cbmltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IEN1YmVHZW9tZXRyeSBmcm9tICcuLi9nZW9tZXRyeS9DdWJlJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5cbmltcG9ydCBza3lib3hFc3NsIGZyb20gJy4uL3NoYWRlci9zb3VyY2Uvc2t5Ym94Lmdsc2wuanMnO1xuU2hhZGVyLmltcG9ydChza3lib3hFc3NsKTtcbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGx1Z2luLlNreWJveFxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgdmFyIHNreVRleCA9IG5ldyBjbGF5LlRleHR1cmVDdWJlKCk7XG4gKiAgICAgc2t5VGV4LmxvYWQoe1xuICogICAgICAgICAncHgnOiAnYXNzZXRzL3RleHR1cmVzL3NreS9weC5qcGcnLFxuICogICAgICAgICAnbngnOiAnYXNzZXRzL3RleHR1cmVzL3NreS9ueC5qcGcnXG4gKiAgICAgICAgICdweSc6ICdhc3NldHMvdGV4dHVyZXMvc2t5L3B5LmpwZydcbiAqICAgICAgICAgJ255JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvbnkuanBnJ1xuICogICAgICAgICAncHonOiAnYXNzZXRzL3RleHR1cmVzL3NreS9wei5qcGcnXG4gKiAgICAgICAgICdueic6ICdhc3NldHMvdGV4dHVyZXMvc2t5L256LmpwZydcbiAqICAgICB9KTtcbiAqICAgICB2YXIgc2t5Ym94ID0gbmV3IGNsYXkucGx1Z2luLlNreWJveCh7XG4gKiAgICAgICAgIHNjZW5lOiBzY2VuZVxuICogICAgIH0pO1xuICogICAgIHNreWJveC5tYXRlcmlhbC5zZXQoJ2Vudmlyb25tZW50TWFwJywgc2t5VGV4KTtcbiAqL1xudmFyIFNreWJveCA9IE1lc2guZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBza3lib3hTaGFkZXIgPSBuZXcgU2hhZGVyKHtcbiAgICAgICAgdmVydGV4OiBTaGFkZXIuc291cmNlKCdjbGF5LnNreWJveC52ZXJ0ZXgnKSxcbiAgICAgICAgZnJhZ21lbnQ6IFNoYWRlci5zb3VyY2UoJ2NsYXkuc2t5Ym94LmZyYWdtZW50JylcbiAgICB9KTtcbiAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoe1xuICAgICAgICBzaGFkZXI6IHNreWJveFNoYWRlcixcbiAgICAgICAgZGVwdGhNYXNrOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlNjZW5lfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wbHVnaW4uU2t5Ym94LnByb3RvdHlwZVxuICAgICAgICAgKi9cbiAgICAgICAgc2NlbmU6IG51bGwsXG5cbiAgICAgICAgZ2VvbWV0cnk6IG5ldyBDdWJlR2VvbWV0cnkoKSxcblxuICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWwsXG5cbiAgICAgICAgZW52aXJvbm1lbnRNYXA6IG51bGwsXG5cbiAgICAgICAgY3VsbGluZzogZmFsc2VcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgaWYgKHNjZW5lKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoU2NlbmUoc2NlbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudE1hcCkge1xuICAgICAgICB0aGlzLnNldEVudmlyb25tZW50TWFwKHRoaXMuZW52aXJvbm1lbnRNYXApO1xuICAgIH1cbn0sIC8qKiBAbGVuZHMgY2xheS5wbHVnaW4uU2t5Ym94IyAqLyB7XG4gICAgLyoqXG4gICAgICogQXR0YWNoIHRoZSBza3lib3ggdG8gdGhlIHNjZW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5TY2VuZX0gc2NlbmVcbiAgICAgKi9cbiAgICBhdHRhY2hTY2VuZTogZnVuY3Rpb24gKHNjZW5lKSB7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaFNjZW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICBzY2VuZS5vbignYmVmb3JlcmVuZGVyJywgdGhpcy5fYmVmb3JlUmVuZGVyU2NlbmUsIHRoaXMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGV0YWNoIGZyb20gc2NlbmVcbiAgICAgKi9cbiAgICBkZXRhY2hTY2VuZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5vZmYoJ2JlZm9yZXJlbmRlcicsIHRoaXMuX2JlZm9yZVJlbmRlclNjZW5lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBza3lib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqL1xuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB0aGlzLmRldGFjaFNjZW5lKCk7XG4gICAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXQgZW52aXJvbm1lbnQgbWFwXG4gICAgICogQHBhcmFtIHtjbGF5LlRleHR1cmVDdWJlfSBlbnZNYXBcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudE1hcDogZnVuY3Rpb24gKGVudk1hcCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnNldCgnZW52aXJvbm1lbnRNYXAnLCBlbnZNYXApO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IGVudmlyb25tZW50IG1hcFxuICAgICAqIEByZXR1cm4ge2NsYXkuVGV4dHVyZUN1YmV9XG4gICAgICovXG4gICAgZ2V0RW52aXJvbm1lbnRNYXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWwuZ2V0KCdlbnZpcm9ubWVudE1hcCcpO1xuICAgIH0sXG5cbiAgICBfYmVmb3JlUmVuZGVyU2NlbmU6IGZ1bmN0aW9uKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XG4gICAgICAgIHRoaXMucmVuZGVyU2t5Ym94KHJlbmRlcmVyLCBjYW1lcmEpO1xuICAgIH0sXG5cbiAgICByZW5kZXJTa3lib3g6IGZ1bmN0aW9uIChyZW5kZXJlciwgY2FtZXJhKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24uY29weShjYW1lcmEuZ2V0V29ybGRQb3NpdGlvbigpKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgLy8gRG9uJ3QgcmVtZW1iZXIgdG8gZGlzYWJsZSBibGVuZFxuICAgICAgICByZW5kZXJlci5nbC5kaXNhYmxlKHJlbmRlcmVyLmdsLkJMRU5EKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyUGFzcyhbdGhpc10sIGNhbWVyYSk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNreWJveDtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IFBlcnNwZWN0aXZlQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuXG52YXIgdGFyZ2V0cyA9IFsncHgnLCAnbngnLCAncHknLCAnbnknLCAncHonLCAnbnonXTtcblxuLyoqXG4gKiBQYXNzIHJlbmRlcmluZyBzY2VuZSB0byBhIGVudmlyb25tZW50IGN1YmUgbWFwXG4gKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcFxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqIEBleGFtcGxlXG4gKiAgICAgLy8gRXhhbXBsZSBvZiBjYXIgcmVmbGVjdGlvblxuICogICAgIHZhciBlbnZNYXAgPSBuZXcgY2xheS5UZXh0dXJlQ3ViZSh7XG4gKiAgICAgICAgIHdpZHRoOiAyNTYsXG4gKiAgICAgICAgIGhlaWdodDogMjU2XG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIGVudlBhc3MgPSBuZXcgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwKHtcbiAqICAgICAgICAgcG9zaXRpb246IGNhci5wb3NpdGlvbixcbiAqICAgICAgICAgdGV4dHVyZTogZW52TWFwXG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIGNhckJvZHkgPSBjYXIuZ2V0Q2hpbGRCeU5hbWUoJ2JvZHknKTtcbiAqICAgICBjYXJCb2R5Lm1hdGVyaWFsLmVuYWJsZVRleHR1cmUoJ2Vudmlyb25tZW50TWFwJyk7XG4gKiAgICAgY2FyQm9keS5tYXRlcmlhbC5zZXQoJ2Vudmlyb25tZW50TWFwJywgZW52TWFwKTtcbiAqICAgICAuLi5cbiAqICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24oZnJhbWVUaW1lKSB7XG4gKiAgICAgICAgIGVudlBhc3MucmVuZGVyKHJlbmRlcmVyLCBzY2VuZSk7XG4gKiAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAqICAgICB9KTtcbiAqL1xudmFyIEVudmlyb25tZW50TWFwUGFzcyA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXQgPSAvKiogQGxlbmRzIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIHBvc2l0aW9uXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcCNcbiAgICAgICAgICovXG4gICAgICAgIHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIGZhciBwbGFuZVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwI1xuICAgICAgICAgKi9cbiAgICAgICAgZmFyOiAxMDAwLFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIG5lYXIgcGxhbmVcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcCNcbiAgICAgICAgICovXG4gICAgICAgIG5lYXI6IDAuMSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudmlyb25tZW50IGN1YmUgbWFwXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmVDdWJlfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwI1xuICAgICAgICAgKi9cbiAgICAgICAgdGV4dHVyZTogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCBpZiB5b3Ugd2FuJ3QgaGF2ZSBzaGFkb3cgaW4gZW52aXJvbm1lbnQgbWFwXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LnByZVBhc3MuU2hhZG93TWFwfVxuICAgICAgICAgKi9cbiAgICAgICAgc2hhZG93TWFwUGFzczogbnVsbCxcbiAgICB9O1xuICAgIHZhciBjYW1lcmFzID0gcmV0Ll9jYW1lcmFzID0ge1xuICAgICAgICBweDogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHsgZm92OiA5MCB9KSxcbiAgICAgICAgbng6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7IGZvdjogOTAgfSksXG4gICAgICAgIHB5OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoeyBmb3Y6IDkwIH0pLFxuICAgICAgICBueTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHsgZm92OiA5MCB9KSxcbiAgICAgICAgcHo6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7IGZvdjogOTAgfSksXG4gICAgICAgIG56OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoeyBmb3Y6IDkwIH0pXG4gICAgfTtcbiAgICBjYW1lcmFzLnB4Lmxvb2tBdChWZWN0b3IzLlBPU0lUSVZFX1gsIFZlY3RvcjMuTkVHQVRJVkVfWSk7XG4gICAgY2FtZXJhcy5ueC5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9YLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgIGNhbWVyYXMucHkubG9va0F0KFZlY3RvcjMuUE9TSVRJVkVfWSwgVmVjdG9yMy5QT1NJVElWRV9aKTtcbiAgICBjYW1lcmFzLm55Lmxvb2tBdChWZWN0b3IzLk5FR0FUSVZFX1ksIFZlY3RvcjMuTkVHQVRJVkVfWik7XG4gICAgY2FtZXJhcy5wei5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9aLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgIGNhbWVyYXMubnoubG9va0F0KFZlY3RvcjMuTkVHQVRJVkVfWiwgVmVjdG9yMy5ORUdBVElWRV9ZKTtcblxuICAgIC8vIEZJWE1FIEluIHdpbmRvd3MsIHVzZSBvbmUgZnJhbWVidWZmZXIgb25seSByZW5kZXJzIG9uZSBzaWRlIG9mIGN1YmVtYXBcbiAgICByZXQuX2ZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKCk7XG5cbiAgICByZXR1cm4gcmV0O1xufSwgIC8qKiBAbGVuZHMgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwIyAqLyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB0YXJnZXRcbiAgICAgKiBAcmV0dXJuICB7Y2xheS5DYW1lcmF9XG4gICAgICovXG4gICAgZ2V0Q2FtZXJhOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW1lcmFzW3RhcmdldF07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSAge2NsYXkuU2NlbmV9IHNjZW5lXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gW25vdFVwZGF0ZVNjZW5lPWZhbHNlXVxuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24ocmVuZGVyZXIsIHNjZW5lLCBub3RVcGRhdGVTY2VuZSkge1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIGlmICghbm90VXBkYXRlU2NlbmUpIHtcbiAgICAgICAgICAgIHNjZW5lLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFR3ZWFrIGZvdlxuICAgICAgICAvLyBodHRwOi8vdGhlLXdpdG5lc3MubmV0L25ld3MvMjAxMi8wMi9zZWFtbGVzcy1jdWJlLW1hcC1maWx0ZXJpbmcvXG4gICAgICAgIHZhciBuID0gdGhpcy50ZXh0dXJlLndpZHRoO1xuICAgICAgICB2YXIgZm92ID0gMiAqIE1hdGguYXRhbihuIC8gKG4gLSAwLjUpKSAvIE1hdGguUEkgKiAxODA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzW2ldO1xuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2NhbWVyYXNbdGFyZ2V0XTtcbiAgICAgICAgICAgIFZlY3RvcjMuY29weShjYW1lcmEucG9zaXRpb24sIHRoaXMucG9zaXRpb24pO1xuXG4gICAgICAgICAgICBjYW1lcmEuZmFyID0gdGhpcy5mYXI7XG4gICAgICAgICAgICBjYW1lcmEubmVhciA9IHRoaXMubmVhcjtcbiAgICAgICAgICAgIGNhbWVyYS5mb3YgPSBmb3Y7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvd01hcFBhc3MpIHtcbiAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYm91bmRpbmdCb3hMYXN0RnJhbWVcbiAgICAgICAgICAgICAgICB2YXIgYmJveCA9IHNjZW5lLmdldEJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICAgICAgYmJveC5hcHBseVRyYW5zZm9ybShjYW1lcmEudmlld01hdHJpeCk7XG4gICAgICAgICAgICAgICAgc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLmNvcHkoYmJveCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd01hcFBhc3MucmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaChcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgICAgICAgICBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqL1xuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRW52aXJvbm1lbnRNYXBQYXNzO1xuIiwiaW1wb3J0IE1lc2ggZnJvbSAnLi4vTWVzaCc7XG5pbXBvcnQgU3BoZXJlR2VvbWV0cnkgZnJvbSAnLi4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5cbmltcG9ydCBiYXNpY0Vzc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9iYXNpYy5nbHNsLmpzJztcblNoYWRlci5pbXBvcnQoYmFzaWNFc3NsKTtcbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGx1Z2luLlNreWRvbWVcbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIHZhciBza3lUZXggPSBuZXcgY2xheS5UZXh0dXJlMkQoKTtcbiAqICAgICBza3lUZXgubG9hZCgnYXNzZXRzL3RleHR1cmVzL3NreS5qcGcnKTtcbiAqICAgICB2YXIgc2t5ZG9tZSA9IG5ldyBjbGF5LnBsdWdpbi5Ta3lkb21lKHtcbiAqICAgICAgICAgc2NlbmU6IHNjZW5lXG4gKiAgICAgfSk7XG4gKiAgICAgc2t5ZG9tZS5tYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCBza3lUZXgpO1xuICovXG52YXIgU2t5ZG9tZSA9IE1lc2guZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBza3lkb21lU2hhZGVyID0gbmV3IFNoYWRlcihTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLmZyYWdtZW50JykpO1xuXG4gICAgdmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgc2hhZGVyOiBza3lkb21lU2hhZGVyLFxuICAgICAgICBkZXB0aE1hc2s6IGZhbHNlXG4gICAgfSk7XG4gICAgbWF0ZXJpYWwuZW5hYmxlVGV4dHVyZSgnZGlmZnVzZU1hcCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlNjZW5lfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wbHVnaW4uU2t5ZG9tZSNcbiAgICAgICAgICovXG4gICAgICAgIHNjZW5lOiBudWxsLFxuXG4gICAgICAgIGdlb21ldHJ5OiBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICAgICAgICAgICAgd2lkdGhTZWdtZW50czogMzAsXG4gICAgICAgICAgICBoZWlnaHRTZWdtZW50czogMzAsXG4gICAgICAgICAgICAvLyB0aGV0YUxlbmd0aDogTWF0aC5QSSAvIDJcbiAgICAgICAgfSksXG5cbiAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG4gICAgICAgIGVudmlyb25tZW50TWFwOiBudWxsLFxuXG4gICAgICAgIGN1bGxpbmc6IGZhbHNlXG4gICAgfTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgIGlmIChzY2VuZSkge1xuICAgICAgICB0aGlzLmF0dGFjaFNjZW5lKHNjZW5lKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudE1hcCkge1xuICAgICAgICB0aGlzLnNldEVudmlyb25tZW50TWFwKHRoaXMuZW52aXJvbm1lbnRNYXApO1xuICAgIH1cbn0sIHtcbiAgICAvKipcbiAgICAgKiBBdHRhY2ggdGhlIHNreWJveCB0byB0aGUgc2NlbmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnBsdWdpbi5Ta3lkb21lLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGF0dGFjaFNjZW5lOiBmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoU2NlbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHNjZW5lLm9uKCdiZWZvcmVyZW5kZXInLCB0aGlzLl9iZWZvcmVSZW5kZXJTY2VuZSwgdGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZXRhY2ggZnJvbSBzY2VuZVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnBsdWdpbi5Ta3lkb21lLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGRldGFjaFNjZW5lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLm9mZignYmVmb3JlcmVuZGVyJywgdGhpcy5fYmVmb3JlUmVuZGVyU2NlbmUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgIH0sXG5cbiAgICBfYmVmb3JlUmVuZGVyU2NlbmU6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uLmNvcHkoY2FtZXJhLmdldFdvcmxkUG9zaXRpb24oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlclBhc3MoW3RoaXNdLCBjYW1lcmEpO1xuICAgIH0sXG5cbiAgICBzZXRFbnZpcm9ubWVudE1hcDogZnVuY3Rpb24gKGVudk1hcCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnNldCgnZGlmZnVzZU1hcCcsIGVudk1hcCk7XG4gICAgfSxcblxuICAgIGdldEVudmlyb25tZW50TWFwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsLmdldCgnZGlmZnVzZU1hcCcpO1xuICAgIH0sXG5cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5kZXRhY2hTY2VuZSgpO1xuICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTa3lkb21lO1xuIiwiaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2JiOTQzOTkxKHY9dnMuODUpLmFzcHhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90b2ppL3dlYmdsLXRleHR1cmUtdXRpbHMvYmxvYi9tYXN0ZXIvdGV4dHVyZS11dGlsL2Rkcy5qc1xudmFyIEREU19NQUdJQyA9IDB4MjA1MzQ0NDQ7XG5cbnZhciBERFNEX0NBUFMgPSAweDE7XG52YXIgRERTRF9IRUlHSFQgPSAweDI7XG52YXIgRERTRF9XSURUSCA9IDB4NDtcbnZhciBERFNEX1BJVENIID0gMHg4O1xudmFyIEREU0RfUElYRUxGT1JNQVQgPSAweDEwMDA7XG52YXIgRERTRF9NSVBNQVBDT1VOVCA9IDB4MjAwMDA7XG52YXIgRERTRF9MSU5FQVJTSVpFID0gMHg4MDAwMDtcbnZhciBERFNEX0RFUFRIID0gMHg4MDAwMDA7XG5cbnZhciBERFNDQVBTX0NPTVBMRVggPSAweDg7XG52YXIgRERTQ0FQU19NSVBNQVAgPSAweDQwMDAwMDtcbnZhciBERFNDQVBTX1RFWFRVUkUgPSAweDEwMDA7XG5cbnZhciBERFNDQVBTMl9DVUJFTUFQID0gMHgyMDA7XG52YXIgRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVggPSAweDQwMDtcbnZhciBERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWCA9IDB4ODAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVZID0gMHgxMDAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVZID0gMHgyMDAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVaID0gMHg0MDAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVaID0gMHg4MDAwO1xudmFyIEREU0NBUFMyX1ZPTFVNRSA9IDB4MjAwMDAwO1xuXG52YXIgRERQRl9BTFBIQVBJWEVMUyA9IDB4MTtcbnZhciBERFBGX0FMUEhBID0gMHgyO1xudmFyIEREUEZfRk9VUkNDID0gMHg0O1xudmFyIEREUEZfUkdCID0gMHg0MDtcbnZhciBERFBGX1lVViA9IDB4MjAwO1xudmFyIEREUEZfTFVNSU5BTkNFID0gMHgyMDAwMDtcblxuZnVuY3Rpb24gZm91ckNDVG9JbnQzMih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5jaGFyQ29kZUF0KDApICtcbiAgICAgICAgKHZhbHVlLmNoYXJDb2RlQXQoMSkgPDwgOCkgK1xuICAgICAgICAodmFsdWUuY2hhckNvZGVBdCgyKSA8PCAxNikgK1xuICAgICAgICAodmFsdWUuY2hhckNvZGVBdCgzKSA8PCAyNCk7XG59XG5cbmZ1bmN0aW9uIGludDMyVG9Gb3VyQ0ModmFsdWUpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgdmFsdWUgJiAweGZmLFxuICAgICAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhmZixcbiAgICAgICAgKHZhbHVlID4+IDI0KSAmIDB4ZmZcbiAgICApO1xufVxuXG52YXIgaGVhZGVyTGVuZ3RoSW50ID0gMzE7IC8vIFRoZSBoZWFkZXIgbGVuZ3RoIGluIDMyIGJpdCBpbnRzXG5cbnZhciBGT1VSQ0NfRFhUMSA9IGZvdXJDQ1RvSW50MzIoJ0RYVDEnKTtcbnZhciBGT1VSQ0NfRFhUMyA9IGZvdXJDQ1RvSW50MzIoJ0RYVDMnKTtcbnZhciBGT1VSQ0NfRFhUNSA9IGZvdXJDQ1RvSW50MzIoJ0RYVDUnKTtcbiAgICAvLyBPZmZzZXRzIGludG8gdGhlIGhlYWRlciBhcnJheVxudmFyIG9mZl9tYWdpYyA9IDA7XG5cbnZhciBvZmZfc2l6ZSA9IDE7XG52YXIgb2ZmX2ZsYWdzID0gMjtcbnZhciBvZmZfaGVpZ2h0ID0gMztcbnZhciBvZmZfd2lkdGggPSA0O1xuXG52YXIgb2ZmX21pcG1hcENvdW50ID0gNztcblxudmFyIG9mZl9wZkZsYWdzID0gMjA7XG52YXIgb2ZmX3BmRm91ckNDID0gMjE7XG5cbnZhciBvZmZfY2FwcyA9IDI3O1xudmFyIG9mZl9jYXBzMiA9IDI4O1xudmFyIG9mZl9jYXBzMyA9IDI5O1xudmFyIG9mZl9jYXBzNCA9IDMwO1xuXG52YXIgcmV0ID0ge1xuICAgIHBhcnNlOiBmdW5jdGlvbihhcnJheUJ1ZmZlciwgb3V0KSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBuZXcgSW50MzJBcnJheShhcnJheUJ1ZmZlciwgMCwgaGVhZGVyTGVuZ3RoSW50KTtcbiAgICAgICAgaWYgKGhlYWRlcltvZmZfbWFnaWNdICE9PSBERFNfTUFHSUMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGVhZGVyKG9mZl9wZkZsYWdzKSAmIEREUEZfRk9VUkNDKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb3VyQ0MgPSBoZWFkZXIob2ZmX3BmRm91ckNDKTtcbiAgICAgICAgdmFyIHdpZHRoID0gaGVhZGVyW29mZl93aWR0aF07XG4gICAgICAgIHZhciBoZWlnaHQgPSBoZWFkZXJbb2ZmX2hlaWdodF07XG4gICAgICAgIHZhciBpc0N1YmVNYXAgPSBoZWFkZXJbb2ZmX2NhcHMyXSAmIEREU0NBUFMyX0NVQkVNQVA7XG4gICAgICAgIHZhciBoYXNNaXBtYXAgPSBoZWFkZXJbb2ZmX2ZsYWdzXSAmIEREU0RfTUlQTUFQQ09VTlQ7XG4gICAgICAgIHZhciBibG9ja0J5dGVzLCBpbnRlcm5hbEZvcm1hdDtcbiAgICAgICAgc3dpdGNoKGZvdXJDQykge1xuICAgICAgICAgICAgY2FzZSBGT1VSQ0NfRFhUMTpcbiAgICAgICAgICAgICAgICBibG9ja0J5dGVzID0gODtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IFRleHR1cmUuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRk9VUkNDX0RYVDM6XG4gICAgICAgICAgICAgICAgYmxvY2tCeXRlcyA9IDE2O1xuICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0ID0gVGV4dHVyZS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRk9VUkNDX0RYVDU6XG4gICAgICAgICAgICAgICAgYmxvY2tCeXRlcyA9IDE2O1xuICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0ID0gVGV4dHVyZS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGFPZmZzZXQgPSBoZWFkZXJbb2ZmX3NpemVdICsgNDtcbiAgICAgICAgLy8gVE9ETzogU3VwcG9zZSBhbGwgZmFjZSBhcmUgZXhpc3RlZFxuICAgICAgICB2YXIgZmFjZU51bWJlciA9IGlzQ3ViZU1hcCA/IDYgOiAxO1xuICAgICAgICB2YXIgbWlwbWFwQ291bnQgPSAxO1xuICAgICAgICBpZiAoaGFzTWlwbWFwKSB7XG4gICAgICAgICAgICBtaXBtYXBDb3VudCA9IE1hdGgubWF4KDEsIGhlYWRlcltvZmZfbWlwbWFwQ291bnRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0dXJlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGZhY2VOdW1iZXI7IGYrKykge1xuICAgICAgICAgICAgdmFyIF93aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgdmFyIF9oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB0ZXh0dXJlc1tmXSA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgICAgIHdpZHRoIDogX3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCA6IF9oZWlnaHQsXG4gICAgICAgICAgICAgICAgZm9ybWF0IDogaW50ZXJuYWxGb3JtYXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIG1pcG1hcHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWlwbWFwQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhTGVuZ3RoID0gTWF0aC5tYXgoNCwgX3dpZHRoKSAvIDQgKiBNYXRoLm1heCg0LCBfaGVpZ2h0KSAvIDQgKiBibG9ja0J5dGVzO1xuICAgICAgICAgICAgICAgIHZhciBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YUxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0ICs9IGRhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgX3dpZHRoICo9IDAuNTtcbiAgICAgICAgICAgICAgICBfaGVpZ2h0ICo9IDAuNTtcbiAgICAgICAgICAgICAgICBtaXBtYXBzW2ldID0gYnl0ZUFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dHVyZXNbZl0ucGl4ZWxzID0gbWlwbWFwc1swXTtcbiAgICAgICAgICAgIGlmIChoYXNNaXBtYXApIHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlc1tmXS5taXBtYXBzID0gbWlwbWFwcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIC8vIHJldHVybiBpc0N1YmVNYXAgPyB0ZXh0dXJlcyA6IHRleHR1cmVzWzBdO1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICBvdXQud2lkdGggPSB0ZXh0dXJlc1swXS53aWR0aDtcbiAgICAgICAgICAgIG91dC5oZWlnaHQgPSB0ZXh0dXJlc1swXS5oZWlnaHQ7XG4gICAgICAgICAgICBvdXQuZm9ybWF0ID0gdGV4dHVyZXNbMF0uZm9ybWF0O1xuICAgICAgICAgICAgb3V0LnBpeGVscyA9IHRleHR1cmVzWzBdLnBpeGVscztcbiAgICAgICAgICAgIG91dC5taXBtYXBzID0gdGV4dHVyZXNbMF0ubWlwbWFwcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlc1swXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJldDtcbiIsImltcG9ydCBUZXh0dXJlIGZyb20gJy4uL1RleHR1cmUnO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xudmFyIHRvQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbnZhciBNSU5FTEVOID0gODtcbnZhciBNQVhFTEVOID0gMHg3ZmZmO1xuZnVuY3Rpb24gcmdiZTJmbG9hdChyZ2JlLCBidWZmZXIsIG9mZnNldCwgZXhwb3N1cmUpIHtcbiAgICBpZiAocmdiZVszXSA+IDApIHtcbiAgICAgICAgdmFyIGYgPSBNYXRoLnBvdygyLjAsIHJnYmVbM10gLSAxMjggLSA4ICsgZXhwb3N1cmUpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0ICsgMF0gPSByZ2JlWzBdICogZjtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDFdID0gcmdiZVsxXSAqIGY7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQgKyAyXSA9IHJnYmVbMl0gKiBmO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDBdID0gMDtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDFdID0gMDtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDJdID0gMDtcbiAgICB9XG4gICAgYnVmZmVyW29mZnNldCArIDNdID0gMS4wO1xuICAgIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHVpbnQ4MnN0cmluZyhhcnJheSwgb2Zmc2V0LCBzaXplKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQ7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgc3RyICs9IHRvQ2hhcihhcnJheVtpXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIGNvcHlyZ2JlKHMsIHQpIHtcbiAgICB0WzBdID0gc1swXTtcbiAgICB0WzFdID0gc1sxXTtcbiAgICB0WzJdID0gc1syXTtcbiAgICB0WzNdID0gc1szXTtcbn1cblxuLy8gVE9ETyA6IGNoZWNrXG5mdW5jdGlvbiBvbGRSZWFkQ29sb3JzKHNjYW4sIGJ1ZmZlciwgb2Zmc2V0LCB4bWF4KSB7XG4gICAgdmFyIHJzaGlmdCA9IDAsIHggPSAwLCBsZW4gPSB4bWF4O1xuICAgIHdoaWxlIChsZW4gPiAwKSB7XG4gICAgICAgIHNjYW5beF1bMF0gPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICBzY2FuW3hdWzFdID0gYnVmZmVyW29mZnNldCsrXTtcbiAgICAgICAgc2Nhblt4XVsyXSA9IGJ1ZmZlcltvZmZzZXQrK107XG4gICAgICAgIHNjYW5beF1bM10gPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICBpZiAoc2Nhblt4XVswXSA9PT0gMSAmJiBzY2FuW3hdWzFdID09PSAxICYmIHNjYW5beF1bMl0gPT09IDEpIHtcbiAgICAgICAgICAgIC8vIGV4cCBpcyBjb3VudCBvZiByZXBlYXRlZCBwaXhlbHNcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAoc2Nhblt4XVszXSA8PCByc2hpZnQpID4+PiAwOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29weXJnYmUoc2Nhblt4LTFdLCBzY2FuW3hdKTtcbiAgICAgICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICAgICAgbGVuLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByc2hpZnQgKz0gODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICAgICAgcnNoaWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiByZWFkQ29sb3JzKHNjYW4sIGJ1ZmZlciwgb2Zmc2V0LCB4bWF4KSB7XG4gICAgaWYgKCh4bWF4IDwgTUlORUxFTikgfCAoeG1heCA+IE1BWEVMRU4pKSB7XG4gICAgICAgIHJldHVybiBvbGRSZWFkQ29sb3JzKHNjYW4sIGJ1ZmZlciwgb2Zmc2V0LCB4bWF4KTtcbiAgICB9XG4gICAgdmFyIGkgPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgIGlmIChpICE9IDIpIHtcbiAgICAgICAgcmV0dXJuIG9sZFJlYWRDb2xvcnMoc2NhbiwgYnVmZmVyLCBvZmZzZXQgLSAxLCB4bWF4KTtcbiAgICB9XG4gICAgc2NhblswXVsxXSA9IGJ1ZmZlcltvZmZzZXQrK107XG4gICAgc2NhblswXVsyXSA9IGJ1ZmZlcltvZmZzZXQrK107XG5cbiAgICBpID0gYnVmZmVyW29mZnNldCsrXTtcbiAgICBpZiAoKCgoc2NhblswXVsyXSA8PCA4KSA+Pj4gMCkgfCBpKSA+Pj4gMCAhPT0geG1heCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB4bWF4Oykge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICAgICAgaWYgKGNvZGUgPiAxMjgpIHtcbiAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgJiAxMjcpID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjb2RlLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2Nhblt4KytdW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvZGUtLSkge1xuICAgICAgICAgICAgICAgICAgICBzY2FuW3grK11baV0gPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5cbnZhciByZXQgPSB7XG4gICAgLy8gaHR0cDovL3d3dy5ncmFwaGljcy5jb3JuZWxsLmVkdS9+Ymp3L3JnYmUuaHRtbFxuICAgIC8vIEJsZW5kZXIgc291cmNlXG4gICAgLy8gaHR0cDovL3JhZHNpdGUubGJsLmdvdi9yYWRpYW5jZS9yZWZlci9Ob3Rlcy9waWN0dXJlX2Zvcm1hdC5odG1sXG4gICAgcGFyc2VSR0JFOiBmdW5jdGlvbihhcnJheUJ1ZmZlciwgdGV4dHVyZSwgZXhwb3N1cmUpIHtcbiAgICAgICAgaWYgKGV4cG9zdXJlID09IG51bGwpIHtcbiAgICAgICAgICAgIGV4cG9zdXJlID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdmFyIHNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKHVpbnQ4MnN0cmluZyhkYXRhLCAwLCAyKSAhPT0gJyM/Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZW1wdHkgbGluZSwgbmV4dCBsaW5lIGlzIHJlc29sdXRpb24gaW5mb1xuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRvQ2hhcihkYXRhW2ldKSA9PT0gJ1xcbicgJiYgdG9DaGFyKGRhdGFbaSsxXSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gc2l6ZSkgeyAvLyBub3QgZm91bmRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIHJlc29sdXRpb24gaW5mbyBsaW5lXG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jaGFyID0gdG9DaGFyKGRhdGFbaV0pO1xuICAgICAgICAgICAgaWYgKF9jaGFyID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyICs9IF9jaGFyO1xuICAgICAgICB9XG4gICAgICAgIC8vIC1ZIE0gK1ggTlxuICAgICAgICB2YXIgdG1wID0gc3RyLnNwbGl0KCcgJyk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBwYXJzZUludCh0bXBbMV0pO1xuICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCh0bXBbM10pO1xuICAgICAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlYWQgYW5kIGRlY29kZSBhY3R1YWwgZGF0YVxuICAgICAgICB2YXIgb2Zmc2V0ID0gaSsxO1xuICAgICAgICB2YXIgc2NhbmxpbmUgPSBbXTtcbiAgICAgICAgLy8gbWVtemVyb1xuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIHNjYW5saW5lW3hdID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgIHNjYW5saW5lW3hdW2pdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWxzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgICAgICB2YXIgb2Zmc2V0MiA9IDA7XG4gICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkQ29sb3JzKHNjYW5saW5lLCBkYXRhLCBvZmZzZXQsIHdpZHRoKTtcbiAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICByZ2JlMmZsb2F0KHNjYW5saW5lW3hdLCBwaXhlbHMsIG9mZnNldDIsIGV4cG9zdXJlKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQyICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHR1cmUpIHtcbiAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dHVyZS53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0ZXh0dXJlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGV4dHVyZS5waXhlbHMgPSBwaXhlbHM7XG4gICAgICAgIC8vIEhBTEZfRkxPQVQgY2FuJ3QgdXNlIEZsb2F0MzJBcnJheVxuICAgICAgICB0ZXh0dXJlLnR5cGUgPSBUZXh0dXJlLkZMT0FUO1xuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9LFxuXG4gICAgcGFyc2VSR0JFRnJvbVBORzogZnVuY3Rpb24ocG5nKSB7XG5cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXQ7XG4iLCJpbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vY29yZS9yZXF1ZXN0JztcbmltcG9ydCBFbnZpcm9ubWVudE1hcFBhc3MgZnJvbSAnLi4vcHJlUGFzcy9FbnZpcm9ubWVudE1hcCc7XG5pbXBvcnQgU2t5ZG9tZSBmcm9tICcuLi9wbHVnaW4vU2t5ZG9tZSc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi4vU2NlbmUnO1xuXG5pbXBvcnQgZGRzIGZyb20gJy4vZGRzJztcbmltcG9ydCBoZHIgZnJvbSAnLi9oZHInO1xuXG4vKipcbiAqIEBhbGlhcyBjbGF5LnV0aWwudGV4dHVyZVxuICovXG52YXIgdGV4dHVyZVV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfG9iamVjdH0gcGF0aFxuICAgICAqIEBwYXJhbSAge29iamVjdH0gW29wdGlvbl1cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW29uc3VjY2Vzc11cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW29uZXJyb3JdXG4gICAgICogQHJldHVybiB7Y2xheS5UZXh0dXJlfVxuICAgICAqL1xuICAgIGxvYWRUZXh0dXJlOiBmdW5jdGlvbiAocGF0aCwgb3B0aW9uLCBvbnN1Y2Nlc3MsIG9uZXJyb3IpIHtcbiAgICAgICAgdmFyIHRleHR1cmU7XG4gICAgICAgIGlmICh0eXBlb2Yob3B0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb25zdWNjZXNzID0gb3B0aW9uO1xuICAgICAgICAgICAgb25lcnJvciA9IG9uc3VjY2VzcztcbiAgICAgICAgICAgIG9wdGlvbiA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uIHx8IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YocGF0aCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5tYXRjaCgvLmhkciQvKSB8fCBvcHRpb24uZmlsZVR5cGUgPT09ICdoZHInKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZVV0aWwuX2ZldGNoVGV4dHVyZShcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhkci5wYXJzZVJHQkUoZGF0YSwgdGV4dHVyZSwgb3B0aW9uLmV4cG9zdXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uc3VjY2VzcyAmJiBvbnN1Y2Nlc3ModGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uZXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvLmRkcyQvKSB8fCBvcHRpb24uZmlsZVR5cGUgPT09ICdkZHMnKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZVV0aWwuX2ZldGNoVGV4dHVyZShcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRkcy5wYXJzZShkYXRhLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uc3VjY2VzcyAmJiBvbnN1Y2Nlc3ModGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uZXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoKTtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLmxvYWQocGF0aCk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5zdWNjZXNzKG9uc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5lcnJvcihvbmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YocGF0aCkgPT0gJ29iamVjdCcgJiYgdHlwZW9mKHBhdGgucHgpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZUN1YmUoKTtcbiAgICAgICAgICAgIHRleHR1cmUubG9hZChwYXRoKTtcbiAgICAgICAgICAgIHRleHR1cmUuc3VjY2VzcyhvbnN1Y2Nlc3MpO1xuICAgICAgICAgICAgdGV4dHVyZS5lcnJvcihvbmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHBhbm9yYW1hIHRleHR1cmUgYW5kIHJlbmRlciBpdCB0byBhIGN1YmUgbWFwXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlRleHR1cmVDdWJlfSBjdWJlTWFwXG4gICAgICogQHBhcmFtICB7b2JqZWN0fSBbb3B0aW9uXVxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59IFtvcHRpb24uZW5jb2RlUkdCTV1cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IFtvcHRpb24uZXhwb3N1cmVdXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtvbnN1Y2Nlc3NdXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtvbmVycm9yXVxuICAgICAqL1xuICAgIGxvYWRQYW5vcmFtYTogZnVuY3Rpb24gKHJlbmRlcmVyLCBwYXRoLCBjdWJlTWFwLCBvcHRpb24sIG9uc3VjY2Vzcywgb25lcnJvcikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHR5cGVvZihvcHRpb24pID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbnN1Y2Nlc3MgPSBvcHRpb247XG4gICAgICAgICAgICBvbmVycm9yID0gb25zdWNjZXNzO1xuICAgICAgICAgICAgb3B0aW9uID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb24gPSBvcHRpb24gfHwge307XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0dXJlVXRpbC5sb2FkVGV4dHVyZShwYXRoLCBvcHRpb24sIGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgICAgICB0ZXh0dXJlLmZsaXBZID0gb3B0aW9uLmZsaXBZIHx8IGZhbHNlO1xuICAgICAgICAgICAgc2VsZi5wYW5vcmFtYVRvQ3ViZU1hcChyZW5kZXJlciwgdGV4dHVyZSwgY3ViZU1hcCwgb3B0aW9uKTtcbiAgICAgICAgICAgIHRleHR1cmUuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgICAgICAgICBvbnN1Y2Nlc3MgJiYgb25zdWNjZXNzKGN1YmVNYXApO1xuICAgICAgICB9LCBvbmVycm9yKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgcGFub3JhbWEgdGV4dHVyZSB0byBhIGN1YmUgbWFwXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlRleHR1cmUyRH0gcGFub3JhbWFNYXBcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlRleHR1cmVDdWJlfSBjdWJlTWFwXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25cbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbb3B0aW9uLmVuY29kZVJHQk1dXG4gICAgICovXG4gICAgcGFub3JhbWFUb0N1YmVNYXA6IGZ1bmN0aW9uIChyZW5kZXJlciwgcGFub3JhbWFNYXAsIGN1YmVNYXAsIG9wdGlvbikge1xuICAgICAgICB2YXIgZW52aXJvbm1lbnRNYXBQYXNzID0gbmV3IEVudmlyb25tZW50TWFwUGFzcygpO1xuICAgICAgICB2YXIgc2t5ZG9tZSA9IG5ldyBTa3lkb21lKHtcbiAgICAgICAgICAgIHNjZW5lOiBuZXcgU2NlbmUoKVxuICAgICAgICB9KTtcbiAgICAgICAgc2t5ZG9tZS5tYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCBwYW5vcmFtYU1hcCk7XG5cbiAgICAgICAgb3B0aW9uID0gb3B0aW9uIHx8IHt9O1xuICAgICAgICBpZiAob3B0aW9uLmVuY29kZVJHQk0pIHtcbiAgICAgICAgICAgIHNreWRvbWUubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdSR0JNX0VOQ09ERScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW52aXJvbm1lbnRNYXBQYXNzLnRleHR1cmUgPSBjdWJlTWFwO1xuICAgICAgICBlbnZpcm9ubWVudE1hcFBhc3MucmVuZGVyKHJlbmRlcmVyLCBza3lkb21lLnNjZW5lKTtcbiAgICAgICAgZW52aXJvbm1lbnRNYXBQYXNzLnRleHR1cmUgPSBudWxsO1xuICAgICAgICBlbnZpcm9ubWVudE1hcFBhc3MuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgICAgIHJldHVybiBjdWJlTWFwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGhlaWdodCBtYXAgdG8gbm9ybWFsIG1hcFxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudH0gaW1hZ2VcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGVja0J1bXA9ZmFsc2VdXG4gICAgICogQHJldHVybiB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICovXG4gICAgaGVpZ2h0VG9Ob3JtYWw6IGZ1bmN0aW9uIChpbWFnZSwgY2hlY2tCdW1wKSB7XG4gICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdmFyIHdpZHRoID0gY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjaGVja0J1bXAgPSBjaGVja0J1bXAgfHwgZmFsc2U7XG4gICAgICAgIHZhciBzcmNEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdmFyIGRzdERhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNyY0RhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgaWYgKGNoZWNrQnVtcCkge1xuICAgICAgICAgICAgICAgIHZhciByID0gc3JjRGF0YS5kYXRhW2ldO1xuICAgICAgICAgICAgICAgIHZhciBnID0gc3JjRGF0YS5kYXRhW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB2YXIgYiA9IHNyY0RhdGEuZGF0YVtpICsgMl07XG4gICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBNYXRoLmFicyhyIC0gZykgKyBNYXRoLmFicyhnIC0gYik7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAyMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0dpdmVuIGltYWdlIGlzIG5vdCBhIGhlaWdodCBtYXAnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE1vZGlmaWVkIGZyb20gaHR0cDovL21yZG9vYi5jb20vbGFiL2phdmFzY3JpcHQvaGVpZ2h0Mm5vcm1hbC9cbiAgICAgICAgICAgIHZhciB4MSwgeTEsIHgyLCB5MjtcbiAgICAgICAgICAgIGlmIChpICUgKHdpZHRoICogNCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBsZWZ0IGVkZ2VcbiAgICAgICAgICAgICAgICB4MSA9IHNyY0RhdGEuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICB4MiA9IHNyY0RhdGEuZGF0YVtpICsgNF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpICUgKHdpZHRoICogNCkgPT09ICh3aWR0aCAtIDEpICogNCkge1xuICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGVkZ2VcbiAgICAgICAgICAgICAgICB4MSA9IHNyY0RhdGEuZGF0YVtpIC0gNF07XG4gICAgICAgICAgICAgICAgeDIgPSBzcmNEYXRhLmRhdGFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4MSA9IHNyY0RhdGEuZGF0YVtpIC0gNF07XG4gICAgICAgICAgICAgICAgeDIgPSBzcmNEYXRhLmRhdGFbaSArIDRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA8IHdpZHRoICogNCkge1xuICAgICAgICAgICAgICAgIC8vIHRvcCBlZGdlXG4gICAgICAgICAgICAgICAgeTEgPSBzcmNEYXRhLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgeTIgPSBzcmNEYXRhLmRhdGFbaSArIHdpZHRoICogNF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpID4gd2lkdGggKiAoaGVpZ2h0IC0gMSkgKiA0KSB7XG4gICAgICAgICAgICAgICAgLy8gYm90dG9tIGVkZ2VcbiAgICAgICAgICAgICAgICB5MSA9IHNyY0RhdGEuZGF0YVtpIC0gd2lkdGggKiA0XTtcbiAgICAgICAgICAgICAgICB5MiA9IHNyY0RhdGEuZGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHkxID0gc3JjRGF0YS5kYXRhW2kgLSB3aWR0aCAqIDRdO1xuICAgICAgICAgICAgICAgIHkyID0gc3JjRGF0YS5kYXRhW2kgKyB3aWR0aCAqIDRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkc3REYXRhLmRhdGFbaV0gPSAoeDEgLSB4MikgKyAxMjc7XG4gICAgICAgICAgICBkc3REYXRhLmRhdGFbaSArIDFdID0gKHkxIC0geTIpICsgMTI3O1xuICAgICAgICAgICAgZHN0RGF0YS5kYXRhW2kgKyAyXSA9IDI1NTtcbiAgICAgICAgICAgIGRzdERhdGEuZGF0YVtpICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShkc3REYXRhLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBoZWlnaHQgbWFwIHRvIG5vcm1hbCBtYXBcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR9IGltYWdlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hlY2tCdW1wPWZhbHNlXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdGhyZXNob2xkPTIwXVxuICAgICAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fVxuICAgICAqL1xuICAgIGlzSGVpZ2h0SW1hZ2U6IGZ1bmN0aW9uIChpbWcsIGRvd25TY2FsZVNpemUsIHRocmVzaG9sZCkge1xuICAgICAgICBpZiAoIWltZyB8fCAhaW1nLndpZHRoIHx8ICFpbWcuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdmFyIHNpemUgPSBkb3duU2NhbGVTaXplIHx8IDMyO1xuICAgICAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMjA7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgc2l6ZSwgc2l6ZSk7XG4gICAgICAgIHZhciBzcmNEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBzaXplLCBzaXplKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcmNEYXRhLmRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgIHZhciByID0gc3JjRGF0YS5kYXRhW2ldO1xuICAgICAgICAgICAgdmFyIGcgPSBzcmNEYXRhLmRhdGFbaSArIDFdO1xuICAgICAgICAgICAgdmFyIGIgPSBzcmNEYXRhLmRhdGFbaSArIDJdO1xuICAgICAgICAgICAgdmFyIGRpZmYgPSBNYXRoLmFicyhyIC0gZykgKyBNYXRoLmFicyhnIC0gYik7XG4gICAgICAgICAgICBpZiAoZGlmZiA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX2ZldGNoVGV4dHVyZTogZnVuY3Rpb24gKHBhdGgsIG9uc3VjY2Vzcywgb25lcnJvcikge1xuICAgICAgICByZXF1ZXN0LmdldCh7XG4gICAgICAgICAgICB1cmw6IHBhdGgsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICAgICAgICBvbmxvYWQ6IG9uc3VjY2VzcyxcbiAgICAgICAgICAgIG9uZXJyb3I6IG9uZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNoZXNzYm9hcmQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gW3NpemVdXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbdW5pdFNpemVdXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbY29sb3IxXVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW2NvbG9yMl1cbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBjcmVhdGVDaGVzc2JvYXJkOiBmdW5jdGlvbiAoc2l6ZSwgdW5pdFNpemUsIGNvbG9yMSwgY29sb3IyKSB7XG4gICAgICAgIHNpemUgPSBzaXplIHx8IDUxMjtcbiAgICAgICAgdW5pdFNpemUgPSB1bml0U2l6ZSB8fCA2NDtcbiAgICAgICAgY29sb3IxID0gY29sb3IxIHx8ICdibGFjayc7XG4gICAgICAgIGNvbG9yMiA9IGNvbG9yMiB8fCAnd2hpdGUnO1xuXG4gICAgICAgIHZhciByZXBlYXQgPSBNYXRoLmNlaWwoc2l6ZSAvIHVuaXRTaXplKTtcblxuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjI7XG4gICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBzaXplLCBzaXplKTtcblxuICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3IxO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcGVhdDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRmlsbCA9IGogJSAyID8gKGkgJSAyKSA6IChpICUgMiAtIDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGkgKiB1bml0U2l6ZSwgaiAqIHVuaXRTaXplLCB1bml0U2l6ZSwgdW5pdFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBpbWFnZTogY2FudmFzLFxuICAgICAgICAgICAgYW5pc290cm9waWM6IDhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGJsYW5rIHB1cmUgY29sb3IgMXgxIHRleHR1cmVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvbG9yXG4gICAgICogQHJldHVybiB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICovXG4gICAgY3JlYXRlQmxhbms6IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuXG4gICAgICAgIHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBpbWFnZTogY2FudmFzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRleHR1cmVVdGlsO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCIjZGVmaW5lIFNBTVBMRV9OVU1CRVIgMTAyNFxcbiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OVxcbnVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbERpc3RyaWJ1dGlvbjtcXG51bmlmb3JtIHZlYzIgdmlld3BvcnRTaXplIDogWzUxMiwgMjU2XTtcXG5jb25zdCB2ZWMzIE4gPSB2ZWMzKDAuMCwgMC4wLCAxLjApO1xcbmNvbnN0IGZsb2F0IGZTYW1wbGVOdW1iZXIgPSBmbG9hdChTQU1QTEVfTlVNQkVSKTtcXG52ZWMzIGltcG9ydGFuY2VTYW1wbGVOb3JtYWwoZmxvYXQgaSwgZmxvYXQgcm91Z2huZXNzLCB2ZWMzIE4pIHtcXG4gICAgdmVjMyBIID0gdGV4dHVyZTJEKG5vcm1hbERpc3RyaWJ1dGlvbiwgdmVjMihyb3VnaG5lc3MsIGkpKS5yZ2I7XFxuICAgIHZlYzMgdXBWZWN0b3IgPSBhYnMoTi56KSA8IDAuOTk5ID8gdmVjMygwLjAsIDAuMCwgMS4wKSA6IHZlYzMoMS4wLCAwLjAsIDAuMCk7XFxuICAgIHZlYzMgdGFuZ2VudFggPSBub3JtYWxpemUoY3Jvc3ModXBWZWN0b3IsIE4pKTtcXG4gICAgdmVjMyB0YW5nZW50WSA9IGNyb3NzKE4sIHRhbmdlbnRYKTtcXG4gICAgcmV0dXJuIHRhbmdlbnRYICogSC54ICsgdGFuZ2VudFkgKiBILnkgKyBOICogSC56O1xcbn1cXG5mbG9hdCBHX1NtaXRoKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcXG4gICAgZmxvYXQgayA9IHJvdWdobmVzcyAqIHJvdWdobmVzcyAvIDIuMDtcXG4gICAgZmxvYXQgRzFWID0gTm9WIC8gKE5vViAqICgxLjAgLSBrKSArIGspO1xcbiAgICBmbG9hdCBHMUwgPSBOb0wgLyAoTm9MICogKDEuMCAtIGspICsgayk7XFxuICAgIHJldHVybiBHMUwgKiBHMVY7XFxufVxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjMiB1diA9IGdsX0ZyYWdDb29yZC54eSAvIHZpZXdwb3J0U2l6ZTtcXG4gICAgZmxvYXQgTm9WID0gdXYueDtcXG4gICAgZmxvYXQgcm91Z2huZXNzID0gdXYueTtcXG4gICAgdmVjMyBWO1xcbiAgICBWLnggPSBzcXJ0KDEuMCAtIE5vViAqIE5vVik7XFxuICAgIFYueSA9IDAuMDtcXG4gICAgVi56ID0gTm9WO1xcbiAgICBmbG9hdCBBID0gMC4wO1xcbiAgICBmbG9hdCBCID0gMC4wO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNBTVBMRV9OVU1CRVI7IGkrKykge1xcbiAgICAgICAgdmVjMyBIID0gaW1wb3J0YW5jZVNhbXBsZU5vcm1hbChmbG9hdChpKSAvIGZTYW1wbGVOdW1iZXIsIHJvdWdobmVzcywgTik7XFxuICAgICAgICB2ZWMzIEwgPSByZWZsZWN0KC1WLCBIKTtcXG4gICAgICAgIGZsb2F0IE5vTCA9IGNsYW1wKEwueiwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgTm9IID0gY2xhbXAoSC56LCAwLjAsIDEuMCk7XFxuICAgICAgICBmbG9hdCBWb0ggPSBjbGFtcChkb3QoViwgSCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGlmIChOb0wgPiAwLjApIHtcXG4gICAgICAgICAgICBmbG9hdCBHID0gR19TbWl0aChyb3VnaG5lc3MsIE5vViwgTm9MKTtcXG4gICAgICAgICAgICBmbG9hdCBHX1ZpcyA9IEcgKiBWb0ggLyAoTm9IICogTm9WKTtcXG4gICAgICAgICAgICBmbG9hdCBGYyA9IHBvdygxLjAgLSBWb0gsIDUuMCk7XFxuICAgICAgICAgICAgQSArPSAoMS4wIC0gRmMpICogR19WaXM7XFxuICAgICAgICAgICAgQiArPSBGYyAqIEdfVmlzO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodmVjMihBLCBCKSAvIGZTYW1wbGVOdW1iZXIsIDAuMCwgMS4wKTtcXG59XFxuXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIiNkZWZpbmUgU0FNUExFX05VTUJFUiAxMDI0XFxuI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5XFxudW5pZm9ybSBtYXQ0IHZpZXdJbnZlcnNlIDogVklFV0lOVkVSU0U7XFxudW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZpcm9ubWVudE1hcDtcXG51bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxEaXN0cmlidXRpb247XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3MgOiAwLjU7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG5jb25zdCBmbG9hdCBmU2FtcGxlTnVtYmVyID0gZmxvYXQoU0FNUExFX05VTUJFUik7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbnZlYzMgaW1wb3J0YW5jZVNhbXBsZU5vcm1hbChmbG9hdCBpLCBmbG9hdCByb3VnaG5lc3MsIHZlYzMgTikge1xcbiAgICB2ZWMzIEggPSB0ZXh0dXJlMkQobm9ybWFsRGlzdHJpYnV0aW9uLCB2ZWMyKHJvdWdobmVzcywgaSkpLnJnYjtcXG4gICAgdmVjMyB1cFZlY3RvciA9IGFicyhOLnopIDwgMC45OTkgPyB2ZWMzKDAuMCwgMC4wLCAxLjApIDogdmVjMygxLjAsIDAuMCwgMC4wKTtcXG4gICAgdmVjMyB0YW5nZW50WCA9IG5vcm1hbGl6ZShjcm9zcyh1cFZlY3RvciwgTikpO1xcbiAgICB2ZWMzIHRhbmdlbnRZID0gY3Jvc3MoTiwgdGFuZ2VudFgpO1xcbiAgICByZXR1cm4gdGFuZ2VudFggKiBILnggKyB0YW5nZW50WSAqIEgueSArIE4gKiBILno7XFxufVxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjMyBleWVQb3MgPSB2aWV3SW52ZXJzZVszXS54eXo7XFxuICAgIHZlYzMgViA9IG5vcm1hbGl6ZSh2X1dvcmxkUG9zaXRpb24gLSBleWVQb3MpO1xcbiAgICB2ZWMzIE4gPSBWO1xcbiAgICB2ZWMzIFIgPSBWO1xcbiAgICB2ZWMzIHByZWZpbHRlcmVkQ29sb3IgPSB2ZWMzKDAuMCk7XFxuICAgIGZsb2F0IHRvdGFsV2VpZ2h0ID0gMC4wO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNBTVBMRV9OVU1CRVI7IGkrKykge1xcbiAgICAgICAgdmVjMyBIID0gaW1wb3J0YW5jZVNhbXBsZU5vcm1hbChmbG9hdChpKSAvIGZTYW1wbGVOdW1iZXIsIHJvdWdobmVzcywgTik7XFxuICAgICAgICB2ZWMzIEwgPSByZWZsZWN0KC1WLCBIKTtcXG4gICAgICAgIGZsb2F0IE5vTCA9IGNsYW1wKGRvdChOLCBMKSwgMC4wLCAxLjApO1xcbiAgICAgICAgaWYgKE5vTCA+IDAuMCkge1xcbiAgICAgICAgICAgIHByZWZpbHRlcmVkQ29sb3IgKz0gZGVjb2RlSERSKHRleHR1cmVDdWJlKGVudmlyb25tZW50TWFwLCBMKSkucmdiICogTm9MO1xcbiAgICAgICAgICAgIHRvdGFsV2VpZ2h0ICs9IE5vTDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNChwcmVmaWx0ZXJlZENvbG9yIC8gdG90YWxXZWlnaHQsIDEuMCkpO1xcbn1cXG5cIjtcbiIsIi8vIEN1YmVtYXAgcHJlZmlsdGVyIHV0aWxpdHlcbi8vIGh0dHA6Ly93d3cudW5yZWFsZW5naW5lLmNvbS9maWxlcy9kb3dubG9hZHMvMjAxM1NpZ2dyYXBoUHJlc2VudGF0aW9uc05vdGVzLnBkZlxuLy8gaHR0cDovL2h0dHAuZGV2ZWxvcGVyLm52aWRpYS5jb20vR1BVR2VtczMvZ3B1Z2VtczNfY2gyMC5odG1sXG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IFBhc3MgZnJvbSAnLi4vY29tcG9zaXRvci9QYXNzJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5pbXBvcnQgU2hhZGVyIGZyb20gJy4uL1NoYWRlcic7XG5pbXBvcnQgU2t5Ym94IGZyb20gJy4uL3BsdWdpbi9Ta3lib3gnO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4uL1NjZW5lJztcbmltcG9ydCBFbnZpcm9ubWVudE1hcFBhc3MgZnJvbSAnLi4vcHJlUGFzcy9FbnZpcm9ubWVudE1hcCc7XG5pbXBvcnQgdmVuZG9yIGZyb20gJy4uL2NvcmUvdmVuZG9yJztcbmltcG9ydCB0ZXh0dXJlVXRpbCBmcm9tICcuL3RleHR1cmUnO1xuXG5pbXBvcnQgaW50ZWdyYXRlQlJERlNoYWRlckNvZGUgZnJvbSAnLi9zaGFkZXIvaW50ZWdyYXRlQlJERi5nbHNsLmpzJztcbmltcG9ydCBwcmVmaWx0ZXJGcmFnQ29kZSBmcm9tICcuL3NoYWRlci9wcmVmaWx0ZXIuZ2xzbC5qcyc7XG5cbnZhciBjdWJlbWFwVXRpbCA9IHt9O1xuXG52YXIgdGFyZ2V0cyA9IFsncHgnLCAnbngnLCAncHknLCAnbnknLCAncHonLCAnbnonXTtcblxuLyoqXG4gKiBAbmFtZSBjbGF5LnV0aWwuY3ViZW1hcC5wcmVmaWx0ZXJFbnZpcm9ubWVudE1hcFxuICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAqIEBwYXJhbSAge2NsYXkuVGV4dHVyZX0gZW52TWFwXG4gKiBAcGFyYW0gIHtPYmplY3R9IFt0ZXh0dXJlT3B0c11cbiAqIEBwYXJhbSAge251bWJlcn0gW3RleHR1cmVPcHRzLndpZHRoPTY0XVxuICogQHBhcmFtICB7bnVtYmVyfSBbdGV4dHVyZU9wdHMuaGVpZ2h0PTY0XVxuICogQHBhcmFtICB7bnVtYmVyfSBbdGV4dHVyZU9wdHMudHlwZV1cbiAqIEBwYXJhbSAge2Jvb2xlYW59IFt0ZXh0dXJlT3B0cy5lbmNvZGVSR0JNPWZhbHNlXVxuICogQHBhcmFtICB7Ym9vbGVhbn0gW3RleHR1cmVPcHRzLmRlY29kZVJHQk09ZmFsc2VdXG4gKiBAcGFyYW0gIHtjbGF5LlRleHR1cmUyRH0gW25vcm1hbERpc3RyaWJ1dGlvbl1cbiAqIEBwYXJhbSAge2NsYXkuVGV4dHVyZTJEfSBbYnJkZkxvb2t1cF1cbiAqL1xuY3ViZW1hcFV0aWwucHJlZmlsdGVyRW52aXJvbm1lbnRNYXAgPSBmdW5jdGlvbiAoXG4gICAgcmVuZGVyZXIsIGVudk1hcCwgdGV4dHVyZU9wdHMsIG5vcm1hbERpc3RyaWJ1dGlvbiwgYnJkZkxvb2t1cFxuKSB7XG4gICAgLy8gTm90IGNyZWF0ZSBvdGhlciByZW5kZXJlciwgaXQgaXMgZWFzeSBoYXZpbmcgaXNzdWUgb2YgY3Jvc3MgcmVmZXJlbmNlIG9mIHJlc291cmNlcyBsaWtlIGZyYW1lYnVmZmVyXG4gICAgLy8gUEVORElORyBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI/XG4gICAgaWYgKCFicmRmTG9va3VwIHx8ICFub3JtYWxEaXN0cmlidXRpb24pIHtcbiAgICAgICAgbm9ybWFsRGlzdHJpYnV0aW9uID0gY3ViZW1hcFV0aWwuZ2VuZXJhdGVOb3JtYWxEaXN0cmlidXRpb24oKTtcbiAgICAgICAgYnJkZkxvb2t1cCA9IGN1YmVtYXBVdGlsLmludGVncmF0ZUJSREYocmVuZGVyZXIsIG5vcm1hbERpc3RyaWJ1dGlvbik7XG4gICAgfVxuICAgIHRleHR1cmVPcHRzID0gdGV4dHVyZU9wdHMgfHwge307XG5cbiAgICB2YXIgd2lkdGggPSB0ZXh0dXJlT3B0cy53aWR0aCB8fCA2NDtcbiAgICB2YXIgaGVpZ2h0ID0gdGV4dHVyZU9wdHMuaGVpZ2h0IHx8IDY0O1xuXG4gICAgdmFyIHRleHR1cmVUeXBlID0gdGV4dHVyZU9wdHMudHlwZSB8fCBlbnZNYXAudHlwZTtcblxuICAgIC8vIFVzZSBzYW1lIHR5cGUgd2l0aCBnaXZlbiBlbnZNYXBcbiAgICB2YXIgcHJlZmlsdGVyZWRDdWJlTWFwID0gbmV3IFRleHR1cmVDdWJlKHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgdHlwZTogdGV4dHVyZVR5cGUsXG4gICAgICAgIGZsaXBZOiBmYWxzZSxcbiAgICAgICAgbWlwbWFwczogW11cbiAgICB9KTtcblxuICAgIGlmICghcHJlZmlsdGVyZWRDdWJlTWFwLmlzUG93ZXJPZlR3bygpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHBvd2VyIG9mIHR3byB0byBlbmFibGUgbWlwbWFwLicpO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gICAgdmFyIG1pcG1hcE51bSA9IE1hdGgubG9nKHNpemUpIC8gTWF0aC5sb2coMikgKyAxO1xuXG4gICAgdmFyIHByZWZpbHRlck1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgc2hhZGVyOiBuZXcgU2hhZGVyKHtcbiAgICAgICAgICAgIHZlcnRleDogU2hhZGVyLnNvdXJjZSgnY2xheS5za3lib3gudmVydGV4JyksXG4gICAgICAgICAgICBmcmFnbWVudDogcHJlZmlsdGVyRnJhZ0NvZGVcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICBwcmVmaWx0ZXJNYXRlcmlhbC5zZXQoJ25vcm1hbERpc3RyaWJ1dGlvbicsIG5vcm1hbERpc3RyaWJ1dGlvbik7XG5cbiAgICB0ZXh0dXJlT3B0cy5lbmNvZGVSR0JNICYmIHByZWZpbHRlck1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUkdCTV9FTkNPREUnKTtcbiAgICB0ZXh0dXJlT3B0cy5kZWNvZGVSR0JNICYmIHByZWZpbHRlck1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUkdCTV9ERUNPREUnKTtcblxuICAgIHZhciBkdW1teVNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdmFyIHNreUVudjtcblxuICAgIGlmIChlbnZNYXAgaW5zdGFuY2VvZiBUZXh0dXJlMkQpIHtcbiAgICAgICAgLy8gQ29udmVydCBwYW5vcmFtYSB0byBjdWJlbWFwXG4gICAgICAgIHZhciBlbnZDdWJlbWFwID0gbmV3IFRleHR1cmVDdWJlKHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgLy8gRklYTUUgRkxPQVQgdHlwZSB3aWxsIGNhdXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCBlcnJvciBvbiBpT1NcbiAgICAgICAgICAgIHR5cGU6IHRleHR1cmVUeXBlID09PSBUZXh0dXJlLkZMT0FUID9cbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS5IQUxGX0ZMT0FUIDogdGV4dHVyZVR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHR1cmVVdGlsLnBhbm9yYW1hVG9DdWJlTWFwKHJlbmRlcmVyLCBlbnZNYXAsIGVudkN1YmVtYXAsIHtcbiAgICAgICAgICAgIC8vIFBFTkRJTkcgZW5jb2RlUkdCTSBzbyBpdCBjYW4gYmUgZGVjb2RlZCBhcyBSR0JNXG4gICAgICAgICAgICBlbmNvZGVSR0JNOiB0ZXh0dXJlT3B0cy5kZWNvZGVSR0JNXG4gICAgICAgIH0pO1xuICAgICAgICBlbnZNYXAgPSBlbnZDdWJlbWFwO1xuICAgIH1cbiAgICBza3lFbnYgPSBuZXcgU2t5Ym94KHtcbiAgICAgICAgc2NlbmU6IGR1bW15U2NlbmUsXG4gICAgICAgIG1hdGVyaWFsOiBwcmVmaWx0ZXJNYXRlcmlhbFxuICAgIH0pO1xuICAgIHNreUVudi5tYXRlcmlhbC5zZXQoJ2Vudmlyb25tZW50TWFwJywgZW52TWFwKTtcblxuICAgIHZhciBlbnZNYXBQYXNzID0gbmV3IEVudmlyb25tZW50TWFwUGFzcyh7XG4gICAgICAgIHRleHR1cmU6IHByZWZpbHRlcmVkQ3ViZU1hcFxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgdG8gYmUgVU5TSUdORURfQllURVxuICAgIGlmICh0ZXh0dXJlT3B0cy5lbmNvZGVSR0JNKSB7XG4gICAgICAgIHRleHR1cmVUeXBlID0gcHJlZmlsdGVyZWRDdWJlTWFwLnR5cGUgPSBUZXh0dXJlLlVOU0lHTkVEX0JZVEU7XG4gICAgfVxuXG4gICAgdmFyIHJlbmRlclRhcmdldFRtcCA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICB0eXBlOiB0ZXh0dXJlVHlwZVxuICAgIH0pO1xuICAgIHZhciBmcmFtZUJ1ZmZlciA9IG5ldyBGcmFtZUJ1ZmZlcih7XG4gICAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIHZhciBBcnJheUN0b3IgPSB2ZW5kb3JbdGV4dHVyZVR5cGUgPT09IFRleHR1cmUuVU5TSUdORURfQllURSA/ICdVaW50OEFycmF5JyA6ICdGbG9hdDMyQXJyYXknXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pcG1hcE51bTsgaSsrKSB7XG4gICAgICAgIHByZWZpbHRlcmVkQ3ViZU1hcC5taXBtYXBzW2ldID0ge1xuICAgICAgICAgICAgcGl4ZWxzOiB7fVxuICAgICAgICB9O1xuICAgICAgICBza3lFbnYubWF0ZXJpYWwuc2V0KCdyb3VnaG5lc3MnLCBpIC8gKHRhcmdldHMubGVuZ3RoIC0gMSkpO1xuXG4gICAgICAgIC8vIFR3ZWFrIGZvdlxuICAgICAgICAvLyBodHRwOi8vdGhlLXdpdG5lc3MubmV0L25ld3MvMjAxMi8wMi9zZWFtbGVzcy1jdWJlLW1hcC1maWx0ZXJpbmcvXG4gICAgICAgIHZhciBuID0gcmVuZGVyVGFyZ2V0VG1wLndpZHRoO1xuICAgICAgICB2YXIgZm92ID0gMiAqIE1hdGguYXRhbihuIC8gKG4gLSAwLjUpKSAvIE1hdGguUEkgKiAxODA7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0YXJnZXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGl4ZWxzID0gbmV3IEFycmF5Q3RvcihyZW5kZXJUYXJnZXRUbXAud2lkdGggKiByZW5kZXJUYXJnZXRUbXAuaGVpZ2h0ICogNCk7XG4gICAgICAgICAgICBmcmFtZUJ1ZmZlci5hdHRhY2gocmVuZGVyVGFyZ2V0VG1wKTtcbiAgICAgICAgICAgIGZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICB2YXIgY2FtZXJhID0gZW52TWFwUGFzcy5nZXRDYW1lcmEodGFyZ2V0c1tqXSk7XG4gICAgICAgICAgICBjYW1lcmEuZm92ID0gZm92O1xuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKGR1bW15U2NlbmUsIGNhbWVyYSk7XG4gICAgICAgICAgICByZW5kZXJlci5nbC5yZWFkUGl4ZWxzKFxuICAgICAgICAgICAgICAgIDAsIDAsIHJlbmRlclRhcmdldFRtcC53aWR0aCwgcmVuZGVyVGFyZ2V0VG1wLmhlaWdodCxcbiAgICAgICAgICAgICAgICBUZXh0dXJlLlJHQkEsIHRleHR1cmVUeXBlLCBwaXhlbHNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIC8vIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgIC8vIGNhbnZhcy53aWR0aCA9IHJlbmRlclRhcmdldFRtcC53aWR0aDtcbiAgICAgICAgICAgIC8vIGNhbnZhcy5oZWlnaHQgPSByZW5kZXJUYXJnZXRUbXAuaGVpZ2h0O1xuICAgICAgICAgICAgLy8gdmFyIGltYWdlRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEocmVuZGVyVGFyZ2V0VG1wLndpZHRoLCByZW5kZXJUYXJnZXRUbXAuaGVpZ2h0KTtcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGsgPSAwOyBrIDwgcGl4ZWxzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAvLyAgICAgaW1hZ2VEYXRhLmRhdGFba10gPSBwaXhlbHNba107XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgICAgICAgICAvLyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG5cbiAgICAgICAgICAgIGZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG4gICAgICAgICAgICBwcmVmaWx0ZXJlZEN1YmVNYXAubWlwbWFwc1tpXS5waXhlbHNbdGFyZ2V0c1tqXV0gPSBwaXhlbHM7XG4gICAgICAgIH1cblxuICAgICAgICByZW5kZXJUYXJnZXRUbXAud2lkdGggLz0gMjtcbiAgICAgICAgcmVuZGVyVGFyZ2V0VG1wLmhlaWdodCAvPSAyO1xuICAgICAgICByZW5kZXJUYXJnZXRUbXAuZGlydHkoKTtcbiAgICB9XG5cbiAgICBmcmFtZUJ1ZmZlci5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICByZW5kZXJUYXJnZXRUbXAuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgc2t5RW52LmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIC8vIFJlbW92ZSBncHUgcmVzb3VyY2UgYWxsdWNhdGVkIGluIHJlbmRlcmVyXG4gICAgbm9ybWFsRGlzdHJpYnV0aW9uLmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgLy8gcmVuZGVyZXIuZGlzcG9zZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW52aXJvbm1lbnRNYXA6IHByZWZpbHRlcmVkQ3ViZU1hcCxcbiAgICAgICAgYnJkZkxvb2t1cDogYnJkZkxvb2t1cCxcbiAgICAgICAgbm9ybWFsRGlzdHJpYnV0aW9uOiBub3JtYWxEaXN0cmlidXRpb24sXG4gICAgICAgIG1heE1pcG1hcExldmVsOiBtaXBtYXBOdW1cbiAgICB9O1xufTtcblxuY3ViZW1hcFV0aWwuaW50ZWdyYXRlQlJERiA9IGZ1bmN0aW9uIChyZW5kZXJlciwgbm9ybWFsRGlzdHJpYnV0aW9uKSB7XG4gICAgbm9ybWFsRGlzdHJpYnV0aW9uID0gbm9ybWFsRGlzdHJpYnV0aW9uIHx8IGN1YmVtYXBVdGlsLmdlbmVyYXRlTm9ybWFsRGlzdHJpYnV0aW9uKCk7XG4gICAgdmFyIGZyYW1lYnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKHtcbiAgICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIHBhc3MgPSBuZXcgUGFzcyh7XG4gICAgICAgIGZyYWdtZW50OiBpbnRlZ3JhdGVCUkRGU2hhZGVyQ29kZVxuICAgIH0pO1xuXG4gICAgdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgd2lkdGg6IDUxMixcbiAgICAgICAgaGVpZ2h0OiAyNTYsXG4gICAgICAgIHR5cGU6IFRleHR1cmUuSEFMRl9GTE9BVCxcbiAgICAgICAgbWluRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1QsXG4gICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICB1c2VNaXBtYXA6IGZhbHNlXG4gICAgfSk7XG4gICAgcGFzcy5zZXRVbmlmb3JtKCdub3JtYWxEaXN0cmlidXRpb24nLCBub3JtYWxEaXN0cmlidXRpb24pO1xuICAgIHBhc3Muc2V0VW5pZm9ybSgndmlld3BvcnRTaXplJywgWzUxMiwgMjU2XSk7XG4gICAgcGFzcy5hdHRhY2hPdXRwdXQodGV4dHVyZSk7XG4gICAgcGFzcy5yZW5kZXIocmVuZGVyZXIsIGZyYW1lYnVmZmVyKTtcblxuICAgIC8vIEZJWE1FIE9ubHkgY2hyb21lIGFuZCBmaXJlZm94IGNhbiByZWFkUGl4ZWxzIHdpdGggZmxvYXQgdHlwZS5cbiAgICAvLyBmcmFtZWJ1ZmZlci5iaW5kKHJlbmRlcmVyKTtcbiAgICAvLyB2YXIgcGl4ZWxzID0gbmV3IEZsb2F0MzJBcnJheSg1MTIgKiAyNTYgKiA0KTtcbiAgICAvLyByZW5kZXJlci5nbC5yZWFkUGl4ZWxzKFxuICAgIC8vICAgICAwLCAwLCB0ZXh0dXJlLndpZHRoLCB0ZXh0dXJlLmhlaWdodCxcbiAgICAvLyAgICAgVGV4dHVyZS5SR0JBLCBUZXh0dXJlLkZMT0FULCBwaXhlbHNcbiAgICAvLyApO1xuICAgIC8vIHRleHR1cmUucGl4ZWxzID0gcGl4ZWxzO1xuICAgIC8vIHRleHR1cmUuZmxpcFkgPSBmYWxzZTtcbiAgICAvLyB0ZXh0dXJlLmRpcnR5KCk7XG4gICAgLy8gZnJhbWVidWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcblxuICAgIGZyYW1lYnVmZmVyLmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgcmV0dXJuIHRleHR1cmU7XG59O1xuXG5jdWJlbWFwVXRpbC5nZW5lcmF0ZU5vcm1hbERpc3RyaWJ1dGlvbiA9IGZ1bmN0aW9uIChyb3VnaG5lc3NMZXZlbHMsIHNhbXBsZVNpemUpIHtcblxuICAgIC8vIGh0dHA6Ly9ob2xnZXIuZGFtbWVydHoub3JnL3N0dWZmL25vdGVzX0hhbW1lcnNsZXlPbkhlbWlzcGhlcmUuaHRtbFxuICAgIC8vIEdMU0wgbm90IHN1cHBvcnQgYml0IG9wZXJhdGlvbiwgdXNlIGxvb2t1cCBpbnN0ZWFkXG4gICAgLy8gViAtPiBpIC8gTiwgVSAtPiByb3VnaG5lc3NcbiAgICB2YXIgcm91Z2huZXNzTGV2ZWxzID0gcm91Z2huZXNzTGV2ZWxzIHx8IDI1NjtcbiAgICB2YXIgc2FtcGxlU2l6ZSA9IHNhbXBsZVNpemUgfHwgMTAyNDtcblxuICAgIHZhciBub3JtYWxEaXN0cmlidXRpb24gPSBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgd2lkdGg6IHJvdWdobmVzc0xldmVscyxcbiAgICAgICAgaGVpZ2h0OiBzYW1wbGVTaXplLFxuICAgICAgICB0eXBlOiBUZXh0dXJlLkZMT0FULFxuICAgICAgICBtaW5GaWx0ZXI6IFRleHR1cmUuTkVBUkVTVCxcbiAgICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1QsXG4gICAgICAgIHVzZU1pcG1hcDogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgcGl4ZWxzID0gbmV3IEZsb2F0MzJBcnJheShzYW1wbGVTaXplICogcm91Z2huZXNzTGV2ZWxzICogNCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgdmFyIHggPSBpIC8gc2FtcGxlU2l6ZTtcbiAgICAgICAgLy8gaHR0cDovL2hvbGdlci5kYW1tZXJ0ei5vcmcvc3R1ZmYvbm90ZXNfSGFtbWVyc2xleU9uSGVtaXNwaGVyZS5odG1sXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9yc1xuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5MDg0OTIvdW5zaWduZWQtaW50ZWdlci1pbi1qYXZhc2NyaXB0XG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTgyMjM1MC93aGF0LWlzLXRoZS1qYXZhc2NyaXB0LW9wZXJhdG9yLWFuZC1ob3ctZG8teW91LXVzZS1pdFxuICAgICAgICB2YXIgeSA9IChpIDw8IDE2IHwgaSA+Pj4gMTYpID4+PiAwO1xuICAgICAgICB5ID0gKCh5ICYgMTQzMTY1NTc2NSkgPDwgMSB8ICh5ICYgMjg2MzMxMTUzMCkgPj4+IDEpID4+PiAwO1xuICAgICAgICB5ID0gKCh5ICYgODU4OTkzNDU5KSA8PCAyIHwgKHkgJiAzNDM1OTczODM2KSA+Pj4gMikgPj4+IDA7XG4gICAgICAgIHkgPSAoKHkgJiAyNTI2NDUxMzUpIDw8IDQgfCAoeSAmIDQwNDIzMjIxNjApID4+PiA0KSA+Pj4gMDtcbiAgICAgICAgeSA9ICgoKHkgJiAxNjcxMTkzNSkgPDwgOCB8ICh5ICYgNDI3ODI1NTM2MCkgPj4+IDgpID4+PiAwKSAvIDQyOTQ5NjcyOTY7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3VnaG5lc3NMZXZlbHM7IGorKykge1xuICAgICAgICAgICAgdmFyIHJvdWdobmVzcyA9IGogLyByb3VnaG5lc3NMZXZlbHM7XG4gICAgICAgICAgICB2YXIgYSA9IHJvdWdobmVzcyAqIHJvdWdobmVzcztcbiAgICAgICAgICAgIHZhciBwaGkgPSAyLjAgKiBNYXRoLlBJICogeDtcbiAgICAgICAgICAgIC8vIENERlxuICAgICAgICAgICAgdmFyIGNvc1RoZXRhID0gTWF0aC5zcXJ0KCgxIC0geSkgLyAoMSArIChhICogYSAtIDEuMCkgKiB5KSk7XG4gICAgICAgICAgICB2YXIgc2luVGhldGEgPSBNYXRoLnNxcnQoMS4wIC0gY29zVGhldGEgKiBjb3NUaGV0YSk7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gKGkgKiByb3VnaG5lc3NMZXZlbHMgKyBqKSAqIDQ7XG4gICAgICAgICAgICBwaXhlbHNbb2Zmc2V0XSA9IHNpblRoZXRhICogTWF0aC5jb3MocGhpKTtcbiAgICAgICAgICAgIHBpeGVsc1tvZmZzZXQgKyAxXSA9IHNpblRoZXRhICogTWF0aC5zaW4ocGhpKTtcbiAgICAgICAgICAgIHBpeGVsc1tvZmZzZXQgKyAyXSA9IGNvc1RoZXRhO1xuICAgICAgICAgICAgcGl4ZWxzW29mZnNldCArIDNdID0gMS4wO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5vcm1hbERpc3RyaWJ1dGlvbi5waXhlbHMgPSBwaXhlbHM7XG5cbiAgICByZXR1cm4gbm9ybWFsRGlzdHJpYnV0aW9uO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3ViZW1hcFV0aWw7XG4iLCIvLyBodHRwczovL2RvY3MudW5yZWFsZW5naW5lLmNvbS9sYXRlc3QvSU5UL0VuZ2luZS9SZW5kZXJpbmcvTGlnaHRpbmdBbmRTaGFkb3dzL0FtYmllbnRDdWJlbWFwL1xuaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcbmltcG9ydCBjdWJlbWFwVXRpbCBmcm9tICcuLi91dGlsL2N1YmVtYXAnO1xuXG4vKipcbiAqIEFtYmllbnQgY3ViZW1hcCBsaWdodCBwcm92aWRlcyBzcGVjdWxhciBwYXJ0cyBvZiBJbWFnZSBCYXNlZCBMaWdodGluZy5cbiAqIFdoaWNoIGlzIGEgYmFzaWMgcmVxdWlyZW1lbnQgZm9yIFBoeXNpY2FsbHkgQmFzZWQgUmVuZGVyaW5nXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5BbWJpZW50Q3ViZW1hcFxuICogQGV4dGVuZHMgY2xheS5MaWdodFxuICovXG52YXIgQW1iaWVudEN1YmVtYXBMaWdodCA9IExpZ2h0LmV4dGVuZCh7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlQ3ViZX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50Q3ViZW1hcCNcbiAgICAgKi9cbiAgICBjdWJlbWFwOiBudWxsLFxuXG4gICAgLy8gVE9ET1xuICAgIC8vIHJhbmdlOiAxMDAsXG5cbiAgICBjYXN0U2hhZG93OiBmYWxzZSxcblxuICAgIF9ub3JtYWxEaXN0cmlidXRpb246IG51bGwsXG4gICAgX2JyZGZMb29rdXA6IG51bGxcblxufSwgLyoqIEBsZW5kcyBjbGF5LmxpZ2h0LkFtYmllbnRDdWJlbWFwIyAqLyB7XG5cbiAgICB0eXBlOiAnQU1CSUVOVF9DVUJFTUFQX0xJR0hUJyxcblxuICAgIC8qKlxuICAgICAqIERvIHByZWZpdGVyaW5nIHRoZSBjdWJlbWFwXG4gICAgICogQHBhcmFtIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0zMl1cbiAgICAgKi9cbiAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2l6ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2JyZGZMb29rdXApIHtcbiAgICAgICAgICAgIHRoaXMuX25vcm1hbERpc3RyaWJ1dGlvbiA9IGN1YmVtYXBVdGlsLmdlbmVyYXRlTm9ybWFsRGlzdHJpYnV0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9icmRmTG9va3VwID0gY3ViZW1hcFV0aWwuaW50ZWdyYXRlQlJERihyZW5kZXJlciwgdGhpcy5fbm9ybWFsRGlzdHJpYnV0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3ViZW1hcCA9IHRoaXMuY3ViZW1hcDtcbiAgICAgICAgaWYgKGN1YmVtYXAuX19wcmVmaWx0ZXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IGN1YmVtYXBVdGlsLnByZWZpbHRlckVudmlyb25tZW50TWFwKFxuICAgICAgICAgICAgcmVuZGVyZXIsIGN1YmVtYXAsIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVSR0JNOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICAgICAgICAgIGhlaWdodDogc2l6ZVxuICAgICAgICAgICAgfSwgdGhpcy5fbm9ybWFsRGlzdHJpYnV0aW9uLCB0aGlzLl9icmRmTG9va3VwXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY3ViZW1hcCA9IHJlc3VsdC5lbnZpcm9ubWVudE1hcDtcbiAgICAgICAgdGhpcy5jdWJlbWFwLl9fcHJlZmlsdGVyZWQgPSB0cnVlO1xuXG4gICAgICAgIGN1YmVtYXAuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgfSxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgYW1iaWVudEN1YmVtYXBMaWdodENvbG9yOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhbWJpZW50Q3ViZW1hcExpZ2h0Q3ViZW1hcDoge1xuICAgICAgICAgICAgdHlwZTogJ3QnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5jdWJlbWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGFtYmllbnRDdWJlbWFwTGlnaHRCUkRGTG9va3VwOiB7XG4gICAgICAgICAgICB0eXBlOiAndCcsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLl9icmRmTG9va3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQHJldHVybiB7Y2xheS5saWdodC5BbWJpZW50Q3ViZW1hcH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50Q3ViZW1hcC5wcm90b3R5cGVcbiAgICAgKi9cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBbWJpZW50Q3ViZW1hcExpZ2h0O1xuIiwiaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi4vY29yZS92ZW5kb3InO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBIYXJtb25pYyBBbWJpZW50IExpZ2h0XG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5BbWJpZW50U0hcbiAqIEBleHRlbmRzIGNsYXkuTGlnaHRcbiAqL1xudmFyIEFtYmllbnRTSExpZ2h0ID0gTGlnaHQuZXh0ZW5kKHtcblxuICAgIGNhc3RTaGFkb3c6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogU3BoZXJpY2FsIEhhcm1vbmljIENvZWZmaWNpZW50c1xuICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50U0gjXG4gICAgICovXG4gICAgY29lZmZpY2llbnRzOiBbXSxcblxufSwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX2NvZWZmaWNpZW50c1RtcEFyciA9IG5ldyB2ZW5kb3IuRmxvYXQzMkFycmF5KDkgKiAzKTtcbn0sIHtcblxuICAgIHR5cGU6ICdBTUJJRU5UX1NIX0xJR0hUJyxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgYW1iaWVudFNITGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBpbnN0YW5jZS5jb2xvcjtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZW5zaXR5ID0gaW5zdGFuY2UuaW50ZW5zaXR5O1xuICAgICAgICAgICAgICAgIHJldHVybiBbY29sb3JbMF0gKiBpbnRlbnNpdHksIGNvbG9yWzFdICogaW50ZW5zaXR5LCBjb2xvclsyXSAqIGludGVuc2l0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHM6IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZWZmaWNpZW50c1RtcEFyciA9IGluc3RhbmNlLl9jb2VmZmljaWVudHNUbXBBcnI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZS5jb2VmZmljaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzVG1wQXJyW2ldID0gaW5zdGFuY2UuY29lZmZpY2llbnRzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29lZmZpY2llbnRzVG1wQXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQHJldHVybiB7Y2xheS5saWdodC5BbWJpZW50fVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmxpZ2h0LkFtYmllbnQucHJvdG90eXBlXG4gICAgICovXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQW1iaWVudFNITGlnaHQ7XG4iLCJpbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4uL2NvcmUvZ2xlbnVtJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL2NvcmUvdXRpbCc7XG5cbnZhciBUZXh0dXJlUG9vbCA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHRoaXMuX3Bvb2wgPSB7fTtcblxuICAgIHRoaXMuX2FsbG9jYXRlZFRleHR1cmVzID0gW107XG59O1xuXG5UZXh0dXJlUG9vbC5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogVGV4dHVyZVBvb2wsXG5cbiAgICBnZXQ6IGZ1bmN0aW9uIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHZhciBrZXkgPSBnZW5lcmF0ZUtleShwYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKCF0aGlzLl9wb29sLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Bvb2xba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fcG9vbFtrZXldO1xuICAgICAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB0aGlzLl9hbGxvY2F0ZWRUZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3QucG9wKCk7XG4gICAgfSxcblxuICAgIHB1dDogZnVuY3Rpb24gKHRleHR1cmUpIHtcbiAgICAgICAgdmFyIGtleSA9IGdlbmVyYXRlS2V5KHRleHR1cmUpO1xuICAgICAgICBpZiAoIXRoaXMuX3Bvb2wuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5fcG9vbFtrZXldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLl9wb29sW2tleV07XG4gICAgICAgIGxpc3QucHVzaCh0ZXh0dXJlKTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FsbG9jYXRlZFRleHR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvY2F0ZWRUZXh0dXJlc1tpXS5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb29sID0ge307XG4gICAgICAgIHRoaXMuX2FsbG9jYXRlZFRleHR1cmVzID0gW107XG4gICAgfVxufTtcblxudmFyIGRlZmF1bHRQYXJhbXMgPSB7XG4gICAgd2lkdGg6IDUxMixcbiAgICBoZWlnaHQ6IDUxMixcbiAgICB0eXBlOiBnbGVudW0uVU5TSUdORURfQllURSxcbiAgICBmb3JtYXQ6IGdsZW51bS5SR0JBLFxuICAgIHdyYXBTOiBnbGVudW0uQ0xBTVBfVE9fRURHRSxcbiAgICB3cmFwVDogZ2xlbnVtLkNMQU1QX1RPX0VER0UsXG4gICAgbWluRmlsdGVyOiBnbGVudW0uTElORUFSX01JUE1BUF9MSU5FQVIsXG4gICAgbWFnRmlsdGVyOiBnbGVudW0uTElORUFSLFxuICAgIHVzZU1pcG1hcDogdHJ1ZSxcbiAgICBhbmlzb3Ryb3BpYzogMSxcbiAgICBmbGlwWTogdHJ1ZSxcbiAgICB1bnBhY2tBbGlnbm1lbnQ6IDQsXG4gICAgcHJlbXVsdGlwbHlBbHBoYTogZmFsc2Vcbn07XG5cbnZhciBkZWZhdWx0UGFyYW1Qcm9wTGlzdCA9IE9iamVjdC5rZXlzKGRlZmF1bHRQYXJhbXMpO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUtleShwYXJhbWV0ZXJzKSB7XG4gICAgdXRpbC5kZWZhdWx0c1dpdGhQcm9wTGlzdChwYXJhbWV0ZXJzLCBkZWZhdWx0UGFyYW1zLCBkZWZhdWx0UGFyYW1Qcm9wTGlzdCk7XG4gICAgZmFsbEJhY2socGFyYW1ldGVycyk7XG5cbiAgICB2YXIga2V5ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0UGFyYW1Qcm9wTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmFtZSA9IGRlZmF1bHRQYXJhbVByb3BMaXN0W2ldO1xuICAgICAgICB2YXIgY2h1bmsgPSBwYXJhbWV0ZXJzW25hbWVdLnRvU3RyaW5nKCk7XG4gICAgICAgIGtleSArPSBjaHVuaztcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gZmFsbEJhY2sodGFyZ2V0KSB7XG5cbiAgICB2YXIgSVBPVCA9IGlzUG93ZXJPZlR3byh0YXJnZXQud2lkdGgsIHRhcmdldC5oZWlnaHQpO1xuXG4gICAgaWYgKHRhcmdldC5mb3JtYXQgPT09IGdsZW51bS5ERVBUSF9DT01QT05FTlQpIHtcbiAgICAgICAgdGFyZ2V0LnVzZU1pcG1hcCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghSVBPVCB8fCAhdGFyZ2V0LnVzZU1pcG1hcCkge1xuICAgICAgICBpZiAodGFyZ2V0Lm1pbkZpbHRlciA9PSBnbGVudW0uTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCB8fFxuICAgICAgICAgICAgdGFyZ2V0Lm1pbkZpbHRlciA9PSBnbGVudW0uTkVBUkVTVF9NSVBNQVBfTElORUFSKSB7XG4gICAgICAgICAgICB0YXJnZXQubWluRmlsdGVyID0gZ2xlbnVtLk5FQVJFU1Q7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0YXJnZXQubWluRmlsdGVyID09IGdsZW51bS5MSU5FQVJfTUlQTUFQX0xJTkVBUiB8fFxuICAgICAgICAgICAgdGFyZ2V0Lm1pbkZpbHRlciA9PSBnbGVudW0uTElORUFSX01JUE1BUF9ORUFSRVNUXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGFyZ2V0Lm1pbkZpbHRlciA9IGdsZW51bS5MSU5FQVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFJUE9UKSB7XG4gICAgICAgIHRhcmdldC53cmFwUyA9IGdsZW51bS5DTEFNUF9UT19FREdFO1xuICAgICAgICB0YXJnZXQud3JhcFQgPSBnbGVudW0uQ0xBTVBfVE9fRURHRTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzUG93ZXJPZlR3byh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgcmV0dXJuICh3aWR0aCAmICh3aWR0aC0xKSkgPT09IDAgJiZcbiAgICAgICAgICAgIChoZWlnaHQgJiAoaGVpZ2h0LTEpKSA9PT0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZVBvb2w7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5zbS5kZXB0aC52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG4jaWZkZWYgU0hBRE9XX1RSQU5TUEFSRU5UXFxuYXR0cmlidXRlIHZlYzIgdGV4Y29vcmQgOiBURVhDT09SRF8wO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzQgdl9WaWV3UG9zaXRpb247XFxuI2lmZGVmIFNIQURPV19UUkFOU1BBUkVOVFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpe1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiNpZmRlZiBTS0lOTklOR1xcbiAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgc2tpbm5lZFBvc2l0aW9uID0gKHNraW5NYXRyaXhXUyAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4jZW5kaWZcXG4gICAgdl9WaWV3UG9zaXRpb24gPSB3b3JsZFZpZXdQcm9qZWN0aW9uICogdmVjNChza2lubmVkUG9zaXRpb24sIDEuMCk7XFxuICAgIGdsX1Bvc2l0aW9uID0gdl9WaWV3UG9zaXRpb247XFxuI2lmZGVmIFNIQURPV19UUkFOU1BBUkVOVFxcbiAgICB2X1RleGNvb3JkID0gdGV4Y29vcmQ7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuc20uZGVwdGguZnJhZ21lbnRcXG52YXJ5aW5nIHZlYzQgdl9WaWV3UG9zaXRpb247XFxuI2lmZGVmIFNIQURPV19UUkFOU1BBUkVOVFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgYmlhcyA6IDAuMDAxO1xcbnVuaWZvcm0gZmxvYXQgc2xvcGVTY2FsZSA6IDEuMDtcXG4jaWZkZWYgU0hBRE9XX1RSQU5TUEFSRU5UXFxudW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNwYXJlbnRNYXA7XFxuI2VuZGlmXFxuQGltcG9ydCBjbGF5LnV0aWwuZW5jb2RlX2Zsb2F0XFxudm9pZCBtYWluKCl7XFxuICAgIGZsb2F0IGRlcHRoID0gdl9WaWV3UG9zaXRpb24ueiAvIHZfVmlld1Bvc2l0aW9uLnc7XFxuI2lmZGVmIFVTRV9WU01cXG4gICAgZGVwdGggPSBkZXB0aCAqIDAuNSArIDAuNTtcXG4gICAgZmxvYXQgbW9tZW50MSA9IGRlcHRoO1xcbiAgICBmbG9hdCBtb21lbnQyID0gZGVwdGggKiBkZXB0aDtcXG4gICAgZmxvYXQgZHggPSBkRmR4KGRlcHRoKTtcXG4gICAgZmxvYXQgZHkgPSBkRmR5KGRlcHRoKTtcXG4gICAgbW9tZW50MiArPSAwLjI1KihkeCpkeCtkeSpkeSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobW9tZW50MSwgbW9tZW50MiwgMC4wLCAxLjApO1xcbiNlbHNlXFxuICAgIGZsb2F0IGR4ID0gZEZkeChkZXB0aCk7XFxuICAgIGZsb2F0IGR5ID0gZEZkeShkZXB0aCk7XFxuICAgIGRlcHRoICs9IHNxcnQoZHgqZHggKyBkeSpkeSkgKiBzbG9wZVNjYWxlICsgYmlhcztcXG4jaWZkZWYgU0hBRE9XX1RSQU5TUEFSRU5UXFxuICAgIGlmICh0ZXh0dXJlMkQodHJhbnNwYXJlbnRNYXAsIHZfVGV4Y29vcmQpLmEgPD0gMC4xKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdCgwLjk5OTkpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KGRlcHRoICogMC41ICsgMC41KTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5zbS5kZWJ1Z19kZXB0aFxcbnVuaWZvcm0gc2FtcGxlcjJEIGRlcHRoTWFwO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjNCB0ZXggPSB0ZXh0dXJlMkQoZGVwdGhNYXAsIHZfVGV4Y29vcmQpO1xcbiNpZmRlZiBVU0VfVlNNXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4LnJnYiwgMS4wKTtcXG4jZWxzZVxcbiAgICBmbG9hdCBkZXB0aCA9IGRlY29kZUZsb2F0KHRleCk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZGVwdGgsIGRlcHRoLCBkZXB0aCwgMS4wKTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5zbS5kaXN0YW5jZS52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSBtYXQ0IHdvcmxkIDogV09STEQ7XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG5AaW1wb3J0IGNsYXkuY2h1bmsuc2tpbm5pbmdfaGVhZGVyXFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG52b2lkIG1haW4gKCl7XFxuICAgIHZlYzMgc2tpbm5lZFBvc2l0aW9uID0gcG9zaXRpb247XFxuI2lmZGVmIFNLSU5OSU5HXFxuICAgIEBpbXBvcnQgY2xheS5jaHVuay5za2luX21hdHJpeFxcbiAgICBza2lubmVkUG9zaXRpb24gPSAoc2tpbk1hdHJpeFdTICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiAsIDEuMCk7XFxuICAgIHZfV29ybGRQb3NpdGlvbiA9ICh3b3JsZCAqIHZlYzQoc2tpbm5lZFBvc2l0aW9uLCAxLjApKS54eXo7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuc20uZGlzdGFuY2UuZnJhZ21lbnRcXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXG51bmlmb3JtIGZsb2F0IHJhbmdlIDogMTAwO1xcbnZhcnlpbmcgdmVjMyB2X1dvcmxkUG9zaXRpb247XFxuQGltcG9ydCBjbGF5LnV0aWwuZW5jb2RlX2Zsb2F0XFxudm9pZCBtYWluKCl7XFxuICAgIGZsb2F0IGRpc3QgPSBkaXN0YW5jZShsaWdodFBvc2l0aW9uLCB2X1dvcmxkUG9zaXRpb24pO1xcbiNpZmRlZiBVU0VfVlNNXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZGlzdCwgZGlzdCAqIGRpc3QsIDAuMCwgMC4wKTtcXG4jZWxzZVxcbiAgICBkaXN0ID0gZGlzdCAvIHJhbmdlO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdChkaXN0KTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5wbHVnaW4uc2hhZG93X21hcF9jb21tb25cXG5AaW1wb3J0IGNsYXkudXRpbC5kZWNvZGVfZmxvYXRcXG5mbG9hdCB0YXBTaGFkb3dNYXAoc2FtcGxlcjJEIG1hcCwgdmVjMiB1diwgZmxvYXQgeil7XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKG1hcCwgdXYpO1xcbiAgICByZXR1cm4gc3RlcCh6LCBkZWNvZGVGbG9hdCh0ZXgpICogMi4wIC0gMS4wKTtcXG59XFxuZmxvYXQgcGNmKHNhbXBsZXIyRCBtYXAsIHZlYzIgdXYsIGZsb2F0IHosIGZsb2F0IHRleHR1cmVTaXplLCB2ZWMyIHNjYWxlKSB7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWIgPSB0YXBTaGFkb3dNYXAobWFwLCB1diwgeik7XFxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigxLjAgLyB0ZXh0dXJlU2l6ZSkgKiBzY2FsZTtcXG4jaWZkZWYgUENGX0tFUk5FTF9TSVpFXFxuICAgIGZvciAoaW50IF9pZHhfID0gMDsgX2lkeF8gPCBQQ0ZfS0VSTkVMX1NJWkU7IF9pZHhfKyspIHt7XFxuICAgICAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2ICsgb2Zmc2V0ICogcGNmS2VybmVsW19pZHhfXSwgeik7XFxuICAgIH19XFxuICAgIHJldHVybiBzaGFkb3dDb250cmliIC8gZmxvYXQoUENGX0tFUk5FTF9TSVpFICsgMSk7XFxuI2Vsc2VcXG4gICAgc2hhZG93Q29udHJpYiArPSB0YXBTaGFkb3dNYXAobWFwLCB1dit2ZWMyKG9mZnNldC54LCAwLjApLCB6KTtcXG4gICAgc2hhZG93Q29udHJpYiArPSB0YXBTaGFkb3dNYXAobWFwLCB1dit2ZWMyKG9mZnNldC54LCBvZmZzZXQueSksIHopO1xcbiAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2K3ZlYzIoLW9mZnNldC54LCBvZmZzZXQueSksIHopO1xcbiAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2K3ZlYzIoMC4wLCBvZmZzZXQueSksIHopO1xcbiAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2K3ZlYzIoLW9mZnNldC54LCAwLjApLCB6KTtcXG4gICAgc2hhZG93Q29udHJpYiArPSB0YXBTaGFkb3dNYXAobWFwLCB1dit2ZWMyKC1vZmZzZXQueCwgLW9mZnNldC55KSwgeik7XFxuICAgIHNoYWRvd0NvbnRyaWIgKz0gdGFwU2hhZG93TWFwKG1hcCwgdXYrdmVjMihvZmZzZXQueCwgLW9mZnNldC55KSwgeik7XFxuICAgIHNoYWRvd0NvbnRyaWIgKz0gdGFwU2hhZG93TWFwKG1hcCwgdXYrdmVjMigwLjAsIC1vZmZzZXQueSksIHopO1xcbiAgICByZXR1cm4gc2hhZG93Q29udHJpYiAvIDkuMDtcXG4jZW5kaWZcXG59XFxuZmxvYXQgcGNmKHNhbXBsZXIyRCBtYXAsIHZlYzIgdXYsIGZsb2F0IHosIGZsb2F0IHRleHR1cmVTaXplKSB7XFxuICAgIHJldHVybiBwY2YobWFwLCB1diwgeiwgdGV4dHVyZVNpemUsIHZlYzIoMS4wKSk7XFxufVxcbmZsb2F0IGNoZWJ5c2hldlVwcGVyQm91bmQodmVjMiBtb21lbnRzLCBmbG9hdCB6KXtcXG4gICAgZmxvYXQgcCA9IDAuMDtcXG4gICAgeiA9IHogKiAwLjUgKyAwLjU7XFxuICAgIGlmICh6IDw9IG1vbWVudHMueCkge1xcbiAgICAgICAgcCA9IDEuMDtcXG4gICAgfVxcbiAgICBmbG9hdCB2YXJpYW5jZSA9IG1vbWVudHMueSAtIG1vbWVudHMueCAqIG1vbWVudHMueDtcXG4gICAgdmFyaWFuY2UgPSBtYXgodmFyaWFuY2UsIDAuMDAwMDAwMSk7XFxuICAgIGZsb2F0IG1EID0gbW9tZW50cy54IC0gejtcXG4gICAgZmxvYXQgcE1heCA9IHZhcmlhbmNlIC8gKHZhcmlhbmNlICsgbUQgKiBtRCk7XFxuICAgIHBNYXggPSBjbGFtcCgocE1heC0wLjQpLygxLjAtMC40KSwgMC4wLCAxLjApO1xcbiAgICByZXR1cm4gbWF4KHAsIHBNYXgpO1xcbn1cXG5mbG9hdCBjb21wdXRlU2hhZG93Q29udHJpYihcXG4gICAgc2FtcGxlcjJEIG1hcCwgbWF0NCBsaWdodFZQTSwgdmVjMyBwb3NpdGlvbiwgZmxvYXQgdGV4dHVyZVNpemUsIHZlYzIgc2NhbGUsIHZlYzIgb2Zmc2V0XFxuKSB7XFxuICAgIHZlYzQgcG9zSW5MaWdodFNwYWNlID0gbGlnaHRWUE0gKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbiAgICBwb3NJbkxpZ2h0U3BhY2UueHl6IC89IHBvc0luTGlnaHRTcGFjZS53O1xcbiAgICBmbG9hdCB6ID0gcG9zSW5MaWdodFNwYWNlLno7XFxuICAgIGlmKGFsbChncmVhdGVyVGhhbihwb3NJbkxpZ2h0U3BhY2UueHl6LCB2ZWMzKC0wLjk5LCAtMC45OSwgLTEuMCkpKSAmJlxcbiAgICAgICAgYWxsKGxlc3NUaGFuKHBvc0luTGlnaHRTcGFjZS54eXosIHZlYzMoMC45OSwgMC45OSwgMS4wKSkpKXtcXG4gICAgICAgIHZlYzIgdXYgPSAocG9zSW5MaWdodFNwYWNlLnh5KzEuMCkgLyAyLjA7XFxuICAgICAgICAjaWZkZWYgVVNFX1ZTTVxcbiAgICAgICAgICAgIHZlYzIgbW9tZW50cyA9IHRleHR1cmUyRChtYXAsIHV2ICogc2NhbGUgKyBvZmZzZXQpLnh5O1xcbiAgICAgICAgICAgIHJldHVybiBjaGVieXNoZXZVcHBlckJvdW5kKG1vbWVudHMsIHopO1xcbiAgICAgICAgI2Vsc2VcXG4gICAgICAgICAgICByZXR1cm4gcGNmKG1hcCwgdXYgKiBzY2FsZSArIG9mZnNldCwgeiwgdGV4dHVyZVNpemUsIHNjYWxlKTtcXG4gICAgICAgICNlbmRpZlxcbiAgICB9XFxuICAgIHJldHVybiAxLjA7XFxufVxcbmZsb2F0IGNvbXB1dGVTaGFkb3dDb250cmliKHNhbXBsZXIyRCBtYXAsIG1hdDQgbGlnaHRWUE0sIHZlYzMgcG9zaXRpb24sIGZsb2F0IHRleHR1cmVTaXplKSB7XFxuICAgIHJldHVybiBjb21wdXRlU2hhZG93Q29udHJpYihtYXAsIGxpZ2h0VlBNLCBwb3NpdGlvbiwgdGV4dHVyZVNpemUsIHZlYzIoMS4wKSwgdmVjMigwLjApKTtcXG59XFxuZmxvYXQgY29tcHV0ZVNoYWRvd0NvbnRyaWJPbW5pKHNhbXBsZXJDdWJlIG1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJhbmdlKVxcbntcXG4gICAgZmxvYXQgZGlzdCA9IGxlbmd0aChkaXJlY3Rpb24pO1xcbiAgICB2ZWM0IHNoYWRvd1RleCA9IHRleHR1cmVDdWJlKG1hcCwgZGlyZWN0aW9uKTtcXG4jaWZkZWYgVVNFX1ZTTVxcbiAgICB2ZWMyIG1vbWVudHMgPSBzaGFkb3dUZXgueHk7XFxuICAgIGZsb2F0IHZhcmlhbmNlID0gbW9tZW50cy55IC0gbW9tZW50cy54ICogbW9tZW50cy54O1xcbiAgICBmbG9hdCBtRCA9IG1vbWVudHMueCAtIGRpc3Q7XFxuICAgIGZsb2F0IHAgPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIG1EICogbUQpO1xcbiAgICBpZihtb21lbnRzLnggKyAwLjAwMSA8IGRpc3Qpe1xcbiAgICAgICAgcmV0dXJuIGNsYW1wKHAsIDAuMCwgMS4wKTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gMS4wO1xcbiAgICB9XFxuI2Vsc2VcXG4gICAgcmV0dXJuIHN0ZXAoZGlzdCwgKGRlY29kZUZsb2F0KHNoYWRvd1RleCkgKyAwLjAwMDIpICogcmFuZ2UpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnBsdWdpbi5jb21wdXRlX3NoYWRvd19tYXBcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVCkgfHwgZGVmaW5lZChESVJFQ1RJT05BTF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpIHx8IGRlZmluZWQoUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiNpZmRlZiBTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVFxcbnVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodFNoYWRvd01hcHNbU1BPVF9MSUdIVF9TSEFET1dNQVBfQ09VTlRdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gbWF0NCBzcG90TGlnaHRNYXRyaWNlc1tTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVF06dW5jb25maWd1cmFibGU7XFxudW5pZm9ybSBmbG9hdCBzcG90TGlnaHRTaGFkb3dNYXBTaXplc1tTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVF06dW5jb25maWd1cmFibGU7XFxuI2VuZGlmXFxuI2lmZGVmIERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVFxcbiNpZiBkZWZpbmVkKFNIQURPV19DQVNDQURFKVxcbnVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzWzFdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbExpZ2h0TWF0cmljZXNbU0hBRE9XX0NBU0NBREVdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gZmxvYXQgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcFNpemVzWzFdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gZmxvYXQgc2hhZG93Q2FzY2FkZUNsaXBzTmVhcltTSEFET1dfQ0FTQ0FERV06dW5jb25maWd1cmFibGU7XFxudW5pZm9ybSBmbG9hdCBzaGFkb3dDYXNjYWRlQ2xpcHNGYXJbU0hBRE9XX0NBU0NBREVdOnVuY29uZmlndXJhYmxlO1xcbiNlbHNlXFxudW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcHNbRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UXTp1bmNvbmZpZ3VyYWJsZTtcXG51bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzW0RJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVF06dW5jb25maWd1cmFibGU7XFxudW5pZm9ybSBmbG9hdCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXNbRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UXTp1bmNvbmZpZ3VyYWJsZTtcXG4jZW5kaWZcXG4jZW5kaWZcXG4jaWZkZWYgUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UXFxudW5pZm9ybSBzYW1wbGVyQ3ViZSBwb2ludExpZ2h0U2hhZG93TWFwc1tQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlRdOnVuY29uZmlndXJhYmxlO1xcbiNlbmRpZlxcbnVuaWZvcm0gYm9vbCBzaGFkb3dFbmFibGVkIDogdHJ1ZTtcXG4jaWZkZWYgUENGX0tFUk5FTF9TSVpFXFxudW5pZm9ybSB2ZWMyIHBjZktlcm5lbFtQQ0ZfS0VSTkVMX1NJWkVdO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5wbHVnaW4uc2hhZG93X21hcF9jb21tb25cXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG52b2lkIGNvbXB1dGVTaGFkb3dPZlNwb3RMaWdodHModmVjMyBwb3NpdGlvbiwgaW5vdXQgZmxvYXQgc2hhZG93Q29udHJpYnNbU1BPVF9MSUdIVF9DT1VOVF0gKSB7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWI7XFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IFNQT1RfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgc2hhZG93Q29udHJpYiA9IGNvbXB1dGVTaGFkb3dDb250cmliKFxcbiAgICAgICAgICAgIHNwb3RMaWdodFNoYWRvd01hcHNbX2lkeF9dLCBzcG90TGlnaHRNYXRyaWNlc1tfaWR4X10sIHBvc2l0aW9uLFxcbiAgICAgICAgICAgIHNwb3RMaWdodFNoYWRvd01hcFNpemVzW19pZHhfXVxcbiAgICAgICAgKTtcXG4gICAgICAgIHNoYWRvd0NvbnRyaWJzW19pZHhfXSA9IHNoYWRvd0NvbnRyaWI7XFxuICAgIH19XFxuICAgIGZvcihpbnQgX2lkeF8gPSBTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVDsgX2lkeF8gPCBTUE9UX0xJR0hUX0NPVU5UOyBfaWR4XysrKXt7XFxuICAgICAgICBzaGFkb3dDb250cmlic1tfaWR4X10gPSAxLjA7XFxuICAgIH19XFxufVxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4jaWZkZWYgU0hBRE9XX0NBU0NBREVcXG52b2lkIGNvbXB1dGVTaGFkb3dPZkRpcmVjdGlvbmFsTGlnaHRzKHZlYzMgcG9zaXRpb24sIGlub3V0IGZsb2F0IHNoYWRvd0NvbnRyaWJzW0RJUkVDVElPTkFMX0xJR0hUX0NPVU5UXSl7XFxuICAgIGZsb2F0IGRlcHRoID0gKDIuMCAqIGdsX0ZyYWdDb29yZC56IC0gZ2xfRGVwdGhSYW5nZS5uZWFyIC0gZ2xfRGVwdGhSYW5nZS5mYXIpXFxuICAgICAgICAgICAgICAgICAgICAvIChnbF9EZXB0aFJhbmdlLmZhciAtIGdsX0RlcHRoUmFuZ2UubmVhcik7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWI7XFxuICAgIHNoYWRvd0NvbnRyaWJzWzBdID0gMS4wO1xcbiAgICBmb3IgKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgU0hBRE9XX0NBU0NBREU7IF9pZHhfKyspIHt7XFxuICAgICAgICBpZiAoXFxuICAgICAgICAgICAgZGVwdGggPj0gc2hhZG93Q2FzY2FkZUNsaXBzTmVhcltfaWR4X10gJiZcXG4gICAgICAgICAgICBkZXB0aCA8PSBzaGFkb3dDYXNjYWRlQ2xpcHNGYXJbX2lkeF9dXFxuICAgICAgICApIHtcXG4gICAgICAgICAgICBzaGFkb3dDb250cmliID0gY29tcHV0ZVNoYWRvd0NvbnRyaWIoXFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzWzBdLCBkaXJlY3Rpb25hbExpZ2h0TWF0cmljZXNbX2lkeF9dLCBwb3NpdGlvbixcXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcFNpemVzWzBdLFxcbiAgICAgICAgICAgICAgICB2ZWMyKDEuMCAvIGZsb2F0KFNIQURPV19DQVNDQURFKSwgMS4wKSxcXG4gICAgICAgICAgICAgICAgdmVjMihmbG9hdChfaWR4XykgLyBmbG9hdChTSEFET1dfQ0FTQ0FERSksIDAuMClcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWJzWzBdID0gc2hhZG93Q29udHJpYjtcXG4gICAgICAgIH1cXG4gICAgfX1cXG4gICAgZm9yKGludCBfaWR4XyA9IERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVDsgX2lkeF8gPCBESVJFQ1RJT05BTF9MSUdIVF9DT1VOVDsgX2lkeF8rKykge3tcXG4gICAgICAgIHNoYWRvd0NvbnRyaWJzW19pZHhfXSA9IDEuMDtcXG4gICAgfX1cXG59XFxuI2Vsc2VcXG52b2lkIGNvbXB1dGVTaGFkb3dPZkRpcmVjdGlvbmFsTGlnaHRzKHZlYzMgcG9zaXRpb24sIGlub3V0IGZsb2F0IHNoYWRvd0NvbnRyaWJzW0RJUkVDVElPTkFMX0xJR0hUX0NPVU5UXSl7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWI7XFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVDsgX2lkeF8rKykge3tcXG4gICAgICAgIHNoYWRvd0NvbnRyaWIgPSBjb21wdXRlU2hhZG93Q29udHJpYihcXG4gICAgICAgICAgICBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwc1tfaWR4X10sIGRpcmVjdGlvbmFsTGlnaHRNYXRyaWNlc1tfaWR4X10sIHBvc2l0aW9uLFxcbiAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBTaXplc1tfaWR4X11cXG4gICAgICAgICk7XFxuICAgICAgICBzaGFkb3dDb250cmlic1tfaWR4X10gPSBzaGFkb3dDb250cmliO1xcbiAgICB9fVxcbiAgICBmb3IoaW50IF9pZHhfID0gRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XyA8IERJUkVDVElPTkFMX0xJR0hUX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgc2hhZG93Q29udHJpYnNbX2lkeF9dID0gMS4wO1xcbiAgICB9fVxcbn1cXG4jZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZChQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxudm9pZCBjb21wdXRlU2hhZG93T2ZQb2ludExpZ2h0cyh2ZWMzIHBvc2l0aW9uLCBpbm91dCBmbG9hdCBzaGFkb3dDb250cmlic1tQT0lOVF9MSUdIVF9DT1VOVF0gKXtcXG4gICAgdmVjMyBsaWdodFBvc2l0aW9uO1xcbiAgICB2ZWMzIGRpcmVjdGlvbjtcXG4gICAgZm9yKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgbGlnaHRQb3NpdGlvbiA9IHBvaW50TGlnaHRQb3NpdGlvbltfaWR4X107XFxuICAgICAgICBkaXJlY3Rpb24gPSBwb3NpdGlvbiAtIGxpZ2h0UG9zaXRpb247XFxuICAgICAgICBzaGFkb3dDb250cmlic1tfaWR4X10gPSBjb21wdXRlU2hhZG93Q29udHJpYk9tbmkocG9pbnRMaWdodFNoYWRvd01hcHNbX2lkeF9dLCBkaXJlY3Rpb24sIHBvaW50TGlnaHRSYW5nZVtfaWR4X10pO1xcbiAgICB9fVxcbiAgICBmb3IoaW50IF9pZHhfID0gUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XyA8IFBPSU5UX0xJR0hUX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgc2hhZG93Q29udHJpYnNbX2lkeF9dID0gMS4wO1xcbiAgICB9fVxcbn1cXG4jZW5kaWZcXG4jZW5kaWZcXG5AZW5kXCI7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IGdsZW51bSBmcm9tICcuLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuaW1wb3J0IEZydXN0dW0gZnJvbSAnLi4vbWF0aC9GcnVzdHVtJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4uL21hdGgvTWF0cml4NCc7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi4vUmVuZGVyZXInO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcbmltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IFNwb3RMaWdodCBmcm9tICcuLi9saWdodC9TcG90JztcbmltcG9ydCBEaXJlY3Rpb25hbExpZ2h0IGZyb20gJy4uL2xpZ2h0L0RpcmVjdGlvbmFsJztcbmltcG9ydCBQb2ludExpZ2h0IGZyb20gJy4uL2xpZ2h0L1BvaW50JztcbmltcG9ydCBzaGFkZXJMaWJyYXJ5IGZyb20gJy4uL3NoYWRlci9saWJyYXJ5JztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuaW1wb3J0IFBlcnNwZWN0aXZlQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgT3J0aG9DYW1lcmEgZnJvbSAnLi4vY2FtZXJhL09ydGhvZ3JhcGhpYyc7XG5cbmltcG9ydCBQYXNzIGZyb20gJy4uL2NvbXBvc2l0b3IvUGFzcyc7XG5pbXBvcnQgVGV4dHVyZVBvb2wgZnJvbSAnLi4vY29tcG9zaXRvci9UZXh0dXJlUG9vbCc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG52YXIgdGFyZ2V0cyA9IFsncHgnLCAnbngnLCAncHknLCAnbnknLCAncHonLCAnbnonXTtcblxuaW1wb3J0IHNoYWRvd21hcEVzc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9zaGFkb3dtYXAuZ2xzbC5qcyc7XG5TaGFkZXJbJ2ltcG9ydCddKHNoYWRvd21hcEVzc2wpO1xuXG4vKipcbiAqIFBhc3MgcmVuZGVyaW5nIHNoYWRvdyBtYXAuXG4gKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucHJlUGFzcy5TaGFkb3dNYXBcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKiBAZXhhbXBsZVxuICogICAgIHZhciBzaGFkb3dNYXBQYXNzID0gbmV3IGNsYXkucHJlUGFzcy5TaGFkb3dNYXAoe1xuICogICAgICAgICBzb2Z0U2hhZG93OiBjbGF5LnByZVBhc3MuU2hhZG93TWFwLlZTTVxuICogICAgIH0pO1xuICogICAgIC4uLlxuICogICAgIGFuaW1hdGlvbi5vbignZnJhbWUnLCBmdW5jdGlvbiAoZnJhbWVUaW1lKSB7XG4gKiAgICAgICAgIHNoYWRvd01hcFBhc3MucmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcbiAqICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICogICAgIH0pO1xuICovXG52YXIgU2hhZG93TWFwUGFzcyA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LnByZVBhc3MuU2hhZG93TWFwIyAqLyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTb2Z0IHNoYWRvdyB0ZWNobmlxdWUuXG4gICAgICAgICAqIENhbiBiZSB7QGxpbmsgY2xheS5wcmVQYXNzLlNoYWRvd01hcC5QQ0Z9IG9yIHtAbGluayBjbGF5LnByZVBhc3MuU2hhZG93TWFwLlZTTX1cbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNvZnRTaGFkb3c6IFNoYWRvd01hcFBhc3MuUENGLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTb2Z0IHNoYWRvdyBibHVyIHNpemVcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNoYWRvd0JsdXI6IDEuMCxcblxuICAgICAgICBsaWdodEZydXN0dW1CaWFzOiAnYXV0bycsXG5cbiAgICAgICAga2VybmVsUENGOiBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgICAgIDEsIDAsXG4gICAgICAgICAgICAxLCAxLFxuICAgICAgICAgICAgLTEsIDEsXG4gICAgICAgICAgICAwLCAxLFxuICAgICAgICAgICAgLTEsIDAsXG4gICAgICAgICAgICAtMSwgLTEsXG4gICAgICAgICAgICAxLCAtMSxcbiAgICAgICAgICAgIDAsIC0xXG4gICAgICAgIF0pLFxuXG4gICAgICAgIHByZWNpc2lvbjogJ21lZGl1bXAnLFxuXG4gICAgICAgIF9sYXN0UmVuZGVyTm90Q2FzdFNoYWRvdzogZmFsc2UsXG5cbiAgICAgICAgX2ZyYW1lQnVmZmVyOiBuZXcgRnJhbWVCdWZmZXIoKSxcblxuICAgICAgICBfdGV4dHVyZXM6IHt9LFxuICAgICAgICBfc2hhZG93TWFwTnVtYmVyOiB7XG4gICAgICAgICAgICAnUE9JTlRfTElHSFQnOiAwLFxuICAgICAgICAgICAgJ0RJUkVDVElPTkFMX0xJR0hUJzogMCxcbiAgICAgICAgICAgICdTUE9UX0xJR0hUJzogMFxuICAgICAgICB9LFxuXG4gICAgICAgIF9kZXB0aE1hdGVyaWFsczoge30sXG4gICAgICAgIF9kaXN0YW5jZU1hdGVyaWFsczoge30sXG5cbiAgICAgICAgX29wYXF1ZUNhc3RlcnM6IFtdLFxuICAgICAgICBfcmVjZWl2ZXJzOiBbXSxcbiAgICAgICAgX2xpZ2h0c0Nhc3RTaGFkb3c6IFtdLFxuXG4gICAgICAgIF9saWdodENhbWVyYXM6IHt9LFxuICAgICAgICBfbGlnaHRNYXRlcmlhbHM6IHt9LFxuXG4gICAgICAgIF90ZXh0dXJlUG9vbDogbmV3IFRleHR1cmVQb29sKClcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIC8vIEdhdXNzaWFuIGZpbHRlciBwYXNzIGZvciBWU01cbiAgICB0aGlzLl9nYXVzc2lhblBhc3NIID0gbmV3IFBhc3Moe1xuICAgICAgICBmcmFnbWVudDogU2hhZGVyLnNvdXJjZSgnY2xheS5jb21wb3NpdG9yLmdhdXNzaWFuX2JsdXInKVxuICAgIH0pO1xuICAgIHRoaXMuX2dhdXNzaWFuUGFzc1YgPSBuZXcgUGFzcyh7XG4gICAgICAgIGZyYWdtZW50OiBTaGFkZXIuc291cmNlKCdjbGF5LmNvbXBvc2l0b3IuZ2F1c3NpYW5fYmx1cicpXG4gICAgfSk7XG4gICAgdGhpcy5fZ2F1c3NpYW5QYXNzSC5zZXRVbmlmb3JtKCdibHVyU2l6ZScsIHRoaXMuc2hhZG93Qmx1cik7XG4gICAgdGhpcy5fZ2F1c3NpYW5QYXNzSC5zZXRVbmlmb3JtKCdibHVyRGlyJywgMC4wKTtcbiAgICB0aGlzLl9nYXVzc2lhblBhc3NWLnNldFVuaWZvcm0oJ2JsdXJTaXplJywgdGhpcy5zaGFkb3dCbHVyKTtcbiAgICB0aGlzLl9nYXVzc2lhblBhc3NWLnNldFVuaWZvcm0oJ2JsdXJEaXInLCAxLjApO1xuXG4gICAgdGhpcy5fb3V0cHV0RGVwdGhQYXNzID0gbmV3IFBhc3Moe1xuICAgICAgICBmcmFnbWVudDogU2hhZGVyLnNvdXJjZSgnY2xheS5zbS5kZWJ1Z19kZXB0aCcpXG4gICAgfSk7XG59LCB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIHNjZW5lIHRvIHNoYWRvdyB0ZXh0dXJlc1xuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtICB7Y2xheS5TY2VuZX0gc2NlbmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5LkNhbWVyYX0gc2NlbmVDYW1lcmFcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbbm90VXBkYXRlU2NlbmU9ZmFsc2VdXG4gICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5TaGFkb3dNYXAucHJvdG90eXBlXG4gICAgICovXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHNjZW5lLCBzY2VuZUNhbWVyYSwgbm90VXBkYXRlU2NlbmUpIHtcbiAgICAgICAgaWYgKCFzY2VuZUNhbWVyYSkge1xuICAgICAgICAgICAgc2NlbmVDYW1lcmEgPSBzY2VuZS5nZXRNYWluQ2FtZXJhKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVyZW5kZXInLCB0aGlzLCByZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyU2hhZG93UGFzcyhyZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhLCBub3RVcGRhdGVTY2VuZSk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignYWZ0ZXJyZW5kZXInLCB0aGlzLCByZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVidWcgcmVuZGVyaW5nIG9mIHNoYWRvdyB0ZXh0dXJlc1xuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBzaXplXG4gICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5TaGFkb3dNYXAucHJvdG90eXBlXG4gICAgICovXG4gICAgcmVuZGVyRGVidWc6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2l6ZSkge1xuICAgICAgICByZW5kZXJlci5zYXZlQ2xlYXIoKTtcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gcmVuZGVyZXIudmlld3BvcnQ7XG4gICAgICAgIHZhciB4ID0gMCwgeSA9IDA7XG4gICAgICAgIHZhciB3aWR0aCA9IHNpemUgfHwgdmlld3BvcnQud2lkdGggLyA0O1xuICAgICAgICB2YXIgaGVpZ2h0ID0gd2lkdGg7XG4gICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXREZXB0aFBhc3MubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfVlNNJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXREZXB0aFBhc3MubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9WU00nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuX3RleHR1cmVzKSB7XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuX3RleHR1cmVzW25hbWVdO1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0Vmlld3BvcnQoeCwgeSwgd2lkdGggKiB0ZXh0dXJlLndpZHRoIC8gdGV4dHVyZS5oZWlnaHQsIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXREZXB0aFBhc3Muc2V0VW5pZm9ybSgnZGVwdGhNYXAnLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dERlcHRoUGFzcy5yZW5kZXIocmVuZGVyZXIpO1xuICAgICAgICAgICAgeCArPSB3aWR0aCAqIHRleHR1cmUud2lkdGggLyB0ZXh0dXJlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7XG4gICAgICAgIHJlbmRlcmVyLnJlc3RvcmVDbGVhcigpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlQ2FzdGVyQW5kUmVjZWl2ZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgbWVzaCkge1xuICAgICAgICBpZiAobWVzaC5jYXN0U2hhZG93KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGFxdWVDYXN0ZXJzLnB1c2gobWVzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc2gucmVjZWl2ZVNoYWRvdykge1xuICAgICAgICAgICAgdGhpcy5fcmVjZWl2ZXJzLnB1c2gobWVzaCk7XG4gICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldCgnc2hhZG93RW5hYmxlZCcsIDEpO1xuXG4gICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldCgncGNmS2VybmVsJywgdGhpcy5rZXJuZWxQQ0YpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXQoJ3NoYWRvd0VuYWJsZWQnLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVzaC5tYXRlcmlhbC5zaGFkZXIgJiYgbWVzaC5tYXRlcmlhbC51cGRhdGVTaGFkZXIpIHtcbiAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudXBkYXRlU2hhZGVyKHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb2Z0U2hhZG93ID09PSBTaGFkb3dNYXBQYXNzLlZTTSkge1xuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9WU00nKTtcbiAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BDRl9LRVJORUxfU0laRScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC51bmRlZmluZSgnZnJhZ21lbnQnLCAnVVNFX1ZTTScpO1xuICAgICAgICAgICAgdmFyIGtlcm5lbFBDRiA9IHRoaXMua2VybmVsUENGO1xuICAgICAgICAgICAgaWYgKGtlcm5lbFBDRiAmJiBrZXJuZWxQQ0YubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BDRl9LRVJORUxfU0laRScsIGtlcm5lbFBDRi5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BDRl9LRVJORUxfU0laRScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIF91cGRhdGU6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZS5vcGFxdWVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDYXN0ZXJBbmRSZWNlaXZlcihyZW5kZXJlciwgc2NlbmUub3BhcXVlTGlzdFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZS50cmFuc3BhcmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIFRPRE8gVHJhbnNwYXJlbnQgb2JqZWN0IHJlY2VpdmUgc2hhZG93IHdpbGwgYmUgdmVyeSBzbG93XG4gICAgICAgICAgICAvLyBpbiBzdGVhbHRoIGRlbW8sIHN0aWxsIG5vdCBmaW5kIHRoZSByZWFzb25cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNhc3RlckFuZFJlY2VpdmVyKHJlbmRlcmVyLCBzY2VuZS50cmFuc3BhcmVudExpc3RbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmUubGlnaHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbGlnaHQgPSBzY2VuZS5saWdodHNbaV07XG4gICAgICAgICAgICBpZiAobGlnaHQuY2FzdFNoYWRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0c0Nhc3RTaGFkb3cucHVzaChsaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3JlbmRlclNoYWRvd1Bhc3M6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhLCBub3RVcGRhdGVTY2VuZSkge1xuICAgICAgICAvLyByZXNldFxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuX3NoYWRvd01hcE51bWJlcikge1xuICAgICAgICAgICAgdGhpcy5fc2hhZG93TWFwTnVtYmVyW25hbWVdID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saWdodHNDYXN0U2hhZG93Lmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX29wYXF1ZUNhc3RlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXJzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIGlmICghbm90VXBkYXRlU2NlbmUpIHtcbiAgICAgICAgICAgIHNjZW5lLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2VuZUNhbWVyYSkge1xuICAgICAgICAgICAgc2NlbmVDYW1lcmEudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGUocmVuZGVyZXIsIHNjZW5lKTtcblxuICAgICAgICAvLyBOZWVkcyB0byB1cGRhdGUgdGhlIHJlY2VpdmVycyBhZ2FpbiBpZiBzaGFkb3dzIGNvbWUgZnJvbSAxIHRvIDAuXG4gICAgICAgIGlmICghdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdy5sZW5ndGggJiYgdGhpcy5fbGFzdFJlbmRlck5vdENhc3RTaGFkb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RSZW5kZXJOb3RDYXN0U2hhZG93ID0gdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdyA9PT0gMDtcblxuICAgICAgICBfZ2wuZW5hYmxlKF9nbC5ERVBUSF9URVNUKTtcbiAgICAgICAgX2dsLmRlcHRoTWFzayh0cnVlKTtcbiAgICAgICAgX2dsLmRpc2FibGUoX2dsLkJMRU5EKTtcblxuICAgICAgICAvLyBDbGVhciB3aXRoIGhpZ2gteiwgc28gdGhlIHBhcnQgbm90IHJlbmRlcmVkIHdpbGwgbm90IGJlZW4gc2hhZG93ZWRcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICAvLyBUT0RPIHJlc3RvcmVcbiAgICAgICAgX2dsLmNsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgICAvLyBTaGFkb3cgdW5pZm9ybXNcbiAgICAgICAgdmFyIHNwb3RMaWdodFNoYWRvd01hcHMgPSBbXTtcbiAgICAgICAgdmFyIHNwb3RMaWdodE1hdHJpY2VzID0gW107XG4gICAgICAgIHZhciBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcyA9IFtdO1xuICAgICAgICB2YXIgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzID0gW107XG4gICAgICAgIHZhciBzaGFkb3dDYXNjYWRlQ2xpcHMgPSBbXTtcbiAgICAgICAgdmFyIHBvaW50TGlnaHRTaGFkb3dNYXBzID0gW107XG5cbiAgICAgICAgdmFyIGRpckxpZ2h0SGFzQ2FzY2FkZTtcbiAgICAgICAgLy8gQ3JlYXRlIHRleHR1cmVzIGZvciBzaGFkb3cgbWFwXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGxpZ2h0ID0gdGhpcy5fbGlnaHRzQ2FzdFNoYWRvd1tpXTtcbiAgICAgICAgICAgIGlmIChsaWdodCBpbnN0YW5jZW9mIERpcmVjdGlvbmFsTGlnaHQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJMaWdodEhhc0Nhc2NhZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdPbmx5IG9uZSBkaXJlZWN0aW9uYWwgbGlnaHQgc3VwcG9ydGVkIHdpdGggc2hhZG93IGNhc2NhZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsaWdodC5zaGFkb3dDYXNjYWRlID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1N1cHBvcnQgYXQgbW9zdCA0IGNhc2NhZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsaWdodC5zaGFkb3dDYXNjYWRlID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJMaWdodEhhc0Nhc2NhZGUgPSBsaWdodC5zaGFkb3dDYXNjYWRlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRGlyZWN0aW9uYWxMaWdodFNoYWRvdyhcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLFxuICAgICAgICAgICAgICAgICAgICBzY2VuZUNhbWVyYSxcbiAgICAgICAgICAgICAgICAgICAgbGlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wYXF1ZUNhc3RlcnMsXG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd0Nhc2NhZGVDbGlwcyxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzLFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaWdodCBpbnN0YW5jZW9mIFNwb3RMaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyU3BvdExpZ2h0U2hhZG93KFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGFxdWVDYXN0ZXJzLFxuICAgICAgICAgICAgICAgICAgICBzcG90TGlnaHRNYXRyaWNlcyxcbiAgICAgICAgICAgICAgICAgICAgc3BvdExpZ2h0U2hhZG93TWFwc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaWdodCBpbnN0YW5jZW9mIFBvaW50TGlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclBvaW50TGlnaHRTaGFkb3coXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICAgICAgICAgICAgICBzY2VuZSxcbiAgICAgICAgICAgICAgICAgICAgbGlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wYXF1ZUNhc3RlcnMsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50TGlnaHRTaGFkb3dNYXBzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc2hhZG93TWFwTnVtYmVyW2xpZ2h0LnR5cGVdKys7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBsaWdodFR5cGUgaW4gdGhpcy5fc2hhZG93TWFwTnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgbnVtYmVyID0gdGhpcy5fc2hhZG93TWFwTnVtYmVyW2xpZ2h0VHlwZV07XG4gICAgICAgICAgICB2YXIga2V5ID0gbGlnaHRUeXBlICsgJ19TSEFET1dNQVBfQ09VTlQnO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9yZWNlaXZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMuX3JlY2VpdmVyc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSBtZXNoLm1hdGVyaWFsO1xuICAgICAgICAgICAgICAgIGlmIChtYXRlcmlhbC5mcmFnbWVudERlZmluZXNba2V5XSAhPT0gbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50Jywga2V5LCBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGVyaWFsLmlzRGVmaW5lZCgnZnJhZ21lbnQnLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC51bmRlZmluZSgnZnJhZ21lbnQnLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcmVjZWl2ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMuX3JlY2VpdmVyc1tpXTtcbiAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICAgICAgICBpZiAoZGlyTGlnaHRIYXNDYXNjYWRlKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdTSEFET1dfQ0FTQ0FERScsIGRpckxpZ2h0SGFzQ2FzY2FkZS5zaGFkb3dDYXNjYWRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnVuZGVmaW5lKCdmcmFnbWVudCcsICdTSEFET1dfQ0FTQ0FERScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNoYWRvd1VuaWZvcm1zID0gc2NlbmUuc2hhZG93VW5pZm9ybXM7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0U2l6ZSh0ZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dHVyZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXMgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcy5tYXAoZ2V0U2l6ZSk7XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcyA9IHsgdmFsdWU6IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzLCB0eXBlOiAndHYnIH07XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0TWF0cmljZXMgPSB7IHZhbHVlOiBkaXJlY3Rpb25hbExpZ2h0TWF0cmljZXMsIHR5cGU6ICdtNHYnIH07XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXMgPSB7IHZhbHVlOiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXMsIHR5cGU6ICcxZnYnIH07XG4gICAgICAgICAgICBpZiAoZGlyTGlnaHRIYXNDYXNjYWRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNoYWRvd0Nhc2NhZGVDbGlwc05lYXIgPSBzaGFkb3dDYXNjYWRlQ2xpcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgc2hhZG93Q2FzY2FkZUNsaXBzRmFyID0gc2hhZG93Q2FzY2FkZUNsaXBzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgc2hhZG93Q2FzY2FkZUNsaXBzTmVhci5wb3AoKTtcbiAgICAgICAgICAgICAgICBzaGFkb3dDYXNjYWRlQ2xpcHNGYXIuc2hpZnQoKTtcblxuICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgZnJvbSBmYXIgdG8gbmVhclxuICAgICAgICAgICAgICAgIHNoYWRvd0Nhc2NhZGVDbGlwc05lYXIucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIHNoYWRvd0Nhc2NhZGVDbGlwc0Zhci5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgLy8gZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcHMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHRNYXRyaWNlcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93Q2FzY2FkZUNsaXBzTmVhciA9IHsgdmFsdWU6IHNoYWRvd0Nhc2NhZGVDbGlwc05lYXIsIHR5cGU6ICcxZnYnIH07XG4gICAgICAgICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93Q2FzY2FkZUNsaXBzRmFyID0geyB2YWx1ZTogc2hhZG93Q2FzY2FkZUNsaXBzRmFyLCB0eXBlOiAnMWZ2JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwb3RMaWdodFNoYWRvd01hcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHNwb3RMaWdodFNoYWRvd01hcFNpemVzID0gc3BvdExpZ2h0U2hhZG93TWFwcy5tYXAoZ2V0U2l6ZSk7XG4gICAgICAgICAgICB2YXIgc2hhZG93VW5pZm9ybXMgPSBzY2VuZS5zaGFkb3dVbmlmb3JtcztcbiAgICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNwb3RMaWdodFNoYWRvd01hcHMgPSB7IHZhbHVlOiBzcG90TGlnaHRTaGFkb3dNYXBzLCB0eXBlOiAndHYnIH07XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zcG90TGlnaHRNYXRyaWNlcyA9IHsgdmFsdWU6IHNwb3RMaWdodE1hdHJpY2VzLCB0eXBlOiAnbTR2JyB9O1xuICAgICAgICAgICAgc2hhZG93VW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93TWFwU2l6ZXMgPSB7IHZhbHVlOiBzcG90TGlnaHRTaGFkb3dNYXBTaXplcywgdHlwZTogJzFmdicgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludExpZ2h0U2hhZG93TWFwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5wb2ludExpZ2h0U2hhZG93TWFwcyA9IHsgdmFsdWU6IHBvaW50TGlnaHRTaGFkb3dNYXBzLCB0eXBlOiAndHYnIH07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyRGlyZWN0aW9uYWxMaWdodFNoYWRvdzogKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgc3BsaXRGcnVzdHVtID0gbmV3IEZydXN0dW0oKTtcbiAgICAgICAgdmFyIHNwbGl0UHJvak1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBjcm9wQkJveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB2YXIgY3JvcE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBsaWdodFZpZXdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICB2YXIgbGlnaHRWaWV3UHJvak1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBsaWdodFByb2pNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVuZGVyZXIsIHNjZW5lLCBzY2VuZUNhbWVyYSwgbGlnaHQsIGNhc3RlcnMsIHNoYWRvd0Nhc2NhZGVDbGlwcywgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcykge1xuXG4gICAgICAgICAgICB2YXIgZGVmYXVsdFNoYWRvd01hdGVyaWFsID0gdGhpcy5fZ2V0RGVwdGhNYXRlcmlhbChsaWdodCk7XG4gICAgICAgICAgICB2YXIgcGFzc0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBnZXRNYXRlcmlhbDogZnVuY3Rpb24gKHJlbmRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmFibGUuc2hhZG93RGVwdGhNYXRlcmlhbCB8fCBkZWZhdWx0U2hhZG93TWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzb3J0Q29tcGFyZTogUmVuZGVyZXIub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IGZyYW1lXG4gICAgICAgICAgICBpZiAoIXNjZW5lLnZpZXdCb3VuZGluZ0JveExhc3RGcmFtZS5pc0Zpbml0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gc2NlbmUuZ2V0Qm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBzY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWVcbiAgICAgICAgICAgICAgICAgICAgLmNvcHkoYm91bmRpbmdCb3gpLmFwcGx5VHJhbnNmb3JtKHNjZW5lQ2FtZXJhLnZpZXdNYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgbW92aW5nIHNwZWVkIHNpbmNlIHRoZSBib3VuZGluZyBib3ggaXMgZnJvbSBsYXN0IGZyYW1lXG4gICAgICAgICAgICAvLyBUT0RPOiBhZGQgYSBiaWFzXG4gICAgICAgICAgICB2YXIgY2xpcHBlZEZhciA9IE1hdGgubWluKC1zY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWUubWluLnosIHNjZW5lQ2FtZXJhLmZhcik7XG4gICAgICAgICAgICB2YXIgY2xpcHBlZE5lYXIgPSBNYXRoLm1heCgtc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLm1heC56LCBzY2VuZUNhbWVyYS5uZWFyKTtcblxuICAgICAgICAgICAgdmFyIGxpZ2h0Q2FtZXJhID0gdGhpcy5fZ2V0RGlyZWN0aW9uYWxMaWdodENhbWVyYShsaWdodCwgc2NlbmUsIHNjZW5lQ2FtZXJhKTtcblxuICAgICAgICAgICAgdmFyIGx2cE1hdDRBcnIgPSBsaWdodFZpZXdQcm9qTWF0cml4LmFycmF5O1xuICAgICAgICAgICAgbGlnaHRQcm9qTWF0cml4LmNvcHkobGlnaHRDYW1lcmEucHJvamVjdGlvbk1hdHJpeCk7XG4gICAgICAgICAgICBtYXQ0LmludmVydChsaWdodFZpZXdNYXRyaXguYXJyYXksIGxpZ2h0Q2FtZXJhLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobGlnaHRWaWV3TWF0cml4LmFycmF5LCBsaWdodFZpZXdNYXRyaXguYXJyYXksIHNjZW5lQ2FtZXJhLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobHZwTWF0NEFyciwgbGlnaHRQcm9qTWF0cml4LmFycmF5LCBsaWdodFZpZXdNYXRyaXguYXJyYXkpO1xuXG4gICAgICAgICAgICB2YXIgY2xpcFBsYW5lcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGlzUGVyc3BlY3RpdmUgPSBzY2VuZUNhbWVyYSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhO1xuXG4gICAgICAgICAgICB2YXIgc2NhbGVaID0gKHNjZW5lQ2FtZXJhLm5lYXIgKyBzY2VuZUNhbWVyYS5mYXIpIC8gKHNjZW5lQ2FtZXJhLm5lYXIgLSBzY2VuZUNhbWVyYS5mYXIpO1xuICAgICAgICAgICAgdmFyIG9mZnNldFogPSAyICogc2NlbmVDYW1lcmEubmVhciAqIHNjZW5lQ2FtZXJhLmZhciAvIChzY2VuZUNhbWVyYS5uZWFyIC0gc2NlbmVDYW1lcmEuZmFyKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxpZ2h0LnNoYWRvd0Nhc2NhZGU7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjbG9nID0gY2xpcHBlZE5lYXIgKiBNYXRoLnBvdyhjbGlwcGVkRmFyIC8gY2xpcHBlZE5lYXIsIGkgLyBsaWdodC5zaGFkb3dDYXNjYWRlKTtcbiAgICAgICAgICAgICAgICB2YXIgY3VuaSA9IGNsaXBwZWROZWFyICsgKGNsaXBwZWRGYXIgLSBjbGlwcGVkTmVhcikgKiBpIC8gbGlnaHQuc2hhZG93Q2FzY2FkZTtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGNsb2cgKiBsaWdodC5jYXNjYWRlU3BsaXRMb2dGYWN0b3IgKyBjdW5pICogKDEgLSBsaWdodC5jYXNjYWRlU3BsaXRMb2dGYWN0b3IpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGFuZXMucHVzaChjKTtcbiAgICAgICAgICAgICAgICBzaGFkb3dDYXNjYWRlQ2xpcHMucHVzaCgtKC1jICogc2NhbGVaICsgb2Zmc2V0WikgLyAtYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuX2dldFRleHR1cmUobGlnaHQsIGxpZ2h0LnNoYWRvd0Nhc2NhZGUpO1xuICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcHMucHVzaCh0ZXh0dXJlKTtcblxuICAgICAgICAgICAgdmFyIHZpZXdwb3J0ID0gcmVuZGVyZXIudmlld3BvcnQ7XG5cbiAgICAgICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAgICAgX2dsLmNsZWFyKF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpZ2h0LnNoYWRvd0Nhc2NhZGU7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3BsaXR0ZWQgZnJ1c3R1bVxuICAgICAgICAgICAgICAgIHZhciBuZWFyUGxhbmUgPSBjbGlwUGxhbmVzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBmYXJQbGFuZSA9IGNsaXBQbGFuZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpc1BlcnNwZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdDQucGVyc3BlY3RpdmUoc3BsaXRQcm9qTWF0cml4LmFycmF5LCBzY2VuZUNhbWVyYS5mb3YgLyAxODAgKiBNYXRoLlBJLCBzY2VuZUNhbWVyYS5hc3BlY3QsIG5lYXJQbGFuZSwgZmFyUGxhbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0NC5vcnRobyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0UHJvak1hdHJpeC5hcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5lQ2FtZXJhLmxlZnQsIHNjZW5lQ2FtZXJhLnJpZ2h0LCBzY2VuZUNhbWVyYS5ib3R0b20sIHNjZW5lQ2FtZXJhLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lYXJQbGFuZSwgZmFyUGxhbmVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BsaXRGcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uKHNwbGl0UHJvak1hdHJpeCk7XG4gICAgICAgICAgICAgICAgc3BsaXRGcnVzdHVtLmdldFRyYW5zZm9ybWVkQm91bmRpbmdCb3goY3JvcEJCb3gsIGxpZ2h0Vmlld01hdHJpeCk7XG4gICAgICAgICAgICAgICAgY3JvcEJCb3guYXBwbHlQcm9qZWN0aW9uKGxpZ2h0UHJvak1hdHJpeCk7XG4gICAgICAgICAgICAgICAgdmFyIF9taW4gPSBjcm9wQkJveC5taW4uYXJyYXk7XG4gICAgICAgICAgICAgICAgdmFyIF9tYXggPSBjcm9wQkJveC5tYXguYXJyYXk7XG4gICAgICAgICAgICAgICAgX21pblswXSA9IE1hdGgubWF4KF9taW5bMF0sIC0xKTtcbiAgICAgICAgICAgICAgICBfbWluWzFdID0gTWF0aC5tYXgoX21pblsxXSwgLTEpO1xuICAgICAgICAgICAgICAgIF9tYXhbMF0gPSBNYXRoLm1pbihfbWF4WzBdLCAxKTtcbiAgICAgICAgICAgICAgICBfbWF4WzFdID0gTWF0aC5taW4oX21heFsxXSwgMSk7XG4gICAgICAgICAgICAgICAgY3JvcE1hdHJpeC5vcnRobyhfbWluWzBdLCBfbWF4WzBdLCBfbWluWzFdLCBfbWF4WzFdLCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgbGlnaHRDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5tdWx0aXBseUxlZnQoY3JvcE1hdHJpeCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2hhZG93U2l6ZSA9IGxpZ2h0LnNoYWRvd1Jlc29sdXRpb24gfHwgNTEyO1xuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJzZWQsIGxlZnQgdG8gcmlnaHQgPT4gZmFyIHRvIG5lYXJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCgobGlnaHQuc2hhZG93Q2FzY2FkZSAtIGkgLSAxKSAqIHNoYWRvd1NpemUsIDAsIHNoYWRvd1NpemUsIHNoYWRvd1NpemUsIDEpO1xuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyUGFzcyhjYXN0ZXJzLCBsaWdodENhbWVyYSwgcGFzc0NvbmZpZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgZm9yIFZTTVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dhdXNzaWFuRmlsdGVyKHJlbmRlcmVyLCB0ZXh0dXJlLCB0ZXh0dXJlLndpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgICAgICAgICBtYXRyaXguY29weShsaWdodENhbWVyYS52aWV3TWF0cml4KVxuICAgICAgICAgICAgICAgICAgICAubXVsdGlwbHlMZWZ0KGxpZ2h0Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzLnB1c2gobWF0cml4LmFycmF5KTtcblxuICAgICAgICAgICAgICAgIGxpZ2h0Q2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weShsaWdodFByb2pNYXRyaXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIHJlbmRlclNwb3RMaWdodFNoYWRvdzogZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgbGlnaHQsIGNhc3RlcnMsIHNwb3RMaWdodE1hdHJpY2VzLCBzcG90TGlnaHRTaGFkb3dNYXBzKSB7XG5cbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLl9nZXRUZXh0dXJlKGxpZ2h0KTtcbiAgICAgICAgdmFyIGxpZ2h0Q2FtZXJhID0gdGhpcy5fZ2V0U3BvdExpZ2h0Q2FtZXJhKGxpZ2h0KTtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0ZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgX2dsLmNsZWFyKF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgIHZhciBkZWZhdWx0U2hhZG93TWF0ZXJpYWwgPSB0aGlzLl9nZXREZXB0aE1hdGVyaWFsKGxpZ2h0KTtcbiAgICAgICAgdmFyIHBhc3NDb25maWcgPSB7XG4gICAgICAgICAgICBnZXRNYXRlcmlhbDogZnVuY3Rpb24gKHJlbmRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyYWJsZS5zaGFkb3dEZXB0aE1hdGVyaWFsIHx8IGRlZmF1bHRTaGFkb3dNYXRlcmlhbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3J0Q29tcGFyZTogUmVuZGVyZXIub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgfTtcblxuICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKHJlbmRlcmVyLmN1bGxSZW5kZXJMaXN0KGNhc3RlcnMsIG51bGwsIGxpZ2h0Q2FtZXJhKSwgbGlnaHRDYW1lcmEsIHBhc3NDb25maWcpO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgLy8gRmlsdGVyIGZvciBWU01cbiAgICAgICAgaWYgKHRoaXMuc29mdFNoYWRvdyA9PT0gU2hhZG93TWFwUGFzcy5WU00pIHtcbiAgICAgICAgICAgIHRoaXMuX2dhdXNzaWFuRmlsdGVyKHJlbmRlcmVyLCB0ZXh0dXJlLCB0ZXh0dXJlLndpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICBtYXRyaXguY29weShsaWdodENhbWVyYS53b3JsZFRyYW5zZm9ybSlcbiAgICAgICAgICAgIC5pbnZlcnQoKVxuICAgICAgICAgICAgLm11bHRpcGx5TGVmdChsaWdodENhbWVyYS5wcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgICBzcG90TGlnaHRTaGFkb3dNYXBzLnB1c2godGV4dHVyZSk7XG4gICAgICAgIHNwb3RMaWdodE1hdHJpY2VzLnB1c2gobWF0cml4LmFycmF5KTtcbiAgICB9LFxuXG4gICAgcmVuZGVyUG9pbnRMaWdodFNoYWRvdzogZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgbGlnaHQsIGNhc3RlcnMsIHBvaW50TGlnaHRTaGFkb3dNYXBzKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fZ2V0VGV4dHVyZShsaWdodCk7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgcG9pbnRMaWdodFNoYWRvd01hcHMucHVzaCh0ZXh0dXJlKTtcblxuICAgICAgICB2YXIgZGVmYXVsdFNoYWRvd01hdGVyaWFsID0gdGhpcy5fZ2V0RGVwdGhNYXRlcmlhbChsaWdodCk7XG4gICAgICAgIHZhciBwYXNzQ29uZmlnID0ge1xuICAgICAgICAgICAgZ2V0TWF0ZXJpYWw6IGZ1bmN0aW9uIChyZW5kZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmFibGUuc2hhZG93RGVwdGhNYXRlcmlhbCB8fCBkZWZhdWx0U2hhZG93TWF0ZXJpYWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydENvbXBhcmU6IFJlbmRlcmVyLm9wYXF1ZVNvcnRDb21wYXJlXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzW2ldO1xuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2dldFBvaW50TGlnaHRDYW1lcmEobGlnaHQsIHRhcmdldCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0ZXh0dXJlLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAgICAgX2dsLmNsZWFyKF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKHJlbmRlcmVyLmN1bGxSZW5kZXJMaXN0KGNhc3RlcnMsIG51bGwsIGNhbWVyYSksIGNhbWVyYSwgcGFzc0NvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICBfZ2V0RGVwdGhNYXRlcmlhbDogZnVuY3Rpb24gKGxpZ2h0KSB7XG4gICAgICAgIHZhciBzaGFkb3dNYXRlcmlhbCA9IHRoaXMuX2xpZ2h0TWF0ZXJpYWxzW2xpZ2h0Ll9fdWlkX19dO1xuICAgICAgICB2YXIgaXNQb2ludExpZ2h0ID0gbGlnaHQgaW5zdGFuY2VvZiBQb2ludExpZ2h0O1xuICAgICAgICBpZiAoIXNoYWRvd01hdGVyaWFsKSB7XG4gICAgICAgICAgICB2YXIgc2hhZGVyUHJlZml4ID0gaXNQb2ludExpZ2h0ID8gJ2NsYXkuc20uZGlzdGFuY2UuJyA6ICdjbGF5LnNtLmRlcHRoLic7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiB0aGlzLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZShzaGFkZXJQcmVmaXggKyAndmVydGV4JyksIFNoYWRlci5zb3VyY2Uoc2hhZGVyUHJlZml4ICsgJ2ZyYWdtZW50JykpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5fbGlnaHRNYXRlcmlhbHNbbGlnaHQuX191aWRfX10gPSBzaGFkb3dNYXRlcmlhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlnaHQuc2hhZG93U2xvcGVTY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbC5zZXRVbmlmb3JtKCdzbG9wZVNjYWxlJywgbGlnaHQuc2hhZG93U2xvcGVTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpZ2h0LnNoYWRvd0JpYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2hhZG93TWF0ZXJpYWwuc2V0VW5pZm9ybSgnc2hhZG93QmlhcycsIGxpZ2h0LnNoYWRvd0JpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9WU00nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNoYWRvd01hdGVyaWFsLnVuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfVlNNJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNQb2ludExpZ2h0KSB7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbC5zZXQoJ2xpZ2h0UG9zaXRpb24nLCBsaWdodC5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXkpO1xuICAgICAgICAgICAgc2hhZG93TWF0ZXJpYWwuc2V0KCdyYW5nZScsIGxpZ2h0LnJhbmdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dNYXRlcmlhbDtcbiAgICB9LFxuXG4gICAgX2dhdXNzaWFuRmlsdGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHRleHR1cmUsIHNpemUpIHtcbiAgICAgICAgdmFyIHBhcmFtZXRlciA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICAgICAgdHlwZTogVGV4dHVyZS5GTE9BVFxuICAgICAgICB9O1xuICAgICAgICB2YXIgdG1wVGV4dHVyZSA9IHRoaXMuX3RleHR1cmVQb29sLmdldChwYXJhbWV0ZXIpO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0bXBUZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIHRoaXMuX2dhdXNzaWFuUGFzc0guc2V0VW5pZm9ybSgndGV4dHVyZScsIHRleHR1cmUpO1xuICAgICAgICB0aGlzLl9nYXVzc2lhblBhc3NILnNldFVuaWZvcm0oJ3RleHR1cmVXaWR0aCcsIHNpemUpO1xuICAgICAgICB0aGlzLl9nYXVzc2lhblBhc3NILnJlbmRlcihyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYXR0YWNoKHRleHR1cmUpO1xuICAgICAgICB0aGlzLl9nYXVzc2lhblBhc3NWLnNldFVuaWZvcm0oJ3RleHR1cmUnLCB0bXBUZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fZ2F1c3NpYW5QYXNzVi5zZXRVbmlmb3JtKCd0ZXh0dXJlSGVpZ2h0Jywgc2l6ZSk7XG4gICAgICAgIHRoaXMuX2dhdXNzaWFuUGFzc1YucmVuZGVyKHJlbmRlcmVyKTtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLl90ZXh0dXJlUG9vbC5wdXQodG1wVGV4dHVyZSk7XG4gICAgfSxcblxuICAgIF9nZXRUZXh0dXJlOiBmdW5jdGlvbiAobGlnaHQsIGNhc2NhZGUpIHtcbiAgICAgICAgdmFyIGtleSA9IGxpZ2h0Ll9fdWlkX187XG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fdGV4dHVyZXNba2V5XTtcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSBsaWdodC5zaGFkb3dSZXNvbHV0aW9uIHx8IDUxMjtcbiAgICAgICAgY2FzY2FkZSA9IGNhc2NhZGUgfHwgMTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlKSB7XG4gICAgICAgICAgICBpZiAobGlnaHQgaW5zdGFuY2VvZiBQb2ludExpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlQ3ViZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0IG1vc3QgNCBjYXNjYWRlXG4gICAgICAgICAgICAvLyBUT0RPIHNoYXJlIHdpdGggaGVpZ2h0ID9cbiAgICAgICAgICAgIHRleHR1cmUud2lkdGggPSByZXNvbHV0aW9uICogY2FzY2FkZTtcbiAgICAgICAgICAgIHRleHR1cmUuaGVpZ2h0ID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS50eXBlID0gVGV4dHVyZS5GTE9BVDtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcGljID0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gZ2xlbnVtLk5FQVJFU1Q7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5tYWdGaWx0ZXIgPSBnbGVudW0uTkVBUkVTVDtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLnVzZU1pcG1hcCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZXNba2V5XSA9IHRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9LFxuXG4gICAgX2dldFBvaW50TGlnaHRDYW1lcmE6IGZ1bmN0aW9uIChsaWdodCwgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5fbGlnaHRDYW1lcmFzLnBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLl9saWdodENhbWVyYXMucG9pbnQgPSB7XG4gICAgICAgICAgICAgICAgcHg6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpLFxuICAgICAgICAgICAgICAgIG54OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSxcbiAgICAgICAgICAgICAgICBweTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCksXG4gICAgICAgICAgICAgICAgbnk6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpLFxuICAgICAgICAgICAgICAgIHB6OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSxcbiAgICAgICAgICAgICAgICBuejogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2xpZ2h0Q2FtZXJhcy5wb2ludFt0YXJnZXRdO1xuXG4gICAgICAgIGNhbWVyYS5mYXIgPSBsaWdodC5yYW5nZTtcbiAgICAgICAgY2FtZXJhLmZvdiA9IDkwO1xuICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KDAsIDAsIDApO1xuICAgICAgICBzd2l0Y2ggKHRhcmdldCkge1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9YLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbngnOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9YLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHknOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9ZLCBWZWN0b3IzLlBPU0lUSVZFX1opO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnknOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9ZLCBWZWN0b3IzLk5FR0FUSVZFX1opO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHonOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9aLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnonOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9aLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxpZ2h0LmdldFdvcmxkUG9zaXRpb24oY2FtZXJhLnBvc2l0aW9uKTtcbiAgICAgICAgY2FtZXJhLnVwZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBjYW1lcmE7XG4gICAgfSxcblxuICAgIF9nZXREaXJlY3Rpb25hbExpZ2h0Q2FtZXJhOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlnaHRWaWV3TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgdmFyIHNjZW5lVmlld0JvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIHZhciBsaWdodFZpZXdCQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIC8vIENhbWVyYSBvZiBkaXJlY3Rpb25hbCBsaWdodCB3aWxsIGJlIGFkanVzdGVkXG4gICAgICAgIC8vIHRvIGNvbnRhaW4gdGhlIHZpZXcgZnJ1c3R1bSBhbmQgc2NlbmUgYm91bmRpbmcgYm94IGFzIHRpZ2h0bHkgYXMgcG9zc2libGVcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChsaWdodCwgc2NlbmUsIHNjZW5lQ2FtZXJhKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2xpZ2h0Q2FtZXJhcy5kaXJlY3Rpb25hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0Q2FtZXJhcy5kaXJlY3Rpb25hbCA9IG5ldyBPcnRob0NhbWVyYSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2xpZ2h0Q2FtZXJhcy5kaXJlY3Rpb25hbDtcblxuICAgICAgICAgICAgc2NlbmVWaWV3Qm91bmRpbmdCb3guY29weShzY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWUpO1xuICAgICAgICAgICAgc2NlbmVWaWV3Qm91bmRpbmdCb3guaW50ZXJzZWN0aW9uKHNjZW5lQ2FtZXJhLmZydXN0dW0uYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgY2VudGVyIG9mIGZydXN0dW0oaW4gd29ybGQgc3BhY2UpXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb25cbiAgICAgICAgICAgICAgICAuY29weShzY2VuZVZpZXdCb3VuZGluZ0JveC5taW4pXG4gICAgICAgICAgICAgICAgLmFkZChzY2VuZVZpZXdCb3VuZGluZ0JveC5tYXgpXG4gICAgICAgICAgICAgICAgLnNjYWxlKDAuNSlcbiAgICAgICAgICAgICAgICAudHJhbnNmb3JtTWF0NChzY2VuZUNhbWVyYS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICBjYW1lcmEucm90YXRpb24uY29weShsaWdodC5yb3RhdGlvbik7XG4gICAgICAgICAgICBjYW1lcmEuc2NhbGUuY29weShsaWdodC5zY2FsZSk7XG4gICAgICAgICAgICBjYW1lcmEudXBkYXRlV29ybGRUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHRvIGxpZ2h0IHZpZXcgc3BhY2VcbiAgICAgICAgICAgIE1hdHJpeDQuaW52ZXJ0KGxpZ2h0Vmlld01hdHJpeCwgY2FtZXJhLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIE1hdHJpeDQubXVsdGlwbHkobGlnaHRWaWV3TWF0cml4LCBsaWdodFZpZXdNYXRyaXgsIHNjZW5lQ2FtZXJhLndvcmxkVHJhbnNmb3JtKTtcblxuICAgICAgICAgICAgbGlnaHRWaWV3QkJveC5jb3B5KHNjZW5lVmlld0JvdW5kaW5nQm94KS5hcHBseVRyYW5zZm9ybShsaWdodFZpZXdNYXRyaXgpO1xuXG4gICAgICAgICAgICB2YXIgbWluID0gbGlnaHRWaWV3QkJveC5taW4uYXJyYXk7XG4gICAgICAgICAgICB2YXIgbWF4ID0gbGlnaHRWaWV3QkJveC5tYXguYXJyYXk7XG5cbiAgICAgICAgICAgIC8vIE1vdmUgY2FtZXJhIHRvIGFkanVzdCB0aGUgbmVhciB0byAwXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KChtaW5bMF0gKyBtYXhbMF0pIC8gMiwgKG1pblsxXSArIG1heFsxXSkgLyAyLCBtYXhbMl0pXG4gICAgICAgICAgICAgICAgLnRyYW5zZm9ybU1hdDQoY2FtZXJhLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIGNhbWVyYS5uZWFyID0gMDtcbiAgICAgICAgICAgIGNhbWVyYS5mYXIgPSAtbWluWzJdICsgbWF4WzJdO1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJlY2VpdmVycyBub3QgaW4gdGhlIGZydXN0dW0gd2lsbCBzdGlsIHJlY2VpdmUgdGhlIHNoYWRvdy5cbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLmxpZ2h0RnJ1c3R1bUJpYXMpKSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLmZhciAqPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLmZhciArPSB0aGlzLmxpZ2h0RnJ1c3R1bUJpYXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYW1lcmEubGVmdCA9IG1pblswXTtcbiAgICAgICAgICAgIGNhbWVyYS5yaWdodCA9IG1heFswXTtcbiAgICAgICAgICAgIGNhbWVyYS50b3AgPSBtYXhbMV07XG4gICAgICAgICAgICBjYW1lcmEuYm90dG9tID0gbWluWzFdO1xuICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZSh0cnVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTtcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgX2dldFNwb3RMaWdodENhbWVyYTogZnVuY3Rpb24gKGxpZ2h0KSB7XG4gICAgICAgIGlmICghdGhpcy5fbGlnaHRDYW1lcmFzLnNwb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpZ2h0Q2FtZXJhcy5zcG90ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2xpZ2h0Q2FtZXJhcy5zcG90O1xuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgICBjYW1lcmEuZm92ID0gbGlnaHQucGVudW1icmFBbmdsZSAqIDI7XG4gICAgICAgIGNhbWVyYS5mYXIgPSBsaWdodC5yYW5nZTtcbiAgICAgICAgY2FtZXJhLndvcmxkVHJhbnNmb3JtLmNvcHkobGlnaHQud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICBtYXQ0LmludmVydChjYW1lcmEudmlld01hdHJpeC5hcnJheSwgY2FtZXJhLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcblxuICAgICAgICByZXR1cm4gY2FtZXJhO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfFdlYkdMUmVuZGVyaW5nQ29udGV4dH0gW3JlbmRlcmVyXVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnByZVBhc3MuU2hhZG93TWFwLnByb3RvdHlwZVxuICAgICAqL1xuICAgIC8vIFBFTkRJTkcgUmVuZGVyZXIgb3IgV2ViR0xSZW5kZXJpbmdDb250ZXh0XG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbCB8fCByZW5kZXJlcjtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmRpc3Bvc2UoX2dsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5fdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHR1cmVzW25hbWVdLmRpc3Bvc2UoX2dsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RleHR1cmVQb29sLmNsZWFyKHJlbmRlcmVyLmdsKTtcblxuICAgICAgICB0aGlzLl9kZXB0aE1hdGVyaWFscyA9IHt9O1xuICAgICAgICB0aGlzLl9kaXN0YW5jZU1hdGVyaWFscyA9IHt9O1xuICAgICAgICB0aGlzLl90ZXh0dXJlcyA9IHt9O1xuICAgICAgICB0aGlzLl9saWdodENhbWVyYXMgPSB7fTtcbiAgICAgICAgdGhpcy5fc2hhZG93TWFwTnVtYmVyID0ge1xuICAgICAgICAgICAgJ1BPSU5UX0xJR0hUJzogMCxcbiAgICAgICAgICAgICdESVJFQ1RJT05BTF9MSUdIVCc6IDAsXG4gICAgICAgICAgICAnU1BPVF9MSUdIVCc6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fbWVzaE1hdGVyaWFscyA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcmVjZWl2ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMuX3JlY2VpdmVyc1tpXTtcbiAgICAgICAgICAgIC8vIE1lc2ggbWF5IGJlIGRpc3Bvc2VkXG4gICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCAmJiBtZXNoLm1hdGVyaWFsLnNoYWRlcikge1xuICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgdmFyIHNoYWRlciA9IG1hdGVyaWFsLnNoYWRlcjtcbiAgICAgICAgICAgICAgICBzaGFkZXIudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BPSU5UX0xJR0hUX1NIQURPV19DT1VOVCcpO1xuICAgICAgICAgICAgICAgIHNoYWRlci51bmRlZmluZSgnZnJhZ21lbnQnLCAnRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XX0NPVU5UJyk7XG4gICAgICAgICAgICAgICAgc2hhZGVyLnVuZGVmaW5lKCdmcmFnbWVudCcsICdBTUJJRU5UX0xJR0hUX1NIQURPV19DT1VOVCcpO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnc2hhZG93RW5hYmxlZCcsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb3BhcXVlQ2FzdGVycyA9IFtdO1xuICAgICAgICB0aGlzLl9yZWNlaXZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdyA9IFtdO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEBuYW1lIGNsYXkucHJlUGFzcy5TaGFkb3dNYXAuVlNNXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5TaGFkb3dNYXBQYXNzLlZTTSA9IDE7XG5cbi8qKlxuICogQG5hbWUgY2xheS5wcmVQYXNzLlNoYWRvd01hcC5QQ0ZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblNoYWRvd01hcFBhc3MuUENGID0gMjtcblxuZXhwb3J0IGRlZmF1bHQgU2hhZG93TWFwUGFzcztcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgUmF5IGZyb20gJy4uL21hdGgvUmF5JztcbmltcG9ydCBWZWN0b3IyIGZyb20gJy4uL21hdGgvVmVjdG9yMic7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IE1hdHJpeDQgZnJvbSAnLi4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBSZW5kZXJhYmxlIGZyb20gJy4uL1JlbmRlcmFibGUnO1xuaW1wb3J0IGdsZW51bSBmcm9tICcuLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgZ2xtYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcblxudmFyIHZlYzMgPSBnbG1hdHJpeC52ZWMzO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LnBpY2tpbmcuUmF5UGlja2luZ1xuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIFJheVBpY2tpbmcgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5waWNraW5nLlJheVBpY2tpbmcjICovXG57XG4gICAgLyoqXG4gICAgICogVGFyZ2V0IHNjZW5lXG4gICAgICogQHR5cGUge2NsYXkuU2NlbmV9XG4gICAgICovXG4gICAgc2NlbmU6IG51bGwsXG4gICAgLyoqXG4gICAgICogVGFyZ2V0IGNhbWVyYVxuICAgICAqIEB0eXBlIHtjbGF5LkNhbWVyYX1cbiAgICAgKi9cbiAgICBjYW1lcmE6IG51bGwsXG4gICAgLyoqXG4gICAgICogVGFyZ2V0IHJlbmRlcmVyXG4gICAgICogQHR5cGUge2NsYXkuUmVuZGVyZXJ9XG4gICAgICovXG4gICAgcmVuZGVyZXI6IG51bGxcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9yYXkgPSBuZXcgUmF5KCk7XG4gICAgdGhpcy5fbmRjID0gbmV3IFZlY3RvcjIoKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkucGlja2luZy5SYXlQaWNraW5nLnByb3RvdHlwZSAqL1xue1xuXG4gICAgLyoqXG4gICAgICogUGljayB0aGUgbmVhcmVzdCBpbnRlcnNlY3Rpb24gb2JqZWN0IGluIHRoZSBzY2VuZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCBNb3VzZSBwb3NpdGlvbiB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB5IE1vdXNlIHBvc2l0aW9uIHlcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbZm9yY2VQaWNrQWxsPWZhbHNlXSBpZ25vcmUgaWdub3JlUGlja2luZ1xuICAgICAqIEByZXR1cm4ge2NsYXkucGlja2luZy5SYXlQaWNraW5nfkludGVyc2VjdGlvbn1cbiAgICAgKi9cbiAgICBwaWNrOiBmdW5jdGlvbiAoeCwgeSwgZm9yY2VQaWNrQWxsKSB7XG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnBpY2tBbGwoeCwgeSwgW10sIGZvcmNlUGlja0FsbCk7XG4gICAgICAgIHJldHVybiBvdXRbMF0gfHwgbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGljayBhbGwgaW50ZXJzZWN0aW9uIG9iamVjdHMsIHdpY2ggd2lsbCBiZSBzb3J0ZWQgZnJvbSBuZWFyIHRvIGZhclxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCBNb3VzZSBwb3NpdGlvbiB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB5IE1vdXNlIHBvc2l0aW9uIHlcbiAgICAgKiBAcGFyYW0gIHtBcnJheX0gW291dHB1dF1cbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbZm9yY2VQaWNrQWxsPWZhbHNlXSBpZ25vcmUgaWdub3JlUGlja2luZ1xuICAgICAqIEByZXR1cm4ge0FycmF5LjxjbGF5LnBpY2tpbmcuUmF5UGlja2luZ35JbnRlcnNlY3Rpb24+fVxuICAgICAqL1xuICAgIHBpY2tBbGw6IGZ1bmN0aW9uICh4LCB5LCBvdXRwdXQsIGZvcmNlUGlja0FsbCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcmVlblRvTkRDKHgsIHksIHRoaXMuX25kYyk7XG4gICAgICAgIHRoaXMuY2FtZXJhLmNhc3RSYXkodGhpcy5fbmRjLCB0aGlzLl9yYXkpO1xuXG4gICAgICAgIG91dHB1dCA9IG91dHB1dCB8fCBbXTtcblxuICAgICAgICB0aGlzLl9pbnRlcnNlY3ROb2RlKHRoaXMuc2NlbmUsIG91dHB1dCwgZm9yY2VQaWNrQWxsIHx8IGZhbHNlKTtcblxuICAgICAgICBvdXRwdXQuc29ydCh0aGlzLl9pbnRlcnNlY3Rpb25Db21wYXJlRnVuYyk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9LFxuXG4gICAgX2ludGVyc2VjdE5vZGU6IGZ1bmN0aW9uIChub2RlLCBvdXQsIGZvcmNlUGlja0FsbCkge1xuICAgICAgICBpZiAoKG5vZGUgaW5zdGFuY2VvZiBSZW5kZXJhYmxlKSAmJiBub2RlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICBpZiAoKCFub2RlLmlnbm9yZVBpY2tpbmcgfHwgZm9yY2VQaWNrQWxsKVxuICAgICAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0cmlhbmdsZSBtZXNoIHN1cHBvcnQgcmF5IHBpY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgKG5vZGUubW9kZSA9PT0gZ2xlbnVtLlRSSUFOR0xFUyAmJiBub2RlLmdlb21ldHJ5LmlzVXNlSW5kaWNlcygpKVxuICAgICAgICAgICAgICAgICAgICAvLyBPciBpZiBnZW9tZXRyeSBoYXMgaXQncyBvd24gcGlja0J5UmF5LCBwaWNrLCBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlLmdlb21ldHJ5LnBpY2tCeVJheVxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlLmdlb21ldHJ5LnBpY2tcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcnNlY3RSZW5kZXJhYmxlKG5vZGUsIG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLl9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5faW50ZXJzZWN0Tm9kZShub2RlLl9jaGlsZHJlbltpXSwgb3V0LCBmb3JjZVBpY2tBbGwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9pbnRlcnNlY3RSZW5kZXJhYmxlOiAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciB2MyA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciByYXkgPSBuZXcgUmF5KCk7XG4gICAgICAgIHZhciB3b3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVuZGVyYWJsZSwgb3V0KSB7XG5cbiAgICAgICAgICAgIHZhciBpc1NraW5uZWRNZXNoID0gcmVuZGVyYWJsZS5pc1NraW5uZWRNZXNoKCk7XG4gICAgICAgICAgICByYXkuY29weSh0aGlzLl9yYXkpO1xuICAgICAgICAgICAgTWF0cml4NC5pbnZlcnQod29ybGRJbnZlcnNlLCByZW5kZXJhYmxlLndvcmxkVHJhbnNmb3JtKTtcblxuICAgICAgICAgICAgLy8gU2tpbm5lZCBtZXNoIHdpbGwgaWdub3JlIHRoZSB3b3JsZCB0cmFuc2Zvcm0uXG4gICAgICAgICAgICBpZiAoIWlzU2tpbm5lZE1lc2gpIHtcbiAgICAgICAgICAgICAgICByYXkuYXBwbHlUcmFuc2Zvcm0od29ybGRJbnZlcnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gcmVuZGVyYWJsZS5nZW9tZXRyeTtcbiAgICAgICAgICAgIC8vIElnbm9yZSBib3VuZGluZyBib3ggb2Ygc2tpbm5lZCBtZXNoP1xuICAgICAgICAgICAgaWYgKCFpc1NraW5uZWRNZXNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdlb21ldHJ5LmJvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmF5LmludGVyc2VjdEJvdW5kaW5nQm94KGdlb21ldHJ5LmJvdW5kaW5nQm94KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHVzZXIgZGVmaW5lZCBwaWNraW5nIGFsZ29yaXRobVxuICAgICAgICAgICAgaWYgKGdlb21ldHJ5LnBpY2spIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5waWNrKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZGMueCwgdGhpcy5fbmRjLnksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FtZXJhLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJhYmxlLCBvdXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVzZSB1c2VyIGRlZmluZWQgcmF5IHBpY2tpbmcgYWxnb3JpdGhtXG4gICAgICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS5waWNrQnlSYXkpIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5waWNrQnlSYXkocmF5LCByZW5kZXJhYmxlLCBvdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGN1bGxCYWNrID0gKHJlbmRlcmFibGUuY3VsbEZhY2UgPT09IGdsZW51bS5CQUNLICYmIHJlbmRlcmFibGUuZnJvbnRGYWNlID09PSBnbGVudW0uQ0NXKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHJlbmRlcmFibGUuY3VsbEZhY2UgPT09IGdsZW51bS5GUk9OVCAmJiByZW5kZXJhYmxlLmZyb250RmFjZSA9PT0gZ2xlbnVtLkNXKTtcblxuICAgICAgICAgICAgdmFyIHBvaW50O1xuICAgICAgICAgICAgdmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRpY2VzO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG4gICAgICAgICAgICB2YXIgd2VpZ2h0QXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMud2VpZ2h0O1xuICAgICAgICAgICAgdmFyIGpvaW50QXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuam9pbnQ7XG4gICAgICAgICAgICB2YXIgc2tpbk1hdHJpY2VzQXJyYXk7XG4gICAgICAgICAgICB2YXIgc2tpbk1hdHJpY2VzID0gW107XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB2YWxpZC5cbiAgICAgICAgICAgIGlmICghcG9zaXRpb25BdHRyIHx8ICFwb3NpdGlvbkF0dHIudmFsdWUgfHwgIWluZGljZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTa2lubmVkTWVzaCkge1xuICAgICAgICAgICAgICAgIHNraW5NYXRyaWNlc0FycmF5ID0gcmVuZGVyYWJsZS5za2VsZXRvbi5nZXRTdWJTa2luTWF0cmljZXMocmVuZGVyYWJsZS5fX3VpZF9fLCByZW5kZXJhYmxlLmpvaW50cyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW5kZXJhYmxlLmpvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBza2luTWF0cmljZXNbaV0gPSBza2luTWF0cmljZXNbaV0gfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgMTY7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbk1hdHJpY2VzW2ldW2tdID0gc2tpbk1hdHJpY2VzQXJyYXlbaSAqIDE2ICsga107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciB3ZWlnaHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgc2tpbm5lZFBvcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciB0bXAgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgc2tpbm5lZFBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbm5lZFBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGlmICghc2tpbm5lZFBvc2l0aW9uQXR0ciB8fCAhc2tpbm5lZFBvc2l0aW9uQXR0ci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jcmVhdGVBdHRyaWJ1dGUoJ3NraW5uZWRQb3NpdGlvbicsICdmJywgMyk7XG4gICAgICAgICAgICAgICAgICAgIHNraW5uZWRQb3NpdGlvbkF0dHIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5uZWRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgc2tpbm5lZFBvc2l0aW9uQXR0ci5pbml0KGdlb21ldHJ5LnZlcnRleENvdW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS52ZXJ0ZXhDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQXR0ci5nZXQoaSwgcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QXR0ci5nZXQoaSwgd2VpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgam9pbnRBdHRyLmdldChpLCBqb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodFszXSA9IDEgLSB3ZWlnaHRbMF0gLSB3ZWlnaHRbMV0gLSB3ZWlnaHRbMl07XG4gICAgICAgICAgICAgICAgICAgIHZlYzMuc2V0KHNraW5uZWRQb3MsIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IDQ7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW50W2tdID49IDAgJiYgd2VpZ2h0W2tdID4gMWUtNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NCh0bXAsIHBvcywgc2tpbk1hdHJpY2VzW2pvaW50W2tdXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChza2lubmVkUG9zLCBza2lubmVkUG9zLCB0bXAsIHdlaWdodFtrXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2tpbm5lZFBvc2l0aW9uQXR0ci5zZXQoaSwgc2tpbm5lZFBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaTEgPSBpbmRpY2VzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBpMiA9IGluZGljZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgIHZhciBpMyA9IGluZGljZXNbaSArIDJdO1xuICAgICAgICAgICAgICAgIHZhciBmaW5hbFBvc0F0dHIgPSBpc1NraW5uZWRNZXNoXG4gICAgICAgICAgICAgICAgICAgID8gZ2VvbWV0cnkuYXR0cmlidXRlcy5za2lubmVkUG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgOiBwb3NpdGlvbkF0dHI7XG4gICAgICAgICAgICAgICAgZmluYWxQb3NBdHRyLmdldChpMSwgdjEuYXJyYXkpO1xuICAgICAgICAgICAgICAgIGZpbmFsUG9zQXR0ci5nZXQoaTIsIHYyLmFycmF5KTtcbiAgICAgICAgICAgICAgICBmaW5hbFBvc0F0dHIuZ2V0KGkzLCB2My5hcnJheSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VsbEJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUodjEsIHYyLCB2MywgcmVuZGVyYWJsZS5jdWxsaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKHYxLCB2MywgdjIsIHJlbmRlcmFibGUuY3VsbGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRXID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NraW5uZWRNZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IzLnRyYW5zZm9ybU1hdDQocG9pbnRXLCBwb2ludCwgcmVuZGVyYWJsZS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHBvaW50IG1heWJlIG5vdCByaWdodC5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjMuY29weShwb2ludFcsIHBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChuZXcgUmF5UGlja2luZy5JbnRlcnNlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludCwgcG9pbnRXLCByZW5kZXJhYmxlLCBbaTEsIGkyLCBpM10sIGkgLyAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yMy5kaXN0KHBvaW50VywgdGhpcy5fcmF5Lm9yaWdpbilcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICBfaW50ZXJzZWN0aW9uQ29tcGFyZUZ1bmM6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5waWNraW5nLlJheVBpY2tpbmd+SW50ZXJzZWN0aW9uXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBwb2ludFxuICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gcG9pbnRXb3JsZFxuICogQHBhcmFtIHtjbGF5Lk5vZGV9IHRhcmdldFxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdHJpYW5nbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmlhbmdsZUluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2VcbiAqL1xuUmF5UGlja2luZy5JbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAocG9pbnQsIHBvaW50V29ybGQsIHRhcmdldCwgdHJpYW5nbGUsIHRyaWFuZ2xlSW5kZXgsIGRpc3RhbmNlKSB7XG4gICAgLyoqXG4gICAgICogSW50ZXJzZWN0aW9uIHBvaW50IGluIGxvY2FsIHRyYW5zZm9ybSBjb29yZGluYXRlc1xuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0aGlzLnBvaW50ID0gcG9pbnQ7XG4gICAgLyoqXG4gICAgICogSW50ZXJzZWN0aW9uIHBvaW50IGluIHdvcmxkIHRyYW5zZm9ybSBjb29yZGluYXRlc1xuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0aGlzLnBvaW50V29ybGQgPSBwb2ludFdvcmxkO1xuICAgIC8qKlxuICAgICAqIEludGVyc2VjdGlvbiBzY2VuZSBub2RlXG4gICAgICogQHR5cGUge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAvKipcbiAgICAgKiBJbnRlcnNlY3Rpb24gdHJpYW5nbGUsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHZlcnRleCBpbmRleFxuICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWFuZ2xlID0gdHJpYW5nbGU7XG4gICAgLyoqXG4gICAgICogSW5kZXggb2YgaW50ZXJzZWN0aW9uIHRyaWFuZ2xlLlxuICAgICAqL1xuICAgIHRoaXMudHJpYW5nbGVJbmRleCA9IHRyaWFuZ2xlSW5kZXg7XG4gICAgLyoqXG4gICAgICogRGlzdGFuY2UgZnJvbSBpbnRlcnNlY3Rpb24gcG9pbnQgdG8gcmF5IG9yaWdpblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUmF5UGlja2luZztcbiIsIi8vIFNwaGVyaWNhbCBIYXJtb25pYyBIZWxwZXJzXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9UZXh0dXJlJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgUGFzcyBmcm9tICcuLi9jb21wb3NpdG9yL1Bhc3MnO1xuaW1wb3J0IHZlbmRvciBmcm9tICcuLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgU2t5Ym94IGZyb20gJy4uL3BsdWdpbi9Ta3lib3gnO1xuaW1wb3J0IFNreWRvbWUgZnJvbSAnLi4vcGx1Z2luL1NreWRvbWUnO1xuaW1wb3J0IEVudmlyb25tZW50TWFwUGFzcyBmcm9tICcuLi9wcmVQYXNzL0Vudmlyb25tZW50TWFwJztcbmltcG9ydCBTY2VuZSBmcm9tICcuLi9TY2VuZSc7XG5pbXBvcnQgZ2xtYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gZ2xtYXRyaXgudmVjMztcbnZhciBzaCA9IHt9O1xuXG5pbXBvcnQgcHJvamVjdEVudk1hcFNoYWRlckNvZGUgZnJvbSAnLi9zaGFkZXIvcHJvamVjdEVudk1hcC5nbHNsLmpzJztcblxudmFyIHRhcmdldHMgPSBbJ3B4JywgJ254JywgJ3B5JywgJ255JywgJ3B6JywgJ256J107XG5cbi8vIFByb2plY3Qgb24gZ3B1LCBidXQgbmVlZHMgYnJvd3NlciB0byBzdXBwb3J0IHJlYWRQaXhlbHMgYXMgRmxvYXQzMkFycmF5LlxuZnVuY3Rpb24gcHJvamVjdEVudmlyb25tZW50TWFwR1BVKHJlbmRlcmVyLCBlbnZNYXApIHtcbiAgICB2YXIgc2hUZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgIHdpZHRoOiA5LFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHR5cGU6IFRleHR1cmUuRkxPQVRcbiAgICB9KTtcbiAgICB2YXIgcGFzcyA9IG5ldyBQYXNzKHtcbiAgICAgICAgZnJhZ21lbnQ6IHByb2plY3RFbnZNYXBTaGFkZXJDb2RlXG4gICAgfSk7XG4gICAgcGFzcy5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1RFWFRVUkVfU0laRScsIGVudk1hcC53aWR0aCk7XG4gICAgcGFzcy5zZXRVbmlmb3JtKCdlbnZpcm9ubWVudE1hcCcsIGVudk1hcCk7XG5cbiAgICB2YXIgZnJhbWVidWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbiAgICBmcmFtZWJ1ZmZlci5hdHRhY2goc2hUZXh0dXJlKTtcbiAgICBwYXNzLnJlbmRlcihyZW5kZXJlciwgZnJhbWVidWZmZXIpO1xuXG4gICAgZnJhbWVidWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgLy8gVE9ETyBPbmx5IGNocm9tZSBhbmQgZmlyZWZveCBzdXBwb3J0IEZsb2F0MzJBcnJheVxuICAgIHZhciBwaXhlbHMgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheSg5ICogNCk7XG4gICAgcmVuZGVyZXIuZ2wucmVhZFBpeGVscygwLCAwLCA5LCAxLCBUZXh0dXJlLlJHQkEsIFRleHR1cmUuRkxPQVQsIHBpeGVscyk7XG5cbiAgICB2YXIgY29lZmYgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheSg5ICogMyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA5OyBpKyspIHtcbiAgICAgICAgY29lZmZbaSAqIDNdID0gcGl4ZWxzW2kgKiA0XTtcbiAgICAgICAgY29lZmZbaSAqIDMgKyAxXSA9IHBpeGVsc1tpICogNCArIDFdO1xuICAgICAgICBjb2VmZltpICogMyArIDJdID0gcGl4ZWxzW2kgKiA0ICsgMl07XG4gICAgfVxuICAgIGZyYW1lYnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG5cbiAgICBmcmFtZWJ1ZmZlci5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICBwYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIHJldHVybiBjb2VmZjtcbn1cblxuZnVuY3Rpb24gaGFybW9uaWNzKG5vcm1hbCwgaW5kZXgpe1xuICAgIHZhciB4ID0gbm9ybWFsWzBdO1xuICAgIHZhciB5ID0gbm9ybWFsWzFdO1xuICAgIHZhciB6ID0gbm9ybWFsWzJdO1xuXG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiAxLjA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGluZGV4ID09PSAxKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBlbHNlIGlmIChpbmRleCA9PT0gMikge1xuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5kZXggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIHo7XG4gICAgfVxuICAgIGVsc2UgaWYgKGluZGV4ID09PSA0KSB7XG4gICAgICAgIHJldHVybiB4ICogejtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5kZXggPT09IDUpIHtcbiAgICAgICAgcmV0dXJuIHkgKiB6O1xuICAgIH1cbiAgICBlbHNlIGlmIChpbmRleCA9PT0gNikge1xuICAgICAgICByZXR1cm4geCAqIHk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGluZGV4ID09PSA3KSB7XG4gICAgICAgIHJldHVybiAzLjAgKiB6ICogeiAtIDEuMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB4ICogeCAtIHkgKiB5O1xuICAgIH1cbn1cblxudmFyIG5vcm1hbFRyYW5zZm9ybSA9IHtcbiAgICBweDogWzIsIDEsIDAsIC0xLCAtMSwgMV0sXG4gICAgbng6IFsyLCAxLCAwLCAxLCAtMSwgLTFdLFxuICAgIHB5OiBbMCwgMiwgMSwgMSwgLTEsIC0xXSxcbiAgICBueTogWzAsIDIsIDEsIDEsIDEsIDFdLFxuICAgIHB6OiBbMCwgMSwgMiwgLTEsIC0xLCAtMV0sXG4gICAgbno6IFswLCAxLCAyLCAxLCAtMSwgMV1cbn07XG5cbi8vIFByb2plY3Qgb24gY3B1LlxuZnVuY3Rpb24gcHJvamVjdEVudmlyb25tZW50TWFwQ1BVKHJlbmRlcmVyLCBjdWJlUGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIGNvZWZmID0gbmV3IHZlbmRvci5GbG9hdDMyQXJyYXkoOSAqIDMpO1xuICAgIHZhciBub3JtYWwgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgIHZhciB0ZXhlbCA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIGZldGNoTm9ybWFsID0gdmVjMy5jcmVhdGUoKTtcbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IDk7IG0rKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0YXJnZXRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgcGl4ZWxzID0gY3ViZVBpeGVsc1t0YXJnZXRzW2tdXTtcblxuICAgICAgICAgICAgdmFyIHNpZGVSZXN1bHQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdmFyIGRpdmlkZXIgPSAwO1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5vcm1hbFRyYW5zZm9ybVt0YXJnZXRzW2tdXTtcbiAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcblxuICAgICAgICAgICAgICAgICAgICBub3JtYWxbMF0gPSB4IC8gKHdpZHRoIC0gMS4wKSAqIDIuMCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBGbGlwIHk/XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbFsxXSA9IHkgLyAoaGVpZ2h0IC0gMS4wKSAqIDIuMCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsWzJdID0gLTEuMDtcbiAgICAgICAgICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUobm9ybWFsLCBub3JtYWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZldGNoTm9ybWFsWzBdID0gbm9ybWFsW3RyYW5zZm9ybVswXV0gKiB0cmFuc2Zvcm1bM107XG4gICAgICAgICAgICAgICAgICAgIGZldGNoTm9ybWFsWzFdID0gbm9ybWFsW3RyYW5zZm9ybVsxXV0gKiB0cmFuc2Zvcm1bNF07XG4gICAgICAgICAgICAgICAgICAgIGZldGNoTm9ybWFsWzJdID0gbm9ybWFsW3RyYW5zZm9ybVsyXV0gKiB0cmFuc2Zvcm1bNV07XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMF0gPSBwaXhlbHNbaSsrXSAvIDI1NTtcbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMV0gPSBwaXhlbHNbaSsrXSAvIDI1NTtcbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMl0gPSBwaXhlbHNbaSsrXSAvIDI1NTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUkdCTSBEZWNvZGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlID0gcGl4ZWxzW2krK10gLyAyNTUgKiA1MS41O1xuICAgICAgICAgICAgICAgICAgICB0ZXhlbFswXSAqPSBzY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRleGVsWzJdICo9IHNjYWxlO1xuXG4gICAgICAgICAgICAgICAgICAgIHZlYzMuc2NhbGVBbmRBZGQoc2lkZVJlc3VsdCwgc2lkZVJlc3VsdCwgdGV4ZWwsIGhhcm1vbmljcyhmZXRjaE5vcm1hbCwgbSkgKiAtbm9ybWFsWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gLW5vcm1hbC56IGVxdWFscyBjb3ModGhldGEpIG9mIExhbWJlcnRpYW5cbiAgICAgICAgICAgICAgICAgICAgZGl2aWRlciArPSAtbm9ybWFsWzJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlYzMuc2NhbGVBbmRBZGQocmVzdWx0LCByZXN1bHQsIHNpZGVSZXN1bHQsIDEgLyBkaXZpZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZWZmW20gKiAzXSA9IHJlc3VsdFswXSAvIDYuMDtcbiAgICAgICAgY29lZmZbbSAqIDMgKyAxXSA9IHJlc3VsdFsxXSAvIDYuMDtcbiAgICAgICAgY29lZmZbbSAqIDMgKyAyXSA9IHJlc3VsdFsyXSAvIDYuMDtcbiAgICB9XG4gICAgcmV0dXJuIGNvZWZmO1xufVxuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gKiBAcGFyYW0gIHtjbGF5LlRleHR1cmV9IGVudk1hcFxuICogQHBhcmFtICB7T2JqZWN0fSBbdGV4dHVyZU9wdHNdXG4gKiBAcGFyYW0gIHtPYmplY3R9IFt0ZXh0dXJlT3B0cy5sb2RdXG4gKiBAcGFyYW0gIHtib29sZWFufSBbdGV4dHVyZU9wdHMuZGVjb2RlUkdCTV1cbiAqL1xuc2gucHJvamVjdEVudmlyb25tZW50TWFwID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBlbnZNYXAsIG9wdHMpIHtcblxuICAgIC8vIFRPRE8gc1JHQlxuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgb3B0cy5sb2QgPSBvcHRzLmxvZCB8fCAwO1xuXG4gICAgdmFyIHNreWJveDtcbiAgICB2YXIgZHVtbXlTY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIHZhciBzaXplID0gNjQ7XG4gICAgaWYgKGVudk1hcCBpbnN0YW5jZW9mIFRleHR1cmUyRCkge1xuICAgICAgICBza3lib3ggPSBuZXcgU2t5ZG9tZSh7XG4gICAgICAgICAgICBzY2VuZTogZHVtbXlTY2VuZSxcbiAgICAgICAgICAgIGVudmlyb25tZW50TWFwOiBlbnZNYXBcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzaXplID0gKGVudk1hcC5pbWFnZSAmJiBlbnZNYXAuaW1hZ2UucHgpID8gZW52TWFwLmltYWdlLnB4LndpZHRoIDogZW52TWFwLndpZHRoO1xuICAgICAgICBza3lib3ggPSBuZXcgU2t5Ym94KHtcbiAgICAgICAgICAgIHNjZW5lOiBkdW1teVNjZW5lLFxuICAgICAgICAgICAgZW52aXJvbm1lbnRNYXA6IGVudk1hcFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ29udmVydCB0byByZ2JtXG4gICAgdmFyIHdpZHRoID0gTWF0aC5jZWlsKHNpemUgLyBNYXRoLnBvdygyLCBvcHRzLmxvZCkpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLmNlaWwoc2l6ZSAvIE1hdGgucG93KDIsIG9wdHMubG9kKSk7XG4gICAgdmFyIHJnYm1UZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9KTtcbiAgICB2YXIgZnJhbWVidWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbiAgICBza3lib3gubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdSR0JNX0VOQ09ERScpO1xuICAgIGlmIChvcHRzLmRlY29kZVJHQk0pIHtcbiAgICAgICAgc2t5Ym94Lm1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUkdCTV9ERUNPREUnKTtcbiAgICB9XG4gICAgc2t5Ym94Lm1hdGVyaWFsLnNldCgnbG9kJywgb3B0cy5sb2QpO1xuICAgIHZhciBlbnZNYXBQYXNzID0gbmV3IEVudmlyb25tZW50TWFwUGFzcyh7XG4gICAgICAgIHRleHR1cmU6IHJnYm1UZXh0dXJlXG4gICAgfSk7XG4gICAgdmFyIGN1YmVQaXhlbHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY3ViZVBpeGVsc1t0YXJnZXRzW2ldXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgICAgIHZhciBjYW1lcmEgPSBlbnZNYXBQYXNzLmdldENhbWVyYSh0YXJnZXRzW2ldKTtcbiAgICAgICAgY2FtZXJhLmZvdiA9IDkwO1xuICAgICAgICBmcmFtZWJ1ZmZlci5hdHRhY2gocmdibVRleHR1cmUpO1xuICAgICAgICBmcmFtZWJ1ZmZlci5iaW5kKHJlbmRlcmVyKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKGR1bW15U2NlbmUsIGNhbWVyYSk7XG4gICAgICAgIHJlbmRlcmVyLmdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgVGV4dHVyZS5SR0JBLCBUZXh0dXJlLlVOU0lHTkVEX0JZVEUsIGN1YmVQaXhlbHNbdGFyZ2V0c1tpXV1cbiAgICAgICAgKTtcbiAgICAgICAgZnJhbWVidWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcbiAgICB9XG5cbiAgICBza3lib3guZGlzcG9zZShyZW5kZXJlcik7XG4gICAgZnJhbWVidWZmZXIuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgcmdibVRleHR1cmUuZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICByZXR1cm4gcHJvamVjdEVudmlyb25tZW50TWFwQ1BVKHJlbmRlcmVyLCBjdWJlUGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNoO1xuIiwiXG4vKipcbiAqIEhlbHBlcnMgZm9yIGNyZWF0aW5nIGEgY29tbW9uIDNkIGFwcGxpY2F0aW9uLlxuICogQG5hbWVzcGFjZSBjbGF5LmFwcGxpY2F0aW9uXG4gKi9cblxuIC8vIFRPRE8gY3JlYXRlQ29tcG9zaXRvclxuIC8vIFRPRE8gbW9iaWxlLiBzY3JvbGwgZXZlbnRzLlxuIC8vIFRPRE8gRGlzcG9zZSB0ZXN0LiBnZW9DYWNoZSB0ZXN0LlxuIC8vIFRPRE8gZml0TW9kZWwsIG5vcm1hbCBnZW5lcmF0aW9uLlxuIC8vIFRPRE8gU2t5Ym94LCBTa3lkb21lLlxuIC8vIFRPRE8gUGFydGljbGUgP1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4vU2NlbmUnO1xuaW1wb3J0IFRpbWVsaW5lIGZyb20gJy4vYW5pbWF0aW9uL1RpbWVsaW5lJztcbmltcG9ydCBDdWJlR2VvIGZyb20gJy4vZ2VvbWV0cnkvQ3ViZSc7XG5pbXBvcnQgU3BoZXJlR2VvIGZyb20gJy4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCBQbGFuZUdlbyBmcm9tICcuL2dlb21ldHJ5L1BsYW5lJztcbmltcG9ydCBUZXh0dXJlMkQgZnJvbSAnLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9UZXh0dXJlJztcbmltcG9ydCBzaGFkZXJMaWJyYXJ5IGZyb20gJy4vc2hhZGVyL2xpYnJhcnknO1xuaW1wb3J0IE1lc2ggZnJvbSAnLi9NZXNoJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL01hdGVyaWFsJztcbmltcG9ydCBQZXJzcGVjdGl2ZUNhbWVyYSBmcm9tICcuL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgT3J0aG9ncmFwaGljQ2FtZXJhIGZyb20gJy4vY2FtZXJhL09ydGhvZ3JhcGhpYyc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgR0xURkxvYWRlciBmcm9tICcuL2xvYWRlci9HTFRGJztcbmltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5pbXBvcnQgRGlyZWN0aW9uYWxMaWdodCBmcm9tICcuL2xpZ2h0L0RpcmVjdGlvbmFsJztcbmltcG9ydCBQb2ludExpZ2h0IGZyb20gJy4vbGlnaHQvUG9pbnQnO1xuaW1wb3J0IFNwb3RMaWdodCBmcm9tICcuL2xpZ2h0L1Nwb3QnO1xuaW1wb3J0IEFtYmllbnRMaWdodCBmcm9tICcuL2xpZ2h0L0FtYmllbnQnO1xuaW1wb3J0IEFtYmllbnRDdWJlbWFwTGlnaHQgZnJvbSAnLi9saWdodC9BbWJpZW50Q3ViZW1hcCc7XG5pbXBvcnQgQW1iaWVudFNITGlnaHQgZnJvbSAnLi9saWdodC9BbWJpZW50U0gnO1xuaW1wb3J0IFNoYWRvd01hcFBhc3MgZnJvbSAnLi9wcmVQYXNzL1NoYWRvd01hcCc7XG5pbXBvcnQgUmF5UGlja2luZyBmcm9tICcuL3BpY2tpbmcvUmF5UGlja2luZyc7XG5pbXBvcnQgTFJVQ2FjaGUgZnJvbSAnLi9jb3JlL0xSVSc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5pbXBvcnQgc2hVdGlsIGZyb20gJy4vdXRpbC9zaCc7XG5pbXBvcnQgdGV4dHVyZVV0aWwgZnJvbSAnLi91dGlsL3RleHR1cmUnO1xuXG5pbXBvcnQgY29sb3JVdGlsIGZyb20gJy4vY29yZS9jb2xvcic7XG52YXIgcGFyc2VDb2xvciA9IGNvbG9yVXRpbC5wYXJzZVRvRmxvYXQ7XG5cbmltcG9ydCAnLi9zaGFkZXIvYnVpbHRpbic7XG5pbXBvcnQgU2hhZGVyIGZyb20gJy4vU2hhZGVyJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfEhUTUxDYW52YXNFbGVtZW50fEhUTUxJbWFnZUVsZW1lbnR8SFRNTFZpZGVvRWxlbWVudH0gSW1hZ2VMaWtlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ3xBcnJheS48bnVtYmVyPn0gQ29sb3JcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7SFRNTERvbUVsZW1lbnR8c3RyaW5nfSBEb21RdWVyeVxuICovXG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5hcHBsaWNhdGlvbi5BcHAzRFxuICogQHBhcmFtIHtEb21RdWVyeX0gZG9tIENvbnRhaW5lciBkb20gZWxlbWVudCBvciBhIHNlbGVjdG9yIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGBxdWVyeVNlbGVjdG9yYFxuICogQHBhcmFtIHtPYmplY3R9IGFwcE5TXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcHBOUy5pbml0IEluaXRpYWxpemF0aW9uIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBpbml0aW5nIGFwcC5cbiAqICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gcmV0dXJuIGEgcHJvbWlzZSBpbiBpbml0IHRvIHN0YXJ0IHRoZSBsb29wIGFzeW5jaHJvbm91c2x5IHdoZW4gdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcHBOUy5sb29wIExvb3AgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCBlYWNoIGZyYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXBwTlMuYmVmb3JlUmVuZGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcHBOUy5hZnRlclJlbmRlclxuICogQHBhcmFtIHtudW1iZXJ9IFthcHBOUy53aWR0aF0gQ29udGFpbmVyIHdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcHBOUy5oZWlnaHRdIENvbnRhaW5lciBoZWlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FwcE5TLmRldmljZVBpeGVsUmF0aW9dXG4gKiBAcGFyYW0ge09iamVjdH0gW2FwcE5TLmdyYXBoaWNdIEdyYXBoaWMgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgc2hhZG93LCBwb3N0RWZmZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcHBOUy5ncmFwaGljLnNoYWRvdz1mYWxzZV0gSWYgZW5hYmxlIHNoYWRvd1xuICogQHBhcmFtIHtib29sZWFufSBbYXBwTlMuZ3JhcGhpYy5saW5lYXI9ZmFsc2VdIElmIHVzZSBsaW5lYXIgc3BhY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FwcE5TLmdyYXBoaWMudG9uZW1hcHBpbmc9ZmFsc2VdIElmIGVuYWJsZSBBQ0VTIHRvbmUgbWFwcGluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FwcE5TLmV2ZW50PWZhbHNlXSBJZiBlbmFibGUgbW91c2UvdG91Y2ggZXZlbnQuIEl0IHdpbGwgc2xvdyBkb3duIHRoZSBzeXN0ZW0gaWYgZ2VvbWV0cmllcyBhcmUgY29tcGxleC5cbiAqL1xuZnVuY3Rpb24gQXBwM0QoZG9tLCBhcHBOUykge1xuXG4gICAgYXBwTlMgPSBhcHBOUyB8fCB7fTtcbiAgICBhcHBOUy5ncmFwaGljID0gYXBwTlMuZ3JhcGhpYyB8fCB7fTtcblxuICAgIGlmICh0eXBlb2YgZG9tID09PSAnc3RyaW5nJykge1xuICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGRvbSk7XG4gICAgfVxuXG4gICAgaWYgKCFkb20pIHsgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRvbScpOyB9XG5cbiAgICB2YXIgaXNEb21DYW52YXMgPSBkb20ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0NBTlZBUyc7XG4gICAgdmFyIHJlbmRlcmVyT3B0cyA9IHt9O1xuICAgIGlzRG9tQ2FudmFzICYmIChyZW5kZXJlck9wdHMuY2FudmFzID0gZG9tKTtcbiAgICBhcHBOUy5kZXZpY2VQaXhlbFJhdGlvICYmIChyZW5kZXJlck9wdHMuZGV2aWNlUGl4ZWxSYXRpbyA9IGFwcE5TLmRldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgdmFyIGdSZW5kZXJlciA9IG5ldyBSZW5kZXJlcihyZW5kZXJlck9wdHMpO1xuICAgIHZhciBnV2lkdGggPSBhcHBOUy53aWR0aCB8fCBkb20uY2xpZW50V2lkdGg7XG4gICAgdmFyIGdIZWlnaHQgPSBhcHBOUy5oZWlnaHQgfHwgZG9tLmNsaWVudEhlaWdodDtcblxuICAgIHZhciBnU2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB2YXIgZ1RpbWVsaW5lID0gbmV3IFRpbWVsaW5lKCk7XG4gICAgdmFyIGdTaGFkb3dQYXNzID0gYXBwTlMuZ3JhcGhpYy5zaGFkb3cgJiYgbmV3IFNoYWRvd01hcFBhc3MoKTtcbiAgICB2YXIgZ1JheVBpY2tpbmcgPSBhcHBOUy5ldmVudCAmJiBuZXcgUmF5UGlja2luZyh7XG4gICAgICAgIHNjZW5lOiBnU2NlbmUsXG4gICAgICAgIHJlbmRlcmVyOiBnUmVuZGVyZXJcbiAgICB9KTtcblxuICAgICFpc0RvbUNhbnZhcyAmJiBkb20uYXBwZW5kQ2hpbGQoZ1JlbmRlcmVyLmNhbnZhcyk7XG5cbiAgICBnUmVuZGVyZXIucmVzaXplKGdXaWR0aCwgZ0hlaWdodCk7XG5cbiAgICB2YXIgZ0ZyYW1lVGltZSA9IDA7XG4gICAgdmFyIGdFbGFwc2VkVGltZSA9IDA7XG5cbiAgICBnVGltZWxpbmUuc3RhcnQoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnRhaW5lciBkb20gZWxlbWVudFxuICAgICAgICAgKiBAbmFtZSBjbGF5LmFwcGxpY2F0aW9uLkFwcDNEI2NvbnRhaW5lclxuICAgICAgICAgKiBAdHlwZSB7SFRNTERvbUVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBjb250YWluZXI6IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkb207IH0gfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGNsYXkuYXBwbGljYXRpb24uQXBwM0QjcmVuZGVyZXJcbiAgICAgICAgICogQHR5cGUge2NsYXkuUmVuZGVyZXJ9XG4gICAgICAgICAqL1xuICAgICAgICByZW5kZXJlcjogeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdSZW5kZXJlcjsgfX0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBjbGF5LmFwcGxpY2F0aW9uLkFwcDNEI3NjZW5lXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlJlbmRlcmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgc2NlbmU6IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnU2NlbmU7IH19LFxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgY2xheS5hcHBsaWNhdGlvbi5BcHAzRCN0aW1lbGluZVxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5SZW5kZXJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRpbWVsaW5lOiB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ1RpbWVsaW5lOyB9fSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IGZyYW1lLiBDYW4gYmUgdXNlZCBpbiBsb29wIHRvIGNhbGN1bGF0ZSB0aGUgbW92ZW1lbnQuXG4gICAgICAgICAqIEBuYW1lIGNsYXkuYXBwbGljYXRpb24uQXBwM0QjZnJhbWVUaW1lXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBmcmFtZVRpbWU6IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnRnJhbWVUaW1lOyB9fSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpbWUgZWxhcHNlZCBzaW5jZSBhcHBsaWNhdGlvbiBjcmVhdGVkLlxuICAgICAgICAgKiBAbmFtZSBjbGF5LmFwcGxpY2F0aW9uLkFwcDNEI2VsYXBzZWRUaW1lXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBlbGFwc2VkVGltZTogeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdFbGFwc2VkVGltZTsgfX1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgYXBwbGljYXRpb24uIFdpbGwgdXNlIHRoZSBjb250YWluZXIgY2xpZW50V2lkdGgvY2xpZW50SGVpZ2h0IGlmIHdpZHRoL2hlaWdodCBpbiBwYXJhbWV0ZXJzIGFyZSBub3QgZ2l2ZW4uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQG1lbWJlck9mIHtjbGF5LmFwcGxpY2F0aW9uLkFwcDNEfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdXG4gICAgICovXG4gICAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBnV2lkdGggPSB3aWR0aCB8fCBhcHBOUy53aWR0aCB8fCBkb20uY2xpZW50V2lkdGg7XG4gICAgICAgIGdIZWlnaHQgPSBoZWlnaHQgfHwgZG9tLmhlaWdodCB8fCBkb20uY2xpZW50SGVpZ2h0O1xuICAgICAgICBnUmVuZGVyZXIucmVzaXplKGdXaWR0aCwgZ0hlaWdodCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2UgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGFwcE5TLmRpc3Bvc2UpIHtcbiAgICAgICAgICAgIGFwcE5TLmRpc3Bvc2UodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ1RpbWVsaW5lLnN0b3AoKTtcbiAgICAgICAgZ1JlbmRlcmVyLmRpc3Bvc2VTY2VuZShnU2NlbmUpO1xuICAgICAgICBnU2hhZG93UGFzcyAmJiBnU2hhZG93UGFzcy5kaXNwb3NlKGdSZW5kZXJlcik7XG5cbiAgICAgICAgZG9tLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzW21ha2VIYW5kbGVyTmFtZShldmVUeXBlKV0gJiYgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobWFrZUhhbmRsZXJOYW1lKGV2ZVR5cGUpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGdSYXlQaWNraW5nICYmIHRoaXMuX2luaXRNb3VzZUV2ZW50cyhnUmF5UGlja2luZyk7XG5cbiAgICB0aGlzLl9nZW9DYWNoZSA9IG5ldyBMUlVDYWNoZSgyMCk7XG4gICAgdGhpcy5fdGV4Q2FjaGUgPSBuZXcgTFJVQ2FjaGUoMjApO1xuXG4gICAgLy8gRG8gaW5pdCB0aGUgYXBwbGljYXRpb24uXG4gICAgdmFyIGluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGFwcE5TLmluaXQgJiYgYXBwTlMuaW5pdCh0aGlzKSk7XG4gICAgLy8gVXNlIHRoZSBpbml0ZWQgY2FtZXJhLlxuICAgIGdSYXlQaWNraW5nICYmIChnUmF5UGlja2luZy5jYW1lcmEgPSBnU2NlbmUuZ2V0TWFpbkNhbWVyYSgpKTtcblxuICAgIHZhciBnVGV4dHVyZXNMaXN0ID0ge307XG4gICAgdmFyIGdHZW9tZXRyaWVzTGlzdCA9IHt9O1xuXG4gICAgaWYgKCFhcHBOUy5sb29wKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTWlzcyBsb29wIG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaW5pdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFwcE5TLmxvb3AgJiYgZ1RpbWVsaW5lLm9uKCdmcmFtZScsIGZ1bmN0aW9uIChmcmFtZVRpbWUpIHtcbiAgICAgICAgICAgIGdGcmFtZVRpbWUgPSBmcmFtZVRpbWU7XG4gICAgICAgICAgICBnRWxhcHNlZFRpbWUgKz0gZnJhbWVUaW1lO1xuICAgICAgICAgICAgYXBwTlMubG9vcChzZWxmKTtcblxuICAgICAgICAgICAgZ1NjZW5lLnVwZGF0ZSgpO1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlR3JhcGhpY09wdGlvbnMoYXBwTlMuZ3JhcGhpYywgZ1NjZW5lLm9wYXF1ZUxpc3QpO1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlR3JhcGhpY09wdGlvbnMoYXBwTlMuZ3JhcGhpYywgZ1NjZW5lLnRyYW5zcGFyZW50TGlzdCk7XG5cbiAgICAgICAgICAgIGdSYXlQaWNraW5nICYmIChnUmF5UGlja2luZy5jYW1lcmEgPSBnU2NlbmUuZ2V0TWFpbkNhbWVyYSgpKTtcbiAgICAgICAgICAgIC8vIFJlbmRlciBzaGFkb3cgcGFzc1xuICAgICAgICAgICAgZ1NoYWRvd1Bhc3MgJiYgZ1NoYWRvd1Bhc3MucmVuZGVyKGdSZW5kZXJlciwgZ1NjZW5lLCBudWxsLCB0cnVlKTtcblxuICAgICAgICAgICAgYXBwTlMuYmVmb3JlUmVuZGVyICYmIGFwcE5TLmJlZm9yZVJlbmRlcihzZWxmKTtcbiAgICAgICAgICAgIHNlbGYuX2RvUmVuZGVyKGdSZW5kZXJlciwgZ1NjZW5lLCB0cnVlKTtcbiAgICAgICAgICAgIGFwcE5TLmFmdGVyUmVuZGVyICYmIGFwcE5TLmFmdGVyUmVuZGVyKHNlbGYpO1xuXG4gICAgICAgICAgICAvLyBNYXJrIGFsbCByZXNvdXJjZXMgdW51c2VkO1xuICAgICAgICAgICAgbWFya1VudXNlZChnVGV4dHVyZXNMaXN0KTtcbiAgICAgICAgICAgIG1hcmtVbnVzZWQoZ0dlb21ldHJpZXNMaXN0KTtcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCByZXNvdXJjZXMgdXNlZCBpbiB0aGlzIGZyYW1lLlxuICAgICAgICAgICAgdmFyIG5ld1RleHR1cmVzTGlzdCA9IFtdO1xuICAgICAgICAgICAgdmFyIG5ld0dlb21ldHJpZXNMaXN0ID0gW107XG4gICAgICAgICAgICBjb2xsZWN0UmVzb3VyY2VzKGdTY2VuZSwgbmV3VGV4dHVyZXNMaXN0LCBuZXdHZW9tZXRyaWVzTGlzdCk7XG5cbiAgICAgICAgICAgIC8vIERpc3Bvc2UgdGhvc2UgdW5zZWQgcmVzb3VyY2VzLlxuICAgICAgICAgICAgY2hlY2tBbmREaXNwb3NlKGdSZW5kZXJlciwgZ1RleHR1cmVzTGlzdCk7XG4gICAgICAgICAgICBjaGVja0FuZERpc3Bvc2UoZ1JlbmRlcmVyLCBnR2VvbWV0cmllc0xpc3QpO1xuXG4gICAgICAgICAgICBnVGV4dHVyZXNMaXN0ID0gbmV3VGV4dHVyZXNMaXN0O1xuICAgICAgICAgICAgZ0dlb21ldHJpZXNMaXN0ID0gbmV3R2VvbWV0cmllc0xpc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlTGlrZUVsZW1lbnQodmFsKSB7XG4gICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEltYWdlXG4gICAgICAgIHx8IHZhbCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50XG4gICAgICAgIHx8IHZhbCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEtleUZyb21JbWFnZUxpa2UodmFsKSB7XG4gICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyB2YWwgOiAodmFsLl9fa2V5X18gfHwgKHZhbC5fX2tleV9fID0gdXRpbC5nZW5HVUlEKCkpKTtcbn1cblxuZnVuY3Rpb24gbWFrZUhhbmRsZXJOYW1lKGV2ZVR5cGUpIHtcbiAgICByZXR1cm4gJ18nICsgZXZlVHlwZSArICdIYW5kbGVyJztcbn1cblxuZnVuY3Rpb24gcGFja2FnZUV2ZW50KGV2ZW50VHlwZSwgcGlja1Jlc3VsdCwgb2Zmc2V0WCwgb2Zmc2V0WSkge1xuICAgIHZhciBldmVudCA9IHV0aWwuY2xvbmUocGlja1Jlc3VsdCk7XG4gICAgZXZlbnQudHlwZSA9IGV2ZW50VHlwZTtcbiAgICBldmVudC5vZmZzZXRYID0gb2Zmc2V0WDtcbiAgICBldmVudC5vZmZzZXRZID0gb2Zmc2V0WTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGJ1YmJsaW5nRXZlbnQodGFyZ2V0LCBldmVudCkge1xuICAgIHdoaWxlICh0YXJnZXQgJiYgIWV2ZW50LmNhbmNlbEJ1YmJsZSkge1xuICAgICAgICB0YXJnZXQudHJpZ2dlcihldmVudC50eXBlLCBldmVudCk7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5nZXRQYXJlbnQoKTtcbiAgICB9XG59XG5cbkFwcDNELnByb3RvdHlwZS5faW5pdE1vdXNlRXZlbnRzID0gZnVuY3Rpb24gKHJheVBpY2tpbmcpIHtcbiAgICB2YXIgZG9tID0gdGhpcy5jb250YWluZXI7XG5cbiAgICB2YXIgb2xkVGFyZ2V0ID0gbnVsbDtcbiAgICBbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVUeXBlKSB7XG4gICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKGV2ZVR5cGUsIHRoaXNbbWFrZUhhbmRsZXJOYW1lKGV2ZVR5cGUpXSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoIXJheVBpY2tpbmcuY2FtZXJhKSB7IC8vIE5vdCBoYXZlIGNhbWVyYSB5ZXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYm94ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIG9mZnNldFggPSBlLmNsaWVudFggLSBib3gubGVmdDtcbiAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZS5jbGllbnRZIC0gYm94LnRvcDtcblxuICAgICAgICAgICAgdmFyIHBpY2tSZXN1bHQgPSByYXlQaWNraW5nLnBpY2sob2Zmc2V0WCwgb2Zmc2V0WSk7XG5cbiAgICAgICAgICAgIGlmIChwaWNrUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgc2lsZW50IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgaWYgKHBpY2tSZXN1bHQudGFyZ2V0LnNpbGVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZVR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDaGFuZ2VkID0gcGlja1Jlc3VsdC50YXJnZXQgIT09IG9sZFRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFRhcmdldCAmJiBidWJibGluZ0V2ZW50KG9sZFRhcmdldCwgcGFja2FnZUV2ZW50KCdtb3VzZW91dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9sZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsaW5nRXZlbnQocGlja1Jlc3VsdC50YXJnZXQsIHBhY2thZ2VFdmVudCgnbW91c2Vtb3ZlJywgcGlja1Jlc3VsdCwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxpbmdFdmVudChwaWNrUmVzdWx0LnRhcmdldCwgcGFja2FnZUV2ZW50KCdtb3VzZW92ZXInLCBwaWNrUmVzdWx0LCBvZmZzZXRYLCBvZmZzZXRZKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsaW5nRXZlbnQocGlja1Jlc3VsdC50YXJnZXQsIHBhY2thZ2VFdmVudChldmVUeXBlLCBwaWNrUmVzdWx0LCBvZmZzZXRYLCBvZmZzZXRZKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9sZFRhcmdldCA9IHBpY2tSZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgYnViYmxpbmdFdmVudChvbGRUYXJnZXQsIHBhY2thZ2VFdmVudCgnbW91c2VvdXQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogb2xkVGFyZ2V0XG4gICAgICAgICAgICAgICAgfSwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xuICAgICAgICAgICAgICAgIG9sZFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIHRoaXMpO1xufTtcblxuQXBwM0QucHJvdG90eXBlLl91cGRhdGVHcmFwaGljT3B0aW9ucyA9IGZ1bmN0aW9uIChncmFwaGljT3B0cywgbGlzdCkge1xuICAgIHZhciBlbmFibGVUb25lbWFwcGluZyA9ICEhZ3JhcGhpY09wdHMudG9uZW1hcHBpbmc7XG4gICAgdmFyIGlzTGluZWFyU3BhY2UgPSAhIWdyYXBoaWNPcHRzLmxpbmVhcjtcblxuICAgIHZhciBwcmV2TWF0ZXJpYWw7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG1hdCA9IGxpc3RbaV0ubWF0ZXJpYWw7XG4gICAgICAgIGlmIChtYXQgPT09IHByZXZNYXRlcmlhbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlbmFibGVUb25lbWFwcGluZyA/IG1hdC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1RPTkVNQVBQSU5HJykgOiBtYXQudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1RPTkVNQVBQSU5HJyk7XG4gICAgICAgIGlmIChpc0xpbmVhclNwYWNlKSB7XG4gICAgICAgICAgICBtYXQuZGVmaW5lKCdmcmFnbWVudCcsICdTUkdCX0VOQ09ERScpO1xuICAgICAgICAgICAgbWF0LmRlZmluZSgnZnJhZ21lbnQnLCAnU1JHQl9ERUNPREUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdC51bmRlZmluZSgnZnJhZ21lbnQnLCAnU1JHQl9FTkNPREUnKTtcbiAgICAgICAgICAgIG1hdC51bmRlZmluZSgnZnJhZ21lbnQnLCAnU1JHQl9ERUNPREUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZNYXRlcmlhbCA9IG1hdDtcbiAgICB9XG59O1xuXG5BcHAzRC5wcm90b3R5cGUuX2RvUmVuZGVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSkge1xuICAgIHZhciBjYW1lcmEgPSBzY2VuZS5nZXRNYWluQ2FtZXJhKCk7XG4gICAgY2FtZXJhLmFzcGVjdCA9IHJlbmRlcmVyLmdldFZpZXdwb3J0QXNwZWN0KCk7XG4gICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lKTtcbn07XG5cblxuZnVuY3Rpb24gbWFya1VudXNlZChyZXNvdXJjZUxpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc291cmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNvdXJjZUxpc3RbaV0uX191c2VkX18gPSAwO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tBbmREaXNwb3NlKHJlbmRlcmVyLCByZXNvdXJjZUxpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc291cmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXJlc291cmNlTGlzdFtpXS5fX3VzZWRfXykge1xuICAgICAgICAgICAgcmVzb3VyY2VMaXN0W2ldLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVVc2VkKHJlc291cmNlLCBsaXN0KSB7XG4gICAgcmVzb3VyY2UuX191c2VkX18gPSByZXNvdXJjZS5fX3VzZWRfXyB8fCAwO1xuICAgIHJlc291cmNlLl9fdXNlZF9fKys7XG4gICAgaWYgKHJlc291cmNlLl9fdXNlZF9fID09PSAxKSB7XG4gICAgICAgIC8vIERvbid0IHB1c2ggdG8gdGhlIGxpc3QgdHdpY2UuXG4gICAgICAgIGxpc3QucHVzaChyZXNvdXJjZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29sbGVjdFJlc291cmNlcyhzY2VuZSwgdGV4dHVyZVJlc291cmNlTGlzdCwgZ2VvbWV0cnlSZXNvdXJjZUxpc3QpIHtcbiAgICBmdW5jdGlvbiB0cmFja1F1ZXVlKHF1ZXVlKSB7XG4gICAgICAgIHZhciBwcmV2TWF0ZXJpYWw7XG4gICAgICAgIHZhciBwcmV2R2VvbWV0cnk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gcXVldWVbaV07XG4gICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSByZW5kZXJhYmxlLmdlb21ldHJ5O1xuICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gcmVuZGVyYWJsZS5tYXRlcmlhbDtcblxuICAgICAgICAgICAgLy8gVE9ETyBvcHRpbWl6ZSEhXG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwgIT09IHByZXZNYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlVW5pZm9ybXMgPSBtYXRlcmlhbC5nZXRUZXh0dXJlVW5pZm9ybXMoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IHRleHR1cmVVbmlmb3Jtcy5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5pZm9ybU5hbWUgPSB0ZXh0dXJlVW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBtYXRlcmlhbC51bmlmb3Jtc1t1bmlmb3JtTmFtZV0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgVGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlZCh2YWwsIHRleHR1cmVSZXNvdXJjZUxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHZhbC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxba10gaW5zdGFuY2VvZiBUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVzZWQodmFsW2tdLCB0ZXh0dXJlUmVzb3VyY2VMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2VvbWV0cnkgIT09IHByZXZHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVVzZWQoZ2VvbWV0cnksIGdlb21ldHJ5UmVzb3VyY2VMaXN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldk1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgICAgICAgICBwcmV2R2VvbWV0cnkgPSBnZW9tZXRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrUXVldWUoc2NlbmUub3BhcXVlTGlzdCk7XG4gICAgdHJhY2tRdWV1ZShzY2VuZS50cmFuc3BhcmVudExpc3QpO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBzY2VuZS5saWdodHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gVHJhY2sgQW1iaWVudEN1YmVtYXBcbiAgICAgICAgaWYgKHNjZW5lLmxpZ2h0c1trXS5jdWJlbWFwKSB7XG4gICAgICAgICAgICB1cGRhdGVVc2VkKHNjZW5lLmxpZ2h0c1trXS5jdWJlbWFwLCB0ZXh0dXJlUmVzb3VyY2VMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogTG9hZCBhIHRleHR1cmUgZnJvbSBpbWFnZSBvciBzdHJpbmcuXG4gKiBAcGFyYW0ge0ltYWdlTGlrZX0gaW1nXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIFRleHR1cmUgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxpcFk9dHJ1ZV0gSWYgZmxpcFkuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmZsaXBZfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmFuaXNvdHJvcGljXSBBbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmFuaXNvdHJvcGljfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBTPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBTfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBUPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBUfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1pbkZpbHRlcj1jbGF5LlRleHR1cmUuTElORUFSX01JUE1BUF9MSU5FQVJdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLm1pbkZpbHRlcn1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYWdGaWx0ZXI9Y2xheS5UZXh0dXJlLkxJTkVBUl0gU2VlIHtAbGluayBjbGF5LlRleHR1cmUubWFnRmlsdGVyfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmV4cG9zdXJlXSBPbmx5IGJlIHVzZWQgd2hlbiBzb3VyY2UgaXMgYSBIRFIgaW1hZ2UuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VDYWNoZV0gSWYgdXNlIGNhY2hlLlxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqIEBleGFtcGxlXG4gKiAgYXBwLmxvYWRUZXh0dXJlKCdkaWZmdXNlTWFwLmpwZycpXG4gKiAgICAgIC50aGVuKGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gKiAgICAgICAgICBtYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCB0ZXh0dXJlKTtcbiAqICAgICAgfSk7XG4gKi9cbkFwcDNELnByb3RvdHlwZS5sb2FkVGV4dHVyZSA9IGZ1bmN0aW9uICh1cmxPckltZywgb3B0cywgdXNlQ2FjaGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JbWFnZUxpa2UodXJsT3JJbWcpO1xuICAgIGlmICh1c2VDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5fdGV4Q2FjaGUuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXhDYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPIFByb21pc2UgP1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IHNlbGYubG9hZFRleHR1cmVTeW5jKHVybE9ySW1nLCBvcHRzKTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICB0ZXh0dXJlLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUodGV4dHVyZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRleHR1cmUuZXJyb3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHVzZUNhY2hlKSB7XG4gICAgICAgIHRoaXMuX3RleENhY2hlLnB1dChrZXksIHByb21pc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgdGV4dHVyZSBmcm9tIGltYWdlIG9yIHN0cmluZyBzeW5jaHJvbm91c2x5LiBUZXh0dXJlIGNhbiBiZSB1c2UgZGlyZWN0bHkgYW5kIGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgaXQncyBsb2FkZWQuXG4gKiBAcGFyYW0ge0ltYWdlTGlrZX0gaW1nXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIFRleHR1cmUgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxpcFk9dHJ1ZV0gSWYgZmxpcFkuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmZsaXBZfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmFuaXNvdHJvcGljXSBBbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmFuaXNvdHJvcGljfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBTPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBTfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBUPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBUfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1pbkZpbHRlcj1jbGF5LlRleHR1cmUuTElORUFSX01JUE1BUF9MSU5FQVJdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLm1pbkZpbHRlcn1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYWdGaWx0ZXI9Y2xheS5UZXh0dXJlLkxJTkVBUl0gU2VlIHtAbGluayBjbGF5LlRleHR1cmUubWFnRmlsdGVyfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmV4cG9zdXJlXSBPbmx5IGJlIHVzZWQgd2hlbiBzb3VyY2UgaXMgYSBIRFIgaW1hZ2UuXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogQGV4YW1wbGVcbiAqICB2YXIgdGV4dHVyZSA9IGFwcC5sb2FkVGV4dHVyZSgnZGlmZnVzZU1hcC5qcGcnLCB7XG4gKiAgICAgIGFuaXNvdHJvcGljOiA4LFxuICogICAgICBmbGlwWTogZmFsc2VcbiAqICB9KTtcbiAqICBtYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCB0ZXh0dXJlKTtcbiAqL1xuQXBwM0QucHJvdG90eXBlLmxvYWRUZXh0dXJlU3luYyA9IGZ1bmN0aW9uICh1cmxPckltZywgb3B0cykge1xuICAgIHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUyRChvcHRzKTtcbiAgICBpZiAodHlwZW9mIHVybE9ySW1nID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodXJsT3JJbWcubWF0Y2goLy5oZHIkfF5kYXRhOmFwcGxpY2F0aW9uXFwvb2N0ZXQtc3RyZWFtLykpIHtcbiAgICAgICAgICAgIHRleHR1cmUgPSB0ZXh0dXJlVXRpbC5sb2FkVGV4dHVyZSh1cmxPckltZywge1xuICAgICAgICAgICAgICAgIGV4cG9zdXJlOiBvcHRzICYmIG9wdHMuZXhwb3N1cmUsXG4gICAgICAgICAgICAgICAgZmlsZVR5cGU6ICdoZHInXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHRleHR1cmUudHJpZ2dlcignc3VjY2VzcycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0dXJlLmxvYWQodXJsT3JJbWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzSW1hZ2VMaWtlRWxlbWVudCh1cmxPckltZykpIHtcbiAgICAgICAgdGV4dHVyZS5pbWFnZSA9IHVybE9ySW1nO1xuICAgICAgICB0ZXh0dXJlLmR5bmFtaWMgPSB1cmxPckltZyBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0dXJlO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBtYXRlcmlhbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXRlcmlhbENvbmZpZy4gbWF0ZXJpYWxDb25maWcgY29udGFpbnMgYHNoYWRlcmAsIGB0cmFuc3BhcmVudGAgYW5kIHVuaWZvcm1zIHRoYXQgdXNlZCBpbiBjb3JyZXNwb25kaW5nIHVuaWZvcm1zLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlmb3JtcyBjYW4gYmUgYGNvbG9yYCwgYGFscGhhYCBgZGlmZnVzZU1hcGAgZXRjLlxuICogQHBhcmFtIHtzdHJpbmd8Y2xheS5TaGFkZXJ9IFtzaGFkZXI9J2NsYXkuc3RhbmRhcmRNUiddIERlZmF1bHQgdG8gYmUgc3RhbmRhcmQgc2hhZGVyIHdpdGggbWV0YWxuZXNzIGFuZCByb3VnaG5lc3Mgd29ya2Zsb3cuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0cmFuc3BhcmVudD1mYWxzZV0gSWYgbWF0ZXJpYWwgaXMgdHJhbnNwYXJlbnQuXG4gKiBAcmV0dXJuIHtjbGF5Lk1hdGVyaWFsfVxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlTWF0ZXJpYWwgPSBmdW5jdGlvbiAobWF0Q29uZmlnKSB7XG4gICAgbWF0Q29uZmlnID0gbWF0Q29uZmlnIHx8IHt9O1xuICAgIG1hdENvbmZpZy5zaGFkZXIgPSBtYXRDb25maWcuc2hhZGVyIHx8ICdjbGF5LnN0YW5kYXJkTVInO1xuICAgIHZhciBzaGFkZXIgPSBtYXRDb25maWcuc2hhZGVyIGluc3RhbmNlb2YgU2hhZGVyID8gbWF0Q29uZmlnLnNoYWRlciA6IHNoYWRlckxpYnJhcnkuZ2V0KG1hdENvbmZpZy5zaGFkZXIpO1xuICAgIHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgIHNoYWRlcjogc2hhZGVyXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gbWFrZVRleHR1cmVTZXR0ZXIoa2V5KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGV4dHVyZSkge1xuICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybShrZXksIHRleHR1cmUpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0Q29uZmlnKSB7XG4gICAgICAgIGlmIChtYXRlcmlhbC51bmlmb3Jtc1trZXldKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gbWF0Q29uZmlnW2tleV07XG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwudW5pZm9ybXNba2V5XS50eXBlID09PSAndCcgfHwgaXNJbWFnZUxpa2VFbGVtZW50KHZhbCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCBhIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGV4dHVyZSh2YWwpLnRoZW4obWFrZVRleHR1cmVTZXR0ZXIoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKGtleSwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYXRDb25maWcudHJhbnNwYXJlbnQpIHtcbiAgICAgICAgbWF0Q29uZmlnLmRlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICBtYXRDb25maWcudHJhbnNwYXJlbnQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0ZXJpYWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGN1YmUgbWVzaCBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZSBvciB0aGUgZ2l2ZW4gcGFyZW50IG5vZGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58bnVtYmVyfSBbc3ViZGl2aXNpb249MV0gU3ViZGl2aXNpb24gb2YgY3ViZS5cbiAqICAgICAgICAgIENhbiBiZSBhIG51bWJlciB0byByZXByZXNlbnQgYm90aCB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aCBkaW1lbnNpb25zLiBPciBhbiBhcnJheSB0byByZXByZXNlbnQgdGhlbSByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0ge09iamVjdHxjbGF5Lk1hdGVyaWFsfSBbbWF0ZXJpYWxdXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW3BhcmVudE5vZGVdIFBhcmVudCBub2RlIHRvIGFwcGVuZC4gRGVmYXVsdCB0byBiZSBzY2VuZS5cbiAqIEByZXR1cm4ge2NsYXkuTWVzaH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gQ3JlYXRlIGEgd2hpdGUgY3ViZS5cbiAqICBhcHAuY3JlYXRlQ3ViZSgpXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVDdWJlID0gZnVuY3Rpb24gKHN1YmRpdiwgbWF0ZXJpYWwsIHBhcmVudE5vZGUpIHtcbiAgICBpZiAoc3ViZGl2ID09IG51bGwpIHtcbiAgICAgICAgc3ViZGl2ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdWJkaXYgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHN1YmRpdiA9IFtzdWJkaXYsIHN1YmRpdiwgc3ViZGl2XTtcbiAgICB9XG5cbiAgICB2YXIgZ2VvS2V5ID0gJ2N1YmUtJyArIHN1YmRpdi5qb2luKCctJyk7XG4gICAgdmFyIGN1YmUgPSB0aGlzLl9nZW9DYWNoZS5nZXQoZ2VvS2V5KTtcbiAgICBpZiAoIWN1YmUpIHtcbiAgICAgICAgY3ViZSA9IG5ldyBDdWJlR2VvKHtcbiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHN1YmRpdlswXSxcbiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzdWJkaXZbMV0sXG4gICAgICAgICAgICBkZXB0aFNlZ21lbnRzOiBzdWJkaXZbMl1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2dlb0NhY2hlLnB1dChnZW9LZXksIGN1YmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNoKGN1YmUsIG1hdGVyaWFsLCBwYXJlbnROb2RlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY3ViZSBtZXNoIHRoYXQgY2FtZXJhIGlzIGluc2lkZSB0aGUgY3ViZS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPnxudW1iZXJ9IFtzdWJkaXZpc2lvbj0xXSBTdWJkaXZpc2lvbiBvZiBjdWJlLlxuICogICAgICAgICAgQ2FuIGJlIGEgbnVtYmVyIHRvIHJlcHJlc2VudCBib3RoIHdpZHRoLCBoZWlnaHQgYW5kIGRlcHRoIGRpbWVuc2lvbnMuIE9yIGFuIGFycmF5IHRvIHJlcHJlc2VudCB0aGVtIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSB7T2JqZWN0fGNsYXkuTWF0ZXJpYWx9IFttYXRlcmlhbF1cbiAqIEBwYXJhbSB7Y2xheS5Ob2RlfSBbcGFyZW50Tm9kZV0gUGFyZW50IG5vZGUgdG8gYXBwZW5kLiBEZWZhdWx0IHRvIGJlIHNjZW5lLlxuICogQHJldHVybiB7Y2xheS5NZXNofVxuICogQGV4YW1wbGVcbiAqICAvLyBDcmVhdGUgYSB3aGl0ZSBjdWJlIGluc2lkZS5cbiAqICBhcHAuY3JlYXRlQ3ViZUluc2lkZSgpXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVDdWJlSW5zaWRlID0gZnVuY3Rpb24gKHN1YmRpdiwgbWF0ZXJpYWwsIHBhcmVudE5vZGUpIHtcbiAgICBpZiAoc3ViZGl2ID09IG51bGwpIHtcbiAgICAgICAgc3ViZGl2ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdWJkaXYgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHN1YmRpdiA9IFtzdWJkaXYsIHN1YmRpdiwgc3ViZGl2XTtcbiAgICB9XG4gICAgdmFyIGdlb0tleSA9ICdjdWJlSW5zaWRlLScgKyBzdWJkaXYuam9pbignLScpO1xuICAgIHZhciBjdWJlID0gdGhpcy5fZ2VvQ2FjaGUuZ2V0KGdlb0tleSk7XG4gICAgaWYgKCFjdWJlKSB7XG4gICAgICAgIGN1YmUgPSBuZXcgQ3ViZUdlbyh7XG4gICAgICAgICAgICBpbnNpZGU6IHRydWUsXG4gICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiBzdWJkaXZbMF0sXG4gICAgICAgICAgICBoZWlnaHRTZWdtZW50czogc3ViZGl2WzFdLFxuICAgICAgICAgICAgZGVwdGhTZWdtZW50czogc3ViZGl2WzJdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9nZW9DYWNoZS5wdXQoZ2VvS2V5LCBjdWJlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNoKGN1YmUsIG1hdGVyaWFsLCBwYXJlbnROb2RlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgc3BoZXJlIG1lc2ggYW5kIGFkZCBpdCB0byB0aGUgc2NlbmUgb3IgdGhlIGdpdmVuIHBhcmVudCBub2RlLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N1YmRpdmlzaW9uPTIwXSBTdWJkaXZpc2lvbiBvZiBzcGhlcmUuXG4gKiBAcGFyYW0ge09iamVjdHxjbGF5Lk1hdGVyaWFsfSBbbWF0ZXJpYWxdXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW3BhcmVudE5vZGVdIFBhcmVudCBub2RlIHRvIGFwcGVuZC4gRGVmYXVsdCB0byBiZSBzY2VuZS5cbiAqIEByZXR1cm4ge2NsYXkuTWVzaH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gQ3JlYXRlIGEgc2VtaS10cmFuc3BhcmVudCBzcGhlcmUuXG4gKiAgYXBwLmNyZWF0ZVNwaGVyZSgyMCwge1xuICogICAgICBjb2xvcjogWzAsIDAsIDFdLFxuICogICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAqICAgICAgYWxwaGE6IDAuNVxuICogIH0pXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVTcGhlcmUgPSBmdW5jdGlvbiAoc3ViZGl2aXNpb24sIG1hdGVyaWFsLCBwYXJlbnROb2RlKSB7XG4gICAgaWYgKHN1YmRpdmlzaW9uID09IG51bGwpIHtcbiAgICAgICAgc3ViZGl2aXNpb24gPSAyMDtcbiAgICB9XG4gICAgdmFyIGdlb0tleSA9ICdzcGhlcmUtJyArIHN1YmRpdmlzaW9uO1xuICAgIHZhciBzcGhlcmUgPSB0aGlzLl9nZW9DYWNoZS5nZXQoZ2VvS2V5KTtcbiAgICBpZiAoIXNwaGVyZSkge1xuICAgICAgICBzcGhlcmUgPSBuZXcgU3BoZXJlR2VvKHtcbiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHN1YmRpdmlzaW9uICogMixcbiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzdWJkaXZpc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZ2VvQ2FjaGUucHV0KGdlb0tleSwgc3BoZXJlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzaChzcGhlcmUsIG1hdGVyaWFsLCBwYXJlbnROb2RlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcGxhbmUgbWVzaCBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZSBvciB0aGUgZ2l2ZW4gcGFyZW50IG5vZGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58bnVtYmVyfSBbc3ViZGl2aXNpb249MV0gU3ViZGl2aXNpb24gb2YgcGxhbmUuXG4gKiAgICAgICAgICBDYW4gYmUgYSBudW1iZXIgdG8gcmVwcmVzZW50IGJvdGggd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zLiBPciBhbiBhcnJheSB0byByZXByZXNlbnQgdGhlbSByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0ge09iamVjdHxjbGF5Lk1hdGVyaWFsfSBbbWF0ZXJpYWxdXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW3BhcmVudE5vZGVdIFBhcmVudCBub2RlIHRvIGFwcGVuZC4gRGVmYXVsdCB0byBiZSBzY2VuZS5cbiAqIEByZXR1cm4ge2NsYXkuTWVzaH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gQ3JlYXRlIGEgcmVkIGNvbG9yIHBsYW5lLlxuICogIGFwcC5jcmVhdGVQbGFuZSgxLCB7XG4gKiAgICAgIGNvbG9yOiBbMSwgMCwgMF1cbiAqICB9KVxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlUGxhbmUgPSBmdW5jdGlvbiAoc3ViZGl2LCBtYXRlcmlhbCwgcGFyZW50Tm9kZSkge1xuICAgIGlmIChzdWJkaXYgPT0gbnVsbCkge1xuICAgICAgICBzdWJkaXYgPSAxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN1YmRpdiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc3ViZGl2ID0gW3N1YmRpdiwgc3ViZGl2XTtcbiAgICB9XG4gICAgdmFyIGdlb0tleSA9ICdwbGFuZS0nICsgc3ViZGl2LmpvaW4oJy0nKTtcbiAgICB2YXIgcGxhbmVHZW8gPSB0aGlzLl9nZW9DYWNoZS5nZXQoZ2VvS2V5KTtcbiAgICBpZiAoIXBsYW5lR2VvKSB7XG4gICAgICAgIHBsYW5lR2VvID0gbmV3IFBsYW5lR2VvKHtcbiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHN1YmRpdlswXSxcbiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzdWJkaXZbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2dlb0NhY2hlLnB1dChnZW9LZXksIHBsYW5lR2VvKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzaChwbGFuZUdlbywgbWF0ZXJpYWwsIHBhcmVudE5vZGUpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBnZW5lcmFsIG1lc2ggd2l0aCBnaXZlbiBnZW9tZXRyeSBpbnN0YW5jZSBhbmQgbWF0ZXJpYWwgY29uZmlnLlxuICogQHBhcmFtIHsqfSBnZW9tZXRyeVxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlTWVzaCA9IGZ1bmN0aW9uIChnZW9tZXRyeSwgbWF0LCBwYXJlbnROb2RlKSB7XG4gICAgdmFyIG1lc2ggPSBuZXcgTWVzaCh7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgbWF0ZXJpYWw6IG1hdCBpbnN0YW5jZW9mIE1hdGVyaWFsID8gbWF0IDogdGhpcy5jcmVhdGVNYXRlcmlhbChtYXQpXG4gICAgfSk7XG4gICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUgfHwgdGhpcy5zY2VuZTtcbiAgICBwYXJlbnROb2RlLmFkZChtZXNoKTtcbiAgICByZXR1cm4gbWVzaDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIGNhbWVyYSBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58Y2xheS5tYXRoLlZlY3RvcjN9IHBvc2l0aW9uXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fGNsYXkubWF0aC5WZWN0b3IzfSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT1cInBlcnNwZWN0aXZlXCJdIENhbiBiZSAncGVyc3BlY3RpdmUnIG9yICdvcnRob2dyYXBoaWMnKGluIHNob3J0ICdvcnRobycpXG4gKiBAcmV0dXJuIHtjbGF5LmNhbWVyYS5QZXJzcGVjdGl2ZX1cbiAqL1xuQXBwM0QucHJvdG90eXBlLmNyZWF0ZUNhbWVyYSA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGFyZ2V0LCB0eXBlKSB7XG4gICAgdmFyIENhbWVyYUN0b3I7XG4gICAgaWYgKHR5cGUgPT09ICdvcnRobycgfHwgdHlwZSA9PT0gJ29ydGhvZ3JhcGhpYycpIHtcbiAgICAgICAgQ2FtZXJhQ3RvciA9IE9ydGhvZ3JhcGhpY0NhbWVyYTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICh0eXBlICYmIHR5cGUgIT09ICdwZXJzcGVjdGl2ZScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua293biBjYW1lcmEgdHlwZSAnICsgdHlwZSArICcuIFVzZSBkZWZhdWx0IHBlcnNwZWN0aXZlIGNhbWVyYScpO1xuICAgICAgICB9XG4gICAgICAgIENhbWVyYUN0b3IgPSBQZXJzcGVjdGl2ZUNhbWVyYTtcbiAgICB9XG5cbiAgICB2YXIgY2FtZXJhID0gbmV3IENhbWVyYUN0b3IoKTtcbiAgICBpZiAocG9zaXRpb24gaW5zdGFuY2VvZiBWZWN0b3IzKSB7XG4gICAgICAgIGNhbWVyYS5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9zaXRpb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0QXJyYXkocG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICB0YXJnZXQgPSBuZXcgVmVjdG9yMyh0YXJnZXRbMF0sIHRhcmdldFsxXSwgdGFyZ2V0WzJdKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgICAgY2FtZXJhLmxvb2tBdCh0YXJnZXQpO1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUuYWRkKGNhbWVyYSk7XG5cbiAgICByZXR1cm4gY2FtZXJhO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXJlY3Rpb25hbCBsaWdodCBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58Y2xheS5tYXRoLlZlY3RvcjN9IGRpciBBIFZlY3RvcjMgb3IgYXJyYXkgdG8gcmVwcmVzZW50IHRoZSBkaXJlY3Rpb24uXG4gKiBAcGFyYW0ge0NvbG9yfSBbY29sb3I9JyNmZmYnXSBDb2xvciBvZiBkaXJlY3Rpb25hbCBsaWdodCwgZGVmYXVsdCB0byBiZSB3aGl0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5XSBJbnRlbnNpdHkgb2YgZGlyZWN0aW9uYWwgbGlnaHQsIGRlZmF1bHQgdG8gYmUgMS5cbiAqXG4gKiBAZXhhbXBsZVxuICogIGFwcC5jcmVhdGVEaXJlY3Rpb25hbExpZ2h0KFstMSwgLTEsIC0xXSwgJyNmZmYnLCAyKTtcbiAqL1xuQXBwM0QucHJvdG90eXBlLmNyZWF0ZURpcmVjdGlvbmFsTGlnaHQgPSBmdW5jdGlvbiAoZGlyLCBjb2xvciwgaW50ZW5zaXR5KSB7XG4gICAgdmFyIGxpZ2h0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoKTtcbiAgICBpZiAoZGlyIGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgICBkaXIgPSBkaXIuYXJyYXk7XG4gICAgfVxuICAgIGxpZ2h0LnBvc2l0aW9uLnNldEFycmF5KGRpcikubmVnYXRlKCk7XG4gICAgbGlnaHQubG9va0F0KFZlY3RvcjMuWkVSTyk7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sb3IgPSBwYXJzZUNvbG9yKGNvbG9yKTtcbiAgICB9XG4gICAgY29sb3IgIT0gbnVsbCAmJiAobGlnaHQuY29sb3IgPSBjb2xvcik7XG4gICAgaW50ZW5zaXR5ICE9IG51bGwgJiYgKGxpZ2h0LmludGVuc2l0eSA9IGludGVuc2l0eSk7XG5cbiAgICB0aGlzLnNjZW5lLmFkZChsaWdodCk7XG4gICAgcmV0dXJuIGxpZ2h0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBzcG90IGxpZ2h0IGFuZCBhZGQgaXQgdG8gdGhlIHNjZW5lLlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPnxjbGF5Lm1hdGguVmVjdG9yM30gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIHNwb3QgbGlnaHQuXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fGNsYXkubWF0aC5WZWN0b3IzfSBbdGFyZ2V0XSBUYXJnZXQgcG9zaXRpb24gd2hlcmUgc3BvdCBsaWdodCBwb2ludHMgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhbmdlPTIwXSBGYWxsb2ZmIHJhbmdlIG9mIHNwb3QgbGlnaHQuIERlZmF1bHQgdG8gYmUgMjAuXG4gKiBAcGFyYW0ge0NvbG9yfSBbY29sb3I9JyNmZmYnXSBDb2xvciBvZiBzcG90IGxpZ2h0LCBkZWZhdWx0IHRvIGJlIHdoaXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gSW50ZW5zaXR5IG9mIHNwb3QgbGlnaHQsIGRlZmF1bHQgdG8gYmUgMS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdW1icmFBbmdsZT0zMF0gVW1icmEgYW5nbGUgb2Ygc3BvdCBsaWdodC4gRGVmYXVsdCB0byBiZSAzMCBkZWdyZWUgZnJvbSB0aGUgbWlkZGxlIGxpbmUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3BlbnVtYnJhQW5nbGU9NDVdIFBlbnVtYnJhIGFuZ2xlIG9mIHNwb3QgbGlnaHQuIERlZmF1bHQgdG8gYmUgNDUgZGVncmVlIGZyb20gdGhlIG1pZGRsZSBsaW5lLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgYXBwLmNyZWF0ZVNwb3RMaWdodChbNSwgNSwgNV0sIFswLCAwLCAwXSwgMjAsICM5MDApO1xuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlU3BvdExpZ2h0ID0gZnVuY3Rpb24gKHBvc2l0aW9uLCB0YXJnZXQsIHJhbmdlLCBjb2xvciwgaW50ZW5zaXR5LCB1bWJyYUFuZ2xlLCBwZW51bWJyYUFuZ2xlKSB7XG4gICAgdmFyIGxpZ2h0ID0gbmV3IFNwb3RMaWdodCgpO1xuICAgIGxpZ2h0LnBvc2l0aW9uLnNldEFycmF5KHBvc2l0aW9uIGluc3RhbmNlb2YgVmVjdG9yMyA/IHBvc2l0aW9uLmFycmF5IDogcG9zaXRpb24pO1xuXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHRhcmdldCA9IG5ldyBWZWN0b3IzKHRhcmdldFswXSwgdGFyZ2V0WzFdLCB0YXJnZXRbMl0pO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgICBsaWdodC5sb29rQXQodGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb2xvciA9IHBhcnNlQ29sb3IoY29sb3IpO1xuICAgIH1cbiAgICByYW5nZSAhPSBudWxsICYmIChsaWdodC5yYW5nZSA9IHJhbmdlKTtcbiAgICBjb2xvciAhPSBudWxsICYmIChsaWdodC5jb2xvciA9IGNvbG9yKTtcbiAgICBpbnRlbnNpdHkgIT0gbnVsbCAmJiAobGlnaHQuaW50ZW5zaXR5ID0gaW50ZW5zaXR5KTtcbiAgICB1bWJyYUFuZ2xlICE9IG51bGwgJiYgKGxpZ2h0LnVtYnJhQW5nbGUgPSB1bWJyYUFuZ2xlKTtcbiAgICBwZW51bWJyYUFuZ2xlICE9IG51bGwgJiYgKGxpZ2h0LnBlbnVtYnJhQW5nbGUgPSBwZW51bWJyYUFuZ2xlKTtcblxuICAgIHRoaXMuc2NlbmUuYWRkKGxpZ2h0KTtcblxuICAgIHJldHVybiBsaWdodDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcG9pbnQgbGlnaHQuXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fGNsYXkubWF0aC5WZWN0b3IzfSBwb3NpdGlvbiBQb3NpdGlvbiBvZiBwb2ludCBsaWdodC4uXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhbmdlPTEwMF0gRmFsbG9mZiByYW5nZSBvZiBwb2ludCBsaWdodC5cbiAqIEBwYXJhbSB7Q29sb3J9IFtjb2xvcj0nI2ZmZiddIENvbG9yIG9mIHBvaW50IGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gSW50ZW5zaXR5IG9mIHBvaW50IGxpZ2h0LlxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlUG9pbnRMaWdodCA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgcmFuZ2UsIGNvbG9yLCBpbnRlbnNpdHkpIHtcbiAgICB2YXIgbGlnaHQgPSBuZXcgUG9pbnRMaWdodCgpO1xuICAgIGxpZ2h0LnBvc2l0aW9uLnNldEFycmF5KHBvc2l0aW9uIGluc3RhbmNlb2YgVmVjdG9yMyA/IHBvc2l0aW9uLmFycmF5IDogcG9zaXRpb24pO1xuXG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sb3IgPSBwYXJzZUNvbG9yKGNvbG9yKTtcbiAgICB9XG4gICAgcmFuZ2UgIT0gbnVsbCAmJiAobGlnaHQucmFuZ2UgPSByYW5nZSk7XG4gICAgY29sb3IgIT0gbnVsbCAmJiAobGlnaHQuY29sb3IgPSBjb2xvcik7XG4gICAgaW50ZW5zaXR5ICE9IG51bGwgJiYgKGxpZ2h0LmludGVuc2l0eSA9IGludGVuc2l0eSk7XG5cbiAgICB0aGlzLnNjZW5lLmFkZChsaWdodCk7XG5cbiAgICByZXR1cm4gbGlnaHQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGFtYmllbnQgbGlnaHQuXG4gKiBAcGFyYW0ge0NvbG9yfSBbY29sb3I9JyNmZmYnXSBDb2xvciBvZiBhbWJpZW50IGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gSW50ZW5zaXR5IG9mIGFtYmllbnQgbGlnaHQuXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVBbWJpZW50TGlnaHQgPSBmdW5jdGlvbiAoY29sb3IsIGludGVuc2l0eSkge1xuICAgIHZhciBsaWdodCA9IG5ldyBBbWJpZW50TGlnaHQoKTtcblxuICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbG9yID0gcGFyc2VDb2xvcihjb2xvcik7XG4gICAgfVxuICAgIGNvbG9yICE9IG51bGwgJiYgKGxpZ2h0LmNvbG9yID0gY29sb3IpO1xuICAgIGludGVuc2l0eSAhPSBudWxsICYmIChsaWdodC5pbnRlbnNpdHkgPSBpbnRlbnNpdHkpO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQobGlnaHQpO1xuXG4gICAgcmV0dXJuIGxpZ2h0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gY3ViZW1hcCBhbWJpZW50IGxpZ2h0IGFuZCBhbiBzcGhlcmljYWwgaGFybW9uaWMgYW1iaWVudCBsaWdodFxuICogZm9yIHNwZWN1bGFyIGFuZCBkaWZmdXNlIGxpZ2h0aW5nIGluIFBCUiByZW5kZXJpbmdcbiAqIEBwYXJhbSB7SW1hZ2VMaWtlfSBbZW52SW1hZ2VdIFBhbm9yYW1hIGVudmlyb25tZW50IGltYWdlLCBIRFIgZm9ybWF0IGlzIGJldHRlci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3BlY3VsYXJJbnRlbnN0aXR5PTAuN10gSW50ZW5zaXR5IG9mIHNwZWN1bGFyIGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtkaWZmdXNlSW50ZW5zdGl0eT0wLjddIEludGVuc2l0eSBvZiBkaWZmdXNlIGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtleHBvc3VyZT0xXSBFeHBvc3VyZSBvZiBIRFIgaW1hZ2UuIE9ubHkgaWYgaW1hZ2UgaW4gZmlyc3QgcGFyYW10ZXIgaXMgSERSLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwcmVmaWx0ZXJlZEN1YmVtYXBTaXplPTMyXSBUaGUgc2l6ZSBvZiBwcmVmaWxlcnRlZCBjdWJlbWFwLiBMYXJnZXIgdmFsdWUgd2lsbCB0YWtlIG1vcmUgdGltZSB0byBkbyBleHBlbnNpdmUgcHJlZmlsdGVyaW5nLlxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlQW1iaWVudEN1YmVtYXBMaWdodCA9IGZ1bmN0aW9uIChlbnZJbWFnZSwgc3BlY0ludGVuc2l0eSwgZGlmZkludGVuc2l0eSwgZXhwb3N1cmUsIHByZWZpbHRlcmVkQ3ViZW1hcFNpemUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGV4cG9zdXJlID09IG51bGwpIHtcbiAgICAgICAgZXhwb3N1cmUgPSAxO1xuICAgIH1cbiAgICBpZiAocHJlZmlsdGVyZWRDdWJlbWFwU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHByZWZpbHRlcmVkQ3ViZW1hcFNpemUgPSAzMjtcbiAgICB9XG5cbiAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuXG4gICAgcmV0dXJuIHRoaXMubG9hZFRleHR1cmUoZW52SW1hZ2UsIHtcbiAgICAgICAgZXhwb3N1cmU6IGV4cG9zdXJlXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZW52VGV4dHVyZSkge1xuICAgICAgICB2YXIgc3BlY0xpZ2h0ID0gbmV3IEFtYmllbnRDdWJlbWFwTGlnaHQoe1xuICAgICAgICAgICAgaW50ZW5zaXR5OiBzcGVjSW50ZW5zaXR5ICE9IG51bGwgPyBzcGVjSW50ZW5zaXR5IDogMC43XG4gICAgICAgIH0pO1xuICAgICAgICBzcGVjTGlnaHQuY3ViZW1hcCA9IGVudlRleHR1cmU7XG4gICAgICAgIGVudlRleHR1cmUuZmxpcFkgPSBmYWxzZTtcbiAgICAgICAgLy8gVE9ETyBDYWNoZSBwcmVmaWx0ZXIgP1xuICAgICAgICBzcGVjTGlnaHQucHJlZmlsdGVyKHNlbGYucmVuZGVyZXIsIDMyKTtcblxuICAgICAgICB2YXIgZGlmZkxpZ2h0ID0gbmV3IEFtYmllbnRTSExpZ2h0KHtcbiAgICAgICAgICAgIGludGVuc2l0eTogZGlmZkludGVuc2l0eSAhPSBudWxsID8gZGlmZkludGVuc2l0eSA6IDAuNyxcbiAgICAgICAgICAgIGNvZWZmaWNpZW50czogc2hVdGlsLnByb2plY3RFbnZpcm9ubWVudE1hcChcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlcmVyLCBzcGVjTGlnaHQuY3ViZW1hcCwge1xuICAgICAgICAgICAgICAgICAgICBsb2Q6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH0pO1xuICAgICAgICBzY2VuZS5hZGQoc3BlY0xpZ2h0KTtcbiAgICAgICAgc2NlbmUuYWRkKGRpZmZMaWdodCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwZWN1bGFyOiBzcGVjTGlnaHQsXG4gICAgICAgICAgICBkaWZmdXNlOiBkaWZmTGlnaHQsXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBlbnZpcm9ubWVudCBtYXBcbiAgICAgICAgICAgIGVudmlyb25tZW50TWFwOiBlbnZUZXh0dXJlXG4gICAgICAgIH07XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIExvYWQgYSBbZ2xURl0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGKSBmb3JtYXQgbW9kZWwuXG4gKiBZb3UgY2FuIGNvbnZlcnQgRkJYL0RBRS9PQkogZm9ybWF0IG1vZGVscyB0byBbZ2xURl0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGKSB3aXRoIFtmYngyZ2x0Zl0oaHR0cHM6Ly9naXRodWIuY29tL3Bpc3NhbmcvY2xheWdsI2ZieC10by1nbHRmMjAtY29udmVydGVyKSBweXRob24gc2NyaXB0LFxuICogb3Igc2ltcGx5IHVzaW5nIHRoZSBbQ2xheSBWaWV3ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9waXNzYW5nL2NsYXktdmlld2VyKSBjbGllbnQgYXBwbGljYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHBhcmFtIHtzdHJpbmd8Y2xheS5TaGFkZXJ9IFtvcHRzLnNoYWRlcj0nY2xheS5zdGFuZGFyZCddICdiYXNpYyd8J2xhbWJlcnQnfCdzdGFuZGFyZCcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLndhaXRUZXh0dXJlTG9hZGVkPWZhbHNlXSBJZiBhZGQgdG8gc2NlbmUgdXRpbCB0ZXh0dXJlcyBhcmUgYWxsIGxvYWRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuYXV0b1BsYXlBbmltYXRpb249dHJ1ZV0gSWYgYXV0b3BsYXkgdGhlIGFuaW1hdGlvbiBvZiBtb2RlbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMudXBBeGlzPSd5J10gQ2hhbmdlIG1vZGVsIHRvIHkgdXAgaWYgdXBBeGlzIGlzICd6J1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy50ZXh0dXJlRmxpcFk9ZmFsc2VdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGV4dHVyZVJvb3RQYXRoXSBSb290IHBhdGggb2YgdGV4dHVyZS4gRGVmYXVsdCB0byBiZSByZWxhdGl2ZSB3aXRoIGdsVEYgZmlsZS5cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbkFwcDNELnByb3RvdHlwZS5sb2FkTW9kZWwgPSBmdW5jdGlvbiAodXJsLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVUkwuJyk7XG4gICAgfVxuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKG9wdHMuYXV0b1BsYXlBbmltYXRpb24gPT0gbnVsbCkge1xuICAgICAgICBvcHRzLmF1dG9QbGF5QW5pbWF0aW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHNoYWRlciA9IG9wdHMuc2hhZGVyIHx8ICdjbGF5LnN0YW5kYXJkJztcblxuICAgIHZhciBsb2FkZXJPcHRzID0ge1xuICAgICAgICByb290Tm9kZTogbmV3IE5vZGUoKSxcbiAgICAgICAgc2hhZGVyOiBzaGFkZXIsXG4gICAgICAgIHRleHR1cmVSb290UGF0aDogb3B0cy50ZXh0dXJlUm9vdFBhdGgsXG4gICAgICAgIGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcbiAgICAgICAgdGV4dHVyZUZsaXBZOiBvcHRzLnRleHR1cmVGbGlwWVxuICAgIH07XG4gICAgaWYgKG9wdHMudXBBeGlzICYmIG9wdHMudXBBeGlzLnRvTG93ZXJDYXNlKCkgPT09ICd6Jykge1xuICAgICAgICBsb2FkZXJPcHRzLnJvb3ROb2RlLnJvdGF0aW9uLmlkZW50aXR5KCkucm90YXRlWCgtTWF0aC5QSSAvIDIpO1xuICAgIH1cblxuICAgIHZhciBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcihsb2FkZXJPcHRzKTtcblxuICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgdmFyIHRpbWVsaW5lID0gdGhpcy50aW1lbGluZTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBhZnRlckxvYWQocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjZW5lLmFkZChyZXN1bHQucm9vdE5vZGUpO1xuICAgICAgICAgICAgaWYgKG9wdHMuYXV0b1BsYXlBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2xpcHMuZm9yRWFjaChmdW5jdGlvbiAoY2xpcCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZS5hZGRDbGlwKGNsaXApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGxvYWRlci5zdWNjZXNzKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvcHRzLndhaXRUZXh0dXJlTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXJMb2FkKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChyZXN1bHQudGV4dHVyZXMubWFwKGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5zdWNjZXNzKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5lcnJvcihyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckxvYWQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyTG9hZChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9hZGVyLmVycm9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9hZGVyLmxvYWQodXJsKTtcbiAgICB9KTtcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIEFwcDNEOiBBcHAzRCxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSAzRCBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgbWFuYWdlIHRoZSBhcHAgaW5pdGlhbGl6YXRpb24gYW5kIGxvb3AuXG4gICAgICogQG5hbWUgY2xheS5hcHBsaWNhdGlvbi5jcmVhdGVcbiAgICAgKiBAcGFyYW0ge0hUTUxEb21FbGVtZW50fHN0cmluZ30gZG9tIENvbnRhaW5lciBkb20gZWxlbWVudCBvciBhIHNlbGVjdG9yIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGBxdWVyeVNlbGVjdG9yYFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcHBOU1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXQgSW5pdGlhbGl6YXRpb24gY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGluaXRpbmcgYXBwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxvb3AgTG9vcCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIGVhY2ggZnJhbWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gQ29udGFpbmVyIHdpZHRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSBDb250YWluZXIgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGV2aWNlUGl4ZWxSYXRpb11cbiAgICAgKiBAcmV0dXJuIHtjbGF5LmFwcGxpY2F0aW9uLkFwcDNEfVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgY2xheS5hcHBsaWNhdGlvbi5jcmVhdGUoJyNhcHAnLCB7XG4gICAgICogICAgICBpbml0OiBmdW5jdGlvbiAoYXBwKSB7XG4gICAgICogICAgICAgICAgYXBwLmNyZWF0ZUN1YmUoKTtcbiAgICAgKiAgICAgICAgICB2YXIgY2FtZXJhID0gYXBwLmNyZWF0ZUNhbWVyYSgpO1xuICAgICAqICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgMCwgMik7XG4gICAgICogICAgICB9LFxuICAgICAqICAgICAgbG9vcDogZnVuY3Rpb24gKCkgeyAvLyBub29wIH1cbiAgICAgKiAgfSlcbiAgICAgKi9cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChkb20sIGFwcE5TKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwM0QoZG9tLCBhcHBOUyk7XG4gICAgfVxufTsiLCJpbXBvcnQgbm90aWZpZXIgZnJvbSAnLi4vY29yZS9taXhpbi9ub3RpZmllcic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi9jb3JlL3JlcXVlc3QnO1xuaW1wb3J0IHV0aWwgIGZyb20gJy4uL2NvcmUvdXRpbCc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5hc3luYy5UYXNrXG4gKiBAbWl4ZXMgY2xheS5jb3JlLm1peGluLm5vdGlmaWVyXG4gKi9cbnZhciBUYXNrID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZnVsbGZpbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlamVjdGVkID0gZmFsc2U7XG59O1xuLyoqXG4gKiBUYXNrIHN1Y2Nlc3NlZFxuICogQHBhcmFtIHt9IGRhdGFcbiAqL1xuVGFzay5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB0aGlzLl9mdWxsZmlsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWplY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMudHJpZ2dlcignc3VjY2VzcycsIGRhdGEpO1xufTtcbi8qKlxuICogVGFzayBmYWlsZWRcbiAqIEBwYXJhbSB7fSBlcnJcbiAqL1xuVGFzay5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgdGhpcy5fcmVqZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuX2Z1bGxmaWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgZXJyKTtcbn07XG4vKipcbiAqIElmIHRhc2sgc3VjY2Vzc2VkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5UYXNrLnByb3RvdHlwZS5pc0Z1bGxmaWxsZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbGZpbGxlZDtcbn07XG4vKipcbiAqIElmIHRhc2sgZmFpbGVkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5UYXNrLnByb3RvdHlwZS5pc1JlamVjdGVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlamVjdGVkO1xufTtcbi8qKlxuICogSWYgdGFzayBmaW5pc2hlZCwgZWl0aGVyIHN1Y2Nlc3NlZCBvciBmYWlsZWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblRhc2sucHJvdG90eXBlLmlzU2V0dGxlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsZmlsbGVkIHx8IHRoaXMuX3JlamVjdGVkO1xufTtcblxudXRpbC5leHRlbmQoVGFzay5wcm90b3R5cGUsIG5vdGlmaWVyKTtcblxuZnVuY3Rpb24gbWFrZVJlcXVlc3RUYXNrKHVybCwgcmVzcG9uc2VUeXBlKSB7XG4gICAgdmFyIHRhc2sgPSBuZXcgVGFzaygpO1xuICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogcmVzcG9uc2VUeXBlLFxuICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB0YXNrLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGFzaztcbn1cbi8qKlxuICogTWFrZSBhIHJlcXVlc3QgdGFza1xuICogQHBhcmFtICB7c3RyaW5nfG9iamVjdHxvYmplY3RbXXxzdHJpbmdbXX0gdXJsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtyZXNwb25zZVR5cGVdXG4gKiBAZXhhbXBsZVxuICogICAgIHZhciB0YXNrID0gVGFzay5tYWtlUmVxdWVzdFRhc2soJy4vYS5qc29uJyk7XG4gKiAgICAgdmFyIHRhc2sgPSBUYXNrLm1ha2VSZXF1ZXN0VGFzayh7XG4gKiAgICAgICAgIHVybDogJ2IuYmluJyxcbiAqICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIHRhc2tzID0gVGFzay5tYWtlUmVxdWVzdFRhc2soWycuL2EuanNvbicsICcuL2IuanNvbiddKTtcbiAqICAgICB2YXIgdGFza3MgPSBUYXNrLm1ha2VSZXF1ZXN0VGFzayhbXG4gKiAgICAgICAgIHt1cmw6ICdhLmpzb24nfSxcbiAqICAgICAgICAge3VybDogJ2IuYmluJywgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfVxuICogICAgIF0pO1xuICogQHJldHVybiB7Y2xheS5hc3luYy5UYXNrfGNsYXkuYXN5bmMuVGFza1tdfVxuICovXG5UYXNrLm1ha2VSZXF1ZXN0VGFzayA9IGZ1bmN0aW9uKHVybCwgcmVzcG9uc2VUeXBlKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdFRhc2sodXJsLCByZXNwb25zZVR5cGUpO1xuICAgIH0gZWxzZSBpZiAodXJsLnVybCkgeyAgIC8vICBDb25maWd1cmUgb2JqZWN0XG4gICAgICAgIHZhciBvYmogPSB1cmw7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdFRhc2sob2JqLnVybCwgb2JqLnJlc3BvbnNlVHlwZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHsgIC8vIFVybCBsaXN0XG4gICAgICAgIHZhciB1cmxMaXN0ID0gdXJsO1xuICAgICAgICB2YXIgdGFza3MgPSBbXTtcbiAgICAgICAgdXJsTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgdmFyIHVybCwgcmVzcG9uc2VUeXBlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gb2JqO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChPYmplY3Qob2JqKSA9PT0gb2JqKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gb2JqLnVybDtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGUgPSBvYmoucmVzcG9uc2VUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFza3MucHVzaChtYWtlUmVxdWVzdFRhc2sodXJsLCByZXNwb25zZVR5cGUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXNrcztcbiAgICB9XG59O1xuLyoqXG4gKiBAcmV0dXJuIHtjbGF5LmFzeW5jLlRhc2t9XG4gKi9cblRhc2subWFrZVRhc2sgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRhc2soKTtcbn07XG5cbnV0aWwuZXh0ZW5kKFRhc2sucHJvdG90eXBlLCBub3RpZmllcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRhc2s7XG4iLCJpbXBvcnQgdXRpbCBmcm9tICcuLi9jb3JlL3V0aWwnO1xuaW1wb3J0IFRhc2sgZnJvbSAnLi9UYXNrJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LmFzeW5jLlRhc2tHcm91cFxuICogQGV4dGVuZHMgY2xheS5hc3luYy5UYXNrXG4gKi9cbnZhciBUYXNrR3JvdXAgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBUYXNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLl90YXNrcyA9IFtdO1xuXG4gICAgdGhpcy5fZnVsZmlsbGVkTnVtYmVyID0gMDtcblxuICAgIHRoaXMuX3JlamVjdGVkTnVtYmVyID0gMDtcbn07XG5cbnZhciBDdG9yID0gZnVuY3Rpb24gKCl7fTtcbkN0b3IucHJvdG90eXBlID0gVGFzay5wcm90b3R5cGU7XG5UYXNrR3JvdXAucHJvdG90eXBlID0gbmV3IEN0b3IoKTtcblxuVGFza0dyb3VwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRhc2tHcm91cDtcblxuLyoqXG4gKiBXYWl0IGZvciBhbGwgZ2l2ZW4gdGFza3Mgc3VjY2Vzc2VkLCB0YXNrIGNhbiBhbHNvIGJlIGFueSBub3RpZmllciBvYmplY3Qgd2hpY2ggd2lsbCB0cmlnZ2VyIHN1Y2Nlc3MgYW5kIGVycm9yIGV2ZW50cy4gTGlrZSB7QGxpbmsgY2xheS5UZXh0dXJlMkR9LCB7QGxpbmsgY2xheS5UZXh0dXJlQ3ViZX0sIHtAbGluayBjbGF5LmxvYWRlci5HTFRGfS5cbiAqIEBwYXJhbSAge0FycmF5LjxjbGF5LmFzeW5jLlRhc2s+fSB0YXNrc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqICAgICAvLyBMb2FkIHRleHR1cmUgbGlzdFxuICogICAgIHZhciBsaXN0ID0gWydhLmpwZycsICdiLmpwZycsICdjLmpwZyddXG4gKiAgICAgdmFyIHRleHR1cmVzID0gbGlzdC5tYXAoZnVuY3Rpb24gKHNyYykge1xuICogICAgICAgICB2YXIgdGV4dHVyZSA9IG5ldyBjbGF5LlRleHR1cmUyRCgpO1xuICogICAgICAgICB0ZXh0dXJlLmxvYWQoc3JjKTtcbiAqICAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIHRhc2tHcm91cCA9IG5ldyBjbGF5LmFzeW5jLlRhc2tHcm91cCgpO1xuICogICAgIHRhc2tHcm91cC5hbGwodGV4dHVyZXMpLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICogICAgICAgICAvLyBEbyBzb21lIHRoaW5nIGFmdGVyIGFsbCB0ZXh0dXJlcyBsb2FkZWRcbiAqICAgICB9KTtcbiAqL1xuVGFza0dyb3VwLnByb3RvdHlwZS5hbGwgPSBmdW5jdGlvbiAodGFza3MpIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIHRoaXMuX3Rhc2tzID0gdGFza3M7XG4gICAgdGhpcy5fZnVsZmlsbGVkTnVtYmVyID0gMDtcbiAgICB0aGlzLl9yZWplY3RlZE51bWJlciA9IDA7XG5cbiAgICB1dGlsLmVhY2godGFza3MsIGZ1bmN0aW9uICh0YXNrLCBpZHgpIHtcbiAgICAgICAgaWYgKCF0YXNrIHx8ICF0YXNrLm9uY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb3VudCsrO1xuICAgICAgICB0YXNrLm9uY2UoJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICBjb3VudC0tO1xuXG4gICAgICAgICAgICBzZWxmLl9mdWxmaWxsZWROdW1iZXIrKztcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vIFNvbWUgdGFza3MgbGlrZSB0ZXh0dXJlLCBsb2FkZXIgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0YXNrXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgc3RhdGVzIGhlcmVcbiAgICAgICAgICAgIHRhc2suX2Z1bGZpbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBkYXRhW2lkeF0gPSByZXM7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0YXNrLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBzZWxmLl9yZWplY3RlZE51bWJlciArKztcblxuICAgICAgICAgICAgdGFzay5fZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHNlbGYucmVqZWN0KHRhc2spO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuLyoqXG4gKiBXYWl0IGZvciBhbGwgZ2l2ZW4gdGFza3MgZmluaXNoZWQsIGVpdGhlciBzdWNjZXNzZWQgb3IgZmFpbGVkXG4gKiBAcGFyYW0gIHtBcnJheS48Y2xheS5hc3luYy5UYXNrPn0gdGFza3NcbiAqIEByZXR1cm4ge2NsYXkuYXN5bmMuVGFza0dyb3VwfVxuICovXG5UYXNrR3JvdXAucHJvdG90eXBlLmFsbFNldHRsZWQgPSBmdW5jdGlvbiAodGFza3MpIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl90YXNrcyA9IHRhc2tzO1xuXG4gICAgdXRpbC5lYWNoKHRhc2tzLCBmdW5jdGlvbiAodGFzaywgaWR4KSB7XG4gICAgICAgIGlmICghdGFzayB8fCAhdGFzay5vbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY291bnQrKztcbiAgICAgICAgdGFzay5vbmNlKCdzdWNjZXNzJywgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgY291bnQtLTtcblxuICAgICAgICAgICAgc2VsZi5fZnVsZmlsbGVkTnVtYmVyKys7XG5cbiAgICAgICAgICAgIHRhc2suX2Z1bGZpbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBkYXRhW2lkeF0gPSByZXM7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0YXNrLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY291bnQtLTtcblxuICAgICAgICAgICAgc2VsZi5fcmVqZWN0ZWROdW1iZXIrKztcblxuICAgICAgICAgICAgdGFzay5fZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIGRhdGFbaWR4XSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufTtcbi8qKlxuICogR2V0IHN1Y2Nlc3NlZCBzdWIgdGFza3MgbnVtYmVyLCByZWN1cnNpdmUgY2FuIGJlIHRydWUgaWYgc3ViIHRhc2sgaXMgYWxzbyBhIFRhc2tHcm91cC5cbiAqIEBwYXJhbSAge2Jvb2xlYW59IFtyZWN1cnNpdmVdXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblRhc2tHcm91cC5wcm90b3R5cGUuZ2V0RnVsZmlsbGVkTnVtYmVyID0gZnVuY3Rpb24gKHJlY3Vyc2l2ZSkge1xuICAgIGlmIChyZWN1cnNpdmUpIHtcbiAgICAgICAgdmFyIG5GdWxmaWxsZWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRoaXMuX3Rhc2tzW2ldO1xuICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUYXNrR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuRnVsZmlsbGVkICs9IHRhc2suZ2V0RnVsZmlsbGVkTnVtYmVyKHJlY3Vyc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYodGFzay5fZnVsZmlsbGVkKSB7XG4gICAgICAgICAgICAgICAgbkZ1bGZpbGxlZCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuRnVsZmlsbGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdWxmaWxsZWROdW1iZXI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBHZXQgZmFpbGVkIHN1YiB0YXNrcyBudW1iZXIsIHJlY3Vyc2l2ZSBjYW4gYmUgdHJ1ZSBpZiBzdWIgdGFzayBpcyBhbHNvIGEgVGFza0dyb3VwLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZV1cbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVGFza0dyb3VwLnByb3RvdHlwZS5nZXRSZWplY3RlZE51bWJlciA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHZhciBuUmVqZWN0ZWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRoaXMuX3Rhc2tzW2ldO1xuICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUYXNrR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuUmVqZWN0ZWQgKz0gdGFzay5nZXRSZWplY3RlZE51bWJlcihyZWN1cnNpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHRhc2suX3JlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgblJlamVjdGVkICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5SZWplY3RlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVqZWN0ZWROdW1iZXI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBHZXQgZmluaXNoZWQgc3ViIHRhc2tzIG51bWJlciwgcmVjdXJzaXZlIGNhbiBiZSB0cnVlIGlmIHN1YiB0YXNrIGlzIGFsc28gYSBUYXNrR3JvdXAuXG4gKiBAcGFyYW0gIHtib29sZWFufSBbcmVjdXJzaXZlXVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5UYXNrR3JvdXAucHJvdG90eXBlLmdldFNldHRsZWROdW1iZXIgPSBmdW5jdGlvbiAocmVjdXJzaXZlKSB7XG5cbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHZhciBuU2V0dGxlZCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGhpcy5fdGFza3NbaV07XG4gICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIFRhc2tHcm91cCkge1xuICAgICAgICAgICAgICAgIG5TZXR0bGVkICs9IHRhc2suZ2V0U2V0dGxlZE51bWJlcihyZWN1cnNpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHRhc2suX3JlamVjdGVkIHx8IHRhc2suX2Z1bGZpbGxlZCkge1xuICAgICAgICAgICAgICAgIG5TZXR0bGVkICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5TZXR0bGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdWxmaWxsZWROdW1iZXIgKyB0aGlzLl9yZWplY3RlZE51bWJlcjtcbiAgICB9XG59O1xuXG4vKipcbiAqIEdldCBhbGwgc3ViIHRhc2tzIG51bWJlciwgcmVjdXJzaXZlIGNhbiBiZSB0cnVlIGlmIHN1YiB0YXNrIGlzIGFsc28gYSBUYXNrR3JvdXAuXG4gKiBAcGFyYW0gIHtib29sZWFufSBbcmVjdXJzaXZlXVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5UYXNrR3JvdXAucHJvdG90eXBlLmdldFRhc2tOdW1iZXIgPSBmdW5jdGlvbiAocmVjdXJzaXZlKSB7XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgICB2YXIgblRhc2sgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRoaXMuX3Rhc2tzW2ldO1xuICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUYXNrR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuVGFzayArPSB0YXNrLmdldFRhc2tOdW1iZXIocmVjdXJzaXZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgblRhc2sgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gblRhc2s7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tzLmxlbmd0aDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYXNrR3JvdXA7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuXG52YXIgQ2FudmFzTWF0ZXJpYWwgPSBCYXNlLmV4dGVuZCh7XG5cbiAgICBjb2xvcjogWzEsIDEsIDEsIDFdLFxuXG4gICAgb3BhY2l0eTogMSxcblxuICAgIHBvaW50U2l6ZTogMCxcblxuICAgIHBvaW50U2hhcGU6ICdyZWN0YW5nbGUnXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FudmFzTWF0ZXJpYWw7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4uL2NvcmUvZ2xlbnVtJztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbnZhciB2ZWM0ID0gZ2xNYXRyaXgudmVjNDtcblxudmFyIHZlYzNTZXQgPSB2ZWMzLnNldDtcbnZhciB2ZWMzQ3JlYXRlID0gdmVjMy5jcmVhdGU7XG5cbnZhciB2ZWM0Q3JlYXRlID0gdmVjNC5jcmVhdGU7XG5cbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG5cbnZhciBQUklNSVRJVkVfVFJJQU5HTEUgPSAxO1xudmFyIFBSSU1JVElWRV9MSU5FID0gMjtcbnZhciBQUklNSVRJVkVfUE9JTlQgPSAzO1xuXG5mdW5jdGlvbiBQcmltaXRpdmVQb29sKGNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5jdG9yID0gY29uc3RydWN0b3I7XG5cbiAgICB0aGlzLl9kYXRhID0gW107XG5cbiAgICB0aGlzLl9zaXplID0gMDtcbn1cblxuUHJpbWl0aXZlUG9vbC5wcm90b3R5cGUgPSB7XG4gICAgcGljazogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fc2l6ZTtcbiAgICAgICAgdmFyIG9iaiA9IGRhdGFbc2l6ZV07XG4gICAgICAgIGlmICghIG9iaikge1xuICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IgbXVzdCBoYXZlIG5vIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIG9iaiA9IG5ldyB0aGlzLmN0b3IoKTtcbiAgICAgICAgICAgIGRhdGFbc2l6ZV0gPSBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9LFxuXG4gICAgc2hyaW5rOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEubGVuZ3RoID0gdGhpcy5fc2l6ZTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFRyaWFuZ2xlKCkge1xuICAgIHRoaXMudmVydGljZXMgPSBbdmVjNENyZWF0ZSgpLCB2ZWM0Q3JlYXRlKCksIHZlYzRDcmVhdGUoKV07XG4gICAgdGhpcy5jb2xvciA9IHZlYzRDcmVhdGUoKTtcblxuICAgIHRoaXMuZGVwdGggPSAwO1xufVxuXG5UcmlhbmdsZS5wcm90b3R5cGUudHlwZSA9IFBSSU1JVElWRV9UUklBTkdMRTtcblxuZnVuY3Rpb24gUG9pbnQoKSB7XG4gICAgLy8gSGVyZSB1c2UgYW4gYXJyYXkgdG8gbWFrZSBpdCBtb3JlIGNvbnZpbmllbnQgdG8gcHJvY2Nlc3NpbmcgaW4gX3NldFByaW1pdGl2ZSBtZXRob2RcbiAgICB0aGlzLnZlcnRpY2VzID0gW3ZlYzRDcmVhdGUoKV07XG5cbiAgICB0aGlzLmNvbG9yID0gdmVjNENyZWF0ZSgpO1xuXG4gICAgdGhpcy5kZXB0aCA9IDA7XG59XG5cblBvaW50LnByb3RvdHlwZS50eXBlID0gUFJJTUlUSVZFX1BPSU5UO1xuXG5mdW5jdGlvbiBMaW5lKCkge1xuICAgIHRoaXMudmVydGljZXMgPSBbdmVjNENyZWF0ZSgpLCB2ZWM0Q3JlYXRlKCldO1xuICAgIHRoaXMuY29sb3IgPSB2ZWM0Q3JlYXRlKCk7XG5cbiAgICB0aGlzLmRlcHRoID0gMDtcblxuICAgIHRoaXMubGluZVdpZHRoID0gMTtcbn1cblxuTGluZS5wcm90b3R5cGUudHlwZSA9IFBSSU1JVElWRV9MSU5FO1xuXG5mdW5jdGlvbiBkZXB0aFNvcnRGdW5jKHgsIHkpIHtcbiAgICAvLyBTb3J0IGZyb20gZmFyIHRvIG5lYXIsIHdoaWNoIGluIGRlcHRoIG9mIHByb2plY3Rpb24gc3BhY2UgaXMgZnJvbSBsYXJnZXIgdG8gc21hbGxlclxuICAgIHJldHVybiB5LmRlcHRoIC0geC5kZXB0aDtcbn1cblxuZnVuY3Rpb24gdmVjM1RvQ29sb3JTdHIodjMpIHtcbiAgICByZXR1cm4gJ3JnYignICsgcm91bmQodjNbMF0gKiAyNTUpICsgJywnICsgcm91bmQodjNbMV0gKiAyNTUpICsgJywnICsgcm91bmQodjNbMl0gKiAyNTUpICsgJyknO1xufVxuXG5mdW5jdGlvbiB2ZWM0VG9Db2xvclN0cih2NCkge1xuICAgIHJldHVybiAncmdiYSgnICsgcm91bmQodjRbMF0gKiAyNTUpICsgJywnICsgcm91bmQodjRbMV0gKiAyNTUpICsgJywnICsgcm91bmQodjRbMl0gKiAyNTUpICsgJywnICsgdjRbM10gKyAnKSc7XG59XG5cbnZhciBDYW52YXNSZW5kZXJlciA9IEJhc2UuZXh0ZW5kKHtcblxuICAgIGNhbnZhczogbnVsbCxcblxuICAgIF93aWR0aDogMTAwLFxuXG4gICAgX2hlaWdodDogMTAwLFxuXG4gICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMS4wLFxuXG4gICAgY29sb3I6IFswLjAsIDAuMCwgMC4wLCAwLjBdLFxuXG4gICAgY2xlYXI6IHRydWUsXG5cbiAgICBjdHg6IG51bGwsXG5cbiAgICAvLyBDYWNoZWQgcHJpbWl0aXZlIGxpc3QsIGluY2x1ZGluZyB0cmlhbmdsZSwgbGluZSwgcG9pbnRcbiAgICBfcHJpbWl0aXZlczogW10sXG5cbiAgICAvLyBUcmlhbmdsZSBwb29sXG4gICAgX3RyaWFuZ2xlczogbmV3IFByaW1pdGl2ZVBvb2woVHJpYW5nbGUpLFxuXG4gICAgLy8gTGluZSBwb29sXG4gICAgX2xpbmVzOiBuZXcgUHJpbWl0aXZlUG9vbChMaW5lKSxcblxuICAgIC8vIFBvaW50IHBvb2xcbiAgICBfcG9pbnRzOiBuZXcgUHJpbWl0aXZlUG9vbChQb2ludClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoISB0aGlzLmNhbnZhcykge1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIH1cbiAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXM7XG5cbiAgICB0cnkge1xuICAgICAgICB0aGlzLmN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGlmICghY3R4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgQ29udGV4dCAnICsgZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xufSwge1xuXG4gICAgcmVzaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgZHByID0gdGhpcy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogZHByO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGRwcjtcblxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gY2FudmFzLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gY2FudmFzLmhlaWdodCAvIGRwcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRXaWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfSxcblxuICAgIGdldEhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH0sXG5cbiAgICBnZXRWaWV3cG9ydEFzcGVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGggLyB0aGlzLl9oZWlnaHQ7XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKHNjZW5lLCBjYW1lcmEpIHtcblxuICAgICAgICBpZiAodGhpcy5jbGVhcikge1xuICAgICAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgICAgIHZhciBkcHIgPSB0aGlzLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICB2YXIgdyA9IHRoaXMuX3dpZHRoICogZHByO1xuICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9oZWlnaHQgKiBkcHI7XG4gICAgICAgICAgICBpZiAoY29sb3IgJiYgY29sb3JbM10gPT09IDApIHtcbiAgICAgICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSGFzIHRyYW5zcGFyZW5jeVxuICAgICAgICAgICAgICAgIGlmIChjb2xvclszXSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yLmxlbmd0aCA9PT0gNCA/IHZlYzRUb0NvbG9yU3RyKGNvbG9yKSA6IHZlYzNUb0NvbG9yU3RyKGNvbG9yKTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY2VuZS51cGRhdGUoKTtcbiAgICAgICAgY2FtZXJhLnVwZGF0ZSgpO1xuXG4gICAgICAgIHZhciBvcGFxdWVMaXN0ID0gc2NlbmUub3BhcXVlTGlzdDtcbiAgICAgICAgdmFyIHRyYW5zcGFyZW50TGlzdCA9IHNjZW5lLnRyYW5zcGFyZW50TGlzdDtcbiAgICAgICAgdmFyIHNjZW5lTWF0ZXJpYWwgPSBzY2VuZS5tYXRlcmlhbDtcblxuICAgICAgICB2YXIgbGlzdCA9IG9wYXF1ZUxpc3QuY29uY2F0KHRyYW5zcGFyZW50TGlzdCk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzKGxpc3QsIGNhbWVyYSk7XG4gICAgfSxcblxuICAgIHJlbmRlclBhc3M6IGZ1bmN0aW9uIChsaXN0LCBjYW1lcmEpIHtcbiAgICAgICAgdmFyIHZpZXdQcm9qID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseSh2aWV3UHJvaiwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguYXJyYXksIGNhbWVyYS52aWV3TWF0cml4LmFycmF5KTtcbiAgICAgICAgdmFyIHdvcmxkVmlld1Byb2pNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICB2YXIgcG9zVmlld1NwYWNlID0gdmVjMy5jcmVhdGUoKTtcblxuICAgICAgICB2YXIgcHJpbWl0aXZlcyA9IHRoaXMuX3ByaW1pdGl2ZXM7XG4gICAgICAgIHZhciB0cmlhbmdsZXNQb29sID0gdGhpcy5fdHJpYW5nbGVzO1xuICAgICAgICB2YXIgbGluZXNQb29sID0gdGhpcy5fbGluZXM7XG4gICAgICAgIHZhciBwb2ludHNQb29sID0gdGhpcy5fcG9pbnRzO1xuXG4gICAgICAgIHRyaWFuZ2xlc1Bvb2wucmVzZXQoKTtcbiAgICAgICAgbGluZXNQb29sLnJlc2V0KCk7XG4gICAgICAgIHBvaW50c1Bvb2wucmVzZXQoKTtcblxuICAgICAgICB2YXIgblByaW1pdGl2ZSA9IDA7XG5cbiAgICAgICAgdmFyIGluZGljZXMgPSBbMCwgMCwgMF07XG4gICAgICAgIHZhciBtYXRDb2xvciA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gbGlzdFtpXTtcblxuICAgICAgICAgICAgbWF0NC5tdWx0aXBseSh3b3JsZFZpZXdQcm9qTWF0LCB2aWV3UHJvaiwgcmVuZGVyYWJsZS53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG5cbiAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IHJlbmRlcmFibGUuZ2VvbWV0cnk7XG4gICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSByZW5kZXJhYmxlLm1hdGVyaWFsO1xuICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgICAgICAvLyBhbHBoYSBpcyBkZWZhdWx0IDFcbiAgICAgICAgICAgIGlmIChtYXRlcmlhbC5jb2xvci5sZW5ndGggPT0gMykge1xuICAgICAgICAgICAgICAgIHZlYzMuY29weShtYXRDb2xvciwgbWF0ZXJpYWwuY29sb3IpO1xuICAgICAgICAgICAgICAgIG1hdENvbG9yWzNdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzQuY29weShtYXRDb2xvciwgbWF0ZXJpYWwuY29sb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgblZlcnRleCA9IGdlb21ldHJ5LnZlcnRleENvdW50O1xuICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IFRSSUFOR0xFUywgTElORVMsIFBPSU5UUyBkcmF3IG1vZGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHJlbmRlcmFibGUubW9kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZ2xlbnVtLlRSSUFOR0xFUzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlb21ldHJ5LmlzVXNlSW5kaWNlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbkZhY2UgPSBnZW9tZXRyeS50cmlhbmdsZUNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuRmFjZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuZ2V0RmFjZShqLCBpbmRpY2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlhbmdsZSA9IHRyaWFuZ2xlc1Bvb2wucGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpcHBlZCA9IHRoaXMuX3NldFByaW1pdGl2ZSh0cmlhbmdsZSwgaW5kaWNlcywgMywgYXR0cmlidXRlcywgd29ybGRWaWV3UHJvak1hdCwgbWF0Q29sb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgY2xpcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVzW25QcmltaXRpdmUrK10gPSB0cmlhbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5WZXJ0ZXg7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1swXSA9IGorKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzFdID0gaisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbMl0gPSBqKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJpYW5nbGUgPSB0cmlhbmdsZXNQb29sLnBpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXBwZWQgPSB0aGlzLl9zZXRQcmltaXRpdmUodHJpYW5nbGUsIGluZGljZXMsIDMsIGF0dHJpYnV0ZXMsIHdvcmxkVmlld1Byb2pNYXQsIG1hdENvbG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGNsaXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlc1tuUHJpbWl0aXZlKytdID0gdHJpYW5nbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2xlbnVtLkxJTkVTOlxuICAgICAgICAgICAgICAgICAgICAvLyBMSU5FUyBtb2RlIGNhbid0IHVzZSBmYWNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgblZlcnRleDspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbMF0gPSBqKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzFdID0gaisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1Bvb2wucGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5saW5lV2lkdGggPSByZW5kZXJhYmxlLmxpbmVXaWR0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXBwZWQgPSB0aGlzLl9zZXRQcmltaXRpdmUobGluZSwgaW5kaWNlcywgMiwgYXR0cmlidXRlcywgd29ybGRWaWV3UHJvak1hdCwgbWF0Q29sb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBjbGlwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlc1tuUHJpbWl0aXZlKytdID0gbGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGdsZW51bS5QT0lOVFM6XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgblZlcnRleDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzBdID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IHBvaW50c1Bvb2wucGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXBwZWQgPSB0aGlzLl9zZXRQcmltaXRpdmUocG9pbnQsIGluZGljZXMsIDEsIGF0dHJpYnV0ZXMsIHdvcmxkVmlld1Byb2pNYXQsIG1hdENvbG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgY2xpcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZXNbblByaW1pdGl2ZSsrXSA9IHBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFBPSU5UUyBtb2RlIGNhbid0IHVzZSBmYWNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJpYW5nbGVzUG9vbC5zaHJpbmsoKTtcbiAgICAgICAgbGluZXNQb29sLnNocmluaygpO1xuICAgICAgICBwb2ludHNQb29sLnNocmluaygpO1xuXG4gICAgICAgIHByaW1pdGl2ZXMubGVuZ3RoID0gblByaW1pdGl2ZTtcblxuICAgICAgICBwcmltaXRpdmVzLnNvcnQoZGVwdGhTb3J0RnVuYyk7XG4gICAgICAgIHRoaXMuX2RyYXdQcmltaXRpdmVzKHByaW1pdGl2ZXMpO1xuICAgIH0sXG5cbiAgICBfc2V0UHJpbWl0aXZlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmVydGV4Q29sb3IgPSB2ZWM0Q3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJpbWl0aXZlLCBpbmRpY2VzLCBzaXplLCBhdHRyaWJ1dGVzLCB3b3JsZFZpZXdQcm9qTWF0LCBtYXRDb2xvcikge1xuICAgICAgICAgICAgdmFyIGNvbG9yQXR0cmliID0gYXR0cmlidXRlcy5jb2xvcjtcbiAgICAgICAgICAgIHZhciB1c2VWZXJ0ZXhDb2xvciA9IGNvbG9yQXR0cmliLnZhbHVlICYmIGNvbG9yQXR0cmliLnZhbHVlLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB2YXIgcHJpQ29sb3IgPSBwcmltaXRpdmUuY29sb3I7XG5cbiAgICAgICAgICAgIHByaW1pdGl2ZS5kZXB0aCA9IDA7XG4gICAgICAgICAgICBpZiAodXNlVmVydGV4Q29sb3IpIHtcbiAgICAgICAgICAgICAgICB2ZWM0LnNldChwcmlDb2xvciwgMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjbGlwcGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAxIC8gc2l6ZTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkID0gcHJpbWl0aXZlLnZlcnRpY2VzW2ldO1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24uZ2V0KGluZGljZXNbaV0sIGNvb3JkKTtcbiAgICAgICAgICAgICAgICBjb29yZFszXSA9IDE7XG4gICAgICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkLCBjb29yZCwgd29ybGRWaWV3UHJvak1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZVZlcnRleENvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQXR0cmliLmdldChpbmRpY2VzW2ldLCB2ZXJ0ZXhDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF2ZXJhZ2UgdmVydGV4IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggcHJpbWl0aXZlIG9ubHkgY2FsbCBmaWxsIG9yIHN0cm9rZSBvbmNlXG4gICAgICAgICAgICAgICAgICAgIC8vIFNvIGNvbG9yIG11c3QgYmUgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgdmVjNC5zY2FsZUFuZEFkZChwcmlDb2xvciwgcHJpQ29sb3IsIHZlcnRleENvbG9yLCBwZXJjZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDbGlwcGluZ1xuICAgICAgICAgICAgICAgIHZhciB4ID0gY29vcmRbMF07XG4gICAgICAgICAgICAgICAgdmFyIHkgPSBjb29yZFsxXTtcbiAgICAgICAgICAgICAgICB2YXIgeiA9IGNvb3JkWzJdO1xuICAgICAgICAgICAgICAgIHZhciB3ID0gY29vcmRbM107XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIFBvaW50IGNsaXBwaW5nXG4gICAgICAgICAgICAgICAgaWYgKHggPiAtdyAmJiB4IDwgdyAmJiB5ID4gLXcgJiYgeSA8IHcgJiYgeiA+IC13ICYmIHogPCB3KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgaW52VyA9IDEgLyB3O1xuICAgICAgICAgICAgICAgIGNvb3JkWzBdID0geCAqIGludlc7XG4gICAgICAgICAgICAgICAgY29vcmRbMV0gPSB5ICogaW52VztcbiAgICAgICAgICAgICAgICBjb29yZFsyXSA9IHogKiBpbnZXO1xuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmltaXRpdmUgYXZlcmFnZSBkZXB0aDtcbiAgICAgICAgICAgICAgICBwcmltaXRpdmUuZGVwdGggKz0gY29vcmRbMl07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghIGNsaXBwZWQpIHtcbiAgICAgICAgICAgICAgICBwcmltaXRpdmUuZGVwdGggLz0gc2l6ZTtcblxuICAgICAgICAgICAgICAgIGlmICh1c2VWZXJ0ZXhDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICB2ZWM0Lm11bChwcmlDb2xvciwgcHJpQ29sb3IsIG1hdENvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzQuY29weShwcmlDb2xvciwgbWF0Q29sb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNsaXBwZWQ7XG4gICAgICAgIH1cbiAgICB9KSgpLFxuXG4gICAgX2RyYXdQcmltaXRpdmVzOiBmdW5jdGlvbiAocHJpbWl0aXZlcykge1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGN0eC5zYXZlKCk7XG5cbiAgICAgICAgdmFyIHByZXZNYXRlcmlhbDtcblxuICAgICAgICB2YXIgZHByID0gdGhpcy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLl93aWR0aCAqIGRwcjtcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuX2hlaWdodCAqIGRwcjtcbiAgICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgICAgIHZhciBwcmV2TGluZVdpZHRoO1xuICAgICAgICB2YXIgcHJldlN0cm9rZUNvbG9yO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpbWl0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHByaW1pdGl2ZSA9IHByaW1pdGl2ZXNbaV07XG4gICAgICAgICAgICB2YXIgdmVydGljZXMgPSBwcmltaXRpdmUudmVydGljZXM7XG5cbiAgICAgICAgICAgIHZhciBwcmltaXRpdmVUeXBlID0gcHJpbWl0aXZlLnR5cGU7XG4gICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSBwcmltaXRpdmUubWF0ZXJpYWw7XG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwgIT09IHByZXZNYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBtYXRlcmlhbFxuICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IG1hdGVyaWFsLm9wYWNpdHk7XG4gICAgICAgICAgICAgICAgcHJldk1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjb2xvclN0ciA9IHZlYzRUb0NvbG9yU3RyKHByaW1pdGl2ZS5jb2xvcik7XG4gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFBSSU1JVElWRV9UUklBTkdMRTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYwID0gdmVydGljZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2MSA9IHZlcnRpY2VzWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdjIgPSB2ZXJ0aWNlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yU3RyO1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oKHYwWzBdICsgMSkgKiBoYWxmV2lkdGgsICgtdjBbMV0gKyAxKSAqIGhhbGZIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKCh2MVswXSArIDEpICogaGFsZldpZHRoLCAoLXYxWzFdICsgMSkgKiBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbygodjJbMF0gKyAxKSAqIGhhbGZXaWR0aCwgKC12MlsxXSArIDEpICogaGFsZkhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBQUklNSVRJVkVfTElORTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYwID0gdmVydGljZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2MSA9IHZlcnRpY2VzWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gcHJpbWl0aXZlLmxpbmVXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZTdHJva2VDb2xvciAhPT0gY29sb3JTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yU3RyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lV2lkdGggIT09IHByZXZMaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBwcmV2TGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbygodjBbMF0gKyAxKSAqIGhhbGZXaWR0aCwgKC12MFsxXSArIDEpICogaGFsZkhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oKHYxWzBdICsgMSkgKiBoYWxmV2lkdGgsICgtdjFbMV0gKyAxKSAqIGhhbGZIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUFJJTUlUSVZFX1BPSU5UOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRTaXplID0gbWF0ZXJpYWwucG9pbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRTaGFwZSA9IG1hdGVyaWFsLnBvaW50U2hhcGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYWxmU2l6ZSA9IHBvaW50U2l6ZSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2ludFNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdjAgPSB2ZXJ0aWNlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjeCA9ICh2MFswXSArIDEpICogaGFsZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN5ID0gKC12MFsxXSArIDEpICogaGFsZkhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yU3RyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50U2hhcGUgPT09ICdyZWN0YW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN4IC0gaGFsZlNpemUsIGN5IC0gaGFsZlNpemUsIHBvaW50U2l6ZSwgcG9pbnRTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvaW50U2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoY3gsIGN5LCBoYWxmU2l6ZSwgMCwgTWF0aC5QSSAqIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3RyaWFuZ2xlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLl9saW5lcy5jbGVhcigpO1xuICAgICAgICB0aGlzLl9wb2ludHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fcHJpbWl0aXZlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY3R4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDYW52YXNSZW5kZXJlcjtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5cbi8vIFBFTkRJTkdcbi8vIFVzZSB0b3BvbG9naWNhbCBzb3J0ID9cblxuLyoqXG4gKiBOb2RlIG9mIGdyYXBoIGJhc2VkIHBvc3QgcHJvY2Vzc2luZy5cbiAqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jb21wb3NpdG9yLk5vZGVcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKlxuICovXG52YXIgTm9kZSA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LmNvbXBvc2l0b3IuTm9kZSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnB1dCBsaW5rcywgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSBncmFwaFxuICAgICAgICAgKiBAZXhhbXBsZTpcbiAgICAgICAgICogICAgIGlucHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBpbnB1dExpbmtzOiB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3V0cHV0IGxpbmtzLCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIGdyYXBoXG4gICAgICAgICAqIEBleGFtcGxlOlxuICAgICAgICAgKiAgICAgb3V0cHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRMaW5rczoge30sXG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3V0cHV0IHRleHR1cmUgb2YgcHJldmlvdXMgZnJhbWVcbiAgICAgICAgLy8gV2lsbCBiZSB1c2VkIHdoZW4gdGhlcmUgZXhpc3QgYSBjaXJjdWxhciByZWZlcmVuY2VcbiAgICAgICAgX3ByZXZPdXRwdXRUZXh0dXJlczoge30sXG4gICAgICAgIF9vdXRwdXRUZXh0dXJlczoge30sXG5cbiAgICAgICAgLy8gRXhhbXBsZTogeyBuYW1lOiAyIH1cbiAgICAgICAgX291dHB1dFJlZmVyZW5jZXM6IHt9LFxuXG4gICAgICAgIF9yZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAvLyBJZiByZW5kZXJlZCBpbiB0aGlzIGZyYW1lXG4gICAgICAgIF9yZW5kZXJlZDogZmFsc2UsXG5cbiAgICAgICAgX2NvbXBvc2l0b3I6IG51bGxcbiAgICB9O1xufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLk5vZGUucHJvdG90eXBlICovXG57XG5cbiAgICAvLyBUT0RPIFJlbW92ZSBwYXJhbWV0ZXIgZnVuY3Rpb24gY2FsbGJhY2tcbiAgICB1cGRhdGVQYXJhbWV0ZXI6IGZ1bmN0aW9uIChvdXRwdXROYW1lLCByZW5kZXJlcikge1xuICAgICAgICB2YXIgb3V0cHV0SW5mbyA9IHRoaXMub3V0cHV0c1tvdXRwdXROYW1lXTtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvdXRwdXRJbmZvLnBhcmFtZXRlcnM7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5O1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnNDb3B5KSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ3dpZHRoJyAmJiBrZXkgIT09ICdoZWlnaHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNDb3B5W2tleV0gPSBwYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB3aWR0aCwgaGVpZ2h0O1xuICAgICAgICBpZiAocGFyYW1ldGVycy53aWR0aCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGguY2FsbCh0aGlzLCByZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuaGVpZ2h0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHBhcmFtZXRlcnMuaGVpZ2h0LmNhbGwodGhpcywgcmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyYW1ldGVycy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1ldGVyc0NvcHkud2lkdGggIT09IHdpZHRoXG4gICAgICAgICAgICB8fCBwYXJhbWV0ZXJzQ29weS5oZWlnaHQgIT09IGhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdXRwdXRUZXh0dXJlc1tvdXRwdXROYW1lXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dFRleHR1cmVzW291dHB1dE5hbWVdLmRpc3Bvc2UocmVuZGVyZXIuZ2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LndpZHRoID0gd2lkdGg7XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICByZXR1cm4gcGFyYW1ldGVyc0NvcHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBwYXJhbWV0ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7fSB2YWx1ZVxuICAgICAqL1xuICAgIHNldFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7fSxcbiAgICAvKipcbiAgICAgKiBHZXQgcGFyYW1ldGVyIHZhbHVlXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7fVxuICAgICAqL1xuICAgIGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUpIHt9LFxuICAgIC8qKlxuICAgICAqIFNldCBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgICAqL1xuICAgIHNldFBhcmFtZXRlcnM6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBvYmopIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKG5hbWUsIG9ialtuYW1lXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgIGdldE91dHB1dDogZnVuY3Rpb24gKHJlbmRlcmVyIC8qb3B0aW9uYWwqLywgbmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG91dHB1dCB0ZXh0dXJlIHdpdGhvdXQgcmVuZGVyaW5nXG4gICAgICAgICAgICBuYW1lID0gcmVuZGVyZXI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dEluZm8gPSB0aGlzLm91dHB1dHNbbmFtZV07XG4gICAgICAgIGlmICghb3V0cHV0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFscmVhZHkgYmVlbiByZW5kZXJlZCBpbiB0aGlzIGZyYW1lXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCkge1xuICAgICAgICAgICAgLy8gRm9yY2UgcmV0dXJuIHRleHR1cmUgaW4gbGFzdCBmcmFtZVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ub3V0cHV0TGFzdEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZPdXRwdXRUZXh0dXJlc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdXRwdXRUZXh0dXJlc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmluZyAgIC8vIFNvbHZlIENpcmN1bGFyIFJlZmVyZW5jZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYmxhbmsgdGV4dHVyZSBhdCBmaXJzdCBwYXNzXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdID0gdGhpcy5fY29tcG9zaXRvci5hbGxvY2F0ZVRleHR1cmUob3V0cHV0SW5mby5wYXJhbWV0ZXJzIHx8IHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcihyZW5kZXJlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX291dHB1dFRleHR1cmVzW25hbWVdO1xuICAgIH0sXG5cbiAgICByZW1vdmVSZWZlcmVuY2U6IGZ1bmN0aW9uIChvdXRwdXROYW1lKSB7XG4gICAgICAgIHRoaXMuX291dHB1dFJlZmVyZW5jZXNbb3V0cHV0TmFtZV0tLTtcbiAgICAgICAgaWYgKHRoaXMuX291dHB1dFJlZmVyZW5jZXNbb3V0cHV0TmFtZV0gPT09IDApIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXRJbmZvID0gdGhpcy5vdXRwdXRzW291dHB1dE5hbWVdO1xuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ua2VlcExhc3RGcmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5yZWxlYXNlVGV4dHVyZSh0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0gPSB0aGlzLl9vdXRwdXRUZXh0dXJlc1tvdXRwdXROYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE91dHB1dCBvZiB0aGlzIG5vZGUgaGF2ZSBhbHJlYXkgYmVlbiB1c2VkIGJ5IGFsbCBvdGhlciBub2Rlc1xuICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgdGV4dHVyZSBiYWNrIHRvIHRoZSBwb29sLlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0b3IucmVsZWFzZVRleHR1cmUodGhpcy5fb3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGxpbms6IGZ1bmN0aW9uIChpbnB1dFBpbk5hbWUsIGZyb21Ob2RlLCBmcm9tUGluTmFtZSkge1xuXG4gICAgICAgIC8vIFRoZSByZWxhdGlvbnNoaXAgZnJvbSBvdXRwdXQgcGluIHRvIGlucHV0IHBpbiBpcyBvbmUtb24tbXVsdGlwbGVcbiAgICAgICAgdGhpcy5pbnB1dExpbmtzW2lucHV0UGluTmFtZV0gPSB7XG4gICAgICAgICAgICBub2RlOiBmcm9tTm9kZSxcbiAgICAgICAgICAgIHBpbjogZnJvbVBpbk5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFmcm9tTm9kZS5vdXRwdXRMaW5rc1tmcm9tUGluTmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21Ob2RlLm91dHB1dExpbmtzW2Zyb21QaW5OYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZyb21Ob2RlLm91dHB1dExpbmtzW2Zyb21QaW5OYW1lXS5wdXNoKHtcbiAgICAgICAgICAgIG5vZGU6IHRoaXMsXG4gICAgICAgICAgICBwaW46IGlucHV0UGluTmFtZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGVkIHRoZSBwaW4gdGV4dHVyZSBpbiBzaGFkZXJcbiAgICAgICAgdGhpcy5wYXNzLm1hdGVyaWFsLmVuYWJsZVRleHR1cmUoaW5wdXRQaW5OYW1lKTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pbnB1dExpbmtzID0ge307XG4gICAgICAgIHRoaXMub3V0cHV0TGlua3MgPSB7fTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUmVmZXJlbmNlOiBmdW5jdGlvbiAob3V0cHV0TmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAodmFyIGlucHV0TmFtZSBpbiB0aGlzLmlucHV0TGlua3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IHRoaXMuaW5wdXRMaW5rc1tpbnB1dE5hbWVdO1xuICAgICAgICAgICAgICAgIGxpbmsubm9kZS51cGRhdGVSZWZlcmVuY2UobGluay5waW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dHB1dE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dFJlZmVyZW5jZXNbb3V0cHV0TmFtZV0gKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmVmb3JlRnJhbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMub3V0cHV0TGlua3MpIHtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dFJlZmVyZW5jZXNbbmFtZV0gPSAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFmdGVyRnJhbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHV0IGJhY2sgYWxsIHRoZSB0ZXh0dXJlcyB0byBwb29sXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5vdXRwdXRMaW5rcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX291dHB1dFJlZmVyZW5jZXNbbmFtZV0gPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG91dHB1dEluZm8gPSB0aGlzLm91dHB1dHNbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ua2VlcExhc3RGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdG9yLnJlbGVhc2VUZXh0dXJlKHRoaXMuX3ByZXZPdXRwdXRUZXh0dXJlc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdID0gdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdG9yLnJlbGVhc2VUZXh0dXJlKHRoaXMuX291dHB1dFRleHR1cmVzW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTm9kZTtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgR3JhcGhOb2RlIGZyb20gJy4vTm9kZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY29tcG9zaXRvci5HcmFwaFxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIEdyYXBoID0gQmFzZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuY29tcG9zaXRvci5HcmFwaCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxjbGF5LmNvbXBvc2l0b3IuTm9kZT59XG4gICAgICAgICAqL1xuICAgICAgICBub2RlczogW11cbiAgICB9O1xufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLkdyYXBoLnByb3RvdHlwZSAqL1xue1xuXG4gICAgLyoqXG4gICAgICogTWFyayB0byB1cGRhdGVcbiAgICAgKi9cbiAgICBkaXJ0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2NsYXkuY29tcG9zaXRvci5Ob2RlfSBub2RlXG4gICAgICovXG4gICAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcblxuICAgICAgICBpZiAodGhpcy5ub2Rlcy5pbmRleE9mKG5vZGUpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm9kZXMucHVzaChub2RlKTtcblxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LmNvbXBvc2l0b3IuTm9kZXxzdHJpbmd9IG5vZGVcbiAgICAgKi9cbiAgICByZW1vdmVOb2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBub2RlID0gdGhpcy5nZXROb2RlQnlOYW1lKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpZHggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub2Rlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmNvbXBvc2l0b3IuTm9kZX1cbiAgICAgKi9cbiAgICBnZXROb2RlQnlOYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGxpbmtzIG9mIGdyYXBoXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ub2Rlc1tpXS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYXZlcnNlIGFsbCB0aGUgbm9kZXMgYW5kIGJ1aWxkIHRoZSBncmFwaFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5ub2Rlc1tpXTtcblxuICAgICAgICAgICAgaWYgKCFub2RlLmlucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaW5wdXROYW1lIGluIG5vZGUuaW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmlucHV0c1tpbnB1dE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXNzICYmICFub2RlLnBhc3MubWF0ZXJpYWwuaXNVbmlmb3JtRW5hYmxlZChpbnB1dE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGluICcgICsgbm9kZS5uYW1lICsgJy4nICsgaW5wdXROYW1lICsgJyBub3QgdXNlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmcm9tUGluSW5mbyA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG5cbiAgICAgICAgICAgICAgICB2YXIgZnJvbVBpbiA9IHRoaXMuZmluZFBpbihmcm9tUGluSW5mbyk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21QaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5saW5rKGlucHV0TmFtZSwgZnJvbVBpbi5ub2RlLCBmcm9tUGluLnBpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZyb21QaW5JbmZvID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdOb2RlICcgKyBmcm9tUGluSW5mbyArICcgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BpbiBvZiAnICsgZnJvbVBpbkluZm8ubm9kZSArICcuJyArIGZyb21QaW5JbmZvLnBpbiArICcgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluZFBpbjogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHZhciBub2RlO1xuICAgICAgICAvLyBUcnkgdG8gdGFrZSBpbnB1dCBhcyBhIGRpcmVjdGx5IGEgbm9kZVxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIEdyYXBoTm9kZSkge1xuICAgICAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgbm9kZTogaW5wdXRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0Lm5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdG1wID0gdGhpcy5ub2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodG1wLm5hbWUgPT09IGlucHV0Lm5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlID0gaW5wdXQubm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgdmFyIGlucHV0UGluID0gaW5wdXQucGluO1xuICAgICAgICAgICAgaWYgKCFpbnB1dFBpbikge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBmaXJzdCBwaW4gZGVmYXVsdGx5XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUub3V0cHV0cykge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFBpbiA9IE9iamVjdC5rZXlzKG5vZGUub3V0cHV0cylbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUub3V0cHV0c1tpbnB1dFBpbl0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICBwaW46IGlucHV0UGluXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBHcmFwaDtcbiIsImltcG9ydCBHcmFwaCBmcm9tICcuL0dyYXBoJztcbmltcG9ydCBUZXh0dXJlUG9vbCBmcm9tICcuL1RleHR1cmVQb29sJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5cbi8qKlxuICogQ29tcG9zaXRvciBwcm92aWRlIGdyYXBoIGJhc2VkIHBvc3QgcHJvY2Vzc2luZ1xuICpcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LmNvbXBvc2l0b3IuQ29tcG9zaXRvclxuICogQGV4dGVuZHMgY2xheS5jb21wb3NpdG9yLkdyYXBoXG4gKlxuICovXG52YXIgQ29tcG9zaXRvciA9IEdyYXBoLmV4dGVuZChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBPdXRwdXQgbm9kZVxuICAgICAgICBfb3V0cHV0czogW10sXG5cbiAgICAgICAgX3RleHR1cmVQb29sOiBuZXcgVGV4dHVyZVBvb2woKSxcblxuICAgICAgICBfZnJhbWVCdWZmZXI6IG5ldyBGcmFtZUJ1ZmZlcih7XG4gICAgICAgICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICAgICAgfSlcbiAgICB9O1xufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLkNvbXBvc2l0b3IucHJvdG90eXBlICovXG57XG4gICAgYWRkTm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBHcmFwaC5wcm90b3R5cGUuYWRkTm9kZS5jYWxsKHRoaXMsIG5vZGUpO1xuICAgICAgICBub2RlLl9jb21wb3NpdG9yID0gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgcmVuZGVyOiBmdW5jdGlvbihyZW5kZXJlciwgZnJhbWVCdWZmZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5fb3V0cHV0cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vZGVzW2ldLm91dHB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3V0cHV0cy5wdXNoKHRoaXMubm9kZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZWZlcmVuY2UgbnVtYmVyIG9mIGVhY2ggb3V0cHV0IHRleHR1cmVcbiAgICAgICAgICAgIHRoaXMubm9kZXNbaV0uYmVmb3JlRnJhbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3V0cHV0c1tpXS51cGRhdGVSZWZlcmVuY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3V0cHV0c1tpXS5yZW5kZXIocmVuZGVyZXIsIGZyYW1lQnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gQ2xlYXIgdXBcbiAgICAgICAgICAgIHRoaXMubm9kZXNbaV0uYWZ0ZXJGcmFtZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFsbG9jYXRlVGV4dHVyZTogZnVuY3Rpb24gKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHR1cmVQb29sLmdldChwYXJhbWV0ZXJzKTtcbiAgICB9LFxuXG4gICAgcmVsZWFzZVRleHR1cmU6IGZ1bmN0aW9uIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVQb29sLnB1dChwYXJhbWV0ZXJzKTtcbiAgICB9LFxuXG4gICAgZ2V0RnJhbWVCdWZmZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lQnVmZmVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGNvbXBvc2l0b3JcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVQb29sLmNsZWFyKHJlbmRlcmVyKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9zaXRvcjtcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4uL2NvcmUvZ2xlbnVtJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY29tcG9zaXRvci5TY2VuZU5vZGVcbiAqIEBleHRlbmRzIGNsYXkuY29tcG9zaXRvci5Ob2RlXG4gKi9cbnZhciBTY2VuZU5vZGUgPSBOb2RlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLlNjZW5lTm9kZSMgKi9cbntcbiAgICBuYW1lOiAnc2NlbmUnLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LlNjZW5lfVxuICAgICAqL1xuICAgIHNjZW5lOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LkNhbWVyYX1cbiAgICAgKi9cbiAgICBjYW1lcmE6IG51bGwsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgYXV0b1VwZGF0ZVNjZW5lOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHByZVo6IGZhbHNlXG5cbn0sIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbn0sIHtcbiAgICByZW5kZXI6IGZ1bmN0aW9uKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcignYmVmb3JlcmVuZGVyJyk7XG5cbiAgICAgICAgdmFyIHJlbmRlckluZm87XG5cbiAgICAgICAgaWYgKCF0aGlzLm91dHB1dHMpIHtcblxuICAgICAgICAgICAgcmVuZGVySW5mbyA9IHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgIXRoaXMuYXV0b1VwZGF0ZVNjZW5lLCB0aGlzLnByZVopO1xuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgIHZhciBmcmFtZUJ1ZmZlciA9IHRoaXMuZnJhbWVCdWZmZXI7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy51cGRhdGVQYXJhbWV0ZXIobmFtZSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIHZhciBvdXRwdXRJbmZvID0gdGhpcy5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fY29tcG9zaXRvci5hbGxvY2F0ZVRleHR1cmUocGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV0gPSB0ZXh0dXJlO1xuXG4gICAgICAgICAgICAgICAgdmFyIGF0dGFjaG1lbnQgPSBvdXRwdXRJbmZvLmF0dGFjaG1lbnQgfHwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYXR0YWNobWVudCkgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudCA9IF9nbFthdHRhY2htZW50XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRleHR1cmUsIGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgIC8vIE1SVCBTdXBwb3J0IGluIGNocm9tZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc2RrL3Rlc3RzL2NvbmZvcm1hbmNlL2V4dGVuc2lvbnMvZXh0LWRyYXctYnVmZmVycy5odG1sXG4gICAgICAgICAgICB2YXIgZXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ0VYVF9kcmF3X2J1ZmZlcnMnKTtcbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnVmcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGF0dGFjaG1lbnQgaW4gdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPSBwYXJzZUludChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPj0gX2dsLkNPTE9SX0FUVEFDSE1FTlQwICYmIGF0dGFjaG1lbnQgPD0gX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy5wdXNoKGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4dC5kcmF3QnVmZmVyc0VYVChidWZzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWx3YXlzIGNsZWFyXG4gICAgICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgICAgICByZW5kZXJlci5zYXZlQ2xlYXIoKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLmNsZWFyQml0ID0gZ2xlbnVtLkRFUFRIX0JVRkZFUl9CSVQgfCBnbGVudW0uQ09MT1JfQlVGRkVSX0JJVDtcbiAgICAgICAgICAgIHJlbmRlckluZm8gPSByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsICF0aGlzLmF1dG9VcGRhdGVTY2VuZSwgdGhpcy5wcmVaKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlc3RvcmVDbGVhcigpO1xuXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdhZnRlcnJlbmRlcicsIHJlbmRlckluZm8pO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZCA9IHRydWU7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNjZW5lTm9kZTtcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY29tcG9zaXRvci5UZXh0dXJlTm9kZVxuICogQGV4dGVuZHMgY2xheS5jb21wb3NpdG9yLk5vZGVcbiAqL1xudmFyIFRleHR1cmVOb2RlID0gTm9kZS5leHRlbmQoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLlRleHR1cmVOb2RlIyAqLyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuICAgICAgICB0ZXh0dXJlOiBudWxsLFxuXG4gICAgICAgIC8vIFRleHR1cmUgbm9kZSBtdXN0IGhhdmUgb3V0cHV0IHdpdGhvdXQgcGFyYW1ldGVyc1xuICAgICAgICBvdXRwdXRzOiB7XG4gICAgICAgICAgICBjb2xvcjoge31cbiAgICAgICAgfVxuICAgIH07XG59LCBmdW5jdGlvbiAoKSB7XG59LCB7XG5cbiAgICBnZXRPdXRwdXQ6IGZ1bmN0aW9uIChyZW5kZXJlciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlO1xuICAgIH0sXG5cbiAgICAvLyBEbyBub3RoaW5nXG4gICAgYmVmb3JlRnJhbWU6IGZ1bmN0aW9uICgpIHt9LFxuICAgIGFmdGVyRnJhbWU6IGZ1bmN0aW9uICgpIHt9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZU5vZGU7XG4iLCIvLyBUT0RPIFNoYWRlciBsaWJyYXJ5XG5pbXBvcnQgUGFzcyBmcm9tICcuL1Bhc3MnO1xuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcblxuLy8gVE9ETyBjdXJsbm9pc2UgZGVtbyB3cm9uZ1xuXG4vLyBQRU5ESU5HXG4vLyBVc2UgdG9wb2xvZ2ljYWwgc29ydCA/XG5cbi8qKlxuICogRmlsdGVyIG5vZGVcbiAqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jb21wb3NpdG9yLkZpbHRlck5vZGVcbiAqIEBleHRlbmRzIGNsYXkuY29tcG9zaXRvci5Ob2RlXG4gKlxuICogQGV4YW1wbGVcbiAgICB2YXIgbm9kZSA9IG5ldyBjbGF5LmNvbXBvc2l0b3IuTm9kZSh7XG4gICAgICAgIG5hbWU6ICdmeGFhJyxcbiAgICAgICAgc2hhZGVyOiBjbGF5LlNoYWRlci5zb3VyY2UoJ2NsYXkuY29tcG9zaXRvci5meGFhJyksXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiAnc2NlbmUnLFxuICAgICAgICAgICAgICAgICAgICBwaW46ICdjb2xvcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gTXVsdGlwbGUgb3V0cHV0cyBpcyBwcmVzZXJ2ZWQgZm9yIE1SVCBzdXBwb3J0IGluIFdlYkdMMi4wXG4gICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgYXR0YWNobWVudDogY2xheS5GcmFtZUJ1ZmZlci5DT0xPUl9BVFRBQ0hNRU5UMFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBjbGF5LlRleHR1cmUuUkdCQSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUxMixcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA1MTJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2lsbCBrZWVwIHRoZSBSVFQgcmVuZGVyZWQgaW4gbGFzdCBmcmFtZVxuICAgICAgICAgICAgICAgIGtlZXBMYXN0RnJhbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIG5vZGUgb3V0cHV0IHRoZSBSVFQgcmVuZGVyZWQgaW4gbGFzdCBmcmFtZVxuICAgICAgICAgICAgICAgIG91dHB1dExhc3RGcmFtZTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgKlxuICAgICovXG52YXIgRmlsdGVyTm9kZSA9IE5vZGUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LmNvbXBvc2l0b3IuTm9kZSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgaW5wdXRzOiB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIG91dHB1dHM6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBzaGFkZXI6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnB1dCBsaW5rcywgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSBncmFwaFxuICAgICAgICAgKiBAZXhhbXBsZTpcbiAgICAgICAgICogICAgIGlucHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBpbnB1dExpbmtzOiB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3V0cHV0IGxpbmtzLCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIGdyYXBoXG4gICAgICAgICAqIEBleGFtcGxlOlxuICAgICAgICAgKiAgICAgb3V0cHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRMaW5rczoge30sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LmNvbXBvc2l0b3IuUGFzc31cbiAgICAgICAgICovXG4gICAgICAgIHBhc3M6IG51bGwsXG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3V0cHV0IHRleHR1cmUgb2YgcHJldmlvdXMgZnJhbWVcbiAgICAgICAgLy8gV2lsbCBiZSB1c2VkIHdoZW4gdGhlcmUgZXhpc3QgYSBjaXJjdWxhciByZWZlcmVuY2VcbiAgICAgICAgX3ByZXZPdXRwdXRUZXh0dXJlczoge30sXG4gICAgICAgIF9vdXRwdXRUZXh0dXJlczoge30sXG5cbiAgICAgICAgLy8gRXhhbXBsZTogeyBuYW1lOiAyIH1cbiAgICAgICAgX291dHB1dFJlZmVyZW5jZXM6IHt9LFxuXG4gICAgICAgIF9yZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAvLyBJZiByZW5kZXJlZCBpbiB0aGlzIGZyYW1lXG4gICAgICAgIF9yZW5kZXJlZDogZmFsc2UsXG5cbiAgICAgICAgX2NvbXBvc2l0b3I6IG51bGxcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIHBhc3MgPSBuZXcgUGFzcyh7XG4gICAgICAgIGZyYWdtZW50OiB0aGlzLnNoYWRlclxuICAgIH0pO1xuICAgIHRoaXMucGFzcyA9IHBhc3M7XG59LFxuLyoqIEBsZW5kcyBjbGF5LmNvbXBvc2l0b3IuTm9kZS5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24gKHJlbmRlcmVyLCBmcmFtZUJ1ZmZlcikge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcicsIHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJpbmcgPSB0cnVlO1xuXG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcblxuICAgICAgICBmb3IgKHZhciBpbnB1dE5hbWUgaW4gdGhpcy5pbnB1dExpbmtzKSB7XG4gICAgICAgICAgICB2YXIgbGluayA9IHRoaXMuaW5wdXRMaW5rc1tpbnB1dE5hbWVdO1xuICAgICAgICAgICAgdmFyIGlucHV0VGV4dHVyZSA9IGxpbmsubm9kZS5nZXRPdXRwdXQocmVuZGVyZXIsIGxpbmsucGluKTtcbiAgICAgICAgICAgIHRoaXMucGFzcy5zZXRVbmlmb3JtKGlucHV0TmFtZSwgaW5wdXRUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdXRwdXRcbiAgICAgICAgaWYgKCF0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMucGFzcy5vdXRwdXRzID0gbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5nZXRGcmFtZUJ1ZmZlcigpLnVuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgIHRoaXMucGFzcy5yZW5kZXIocmVuZGVyZXIsIGZyYW1lQnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFzcy5vdXRwdXRzID0ge307XG5cbiAgICAgICAgICAgIHZhciBhdHRhY2hlZFRleHR1cmVzID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy51cGRhdGVQYXJhbWV0ZXIobmFtZSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihwYXJhbWV0ZXJzLndpZHRoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmFtZXRlcihuYW1lLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvdXRwdXRJbmZvID0gdGhpcy5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fY29tcG9zaXRvci5hbGxvY2F0ZVRleHR1cmUocGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgIHZhciBhdHRhY2htZW50ID0gb3V0cHV0SW5mby5hdHRhY2htZW50IHx8IF9nbC5DT0xPUl9BVFRBQ0hNRU5UMDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGF0dGFjaG1lbnQpID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPSBfZ2xbYXR0YWNobWVudF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5nZXRGcmFtZUJ1ZmZlcigpLmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIGF0dGFjaGVkVGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBhdHRhY2htZW50IGNoYW5nZXMgaW4gZGlmZmVyZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5nZXRGcmFtZUJ1ZmZlcigpLmF0dGFjaChcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRUZXh0dXJlc1thdHRhY2htZW50XSwgYXR0YWNobWVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGFzcy5yZW5kZXIocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBkYXRhIG9mIHRleHR1cmUgaXMgY2hhbmdlZCBvdmVyIHRpbWUsXG4gICAgICAgICAgICAvLyBIZXJlIHVwZGF0ZSB0aGUgbWlwbWFwcyBvZiB0ZXh0dXJlIGVhY2ggdGltZSBhZnRlciByZW5kZXJlZDtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0b3IuZ2V0RnJhbWVCdWZmZXIoKS51cGRhdGVNaXBtYXAocmVuZGVyZXIuZ2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaW5wdXROYW1lIGluIHRoaXMuaW5wdXRMaW5rcykge1xuICAgICAgICAgICAgdmFyIGxpbmsgPSB0aGlzLmlucHV0TGlua3NbaW5wdXROYW1lXTtcbiAgICAgICAgICAgIGxpbmsubm9kZS5yZW1vdmVSZWZlcmVuY2UobGluay5waW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2FmdGVycmVuZGVyJywgcmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICAvLyBUT0RPIFJlbW92ZSBwYXJhbWV0ZXIgZnVuY3Rpb24gY2FsbGJhY2tcbiAgICB1cGRhdGVQYXJhbWV0ZXI6IGZ1bmN0aW9uIChvdXRwdXROYW1lLCByZW5kZXJlcikge1xuICAgICAgICB2YXIgb3V0cHV0SW5mbyA9IHRoaXMub3V0cHV0c1tvdXRwdXROYW1lXTtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvdXRwdXRJbmZvLnBhcmFtZXRlcnM7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5O1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnNDb3B5KSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ3dpZHRoJyAmJiBrZXkgIT09ICdoZWlnaHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNDb3B5W2tleV0gPSBwYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB3aWR0aCwgaGVpZ2h0O1xuICAgICAgICBpZiAocGFyYW1ldGVycy53aWR0aCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGguY2FsbCh0aGlzLCByZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuaGVpZ2h0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHBhcmFtZXRlcnMuaGVpZ2h0LmNhbGwodGhpcywgcmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyYW1ldGVycy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1ldGVyc0NvcHkud2lkdGggIT09IHdpZHRoXG4gICAgICAgICAgICB8fCBwYXJhbWV0ZXJzQ29weS5oZWlnaHQgIT09IGhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdXRwdXRUZXh0dXJlc1tvdXRwdXROYW1lXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dFRleHR1cmVzW291dHB1dE5hbWVdLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LndpZHRoID0gd2lkdGg7XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICByZXR1cm4gcGFyYW1ldGVyc0NvcHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBwYXJhbWV0ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7fSB2YWx1ZVxuICAgICAqL1xuICAgIHNldFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMucGFzcy5zZXRVbmlmb3JtKG5hbWUsIHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCBwYXJhbWV0ZXIgdmFsdWVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHt9XG4gICAgICovXG4gICAgZ2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXNzLmdldFVuaWZvcm0obmFtZSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXQgcGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICAgKi9cbiAgICBzZXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihuYW1lLCBvYmpbbmFtZV0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBTZXQgc2hhZGVyIGNvZGVcbiAgICAvLyAgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RyXG4gICAgLy8gICovXG4gICAgLy8gc2V0U2hhZGVyOiBmdW5jdGlvbiAoc2hhZGVyU3RyKSB7XG4gICAgLy8gICAgIHZhciBtYXRlcmlhbCA9IHRoaXMucGFzcy5tYXRlcmlhbDtcbiAgICAvLyAgICAgbWF0ZXJpYWwuc2hhZGVyLnNldEZyYWdtZW50KHNoYWRlclN0cik7XG4gICAgLy8gICAgIG1hdGVyaWFsLmF0dGFjaFNoYWRlcihtYXRlcmlhbC5zaGFkZXIsIHRydWUpO1xuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUHJveHkgb2YgcGFzcy5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgeHh4KTtcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHN5bWJvbFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gW3ZhbF1cbiAgICAgKi9cbiAgICBkZWZpbmU6IGZ1bmN0aW9uIChzeW1ib2wsIHZhbCkge1xuICAgICAgICB0aGlzLnBhc3MubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsIHN5bWJvbCwgdmFsKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJveHkgb2YgcGFzcy5tYXRlcmlhbC51bmRlZmluZSgnZnJhZ21lbnQnLCB4eHgpXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKi9cbiAgICB1bmRlZmluZTogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB0aGlzLnBhc3MubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50Jywgc3ltYm9sKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlUmVmZXJlbmNlOiBmdW5jdGlvbiAob3V0cHV0TmFtZSkge1xuICAgICAgICB0aGlzLl9vdXRwdXRSZWZlcmVuY2VzW291dHB1dE5hbWVdLS07XG4gICAgICAgIGlmICh0aGlzLl9vdXRwdXRSZWZlcmVuY2VzW291dHB1dE5hbWVdID09PSAwKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0SW5mbyA9IHRoaXMub3V0cHV0c1tvdXRwdXROYW1lXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmZvLmtlZXBMYXN0RnJhbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldk91dHB1dFRleHR1cmVzW291dHB1dE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0b3IucmVsZWFzZVRleHR1cmUodGhpcy5fcHJldk91dHB1dFRleHR1cmVzW291dHB1dE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW291dHB1dE5hbWVdID0gdGhpcy5fb3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdXRwdXQgb2YgdGhpcyBub2RlIGhhdmUgYWxyZWF5IGJlZW4gdXNlZCBieSBhbGwgb3RoZXIgbm9kZXNcbiAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHRleHR1cmUgYmFjayB0byB0aGUgcG9vbC5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdG9yLnJlbGVhc2VUZXh0dXJlKHRoaXMuX291dHB1dFRleHR1cmVzW291dHB1dE5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBOb2RlLnByb3RvdHlwZS5jbGVhci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIERlZmF1bHQgZGlzYWJsZSBhbGwgdGV4dHVyZVxuICAgICAgICB0aGlzLnBhc3MubWF0ZXJpYWwuZGlzYWJsZVRleHR1cmVzQWxsKCk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlck5vZGU7XG4iLCJpbXBvcnQgdXRpbCBmcm9tICcuLi9jb3JlL3V0aWwnO1xuaW1wb3J0IENvbXBvc2l0b3IgZnJvbSAnLi9Db21wb3NpdG9yJztcbmltcG9ydCBDb21wb1NjZW5lTm9kZSBmcm9tICcuL1NjZW5lTm9kZSc7XG5pbXBvcnQgQ29tcG9UZXh0dXJlTm9kZSBmcm9tICcuL1RleHR1cmVOb2RlJztcbmltcG9ydCBDb21wb0ZpbHRlck5vZGUgZnJvbSAnLi9GaWx0ZXJOb2RlJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL1RleHR1cmUnO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFRleHR1cmVDdWJlIGZyb20gJy4uL1RleHR1cmVDdWJlJztcblxudmFyIHNoYWRlclNvdXJjZVJlZyA9IC9eI3NvdXJjZVxcKCguKj8pXFwpLztcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHJldHVybiB7Y2xheS5jb21wb3NpdG9yLkNvbXBvc2l0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2l0b3IoanNvbiwgb3B0cykge1xuICAgIHZhciBjb21wb3NpdG9yID0gbmV3IENvbXBvc2l0b3IoKTtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIHZhciBsaWIgPSB7XG4gICAgICAgIHRleHR1cmVzOiB7fSxcbiAgICAgICAgcGFyYW1ldGVyczoge31cbiAgICB9O1xuICAgIHZhciBhZnRlckxvYWQgPSBmdW5jdGlvbihzaGFkZXJMaWIsIHRleHR1cmVMaWIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUluZm8gPSBqc29uLm5vZGVzW2ldO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBjcmVhdGVOb2RlKG5vZGVJbmZvLCBsaWIsIG9wdHMpO1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdG9yLmFkZE5vZGUobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiBqc29uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdmFyIHBhcmFtSW5mbyA9IGpzb24ucGFyYW1ldGVyc1tuYW1lXTtcbiAgICAgICAgbGliLnBhcmFtZXRlcnNbbmFtZV0gPSBjb252ZXJ0UGFyYW1ldGVyKHBhcmFtSW5mbyk7XG4gICAgfVxuICAgIC8vIFRPRE8gbG9hZCB0ZXh0dXJlIGFzeW5jaHJvbm91c1xuICAgIGxvYWRUZXh0dXJlcyhqc29uLCBsaWIsIG9wdHMsIGZ1bmN0aW9uKHRleHR1cmVMaWIpIHtcbiAgICAgICAgbGliLnRleHR1cmVzID0gdGV4dHVyZUxpYjtcbiAgICAgICAgYWZ0ZXJMb2FkKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9zaXRvcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9kZShub2RlSW5mbywgbGliLCBvcHRzKSB7XG4gICAgdmFyIHR5cGUgPSBub2RlSW5mby50eXBlIHx8ICdmaWx0ZXInO1xuICAgIHZhciBzaGFkZXJTb3VyY2U7XG4gICAgdmFyIGlucHV0cztcbiAgICB2YXIgb3V0cHV0cztcblxuICAgIGlmICh0eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICB2YXIgc2hhZGVyRXhwID0gbm9kZUluZm8uc2hhZGVyLnRyaW0oKTtcbiAgICAgICAgdmFyIHJlcyA9IHNoYWRlclNvdXJjZVJlZy5leGVjKHNoYWRlckV4cCk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHNoYWRlclNvdXJjZSA9IFNoYWRlci5zb3VyY2UocmVzWzFdLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhZGVyRXhwLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgICAgICBzaGFkZXJTb3VyY2UgPSBsaWIuc2hhZGVyc1tzaGFkZXJFeHAuc3Vic3RyKDEpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWRlclNvdXJjZSkge1xuICAgICAgICAgICAgc2hhZGVyU291cmNlID0gc2hhZGVyRXhwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hhZGVyU291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZUluZm8uaW5wdXRzKSB7XG4gICAgICAgIGlucHV0cyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIG5vZGVJbmZvLmlucHV0cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlSW5mby5pbnB1dHNbbmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRzW25hbWVdID0gbm9kZUluZm8uaW5wdXRzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXRzW25hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlSW5mby5pbnB1dHNbbmFtZV0ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgcGluOiBub2RlSW5mby5pbnB1dHNbbmFtZV0ucGluXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZUluZm8ub3V0cHV0cykge1xuICAgICAgICBvdXRwdXRzID0ge307XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZUluZm8ub3V0cHV0cykge1xuICAgICAgICAgICAgdmFyIG91dHB1dEluZm8gPSBub2RlSW5mby5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgb3V0cHV0c1tuYW1lXSA9IHt9O1xuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8uYXR0YWNobWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0c1tuYW1lXS5hdHRhY2htZW50ID0gb3V0cHV0SW5mby5hdHRhY2htZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ua2VlcExhc3RGcmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0c1tuYW1lXS5rZWVwTGFzdEZyYW1lID0gb3V0cHV0SW5mby5rZWVwTGFzdEZyYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ub3V0cHV0TGFzdEZyYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzW25hbWVdLm91dHB1dExhc3RGcmFtZSA9IG91dHB1dEluZm8ub3V0cHV0TGFzdEZyYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ucGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIG91dHB1dHNbbmFtZV0ucGFyYW1ldGVycyA9IGNvbnZlcnRQYXJhbWV0ZXIob3V0cHV0SW5mby5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbm9kZTtcbiAgICBpZiAodHlwZSA9PT0gJ3NjZW5lJykge1xuICAgICAgICBub2RlID0gbmV3IENvbXBvU2NlbmVOb2RlKHtcbiAgICAgICAgICAgIG5hbWU6IG5vZGVJbmZvLm5hbWUsXG4gICAgICAgICAgICBzY2VuZTogb3B0cy5zY2VuZSxcbiAgICAgICAgICAgIGNhbWVyYTogb3B0cy5jYW1lcmEsXG4gICAgICAgICAgICBvdXRwdXRzOiBvdXRwdXRzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAndGV4dHVyZScpIHtcbiAgICAgICAgbm9kZSA9IG5ldyBDb21wb1RleHR1cmVOb2RlKHtcbiAgICAgICAgICAgIG5hbWU6IG5vZGVJbmZvLm5hbWUsXG4gICAgICAgICAgICBvdXRwdXRzOiBvdXRwdXRzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBEZWZhdWx0IGlzIGZpbHRlclxuICAgIGVsc2Uge1xuICAgICAgICBub2RlID0gbmV3IENvbXBvRmlsdGVyTm9kZSh7XG4gICAgICAgICAgICBuYW1lOiBub2RlSW5mby5uYW1lLFxuICAgICAgICAgICAgc2hhZGVyOiBzaGFkZXJTb3VyY2UsXG4gICAgICAgICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgICAgICAgIG91dHB1dHM6IG91dHB1dHNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlSW5mby5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIG5vZGVJbmZvLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbm9kZUluZm8ucGFyYW1ldGVyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGxpYi50ZXh0dXJlc1t2YWwuc3Vic3RyKDEpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUub24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlZm9yZXJlbmRlcicsIGNyZWF0ZVNpemVTZXRIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cnlDb252ZXJ0RXhwcih2YWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLnNldFBhcmFtZXRlcihuYW1lLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlSW5mby5kZWZpbmVzICYmIG5vZGUucGFzcykge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBub2RlSW5mby5kZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IG5vZGVJbmZvLmRlZmluZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzLm1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCBuYW1lLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UGFyYW1ldGVyKHBhcmFtSW5mbykge1xuICAgIHZhciBwYXJhbSA9IHt9O1xuICAgIGlmICghcGFyYW1JbmZvKSB7XG4gICAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG4gICAgWyd0eXBlJywgJ21pbkZpbHRlcicsICdtYWdGaWx0ZXInLCAnd3JhcFMnLCAnd3JhcFQnLCAnZmxpcFknLCAndXNlTWlwbWFwJ11cbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHBhcmFtSW5mb1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGVudW1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gVGV4dHVyZVt2YWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJhbVtuYW1lXSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgWyd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1JbmZvW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gcGFyYW1JbmZvW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbVtuYW1lXSA9IGNyZWF0ZVNpemVQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cnlDb252ZXJ0RXhwcih2YWwpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbVtuYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIGlmIChwYXJhbUluZm8udXNlTWlwbWFwICE9IG51bGwpIHtcbiAgICAgICAgcGFyYW0udXNlTWlwbWFwID0gcGFyYW1JbmZvLnVzZU1pcG1hcDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtO1xufVxuXG5mdW5jdGlvbiBsb2FkVGV4dHVyZXMoanNvbiwgbGliLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghanNvbi50ZXh0dXJlcykge1xuICAgICAgICBjYWxsYmFjayh7fSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRleHR1cmVzID0ge307XG4gICAgdmFyIGxvYWRpbmcgPSAwO1xuXG4gICAgdmFyIGNiZCA9IGZhbHNlO1xuICAgIHZhciB0ZXh0dXJlUm9vdFBhdGggPSBvcHRzLnRleHR1cmVSb290UGF0aDtcbiAgICB1dGlsLmVhY2goanNvbi50ZXh0dXJlcywgZnVuY3Rpb24odGV4dHVyZUluZm8sIG5hbWUpIHtcbiAgICAgICAgdmFyIHRleHR1cmU7XG4gICAgICAgIHZhciBwYXRoID0gdGV4dHVyZUluZm8ucGF0aDtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBjb252ZXJ0UGFyYW1ldGVyKHRleHR1cmVJbmZvLnBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSAmJiBwYXRoLmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgaWYgKHRleHR1cmVSb290UGF0aCkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLnJlbGF0aXZlMmFic29sdXRlKGl0ZW0sIHRleHR1cmVSb290UGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0dXJlID0gbmV3IFRleHR1cmVDdWJlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGV4dHVyZVJvb3RQYXRoKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHV0aWwucmVsYXRpdmUyYWJzb2x1dGUocGF0aCwgdGV4dHVyZVJvb3RQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dHVyZS5sb2FkKHBhdGgpO1xuICAgICAgICBsb2FkaW5nKys7XG4gICAgICAgIHRleHR1cmUub25jZSgnc3VjY2VzcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGV4dHVyZXNbbmFtZV0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgbG9hZGluZy0tO1xuICAgICAgICAgICAgaWYgKGxvYWRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0ZXh0dXJlcyk7XG4gICAgICAgICAgICAgICAgY2JkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobG9hZGluZyA9PT0gMCAmJiAhY2JkKSB7XG4gICAgICAgIGNhbGxiYWNrKHRleHR1cmVzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpemVTZXRIYW5kbGVyKG5hbWUsIGV4cHJGdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICAvLyBQRU5ESU5HIHZpZXdwb3J0IHNpemUgb3Igd2luZG93IHNpemVcbiAgICAgICAgdmFyIGRwciA9IHJlbmRlcmVyLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICAgICAgLy8gUEVORElORyBJZiBtdWx0aXBseSBkcHIgP1xuICAgICAgICB2YXIgd2lkdGggPSByZW5kZXJlci5nZXRXaWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gcmVuZGVyZXIuZ2V0SGVpZ2h0KCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBleHByRnVuYyh3aWR0aCwgaGVpZ2h0LCBkcHIpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihuYW1lLCByZXN1bHQpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpemVQYXJzZXIobmFtZSwgZXhwckZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBkcHIgPSByZW5kZXJlci5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIHZhciB3aWR0aCA9IHJlbmRlcmVyLmdldFdpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSByZW5kZXJlci5nZXRIZWlnaHQoKTtcbiAgICAgICAgcmV0dXJuIGV4cHJGdW5jKHdpZHRoLCBoZWlnaHQsIGRwcik7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdHJ5Q29udmVydEV4cHIoc3RyaW5nKSB7XG4gICAgLy8gUEVORElOR1xuICAgIHZhciBleHByUmVzID0gL15leHByXFwoKC4qKVxcKSQvLmV4ZWMoc3RyaW5nKTtcbiAgICBpZiAoZXhwclJlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ3dpZHRoJywgJ2hlaWdodCcsICdkcHInLCAncmV0dXJuICcgKyBleHByUmVzWzFdKTtcbiAgICAgICAgICAgIC8vIFRyeSBydW4gdFxuICAgICAgICAgICAgZnVuYygxLCAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHByZXNzaW9uLicpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb3NpdG9yO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQuZ2J1ZmZlci52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSBtYXQ0IHdvcmxkSW52ZXJzZVRyYW5zcG9zZSA6IFdPUkxESU5WRVJTRVRSQU5TUE9TRTtcXG51bmlmb3JtIG1hdDQgd29ybGQgOiBXT1JMRDtcXG51bmlmb3JtIHZlYzIgdXZSZXBlYXQ7XFxudW5pZm9ybSB2ZWMyIHV2T2Zmc2V0O1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uIDogUE9TSVRJT047XFxuYXR0cmlidXRlIHZlYzIgdGV4Y29vcmQgOiBURVhDT09SRF8wO1xcbiNpZmRlZiBGSVJTVF9QQVNTXFxuYXR0cmlidXRlIHZlYzMgbm9ybWFsIDogTk9STUFMO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG4jaWZkZWYgRklSU1RfUEFTU1xcbnZhcnlpbmcgdmVjMyB2X05vcm1hbDtcXG5hdHRyaWJ1dGUgdmVjNCB0YW5nZW50IDogVEFOR0VOVDtcXG52YXJ5aW5nIHZlYzMgdl9UYW5nZW50O1xcbnZhcnlpbmcgdmVjMyB2X0JpdGFuZ2VudDtcXG52YXJ5aW5nIHZlYzMgdl9Xb3JsZFBvc2l0aW9uO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiNpZmRlZiBGSVJTVF9QQVNTXFxuICAgIHZlYzMgc2tpbm5lZE5vcm1hbCA9IG5vcm1hbDtcXG4gICAgdmVjMyBza2lubmVkVGFuZ2VudCA9IHRhbmdlbnQueHl6O1xcbiAgICBib29sIGhhc1RhbmdlbnQgPSBkb3QodGFuZ2VudCwgdGFuZ2VudCkgPiAwLjA7XFxuI2VuZGlmXFxuI2lmZGVmIFNLSU5OSU5HXFxuICAgIEBpbXBvcnQgY2xheS5jaHVuay5za2luX21hdHJpeFxcbiAgICBza2lubmVkUG9zaXRpb24gPSAoc2tpbk1hdHJpeFdTICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6O1xcbiAgICAjaWZkZWYgRklSU1RfUEFTU1xcbiAgICBza2lubmVkTm9ybWFsID0gKHNraW5NYXRyaXhXUyAqIHZlYzQobm9ybWFsLCAwLjApKS54eXo7XFxuICAgIGlmIChoYXNUYW5nZW50KSB7XFxuICAgICAgICBza2lubmVkVGFuZ2VudCA9IChza2luTWF0cml4V1MgKiB2ZWM0KHRhbmdlbnQueHl6LCAwLjApKS54eXo7XFxuICAgIH1cXG4gICAgI2VuZGlmXFxuI2VuZGlmXFxuICAgIGdsX1Bvc2l0aW9uID0gd29ybGRWaWV3UHJvamVjdGlvbiAqIHZlYzQoc2tpbm5lZFBvc2l0aW9uLCAxLjApO1xcbiAgICB2X1RleGNvb3JkID0gdGV4Y29vcmQgKiB1dlJlcGVhdCArIHV2T2Zmc2V0O1xcbiNpZmRlZiBGSVJTVF9QQVNTXFxuICAgIHZfTm9ybWFsID0gbm9ybWFsaXplKCh3b3JsZEludmVyc2VUcmFuc3Bvc2UgKiB2ZWM0KHNraW5uZWROb3JtYWwsIDAuMCkpLnh5eik7XFxuICAgIGlmIChoYXNUYW5nZW50KSB7XFxuICAgICAgICB2X1RhbmdlbnQgPSBub3JtYWxpemUoKHdvcmxkSW52ZXJzZVRyYW5zcG9zZSAqIHZlYzQoc2tpbm5lZFRhbmdlbnQsIDAuMCkpLnh5eik7XFxuICAgICAgICB2X0JpdGFuZ2VudCA9IG5vcm1hbGl6ZShjcm9zcyh2X05vcm1hbCwgdl9UYW5nZW50KSAqIHRhbmdlbnQudyk7XFxuICAgIH1cXG4gICAgdl9Xb3JsZFBvc2l0aW9uID0gKHdvcmxkICogdmVjNChza2lubmVkUG9zaXRpb24sIDEuMCkpLnh5ejtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5nYnVmZmVyMS5mcmFnbWVudFxcbnVuaWZvcm0gbWF0NCB2aWV3SW52ZXJzZSA6IFZJRVdJTlZFUlNFO1xcbnVuaWZvcm0gZmxvYXQgZ2xvc3NpbmVzcztcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG51bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XFxudmFyeWluZyB2ZWMzIHZfVGFuZ2VudDtcXG52YXJ5aW5nIHZlYzMgdl9CaXRhbmdlbnQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgcm91Z2hHbG9zc01hcDtcXG51bmlmb3JtIGJvb2wgdXNlUm91Z2hHbG9zc01hcDtcXG51bmlmb3JtIGJvb2wgdXNlUm91Z2huZXNzO1xcbnVuaWZvcm0gYm9vbCBkb3VibGVTaWRlZDtcXG51bmlmb3JtIGludCByb3VnaEdsb3NzQ2hhbm5lbDogMDtcXG5mbG9hdCBpbmRleGluZ1RleGVsKGluIHZlYzQgdGV4ZWwsIGluIGludCBpZHgpIHtcXG4gICAgaWYgKGlkeCA9PSAzKSByZXR1cm4gdGV4ZWwuYTtcXG4gICAgZWxzZSBpZiAoaWR4ID09IDEpIHJldHVybiB0ZXhlbC5nO1xcbiAgICBlbHNlIGlmIChpZHggPT0gMikgcmV0dXJuIHRleGVsLmI7XFxuICAgIGVsc2UgcmV0dXJuIHRleGVsLnI7XFxufVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIE4gPSB2X05vcm1hbDtcXG4gICAgaWYgKGRvdWJsZVNpZGVkKSB7XFxuICAgICAgICB2ZWMzIGV5ZVBvcyA9IHZpZXdJbnZlcnNlWzNdLnh5ejtcXG4gICAgICAgIHZlYzMgViA9IGV5ZVBvcyAtIHZfV29ybGRQb3NpdGlvbjtcXG4gICAgICAgIGlmIChkb3QoTiwgVikgPCAwLjApIHtcXG4gICAgICAgICAgICBOID0gLU47XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGRvdCh2X1RhbmdlbnQsIHZfVGFuZ2VudCkgPiAwLjApIHtcXG4gICAgICAgIHZlYzMgbm9ybWFsVGV4ZWwgPSB0ZXh0dXJlMkQobm9ybWFsTWFwLCB2X1RleGNvb3JkKS54eXo7XFxuICAgICAgICBpZiAoZG90KG5vcm1hbFRleGVsLCBub3JtYWxUZXhlbCkgPiAwLjApIHsgICAgICAgICAgICBOID0gbm9ybWFsVGV4ZWwgKiAyLjAgLSAxLjA7XFxuICAgICAgICAgICAgbWF0MyB0Ym4gPSBtYXQzKHZfVGFuZ2VudCwgdl9CaXRhbmdlbnQsIHZfTm9ybWFsKTtcXG4gICAgICAgICAgICBOID0gbm9ybWFsaXplKHRibiAqIE4pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSAoTiArIDEuMCkgKiAwLjU7XFxuICAgIGZsb2F0IGcgPSBnbG9zc2luZXNzO1xcbiAgICBpZiAodXNlUm91Z2hHbG9zc01hcCkge1xcbiAgICAgICAgZmxvYXQgZzIgPSBpbmRleGluZ1RleGVsKHRleHR1cmUyRChyb3VnaEdsb3NzTWFwLCB2X1RleGNvb3JkKSwgcm91Z2hHbG9zc0NoYW5uZWwpO1xcbiAgICAgICAgaWYgKHVzZVJvdWdobmVzcykge1xcbiAgICAgICAgICAgIGcyID0gMS4wIC0gZzI7XFxuICAgICAgICB9XFxuICAgICAgICBnID0gY2xhbXAoZzIgKyAoZyAtIDAuNSkgKiAyLjAsIDAuMCwgMS4wKTtcXG4gICAgfVxcbiAgICBnbF9GcmFnQ29sb3IuYSA9IGcgKyAwLjAwNTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5nYnVmZmVyMi5mcmFnbWVudFxcbnVuaWZvcm0gc2FtcGxlcjJEIGRpZmZ1c2VNYXA7XFxudW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbnVuaWZvcm0gdmVjMyBjb2xvcjtcXG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcXG51bmlmb3JtIGJvb2wgdXNlTWV0YWxuZXNzTWFwO1xcbnVuaWZvcm0gYm9vbCBsaW5lYXI7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwuc3JnYlxcbnZvaWQgbWFpbiAoKVxcbntcXG4gICAgZmxvYXQgbSA9IG1ldGFsbmVzcztcXG4gICAgaWYgKHVzZU1ldGFsbmVzc01hcCkge1xcbiAgICAgICAgdmVjNCBtZXRhbG5lc3NUZXhlbCA9IHRleHR1cmUyRChtZXRhbG5lc3NNYXAsIHZfVGV4Y29vcmQpO1xcbiAgICAgICAgbSA9IGNsYW1wKG1ldGFsbmVzc1RleGVsLnIgKyAobSAqIDIuMCAtIDEuMCksIDAuMCwgMS4wKTtcXG4gICAgfVxcbiAgICB2ZWM0IHRleGVsID0gdGV4dHVyZTJEKGRpZmZ1c2VNYXAsIHZfVGV4Y29vcmQpO1xcbiAgICBpZiAobGluZWFyKSB7XFxuICAgICAgICB0ZXhlbCA9IHNSR0JUb0xpbmVhcih0ZXhlbCk7XFxuICAgIH1cXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHRleGVsLnJnYiAqIGNvbG9yO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IG0gKyAwLjAwNTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5nYnVmZmVyLmRlYnVnXFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG51bmlmb3JtIGludCBkZWJ1ZzogMDtcXG52b2lkIG1haW4gKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgaWYgKGRlYnVnID09IDApIHtcXG4gICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoTiwgMS4wKTtcXG4gICAgfVxcbiAgICBlbHNlIGlmIChkZWJ1ZyA9PSAxKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoeiksIDEuMCk7XFxuICAgIH1cXG4gICAgZWxzZSBpZiAoZGVidWcgPT0gMikge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChwb3NpdGlvbiwgMS4wKTtcXG4gICAgfVxcbiAgICBlbHNlIGlmIChkZWJ1ZyA9PSAzKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoZ2xvc3NpbmVzcyksIDEuMCk7XFxuICAgIH1cXG4gICAgZWxzZSBpZiAoZGVidWcgPT0gNCkge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2ZWMzKG1ldGFsbmVzcyksIDEuMCk7XFxuICAgIH1cXG4gICAgZWxzZSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGFsYmVkbywgMS4wKTtcXG4gICAgfVxcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5saWdodF9oZWFkXFxudW5pZm9ybSBzYW1wbGVyMkQgZ0J1ZmZlclRleHR1cmUxO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGdCdWZmZXJUZXh0dXJlMjtcXG51bmlmb3JtIHNhbXBsZXIyRCBnQnVmZmVyVGV4dHVyZTM7XFxudW5pZm9ybSB2ZWMyIHdpbmRvd1NpemU6IFdJTkRPV19TSVpFO1xcbnVuaWZvcm0gdmVjNCB2aWV3cG9ydDogVklFV1BPUlQ7XFxudW5pZm9ybSBtYXQ0IHZpZXdQcm9qZWN0aW9uSW52O1xcbiNpZmRlZiBERVBUSF9FTkNPREVEXFxuQGltcG9ydCBjbGF5LnV0aWwuZGVjb2RlX2Zsb2F0XFxuI2VuZGlmXFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMiB1diA9IGdsX0ZyYWdDb29yZC54eSAvIHdpbmRvd1NpemU7XFxuICAgIHZlYzIgdXYyID0gKGdsX0ZyYWdDb29yZC54eSAtIHZpZXdwb3J0Lnh5KSAvIHZpZXdwb3J0Lnp3O1xcbiAgICB2ZWM0IHRleGVsMSA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTEsIHV2KTtcXG4gICAgdmVjNCB0ZXhlbDMgPSB0ZXh0dXJlMkQoZ0J1ZmZlclRleHR1cmUzLCB1dik7XFxuICAgIGlmIChkb3QodGV4ZWwxLnJnYiwgdmVjMygxLjApKSA9PSAwLjApIHtcXG4gICAgICAgIGRpc2NhcmQ7XFxuICAgIH1cXG4gICAgZmxvYXQgZ2xvc3NpbmVzcyA9IHRleGVsMS5hO1xcbiAgICBmbG9hdCBtZXRhbG5lc3MgPSB0ZXhlbDMuYTtcXG4gICAgdmVjMyBOID0gdGV4ZWwxLnJnYiAqIDIuMCAtIDEuMDtcXG4gICAgZmxvYXQgeiA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTIsIHV2KS5yICogMi4wIC0gMS4wO1xcbiAgICB2ZWMyIHh5ID0gdXYyICogMi4wIC0gMS4wO1xcbiAgICB2ZWM0IHByb2plY3RlZFBvcyA9IHZlYzQoeHksIHosIDEuMCk7XFxuICAgIHZlYzQgcDQgPSB2aWV3UHJvamVjdGlvbkludiAqIHByb2plY3RlZFBvcztcXG4gICAgdmVjMyBwb3NpdGlvbiA9IHA0Lnh5eiAvIHA0Lnc7XFxuICAgIHZlYzMgYWxiZWRvID0gdGV4ZWwzLnJnYjtcXG4gICAgdmVjMyBkaWZmdXNlQ29sb3IgPSBhbGJlZG8gKiAoMS4wIC0gbWV0YWxuZXNzKTtcXG4gICAgdmVjMyBzcGVjdWxhckNvbG9yID0gbWl4KHZlYzMoMC4wNCksIGFsYmVkbywgbWV0YWxuZXNzKTtcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2VxdWF0aW9uXFxuZmxvYXQgRF9QaG9uZyhpbiBmbG9hdCBnLCBpbiBmbG9hdCBuZGgpIHtcXG4gICAgZmxvYXQgYSA9IHBvdyg4MTkyLjAsIGcpO1xcbiAgICByZXR1cm4gKGEgKyAyLjApIC8gOC4wICogcG93KG5kaCwgYSk7XFxufVxcbmZsb2F0IERfR0dYKGluIGZsb2F0IGcsIGluIGZsb2F0IG5kaCkge1xcbiAgICBmbG9hdCByID0gMS4wIC0gZztcXG4gICAgZmxvYXQgYSA9IHIgKiByO1xcbiAgICBmbG9hdCB0bXAgPSBuZGggKiBuZGggKiAoYSAtIDEuMCkgKyAxLjA7XFxuICAgIHJldHVybiBhIC8gKDMuMTQxNTkyNiAqIHRtcCAqIHRtcCk7XFxufVxcbnZlYzMgRl9TY2hsaWNrKGluIGZsb2F0IG5kdiwgdmVjMyBzcGVjKSB7XFxuICAgIHJldHVybiBzcGVjICsgKDEuMCAtIHNwZWMpICogcG93KDEuMCAtIG5kdiwgNS4wKTtcXG59XFxudmVjMyBsaWdodEVxdWF0aW9uKFxcbiAgICBpbiB2ZWMzIGxpZ2h0Q29sb3IsIGluIHZlYzMgZGlmZnVzZUNvbG9yLCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsXFxuICAgIGluIGZsb2F0IG5kbCwgaW4gZmxvYXQgbmRoLCBpbiBmbG9hdCBuZHYsIGluIGZsb2F0IGdcXG4pXFxue1xcbiAgICByZXR1cm4gbmRsICogbGlnaHRDb2xvclxcbiAgICAgICAgKiAoZGlmZnVzZUNvbG9yICsgRF9QaG9uZyhnLCBuZGgpICogRl9TY2hsaWNrKG5kdiwgc3BlY3VsYXJDb2xvcikpO1xcbn1cXG5AZW5kXCI7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IEZyYW1lQnVmZmVyIGZyb20gJy4uL0ZyYW1lQnVmZmVyJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBGb3J3YXJkUmVuZGVyZXIgZnJvbSAnLi4vUmVuZGVyZXInO1xuaW1wb3J0IFBhc3MgZnJvbSAnLi4vY29tcG9zaXRvci9QYXNzJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4uL21hdGgvTWF0cml4NCc7XG5cbmltcG9ydCBnYnVmZmVyRXNzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2didWZmZXIuZ2xzbC5qcyc7XG5pbXBvcnQgY2h1bmtFc3NsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvY2h1bmsuZ2xzbC5qcyc7XG5cblNoYWRlci5pbXBvcnQoZ2J1ZmZlckVzc2wpO1xuU2hhZGVyLmltcG9ydChjaHVua0Vzc2wpO1xuXG5mdW5jdGlvbiBjcmVhdGVGaWxsQ2FudmFzKGNvbG9yKSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHguZmlsbFN0eWxlID0gY29sb3IgfHwgJyMwMDAnO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcblxuICAgIHJldHVybiBjYW52YXM7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRleHR1cmVUb1Nsb3QocmVuZGVyZXIsIHByb2dyYW0sIHN5bWJvbCwgdGV4dHVyZSwgc2xvdCkge1xuICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFpJywgc3ltYm9sLCBzbG90KTtcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBzbG90KTtcbiAgICAvLyBNYXliZSB0ZXh0dXJlIGlzIG5vdCBsb2FkZWQgeWV0O1xuICAgIGlmICh0ZXh0dXJlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgIHRleHR1cmUuYmluZChyZW5kZXJlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBCaW5kIHRleHR1cmUgdG8gbnVsbFxuICAgICAgICB0ZXh0dXJlLnVuYmluZChyZW5kZXJlcik7XG4gICAgfVxufVxuXG4vLyBUT0RPIFVzZSBnbG9iYWxTaGFkZXIgaW5zdGVhZG9mIGdsb2JhbE1hdGVyaWFsP1xuZnVuY3Rpb24gZ2V0QmVmb3JlUmVuZGVySG9vazEgKGdsLCBkZWZhdWx0Tm9ybWFsTWFwLCBkZWZhdWx0Um91Z2huZXNzTWFwKSB7XG5cbiAgICB2YXIgcHJldmlvdXNOb3JtYWxNYXA7XG4gICAgdmFyIHByZXZpb3VzUm91Z0dsb3NzTWFwO1xuICAgIHZhciBwcmV2aW91c1JlbmRlcmFibGU7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmFibGUsIGdCdWZmZXJNYXQsIHByZXZNYXRlcmlhbCkge1xuICAgICAgICAvLyBNYXRlcmlhbCBub3QgY2hhbmdlXG4gICAgICAgIGlmIChwcmV2aW91c1JlbmRlcmFibGUgJiYgcHJldmlvdXNSZW5kZXJhYmxlLm1hdGVyaWFsID09PSByZW5kZXJhYmxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhbmRhcmRNYXRlcmlhbCA9IHJlbmRlcmFibGUubWF0ZXJpYWw7XG4gICAgICAgIHZhciBwcm9ncmFtID0gcmVuZGVyYWJsZS5fX3Byb2dyYW07XG5cbiAgICAgICAgdmFyIGdsb3NzaW5lc3M7XG4gICAgICAgIHZhciByb3VnaEdsb3NzTWFwO1xuICAgICAgICB2YXIgdXNlUm91Z2huZXNzV29ya2Zsb3cgPSBzdGFuZGFyZE1hdGVyaWFsLmlzRGVmaW5lZCgnZnJhZ21lbnQnLCAnVVNFX1JPVUdITkVTUycpO1xuICAgICAgICB2YXIgZG91YmxlU2lkZWQgPSBzdGFuZGFyZE1hdGVyaWFsLmlzRGVmaW5lZCgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgIHZhciByb3VnaEdsb3NzQ2hhbm5lbDtcbiAgICAgICAgaWYgKHVzZVJvdWdobmVzc1dvcmtmbG93KSB7XG4gICAgICAgICAgICBnbG9zc2luZXNzID0gMS4wIC0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ3JvdWdobmVzcycpO1xuICAgICAgICAgICAgcm91Z2hHbG9zc01hcCA9IHN0YW5kYXJkTWF0ZXJpYWwuZ2V0KCdyb3VnaG5lc3NNYXAnKTtcbiAgICAgICAgICAgIHJvdWdoR2xvc3NDaGFubmVsID0gc3RhbmRhcmRNYXRlcmlhbC5nZXREZWZpbmUoJ2ZyYWdtZW50JywgJ1JPVUdITkVTU19DSEFOTkVMJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9zc2luZXNzID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ2dsb3NzaW5lc3MnKTtcbiAgICAgICAgICAgIHJvdWdoR2xvc3NNYXAgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgnZ2xvc3NpbmVzc01hcCcpO1xuICAgICAgICAgICAgcm91Z2hHbG9zc0NoYW5uZWwgPSBzdGFuZGFyZE1hdGVyaWFsLmdldERlZmluZSgnZnJhZ21lbnQnLCAnR0xPU1NJTkVTU19DSEFOTkVMJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVzZVJvdWdoR2xvc3NNYXAgPSAhIXJvdWdoR2xvc3NNYXA7XG5cbiAgICAgICAgdmFyIG5vcm1hbE1hcCA9IHN0YW5kYXJkTWF0ZXJpYWwuZ2V0KCdub3JtYWxNYXAnKSB8fCBkZWZhdWx0Tm9ybWFsTWFwO1xuICAgICAgICB2YXIgdXZSZXBlYXQgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgndXZSZXBlYXQnKTtcbiAgICAgICAgdmFyIHV2T2Zmc2V0ID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ3V2T2Zmc2V0Jyk7XG5cbiAgICAgICAgcm91Z2hHbG9zc01hcCA9IHJvdWdoR2xvc3NNYXAgfHwgZGVmYXVsdFJvdWdobmVzc01hcDtcblxuICAgICAgICBpZiAocHJldk1hdGVyaWFsICE9PSBnQnVmZmVyTWF0KSB7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgnZ2xvc3NpbmVzcycsIGdsb3NzaW5lc3MpO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ25vcm1hbE1hcCcsIG5vcm1hbE1hcCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgncm91Z2hHbG9zc01hcCcsIHJvdWdoR2xvc3NNYXApO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3VzZVJvdWdoR2xvc3NNYXAnLCArdXNlUm91Z2hHbG9zc01hcCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgndXNlUm91Z2huZXNzJywgK3VzZVJvdWdobmVzc1dvcmtmbG93KTtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdkb3VibGVTaWRlZCcsICtkb3VibGVTaWRlZCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgncm91Z2hHbG9zc0NoYW5uZWwnLCArcm91Z2hHbG9zc0NoYW5uZWwgfHwgMCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgndXZSZXBlYXQnLCB1dlJlcGVhdCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgndXZPZmZzZXQnLCB1dk9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oXG4gICAgICAgICAgICAgICAgZ2wsICcxZicsICdnbG9zc2luZXNzJywgZ2xvc3NpbmVzc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzTm9ybWFsTWFwICE9PSBub3JtYWxNYXApIHtcbiAgICAgICAgICAgICAgICBhdHRhY2hUZXh0dXJlVG9TbG90KHRoaXMsIHByb2dyYW0sICdub3JtYWxNYXAnLCBub3JtYWxNYXAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzUm91Z0dsb3NzTWFwICE9PSByb3VnaEdsb3NzTWFwKSB7XG4gICAgICAgICAgICAgICAgYXR0YWNoVGV4dHVyZVRvU2xvdCh0aGlzLCBwcm9ncmFtLCAncm91Z2hHbG9zc01hcCcsIHJvdWdoR2xvc3NNYXAsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMWknLCAndXNlUm91Z2hHbG9zc01hcCcsICt1c2VSb3VnaEdsb3NzTWFwKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFpJywgJ3VzZVJvdWdobmVzcycsICt1c2VSb3VnaG5lc3NXb3JrZmxvdyk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsICcxaScsICdkb3VibGVTaWRlZCcsICtkb3VibGVTaWRlZCk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsICcxaScsICdyb3VnaEdsb3NzQ2hhbm5lbCcsICtyb3VnaEdsb3NzQ2hhbm5lbCB8fCAwKTtcbiAgICAgICAgICAgIGlmICh1dlJlcGVhdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMmYnLCAndXZSZXBlYXQnLCB1dlJlcGVhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXZPZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzJmJywgJ3V2T2Zmc2V0JywgdXZPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOb3JtYWxNYXAgPSBub3JtYWxNYXA7XG4gICAgICAgIHByZXZpb3VzUm91Z0dsb3NzTWFwID0gcm91Z2hHbG9zc01hcDtcblxuICAgICAgICBwcmV2aW91c1JlbmRlcmFibGUgPSByZW5kZXJhYmxlO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEJlZm9yZVJlbmRlckhvb2syKGdsLCBkZWZhdWx0RGlmZnVzZU1hcCwgZGVmYXVsdE1ldGFsbmVzc01hcCkge1xuICAgIHZhciBwcmV2aW91c0RpZmZ1c2VNYXA7XG4gICAgdmFyIHByZXZpb3VzUmVuZGVyYWJsZTtcbiAgICB2YXIgcHJldmlvdXNNZXRhbG5lc3NNYXA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmFibGUsIGdCdWZmZXJNYXQsIHByZXZNYXRlcmlhbCkge1xuICAgICAgICAvLyBNYXRlcmlhbCBub3QgY2hhbmdlXG4gICAgICAgIGlmIChwcmV2aW91c1JlbmRlcmFibGUgJiYgcHJldmlvdXNSZW5kZXJhYmxlLm1hdGVyaWFsID09PSByZW5kZXJhYmxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJvZ3JhbSA9IHJlbmRlcmFibGUuX19wcm9ncmFtO1xuICAgICAgICB2YXIgc3RhbmRhcmRNYXRlcmlhbCA9IHJlbmRlcmFibGUubWF0ZXJpYWw7XG5cbiAgICAgICAgdmFyIGNvbG9yID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ2NvbG9yJyk7XG4gICAgICAgIHZhciBtZXRhbG5lc3MgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgnbWV0YWxuZXNzJyk7XG5cbiAgICAgICAgdmFyIGRpZmZ1c2VNYXAgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgnZGlmZnVzZU1hcCcpO1xuICAgICAgICB2YXIgbWV0YWxuZXNzTWFwID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ21ldGFsbmVzc01hcCcpO1xuXG4gICAgICAgIHZhciB1dlJlcGVhdCA9IHN0YW5kYXJkTWF0ZXJpYWwuZ2V0KCd1dlJlcGVhdCcpO1xuICAgICAgICB2YXIgdXZPZmZzZXQgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgndXZPZmZzZXQnKTtcblxuICAgICAgICB2YXIgdXNlTWV0YWxuZXNzTWFwID0gISFtZXRhbG5lc3NNYXA7XG5cbiAgICAgICAgZGlmZnVzZU1hcCA9IGRpZmZ1c2VNYXAgfHwgZGVmYXVsdERpZmZ1c2VNYXA7XG4gICAgICAgIG1ldGFsbmVzc01hcCA9IG1ldGFsbmVzc01hcCB8fCBkZWZhdWx0TWV0YWxuZXNzTWFwO1xuXG4gICAgICAgIGlmIChwcmV2TWF0ZXJpYWwgIT09IGdCdWZmZXJNYXQpIHtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdjb2xvcicsIGNvbG9yKTtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdtZXRhbG5lc3MnLCBtZXRhbG5lc3MpO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlTWFwKTtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdtZXRhbG5lc3NNYXAnLCBtZXRhbG5lc3NNYXApO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3VzZU1ldGFsbmVzc01hcCcsICt1c2VNZXRhbG5lc3NNYXApO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3V2UmVwZWF0JywgdXZSZXBlYXQpO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3V2T2Zmc2V0JywgdXZPZmZzZXQpO1xuXG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgnbGluZWFyJywgK3N0YW5kYXJkTWF0ZXJpYWwubGluZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFmJywgJ21ldGFsbmVzcycsIG1ldGFsbmVzcyk7XG5cbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzNmJywgJ2NvbG9yJywgY29sb3IpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRGlmZnVzZU1hcCAhPT0gZGlmZnVzZU1hcCkge1xuICAgICAgICAgICAgICAgIGF0dGFjaFRleHR1cmVUb1Nsb3QodGhpcywgcHJvZ3JhbSwgJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlTWFwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91c01ldGFsbmVzc01hcCAhPT0gbWV0YWxuZXNzTWFwKSB7XG4gICAgICAgICAgICAgICAgYXR0YWNoVGV4dHVyZVRvU2xvdCh0aGlzLCBwcm9ncmFtLCAnbWV0YWxuZXNzTWFwJywgbWV0YWxuZXNzTWFwLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFpJywgJ3VzZU1ldGFsbmVzc01hcCcsICt1c2VNZXRhbG5lc3NNYXApO1xuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMmYnLCAndXZSZXBlYXQnLCB1dlJlcGVhdCk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsICcyZicsICd1dk9mZnNldCcsIHV2T2Zmc2V0KTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMWknLCAnbGluZWFyJywgK3N0YW5kYXJkTWF0ZXJpYWwubGluZWFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzRGlmZnVzZU1hcCA9IGRpZmZ1c2VNYXA7XG4gICAgICAgIHByZXZpb3VzTWV0YWxuZXNzTWFwID0gbWV0YWxuZXNzTWFwO1xuXG4gICAgICAgIHByZXZpb3VzUmVuZGVyYWJsZSA9IHJlbmRlcmFibGU7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBHQnVmZmVyIGlzIHByb3ZpZGVkIGZvciBkZWZlcnJlZCByZW5kZXJpbmcgYW5kIFNTQU8sIFNTUiBwYXNzLlxuICogSXQgd2lsbCBkbyB0d28gcGFzc2VzIHJlbmRlcmluZyB0byB0aHJlZSB0YXJnZXQgdGV4dHVyZXMuIFNlZVxuICogKyB7QGxpbmsgY2xheS5kZWZlcnJlZC5HQnVmZmVyI2dldFRhcmdldFRleHR1cmUxfVxuICogKyB7QGxpbmsgY2xheS5kZWZlcnJlZC5HQnVmZmVyI2dldFRhcmdldFRleHR1cmUyfVxuICogKyB7QGxpbmsgY2xheS5kZWZlcnJlZC5HQnVmZmVyI2dldFRhcmdldFRleHR1cmUzfVxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5kZWZlcnJlZC5HQnVmZmVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgR0J1ZmZlciA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHJldHVybiB7XG5cbiAgICAgICAgZW5hYmxlVGFyZ2V0VGV4dHVyZTE6IHRydWUsXG5cbiAgICAgICAgZW5hYmxlVGFyZ2V0VGV4dHVyZTI6IHRydWUsXG5cbiAgICAgICAgZW5hYmxlVGFyZ2V0VGV4dHVyZTM6IHRydWUsXG5cbiAgICAgICAgcmVuZGVyVHJhbnNwYXJlbnQ6IGZhbHNlLFxuXG4gICAgICAgIF9yZW5kZXJMaXN0OiBbXSxcbiAgICAgICAgLy8gLSBSOiBub3JtYWwueFxuICAgICAgICAvLyAtIEc6IG5vcm1hbC55XG4gICAgICAgIC8vIC0gQjogbm9ybWFsLnpcbiAgICAgICAgLy8gLSBBOiBnbG9zc2luZXNzXG4gICAgICAgIF9nQnVmZmVyVGV4MTogbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBtaW5GaWx0ZXI6IFRleHR1cmUuTkVBUkVTVCxcbiAgICAgICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICAgICAgLy8gUEVORElOR1xuICAgICAgICAgICAgdHlwZTogVGV4dHVyZS5IQUxGX0ZMT0FUXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIC0gUjogZGVwdGhcbiAgICAgICAgX2dCdWZmZXJUZXgyOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIG1pbkZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1QsXG4gICAgICAgICAgICAvLyBmb3JtYXQ6IFRleHR1cmUuREVQVEhfQ09NUE9ORU5ULFxuICAgICAgICAgICAgLy8gdHlwZTogVGV4dHVyZS5VTlNJR05FRF9JTlRcblxuICAgICAgICAgICAgZm9ybWF0OiBUZXh0dXJlLkRFUFRIX1NURU5DSUwsXG4gICAgICAgICAgICB0eXBlOiBUZXh0dXJlLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIC0gUjogYWxiZWRvLnJcbiAgICAgICAgLy8gLSBHOiBhbGJlZG8uZ1xuICAgICAgICAvLyAtIEI6IGFsYmVkby5iXG4gICAgICAgIC8vIC0gQTogbWV0YWxuZXNzXG4gICAgICAgIF9nQnVmZmVyVGV4MzogbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBtaW5GaWx0ZXI6IFRleHR1cmUuTkVBUkVTVCxcbiAgICAgICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZS5ORUFSRVNUXG4gICAgICAgIH0pLFxuXG4gICAgICAgIF9kZWZhdWx0Tm9ybWFsTWFwOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIGltYWdlOiBjcmVhdGVGaWxsQ2FudmFzKCcjMDAwJylcbiAgICAgICAgfSksXG4gICAgICAgIF9kZWZhdWx0Um91Z2huZXNzTWFwOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIGltYWdlOiBjcmVhdGVGaWxsQ2FudmFzKCcjZmZmJylcbiAgICAgICAgfSksXG4gICAgICAgIF9kZWZhdWx0TWV0YWxuZXNzTWFwOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIGltYWdlOiBjcmVhdGVGaWxsQ2FudmFzKCcjZmZmJylcbiAgICAgICAgfSksXG4gICAgICAgIF9kZWZhdWx0RGlmZnVzZU1hcDogbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBpbWFnZTogY3JlYXRlRmlsbENhbnZhcygnI2ZmZicpXG4gICAgICAgIH0pLFxuXG4gICAgICAgIF9mcmFtZUJ1ZmZlcjogbmV3IEZyYW1lQnVmZmVyKCksXG5cbiAgICAgICAgX2dCdWZmZXJNYXRlcmlhbDE6IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoXG4gICAgICAgICAgICAgICAgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5nYnVmZmVyLnZlcnRleCcpLFxuICAgICAgICAgICAgICAgIFNoYWRlci5zb3VyY2UoJ2NsYXkuZGVmZXJyZWQuZ2J1ZmZlcjEuZnJhZ21lbnQnKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHZlcnRleERlZmluZXM6IHtcbiAgICAgICAgICAgICAgICBGSVJTVF9QQVNTOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJhZ21lbnREZWZpbmVzOiB7XG4gICAgICAgICAgICAgICAgRklSU1RfUEFTUzogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgX2dCdWZmZXJNYXRlcmlhbDI6IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoXG4gICAgICAgICAgICAgICAgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5nYnVmZmVyLnZlcnRleCcpLFxuICAgICAgICAgICAgICAgIFNoYWRlci5zb3VyY2UoJ2NsYXkuZGVmZXJyZWQuZ2J1ZmZlcjIuZnJhZ21lbnQnKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KSxcblxuICAgICAgICBfZGVidWdQYXNzOiBuZXcgUGFzcyh7XG4gICAgICAgICAgICBmcmFnbWVudDogU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5nYnVmZmVyLmRlYnVnJylcbiAgICAgICAgfSlcbiAgICB9O1xufSwgLyoqIEBsZW5kcyBjbGF5LmRlZmVycmVkLkdCdWZmZXIjICove1xuXG4gICAgLyoqXG4gICAgICogU2V0IEcgQnVmZmVyIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICAgICAqL1xuICAgIHJlc2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2dCdWZmZXJUZXgxLndpZHRoID09PSB3aWR0aFxuICAgICAgICAgICAgJiYgdGhpcy5fZ0J1ZmZlclRleDEuaGVpZ2h0ID09PSBoZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ0J1ZmZlclRleDEud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5fZ0J1ZmZlclRleDEuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuX2dCdWZmZXJUZXgyLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuX2dCdWZmZXJUZXgyLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICB0aGlzLl9nQnVmZmVyVGV4My53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLl9nQnVmZmVyVGV4My5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfSxcblxuICAgIC8vIFRPRE8gaXMgZHByIG5lZWRlZD9cbiAgICBzZXRWaWV3cG9ydDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGRwcikge1xuICAgICAgICB2YXIgdmlld3BvcnQ7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0geDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0ge1xuICAgICAgICAgICAgICAgIHg6IHgsIHk6IHksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiBkcHIgfHwgMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIH0sXG5cbiAgICBnZXRWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVCdWZmZXIudmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZUJ1ZmZlci52aWV3cG9ydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogMCwgeTogMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fZ0J1ZmZlclRleDEud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9nQnVmZmVyVGV4MS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgRyBCdWZmZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqIEBwYXJhbSB7Y2xheS5jYW1lcmEuUGVyc3BlY3RpdmV9IGNhbWVyYVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XG5cbiAgICAgICAgdmFyIGdsID0gcmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgdmFyIGZyYW1lQnVmZmVyID0gdGhpcy5fZnJhbWVCdWZmZXI7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IGZyYW1lQnVmZmVyLnZpZXdwb3J0O1xuICAgICAgICB2YXIgb3BhcXVlTGlzdCA9IHNjZW5lLm9wYXF1ZUxpc3Q7XG4gICAgICAgIHZhciB0cmFuc3BhcmVudExpc3QgPSBzY2VuZS50cmFuc3BhcmVudExpc3Q7XG5cbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciByZW5kZXJMaXN0ID0gdGhpcy5fcmVuZGVyTGlzdDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcGFxdWVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIW9wYXF1ZUxpc3RbaV0uaWdub3JlR0J1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJlbmRlckxpc3Rbb2Zmc2V0KytdID0gb3BhcXVlTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZW5kZXJUcmFuc3BhcmVudCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc3BhcmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcGFyZW50TGlzdFtpXS5pZ25vcmVHQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckxpc3Rbb2Zmc2V0KytdID0gdHJhbnNwYXJlbnRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJMaXN0Lmxlbmd0aCA9IG9mZnNldDtcblxuICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xuICAgICAgICBnbC5kZXB0aE1hc2sodHJ1ZSk7XG4gICAgICAgIGdsLmNvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgZ2wuZGlzYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgdmFyIGVuYWJsZVRhcmdldFRleHR1cmUxID0gdGhpcy5lbmFibGVUYXJnZXRUZXh0dXJlMTtcbiAgICAgICAgdmFyIGVuYWJsZVRhcmdldFRleHR1cmUyID0gdGhpcy5lbmFibGVUYXJnZXRUZXh0dXJlMjtcbiAgICAgICAgdmFyIGVuYWJsZVRhcmdldFRleHR1cmUzID0gdGhpcy5lbmFibGVUYXJnZXRUZXh0dXJlMztcbiAgICAgICAgaWYgKCFlbmFibGVUYXJnZXRUZXh0dXJlMSAmJiAhZW5hYmxlVGFyZ2V0VGV4dHVyZTMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2FuXFwndCBkaXNhYmxlIHRhcmdldFRleHR1cmUxIHRhcmdldFRleHR1cmUzIGJvdGgnKTtcbiAgICAgICAgICAgIGVuYWJsZVRhcmdldFRleHR1cmUxID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmFibGVUYXJnZXRUZXh0dXJlMikge1xuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRoaXMuX2dCdWZmZXJUZXgyLCByZW5kZXJlci5nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUEVORElORywgc2NlbmUuYm91bmRpbmdCb3hMYXN0RnJhbWUgbmVlZHMgYmUgdXBkYXRlZCBpZiBoYXZlIHNoYWRvd1xuICAgICAgICByZW5kZXJlci5iaW5kU2NlbmVSZW5kZXJpbmcoc2NlbmUpO1xuICAgICAgICBpZiAoZW5hYmxlVGFyZ2V0VGV4dHVyZTEpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgMVxuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRoaXMuX2dCdWZmZXJUZXgxKTtcbiAgICAgICAgICAgIGZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZHByID0gdmlld3BvcnQuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICAvLyB1c2Ugc2Npc3NvciB0byBtYWtlIHN1cmUgb25seSBjbGVhciB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgICAgICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgICAgICAgICAgICAgICBnbC5zY2lzc29yKHZpZXdwb3J0LnggKiBkcHIsIHZpZXdwb3J0LnkgKiBkcHIsIHZpZXdwb3J0LndpZHRoICogZHByLCB2aWV3cG9ydC5oZWlnaHQgKiBkcHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGdCdWZmZXJNYXRlcmlhbDEgPSB0aGlzLl9nQnVmZmVyTWF0ZXJpYWwxO1xuICAgICAgICAgICAgdmFyIHBhc3NDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgZ2V0TWF0ZXJpYWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdCdWZmZXJNYXRlcmlhbDE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBiZWZvcmVSZW5kZXI6IGdldEJlZm9yZVJlbmRlckhvb2sxKGdsLCB0aGlzLl9kZWZhdWx0Tm9ybWFsTWFwLCB0aGlzLl9kZWZhdWx0Um91Z2huZXNzTWFwKSxcbiAgICAgICAgICAgICAgICBzb3J0Q29tcGFyZTogcmVuZGVyZXIub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBGSVhNRSBVc2UgTVJUIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKHJlbmRlckxpc3QsIGNhbWVyYSwgcGFzc0NvbmZpZyk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5hYmxlVGFyZ2V0VGV4dHVyZTMpIHtcblxuICAgICAgICAgICAgLy8gUGFzcyAyXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlci5hdHRhY2godGhpcy5fZ0J1ZmZlclRleDMpO1xuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgIHZhciBkcHIgPSB2aWV3cG9ydC5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIC8vIHVzZSBzY2lzc29yIHRvIG1ha2Ugc3VyZSBvbmx5IGNsZWFyIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnNjaXNzb3Iodmlld3BvcnQueCAqIGRwciwgdmlld3BvcnQueSAqIGRwciwgdmlld3BvcnQud2lkdGggKiBkcHIsIHZpZXdwb3J0LmhlaWdodCAqIGRwcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBnQnVmZmVyTWF0ZXJpYWwyID0gdGhpcy5fZ0J1ZmZlck1hdGVyaWFsMjtcbiAgICAgICAgICAgIHZhciBwYXNzQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGdldE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnQnVmZmVyTWF0ZXJpYWwyO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYmVmb3JlUmVuZGVyOiBnZXRCZWZvcmVSZW5kZXJIb29rMihnbCwgdGhpcy5fZGVmYXVsdERpZmZ1c2VNYXAsIHRoaXMuX2RlZmF1bHRNZXRhbG5lc3NNYXApLFxuICAgICAgICAgICAgICAgIHNvcnRDb21wYXJlOiByZW5kZXJlci5vcGFxdWVTb3J0Q29tcGFyZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlclBhc3MocmVuZGVyTGlzdCwgY2FtZXJhLCBwYXNzQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbmRlcmVyLmJpbmRTY2VuZVJlbmRlcmluZyhudWxsKTtcbiAgICAgICAgZnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyRGVidWc6IGZ1bmN0aW9uIChyZW5kZXJlciwgY2FtZXJhLCB0eXBlLCB2aWV3cG9ydCkge1xuICAgICAgICB2YXIgZGVidWdUeXBlcyA9IHtcbiAgICAgICAgICAgIG5vcm1hbDogMCxcbiAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgcG9zaXRpb246IDIsXG4gICAgICAgICAgICBnbG9zc2luZXNzOiAzLFxuICAgICAgICAgICAgbWV0YWxuZXNzOiA0LFxuICAgICAgICAgICAgYWxiZWRvOiA1XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWJ1Z1R5cGVzW3R5cGVdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5rb3duIHR5cGUgXCInICsgdHlwZSArICdcIicpO1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB1c2Ugbm9ybWFsXG4gICAgICAgICAgICB0eXBlID0gJ25vcm1hbCc7XG4gICAgICAgIH1cblxuICAgICAgICByZW5kZXJlci5zYXZlQ2xlYXIoKTtcbiAgICAgICAgcmVuZGVyZXIuc2F2ZVZpZXdwb3J0KCk7XG4gICAgICAgIHJlbmRlcmVyLmNsZWFyQml0ID0gcmVuZGVyZXIuZ2wuREVQVEhfQlVGRkVSX0JJVDtcblxuICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KHZpZXdwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmlld1Byb2plY3Rpb25JbnYgPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICBNYXRyaXg0Lm11bHRpcGx5KHZpZXdQcm9qZWN0aW9uSW52LCBjYW1lcmEud29ybGRUcmFuc2Zvcm0sIGNhbWVyYS5pbnZQcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgICB2YXIgZGVidWdQYXNzID0gdGhpcy5fZGVidWdQYXNzO1xuICAgICAgICBkZWJ1Z1Bhc3Muc2V0VW5pZm9ybSgndmlld3BvcnRTaXplJywgW3JlbmRlcmVyLmdldFdpZHRoKCksIHJlbmRlcmVyLmdldEhlaWdodCgpXSk7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTEnLCB0aGlzLl9nQnVmZmVyVGV4MSk7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTInLCB0aGlzLl9nQnVmZmVyVGV4Mik7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTMnLCB0aGlzLl9nQnVmZmVyVGV4Myk7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdkZWJ1ZycsIGRlYnVnVHlwZXNbdHlwZV0pO1xuICAgICAgICBkZWJ1Z1Bhc3Muc2V0VW5pZm9ybSgndmlld1Byb2plY3Rpb25JbnYnLCB2aWV3UHJvamVjdGlvbkludi5hcnJheSk7XG4gICAgICAgIGRlYnVnUGFzcy5yZW5kZXIocmVuZGVyZXIpO1xuXG4gICAgICAgIHJlbmRlcmVyLnJlc3RvcmVWaWV3cG9ydCgpO1xuICAgICAgICByZW5kZXJlci5yZXN0b3JlQ2xlYXIoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGZpcnN0IHRhcmdldCB0ZXh0dXJlLlxuICAgICAqIENoYW5uZWwgc3RvcmFnZTpcbiAgICAgKiArIFI6IG5vcm1hbC54ICogMC41ICsgMC41XG4gICAgICogKyBHOiBub3JtYWwueSAqIDAuNSArIDAuNVxuICAgICAqICsgQjogbm9ybWFsLnogKiAwLjUgKyAwLjVcbiAgICAgKiArIEE6IGdsb3NzaW5lc3NcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlMTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ0J1ZmZlclRleDE7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBzZWNvbmQgdGFyZ2V0IHRleHR1cmUuXG4gICAgICogQ2hhbm5lbCBzdG9yYWdlOlxuICAgICAqICsgUjogZGVwdGhcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlMjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ0J1ZmZlclRleDI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGlyZCB0YXJnZXQgdGV4dHVyZS5cbiAgICAgKiBDaGFubmVsIHN0b3JhZ2U6XG4gICAgICogKyBSOiBhbGJlZG8uclxuICAgICAqICsgRzogYWxiZWRvLmdcbiAgICAgKiArIEI6IGFsYmVkby5iXG4gICAgICogKyBBOiBtZXRhbG5lc3NcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlMzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ0J1ZmZlclRleDM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgR0J1ZmZlcjsiLCJpbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG52YXIgdmVjMiA9IGdsTWF0cml4LnZlYzI7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuZ2VvbWV0cnkuQ29uZVxuICogQGV4dGVuZHMgY2xheS5HZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC50b3BSYWRpdXNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5ib3R0b21SYWRpdXNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5oZWlnaHRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5jYXBTZWdtZW50c11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0LmhlaWdodFNlZ21lbnRzXVxuICovXG52YXIgQ29uZSA9IEdlb21ldHJ5LmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5Db25lIyAqL1xue1xuICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdG9wUmFkaXVzOiAwLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBib3R0b21SYWRpdXM6IDEsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodDogMixcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgY2FwU2VnbWVudHM6IDIwLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBoZWlnaHRTZWdtZW50czogMVxufSwgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5idWlsZCgpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5Db25lLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmUgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtdO1xuICAgICAgICB2YXIgZmFjZXMgPSBbXTtcbiAgICAgICAgcG9zaXRpb25zLmxlbmd0aCA9IDA7XG4gICAgICAgIHRleGNvb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgICBmYWNlcy5sZW5ndGggPSAwO1xuICAgICAgICAvLyBUb3AgY2FwXG4gICAgICAgIHZhciBjYXBTZWdSYWRpYWwgPSBNYXRoLlBJICogMiAvIHRoaXMuY2FwU2VnbWVudHM7XG5cbiAgICAgICAgdmFyIHRvcENhcCA9IFtdO1xuICAgICAgICB2YXIgYm90dG9tQ2FwID0gW107XG5cbiAgICAgICAgdmFyIHIxID0gdGhpcy50b3BSYWRpdXM7XG4gICAgICAgIHZhciByMiA9IHRoaXMuYm90dG9tUmFkaXVzO1xuICAgICAgICB2YXIgeSA9IHRoaXMuaGVpZ2h0IC8gMjtcblxuICAgICAgICB2YXIgYzEgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgeSwgMCk7XG4gICAgICAgIHZhciBjMiA9IHZlYzMuZnJvbVZhbHVlcygwLCAteSwgMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYXBTZWdtZW50czsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhldGEgPSBpICogY2FwU2VnUmFkaWFsO1xuICAgICAgICAgICAgdmFyIHggPSByMSAqIE1hdGguc2luKHRoZXRhKTtcbiAgICAgICAgICAgIHZhciB6ID0gcjEgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICAgICAgICB0b3BDYXAucHVzaCh2ZWMzLmZyb21WYWx1ZXMoeCwgeSwgeikpO1xuXG4gICAgICAgICAgICB4ID0gcjIgKiBNYXRoLnNpbih0aGV0YSk7XG4gICAgICAgICAgICB6ID0gcjIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICAgICAgICBib3R0b21DYXAucHVzaCh2ZWMzLmZyb21WYWx1ZXMoeCwgLXksIHopKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRvcCBjYXBcbiAgICAgICAgcG9zaXRpb25zLnB1c2goYzEpO1xuICAgICAgICAvLyBGSVhNRVxuICAgICAgICB0ZXhjb29yZHMucHVzaCh2ZWMyLmZyb21WYWx1ZXMoMCwgMSkpO1xuICAgICAgICB2YXIgbiA9IHRoaXMuY2FwU2VnbWVudHM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCh0b3BDYXBbaV0pO1xuICAgICAgICAgICAgLy8gRklYTUVcbiAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcyhpIC8gbiwgMCkpO1xuICAgICAgICAgICAgZmFjZXMucHVzaChbMCwgaSsxLCAoaSsxKSAlIG4gKyAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCBib3R0b20gY2FwXG4gICAgICAgIHZhciBvZmZzZXQgPSBwb3NpdGlvbnMubGVuZ3RoO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChjMik7XG4gICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcygwLCAxKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChib3R0b21DYXBbaV0pO1xuICAgICAgICAgICAgLy8gRklYTUVcbiAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcyhpIC8gbiwgMCkpO1xuICAgICAgICAgICAgZmFjZXMucHVzaChbb2Zmc2V0LCBvZmZzZXQrKChpKzEpICUgbiArIDEpLCBvZmZzZXQraSsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCBzaWRlXG4gICAgICAgIG9mZnNldCA9IHBvc2l0aW9ucy5sZW5ndGg7XG4gICAgICAgIHZhciBuMiA9IHRoaXMuaGVpZ2h0U2VnbWVudHM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4yKzE7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gaiAvIG4yO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHZlYzMubGVycCh2ZWMzLmNyZWF0ZSgpLCB0b3BDYXBbaV0sIGJvdHRvbUNhcFtpXSwgdikpO1xuICAgICAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcyhpIC8gbiwgdikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4yOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaTEgPSBpICogKG4yICsgMSkgKyBqO1xuICAgICAgICAgICAgICAgIHZhciBpMiA9ICgoaSArIDEpICUgbikgKiAobjIgKyAxKSArIGo7XG4gICAgICAgICAgICAgICAgdmFyIGkzID0gKChpICsgMSkgJSBuKSAqIChuMiArIDEpICsgaiArIDE7XG4gICAgICAgICAgICAgICAgdmFyIGk0ID0gaSAqIChuMiArIDEpICsgaiArIDE7XG4gICAgICAgICAgICAgICAgZmFjZXMucHVzaChbb2Zmc2V0K2kyLCBvZmZzZXQraTEsIG9mZnNldCtpNF0pO1xuICAgICAgICAgICAgICAgIGZhY2VzLnB1c2goW29mZnNldCtpNCwgb2Zmc2V0K2kzLCBvZmZzZXQraTJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi5mcm9tQXJyYXkocG9zaXRpb25zKTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnRleGNvb3JkMC5mcm9tQXJyYXkodGV4Y29vcmRzKTtcblxuICAgICAgICB0aGlzLmluaXRJbmRpY2VzRnJvbUFycmF5KGZhY2VzKTtcblxuICAgICAgICB0aGlzLmdlbmVyYXRlVmVydGV4Tm9ybWFscygpO1xuXG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgICAgdmFyIHIgPSBNYXRoLm1heCh0aGlzLnRvcFJhZGl1cywgdGhpcy5ib3R0b21SYWRpdXMpO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94Lm1pbi5zZXQoLXIsIC10aGlzLmhlaWdodC8yLCAtcik7XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWF4LnNldChyLCB0aGlzLmhlaWdodC8yLCByKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ29uZTtcbiIsImltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgQ29uZUdlb21ldHJ5IGZyb20gJy4vQ29uZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuZ2VvbWV0cnkuQ3lsaW5kZXJcbiAqIEBleHRlbmRzIGNsYXkuR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQucmFkaXVzXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQuaGVpZ2h0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQuY2FwU2VnbWVudHNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5oZWlnaHRTZWdtZW50c11cbiAqL1xudmFyIEN5bGluZGVyID0gR2VvbWV0cnkuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LkN5bGluZGVyIyAqL1xue1xuICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFkaXVzOiAxLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBoZWlnaHQ6IDIsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNhcFNlZ21lbnRzOiA1MCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgaGVpZ2h0U2VnbWVudHM6IDFcbn0sIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYnVpbGQoKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuZ2VvbWV0cnkuQ3lsaW5kZXIucHJvdG90eXBlICovXG57XG4gICAgLyoqXG4gICAgICogQnVpbGQgY3lsaW5kZXIgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjb25lID0gbmV3IENvbmVHZW9tZXRyeSh7XG4gICAgICAgICAgICB0b3BSYWRpdXM6IHRoaXMucmFkaXVzLFxuICAgICAgICAgICAgYm90dG9tUmFkaXVzOiB0aGlzLnJhZGl1cyxcbiAgICAgICAgICAgIGNhcFNlZ21lbnRzOiB0aGlzLmNhcFNlZ21lbnRzLFxuICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IHRoaXMuaGVpZ2h0U2VnbWVudHMsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZSA9IGNvbmUuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZSA9IGNvbmUuYXR0cmlidXRlcy5ub3JtYWwudmFsdWU7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy50ZXhjb29yZDAudmFsdWUgPSBjb25lLmF0dHJpYnV0ZXMudGV4Y29vcmQwLnZhbHVlO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBjb25lLmluZGljZXM7XG5cbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IGNvbmUuYm91bmRpbmdCb3g7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEN5bGluZGVyO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQubGlnaHRfdm9sdW1lLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbnZhcnlpbmcgdmVjMyB2X1Bvc2l0aW9uO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbiAgICB2X1Bvc2l0aW9uID0gcG9zaXRpb247XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLnNwb3RfbGlnaHRcXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfaGVhZFxcbkBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5saWdodF9lcXVhdGlvblxcbkBpbXBvcnQgY2xheS51dGlsLmNhbGN1bGF0ZV9hdHRlbnVhdGlvblxcbnVuaWZvcm0gdmVjMyBsaWdodFBvc2l0aW9uO1xcbnVuaWZvcm0gdmVjMyBsaWdodERpcmVjdGlvbjtcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIGZsb2F0IHVtYnJhQW5nbGVDb3NpbmU7XFxudW5pZm9ybSBmbG9hdCBwZW51bWJyYUFuZ2xlQ29zaW5lO1xcbnVuaWZvcm0gZmxvYXQgbGlnaHRSYW5nZTtcXG51bmlmb3JtIGZsb2F0IGZhbGxvZmZGYWN0b3I7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0U2hhZG93TWFwO1xcbnVuaWZvcm0gbWF0NCBsaWdodE1hdHJpeDtcXG51bmlmb3JtIGZsb2F0IGxpZ2h0U2hhZG93TWFwU2l6ZTtcXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkucGx1Z2luLnNoYWRvd19tYXBfY29tbW9uXFxudm9pZCBtYWluKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMyBMID0gbGlnaHRQb3NpdGlvbiAtIHBvc2l0aW9uO1xcbiAgICB2ZWMzIFYgPSBub3JtYWxpemUoZXllUG9zaXRpb24gLSBwb3NpdGlvbik7XFxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoTCk7XFxuICAgIEwgLz0gZGlzdDtcXG4gICAgZmxvYXQgYXR0ZW51YXRpb24gPSBsaWdodEF0dGVudWF0aW9uKGRpc3QsIGxpZ2h0UmFuZ2UpO1xcbiAgICBmbG9hdCBjID0gZG90KC1ub3JtYWxpemUobGlnaHREaXJlY3Rpb24pLCBMKTtcXG4gICAgZmxvYXQgZmFsbG9mZiA9IGNsYW1wKChjIC0gdW1icmFBbmdsZUNvc2luZSkgLyAocGVudW1icmFBbmdsZUNvc2luZSAtIHVtYnJhQW5nbGVDb3NpbmUpLCAwLjAsIDEuMCk7XFxuICAgIGZhbGxvZmYgPSBwb3coZmFsbG9mZiwgZmFsbG9mZkZhY3Rvcik7XFxuICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgIGZsb2F0IG5kbCA9IGNsYW1wKGRvdChOLCBMKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZGggPSBjbGFtcChkb3QoTiwgSCksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSAoMS4wIC0gZmFsbG9mZikgKiBhdHRlbnVhdGlvbiAqIGxpZ2h0RXF1YXRpb24oXFxuICAgICAgICBsaWdodENvbG9yLCBkaWZmdXNlQ29sb3IsIHNwZWN1bGFyQ29sb3IsIG5kbCwgbmRoLCBuZHYsIGdsb3NzaW5lc3NcXG4gICAgKTtcXG4jaWZkZWYgU0hBRE9XTUFQX0VOQUJMRURcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IGNvbXB1dGVTaGFkb3dDb250cmliKFxcbiAgICAgICAgbGlnaHRTaGFkb3dNYXAsIGxpZ2h0TWF0cml4LCBwb3NpdGlvbiwgbGlnaHRTaGFkb3dNYXBTaXplXFxuICAgICk7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKj0gc2hhZG93Q29udHJpYjtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7XFxufVxcbkBlbmRcXG5cIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLmRpcmVjdGlvbmFsX2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfZXF1YXRpb25cXG51bmlmb3JtIHZlYzMgbGlnaHREaXJlY3Rpb247XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29sb3I7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0U2hhZG93TWFwO1xcbnVuaWZvcm0gZmxvYXQgbGlnaHRTaGFkb3dNYXBTaXplO1xcbnVuaWZvcm0gbWF0NCBsaWdodE1hdHJpY2VzW1NIQURPV19DQVNDQURFXTtcXG51bmlmb3JtIGZsb2F0IHNoYWRvd0Nhc2NhZGVDbGlwc05lYXJbU0hBRE9XX0NBU0NBREVdO1xcbnVuaWZvcm0gZmxvYXQgc2hhZG93Q2FzY2FkZUNsaXBzRmFyW1NIQURPV19DQVNDQURFXTtcXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkucGx1Z2luLnNoYWRvd19tYXBfY29tbW9uXFxudm9pZCBtYWluKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMyBMID0gLW5vcm1hbGl6ZShsaWdodERpcmVjdGlvbik7XFxuICAgIHZlYzMgViA9IG5vcm1hbGl6ZShleWVQb3NpdGlvbiAtIHBvc2l0aW9uKTtcXG4gICAgdmVjMyBIID0gbm9ybWFsaXplKEwgKyBWKTtcXG4gICAgZmxvYXQgbmRsID0gY2xhbXAoZG90KE4sIEwpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZHYgPSBjbGFtcChkb3QoTiwgViksIDAuMCwgMS4wKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGxpZ2h0RXF1YXRpb24oXFxuICAgICAgICBsaWdodENvbG9yLCBkaWZmdXNlQ29sb3IsIHNwZWN1bGFyQ29sb3IsIG5kbCwgbmRoLCBuZHYsIGdsb3NzaW5lc3NcXG4gICAgKTtcXG4jaWZkZWYgU0hBRE9XTUFQX0VOQUJMRURcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4gICAgZm9yIChpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IFNIQURPV19DQVNDQURFOyBfaWR4XysrKSB7e1xcbiAgICAgICAgaWYgKFxcbiAgICAgICAgICAgIHogPj0gc2hhZG93Q2FzY2FkZUNsaXBzTmVhcltfaWR4X10gJiZcXG4gICAgICAgICAgICB6IDw9IHNoYWRvd0Nhc2NhZGVDbGlwc0ZhcltfaWR4X11cXG4gICAgICAgICkge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBjb21wdXRlU2hhZG93Q29udHJpYihcXG4gICAgICAgICAgICAgICAgbGlnaHRTaGFkb3dNYXAsIGxpZ2h0TWF0cmljZXNbX2lkeF9dLCBwb3NpdGlvbiwgbGlnaHRTaGFkb3dNYXBTaXplLFxcbiAgICAgICAgICAgICAgICB2ZWMyKDEuMCAvIGZsb2F0KFNIQURPV19DQVNDQURFKSwgMS4wKSxcXG4gICAgICAgICAgICAgICAgdmVjMihmbG9hdChfaWR4XykgLyBmbG9hdChTSEFET1dfQ0FTQ0FERSksIDAuMClcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgfVxcbiAgICB9fVxcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IHNoYWRvd0NvbnRyaWI7XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvci5hID0gMS4wO1xcbn1cXG5AZW5kXFxuXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5kZWZlcnJlZC5hbWJpZW50X2xpZ2h0XFxudW5pZm9ybSBzYW1wbGVyMkQgZ0J1ZmZlclRleHR1cmUxO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGdCdWZmZXJUZXh0dXJlMztcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIHZlYzIgd2luZG93U2l6ZTogV0lORE9XX1NJWkU7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzIgdXYgPSBnbF9GcmFnQ29vcmQueHkgLyB3aW5kb3dTaXplO1xcbiAgICB2ZWM0IHRleGVsMSA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTEsIHV2KTtcXG4gICAgaWYgKGRvdCh0ZXhlbDEucmdiLCB2ZWMzKDEuMCkpID09IDAuMCkge1xcbiAgICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgICB2ZWMzIGFsYmVkbyA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTMsIHV2KS5yZ2I7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBsaWdodENvbG9yICogYWxiZWRvO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQuYW1iaWVudF9zaF9saWdodFxcbnVuaWZvcm0gc2FtcGxlcjJEIGdCdWZmZXJUZXh0dXJlMTtcXG51bmlmb3JtIHNhbXBsZXIyRCBnQnVmZmVyVGV4dHVyZTM7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29sb3I7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29lZmZpY2llbnRzWzldO1xcbnVuaWZvcm0gdmVjMiB3aW5kb3dTaXplOiBXSU5ET1dfU0laRTtcXG52ZWMzIGNhbGNBbWJpZW50U0hMaWdodCh2ZWMzIE4pIHtcXG4gICAgcmV0dXJuIGxpZ2h0Q29lZmZpY2llbnRzWzBdXFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzFdICogTi54XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzJdICogTi55XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzNdICogTi56XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzRdICogTi54ICogTi56XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzVdICogTi56ICogTi55XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzZdICogTi55ICogTi54XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzddICogKDMuMCAqIE4ueiAqIE4ueiAtIDEuMClcXG4gICAgICAgICsgbGlnaHRDb2VmZmljaWVudHNbOF0gKiAoTi54ICogTi54IC0gTi55ICogTi55KTtcXG59XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzIgdXYgPSBnbF9GcmFnQ29vcmQueHkgLyB3aW5kb3dTaXplO1xcbiAgICB2ZWM0IHRleGVsMSA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTEsIHV2KTtcXG4gICAgaWYgKGRvdCh0ZXhlbDEucmdiLCB2ZWMzKDEuMCkpID09IDAuMCkge1xcbiAgICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgICB2ZWMzIE4gPSB0ZXhlbDEucmdiICogMi4wIC0gMS4wO1xcbiAgICB2ZWMzIGFsYmVkbyA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTMsIHV2KS5yZ2I7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBsaWdodENvbG9yICogYWxiZWRvICogY2FsY0FtYmllbnRTSExpZ2h0KE4pO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQuYW1iaWVudF9jdWJlbWFwX2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIHNhbXBsZXJDdWJlIGxpZ2h0Q3ViZW1hcDtcXG51bmlmb3JtIHNhbXBsZXIyRCBicmRmTG9va3VwO1xcbnVuaWZvcm0gdmVjMyBleWVQb3NpdGlvbjtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvc2l0aW9uIC0gcG9zaXRpb24pO1xcbiAgICB2ZWMzIEwgPSByZWZsZWN0KC1WLCBOKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IHJvdWdoID0gY2xhbXAoMS4wIC0gZ2xvc3NpbmVzcywgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBiaWFzID0gcm91Z2ggKiA1LjA7XFxuICAgIHZlYzIgYnJkZlBhcmFtID0gdGV4dHVyZTJEKGJyZGZMb29rdXAsIHZlYzIocm91Z2gsIG5kdikpLnh5O1xcbiAgICB2ZWMzIGVudldlaWdodCA9IHNwZWN1bGFyQ29sb3IgKiBicmRmUGFyYW0ueCArIGJyZGZQYXJhbS55O1xcbiAgICB2ZWMzIGVudlRleGVsID0gUkdCTURlY29kZSh0ZXh0dXJlQ3ViZUxvZEVYVChsaWdodEN1YmVtYXAsIEwsIGJpYXMpLCA1MS41KTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGxpZ2h0Q29sb3IgKiBlbnZUZXhlbCAqIGVudldlaWdodDtcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLnBvaW50X2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG5AaW1wb3J0IGNsYXkudXRpbC5jYWxjdWxhdGVfYXR0ZW51YXRpb25cXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfZXF1YXRpb25cXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIGZsb2F0IGxpZ2h0UmFuZ2U7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlckN1YmUgbGlnaHRTaGFkb3dNYXA7XFxudW5pZm9ybSBmbG9hdCBsaWdodFNoYWRvd01hcFNpemU7XFxuI2VuZGlmXFxudmFyeWluZyB2ZWMzIHZfUG9zaXRpb247XFxuQGltcG9ydCBjbGF5LnBsdWdpbi5zaGFkb3dfbWFwX2NvbW1vblxcbnZvaWQgbWFpbigpXFxue1xcbiAgICBAaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsuZ2J1ZmZlcl9yZWFkXFxuICAgIHZlYzMgTCA9IGxpZ2h0UG9zaXRpb24gLSBwb3NpdGlvbjtcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvc2l0aW9uIC0gcG9zaXRpb24pO1xcbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKEwpO1xcbiAgICBMIC89IGRpc3Q7XFxuICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgIGZsb2F0IG5kbCA9IGNsYW1wKGRvdChOLCBMKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZGggPSBjbGFtcChkb3QoTiwgSCksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IGF0dGVudWF0aW9uID0gbGlnaHRBdHRlbnVhdGlvbihkaXN0LCBsaWdodFJhbmdlKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGF0dGVudWF0aW9uICogbGlnaHRFcXVhdGlvbihcXG4gICAgICAgIGxpZ2h0Q29sb3IsIGRpZmZ1c2VDb2xvciwgc3BlY3VsYXJDb2xvciwgbmRsLCBuZGgsIG5kdiwgZ2xvc3NpbmVzc1xcbiAgICApO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbiAgICBmbG9hdCBzaGFkb3dDb250cmliID0gY29tcHV0ZVNoYWRvd0NvbnRyaWJPbW5pKFxcbiAgICAgICAgbGlnaHRTaGFkb3dNYXAsIC1MICogZGlzdCwgbGlnaHRSYW5nZVxcbiAgICApO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IGNsYW1wKHNoYWRvd0NvbnRyaWIsIDAuMCwgMS4wKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLnNwaGVyZV9saWdodFxcbkBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5saWdodF9oZWFkXFxuQGltcG9ydCBjbGF5LnV0aWwuY2FsY3VsYXRlX2F0dGVudWF0aW9uXFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2VxdWF0aW9uXFxudW5pZm9ybSB2ZWMzIGxpZ2h0UG9zaXRpb247XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29sb3I7XFxudW5pZm9ybSBmbG9hdCBsaWdodFJhbmdlO1xcbnVuaWZvcm0gZmxvYXQgbGlnaHRSYWRpdXM7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbnZhcnlpbmcgdmVjMyB2X1Bvc2l0aW9uO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICBAaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsuZ2J1ZmZlcl9yZWFkXFxuICAgIHZlYzMgTCA9IGxpZ2h0UG9zaXRpb24gLSBwb3NpdGlvbjtcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvc2l0aW9uIC0gcG9zaXRpb24pO1xcbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKEwpO1xcbiAgICB2ZWMzIFIgPSByZWZsZWN0KFYsIE4pO1xcbiAgICBmbG9hdCB0bXAgPSBkb3QoTCwgUik7XFxuICAgIHZlYzMgY1RvUiA9IHRtcCAqIFIgLSBMO1xcbiAgICBmbG9hdCBkID0gbGVuZ3RoKGNUb1IpO1xcbiAgICBMID0gTCArIGNUb1IgKiBjbGFtcChsaWdodFJhZGl1cyAvIGQsIDAuMCwgMS4wKTtcXG4gICAgTCA9IG5vcm1hbGl6ZShMKTtcXG4gICAgdmVjMyBIID0gbm9ybWFsaXplKEwgKyBWKTtcXG4gICAgZmxvYXQgbmRsID0gY2xhbXAoZG90KE4sIEwpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZHYgPSBjbGFtcChkb3QoTiwgViksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgYXR0ZW51YXRpb24gPSBsaWdodEF0dGVudWF0aW9uKGRpc3QsIGxpZ2h0UmFuZ2UpO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiID0gbGlnaHRDb2xvciAqIG5kbCAqIGF0dGVudWF0aW9uO1xcbiAgICBnbG9zc2luZXNzID0gY2xhbXAoZ2xvc3NpbmVzcyAtIGxpZ2h0UmFkaXVzIC8gMi4wIC8gZGlzdCwgMC4wLCAxLjApO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiID0gYXR0ZW51YXRpb24gKiBsaWdodEVxdWF0aW9uKFxcbiAgICAgICAgbGlnaHRDb2xvciwgZGlmZnVzZUNvbG9yLCBzcGVjdWxhckNvbG9yLCBuZGwsIG5kaCwgbmR2LCBnbG9zc2luZXNzXFxuICAgICk7XFxuICAgIGdsX0ZyYWdDb2xvci5hID0gMS4wO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5kZWZlcnJlZC50dWJlX2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG5AaW1wb3J0IGNsYXkudXRpbC5jYWxjdWxhdGVfYXR0ZW51YXRpb25cXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfZXF1YXRpb25cXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIGZsb2F0IGxpZ2h0UmFuZ2U7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0RXh0ZW5kO1xcbnVuaWZvcm0gdmVjMyBleWVQb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzMgdl9Qb3NpdGlvbjtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmdidWZmZXJfcmVhZFxcbiAgICB2ZWMzIEwgPSBsaWdodFBvc2l0aW9uIC0gcG9zaXRpb247XFxuICAgIHZlYzMgViA9IG5vcm1hbGl6ZShleWVQb3NpdGlvbiAtIHBvc2l0aW9uKTtcXG4gICAgdmVjMyBSID0gcmVmbGVjdChWLCBOKTtcXG4gICAgdmVjMyBMMCA9IGxpZ2h0UG9zaXRpb24gLSBsaWdodEV4dGVuZCAtIHBvc2l0aW9uO1xcbiAgICB2ZWMzIEwxID0gbGlnaHRQb3NpdGlvbiArIGxpZ2h0RXh0ZW5kIC0gcG9zaXRpb247XFxuICAgIHZlYzMgTEQgPSBMMSAtIEwwO1xcbiAgICBmbG9hdCBsZW4wID0gbGVuZ3RoKEwwKTtcXG4gICAgZmxvYXQgbGVuMSA9IGxlbmd0aChMMSk7XFxuICAgIGZsb2F0IGlycmEgPSAyLjAgKiBjbGFtcChkb3QoTiwgTDApIC8gKDIuMCAqIGxlbjApICsgZG90KE4sIEwxKSAvICgyLjAgKiBsZW4xKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBMRERvdFIgPSBkb3QoUiwgTEQpO1xcbiAgICBmbG9hdCB0ID0gKExERG90UiAqIGRvdChSLCBMMCkgLSBkb3QoTDAsIExEKSkgLyAoZG90KExELCBMRCkgLSBMRERvdFIgKiBMRERvdFIpO1xcbiAgICB0ID0gY2xhbXAodCwgMC4wLCAxLjApO1xcbiAgICBMID0gTDAgKyB0ICogTEQ7XFxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoTCk7XFxuICAgIEwgLz0gZGlzdDtcXG4gICAgdmVjMyBIID0gbm9ybWFsaXplKEwgKyBWKTtcXG4gICAgZmxvYXQgbmRoID0gY2xhbXAoZG90KE4sIEgpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IG5kdiA9IGNsYW1wKGRvdChOLCBWKSwgMC4wLCAxLjApO1xcbiAgICBnbG9zc2luZXNzID0gY2xhbXAoZ2xvc3NpbmVzcyAtIDAuMCAvIDIuMCAvIGRpc3QsIDAuMCwgMS4wKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGxpZ2h0Q29sb3IgKiBpcnJhICogbGlnaHRBdHRlbnVhdGlvbihkaXN0LCBsaWdodFJhbmdlKVxcbiAgICAgICAgKiAoZGlmZnVzZUNvbG9yICsgRF9QaG9uZyhnbG9zc2luZXNzLCBuZGgpICogRl9TY2hsaWNrKG5kdiwgc3BlY3VsYXJDb2xvcikpO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG59XFxuQGVuZFwiO1xuIiwiLy8gTGlnaHQtcHJlIHBhc3MgZGVmZXJyZWQgcmVuZGVyaW5nXG4vLyBodHRwOi8vd3d3LnJlYWx0aW1lcmVuZGVyaW5nLmNvbS9ibG9nL2RlZmVycmVkLWxpZ2h0aW5nLWFwcHJvYWNoZXMvXG5pbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL01hdGVyaWFsJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5pbXBvcnQgRnVsbFF1YWRQYXNzIGZyb20gJy4uL2NvbXBvc2l0b3IvUGFzcyc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9UZXh0dXJlJztcbmltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IFNwaGVyZUdlbyBmcm9tICcuLi9nZW9tZXRyeS9TcGhlcmUnO1xuaW1wb3J0IENvbmVHZW8gZnJvbSAnLi4vZ2VvbWV0cnkvQ29uZSc7XG5pbXBvcnQgQ3lsaW5kZXJHZW8gZnJvbSAnLi4vZ2VvbWV0cnkvQ3lsaW5kZXInO1xuaW1wb3J0IE1hdHJpeDQgZnJvbSAnLi4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgR0J1ZmZlciBmcm9tICcuL0dCdWZmZXInO1xuXG5pbXBvcnQgcHJlekdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9wcmV6Lmdsc2wuanMnO1xuaW1wb3J0IHV0aWxHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvdXRpbC5nbHNsLmpzJztcblxuaW1wb3J0IGxpZ2h0dm9sdW1lR2xzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2xpZ2h0dm9sdW1lLmdsc2wuanMnO1xuLy8gTGlnaHQgc2hhZGVyc1xuaW1wb3J0IHNwb3RHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvc3BvdC5nbHNsLmpzJztcbmltcG9ydCBkaXJlY3Rpb25hbEdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9kaXJlY3Rpb25hbC5nbHNsLmpzJztcbmltcG9ydCBhbWJpZW50R2xzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnQuZ2xzbC5qcyc7XG5pbXBvcnQgYW1iaWVudHNoR2xzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnRzaC5nbHNsLmpzJztcbmltcG9ydCBhbWJpZW50Y3ViZW1hcEdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9hbWJpZW50Y3ViZW1hcC5nbHNsLmpzJztcbmltcG9ydCBwb2ludEdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9wb2ludC5nbHNsLmpzJztcbmltcG9ydCBzcGhlcmVHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvc3BoZXJlLmdsc2wuanMnO1xuaW1wb3J0IHR1YmVHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvdHViZS5nbHNsLmpzJztcblxuU2hhZGVyLmltcG9ydChwcmV6R2xzbCk7XG5TaGFkZXIuaW1wb3J0KHV0aWxHbHNsKTtcblNoYWRlci5pbXBvcnQobGlnaHR2b2x1bWVHbHNsKTtcblxuLy8gTGlnaHQgc2hhZGVyc1xuU2hhZGVyLmltcG9ydChzcG90R2xzbCk7XG5TaGFkZXIuaW1wb3J0KGRpcmVjdGlvbmFsR2xzbCk7XG5TaGFkZXIuaW1wb3J0KGFtYmllbnRHbHNsKTtcblNoYWRlci5pbXBvcnQoYW1iaWVudHNoR2xzbCk7XG5TaGFkZXIuaW1wb3J0KGFtYmllbnRjdWJlbWFwR2xzbCk7XG5TaGFkZXIuaW1wb3J0KHBvaW50R2xzbCk7XG5TaGFkZXIuaW1wb3J0KHNwaGVyZUdsc2wpO1xuU2hhZGVyLmltcG9ydCh0dWJlR2xzbCk7XG5cblNoYWRlci5pbXBvcnQocHJlekdsc2wpO1xuXG4vKipcbiAqIERlZmVycmVkIHJlbmRlcmVyXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LmRlZmVycmVkLlJlbmRlcmVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRGVmZXJyZWRSZW5kZXJlciA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBmdWxsUXVhZFZlcnRleCA9IFNoYWRlci5zb3VyY2UoJ2NsYXkuY29tcG9zaXRvci52ZXJ0ZXgnKTtcbiAgICB2YXIgbGlnaHRWb2x1bWVWZXJ0ZXggPSBTaGFkZXIuc291cmNlKCdjbGF5LmRlZmVycmVkLmxpZ2h0X3ZvbHVtZS52ZXJ0ZXgnKTtcblxuICAgIHZhciBkaXJlY3Rpb25hbExpZ2h0U2hhZGVyID0gbmV3IFNoYWRlcihmdWxsUXVhZFZlcnRleCwgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5kaXJlY3Rpb25hbF9saWdodCcpKTtcblxuICAgIHZhciBsaWdodEFjY3VtdWxhdGVCbGVuZEZ1bmMgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICAgICAgZ2wuYmxlbmRFcXVhdGlvbihnbC5GVU5DX0FERCk7XG4gICAgICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORSk7XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVMaWdodFBhc3NNYXQgPSBmdW5jdGlvbiAoc2hhZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWF0ZXJpYWwoe1xuICAgICAgICAgICAgc2hhZGVyOiBzaGFkZXIsXG4gICAgICAgICAgICBibGVuZDogbGlnaHRBY2N1bXVsYXRlQmxlbmRGdW5jLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICBkZXB0aE1hc2s6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlVm9sdW1lU2hhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaGFkZXIobGlnaHRWb2x1bWVWZXJ0ZXgsIFNoYWRlci5zb3VyY2UoJ2NsYXkuZGVmZXJyZWQuJyArIG5hbWUpKTtcbiAgICB9O1xuXG4gICAgLy8gUm90YXRlIGFuZCBwb3NpdGlvbmluZyB0byBmaXQgdGhlIHNwb3QgbGlnaHRcbiAgICAvLyBXaGljaCB0aGUgY3VzcCBvZiBjb25lIHBvaW50aW5nIHRvIHRoZSBwb3NpdGl2ZSB6XG4gICAgLy8gYW5kIHBvc2l0aW9uZWQgb24gdGhlIG9yaWdpblxuICAgIHZhciBjb25lR2VvID0gbmV3IENvbmVHZW8oe1xuICAgICAgICBjYXBTZWdtZW50czogMTBcbiAgICB9KTtcbiAgICB2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcbiAgICBtYXQucm90YXRlWChNYXRoLlBJIC8gMilcbiAgICAgICAgLnRyYW5zbGF0ZShuZXcgVmVjdG9yMygwLCAtMSwgMCkpO1xuXG4gICAgY29uZUdlby5hcHBseVRyYW5zZm9ybShtYXQpO1xuXG4gICAgdmFyIGN5bGluZGVyR2VvID0gbmV3IEN5bGluZGVyR2VvKHtcbiAgICAgICAgY2FwU2VnbWVudHM6IDEwXG4gICAgfSk7XG4gICAgLy8gQWxpZ24gd2l0aCB4IGF4aXNcbiAgICBtYXQuaWRlbnRpdHkoKS5yb3RhdGVaKE1hdGguUEkgLyAyKTtcbiAgICBjeWxpbmRlckdlby5hcHBseVRyYW5zZm9ybShtYXQpO1xuXG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5kZWZlcnJlZC5SZW5kZXJlciMgKi8ge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm92aWRlIFNoYWRvd01hcFBhc3MgZm9yIHNoYWRvdyByZW5kZXJpbmcuXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LnByZVBhc3MuU2hhZG93TWFwfVxuICAgICAgICAgKi9cbiAgICAgICAgc2hhZG93TWFwUGFzczogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZSBhdXRvIHJlc2l6aW5nIGZyb20gZ2l2ZW4gZGVmdWFsdCByZW5kZXJlciBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9SZXNpemU6IHRydWUsXG5cbiAgICAgICAgX2NyZWF0ZUxpZ2h0UGFzc01hdDogY3JlYXRlTGlnaHRQYXNzTWF0LFxuXG4gICAgICAgIF9nQnVmZmVyOiBuZXcgR0J1ZmZlcigpLFxuXG4gICAgICAgIF9saWdodEFjY3VtRnJhbWVCdWZmZXI6IG5ldyBGcmFtZUJ1ZmZlcih7XG4gICAgICAgICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICAgICAgfSksXG5cbiAgICAgICAgX2xpZ2h0QWNjdW1UZXg6IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgLy8gRklYTUUgRGV2aWNlIG5vdCBzdXBwb3J0IGZsb2F0IHRleHR1cmVcbiAgICAgICAgICAgIHR5cGU6IFRleHR1cmUuSEFMRl9GTE9BVCxcbiAgICAgICAgICAgIG1pbkZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1RcbiAgICAgICAgfSksXG5cbiAgICAgICAgX2Z1bGxRdWFkUGFzczogbmV3IEZ1bGxRdWFkUGFzcyh7XG4gICAgICAgICAgICBibGVuZFdpdGhQcmV2aW91czogdHJ1ZVxuICAgICAgICB9KSxcblxuICAgICAgICBfZGlyZWN0aW9uYWxMaWdodE1hdDogY3JlYXRlTGlnaHRQYXNzTWF0KGRpcmVjdGlvbmFsTGlnaHRTaGFkZXIpLFxuXG4gICAgICAgIF9hbWJpZW50TWF0OiBjcmVhdGVMaWdodFBhc3NNYXQobmV3IFNoYWRlcihcbiAgICAgICAgICAgIGZ1bGxRdWFkVmVydGV4LCBTaGFkZXIuc291cmNlKCdjbGF5LmRlZmVycmVkLmFtYmllbnRfbGlnaHQnKVxuICAgICAgICApKSxcbiAgICAgICAgX2FtYmllbnRTSE1hdDogY3JlYXRlTGlnaHRQYXNzTWF0KG5ldyBTaGFkZXIoXG4gICAgICAgICAgICBmdWxsUXVhZFZlcnRleCwgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5hbWJpZW50X3NoX2xpZ2h0JylcbiAgICAgICAgKSksXG4gICAgICAgIF9hbWJpZW50Q3ViZW1hcE1hdDogY3JlYXRlTGlnaHRQYXNzTWF0KG5ldyBTaGFkZXIoXG4gICAgICAgICAgICBmdWxsUXVhZFZlcnRleCwgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5hbWJpZW50X2N1YmVtYXBfbGlnaHQnKVxuICAgICAgICApKSxcblxuICAgICAgICBfc3BvdExpZ2h0U2hhZGVyOiBjcmVhdGVWb2x1bWVTaGFkZXIoJ3Nwb3RfbGlnaHQnKSxcbiAgICAgICAgX3BvaW50TGlnaHRTaGFkZXI6IGNyZWF0ZVZvbHVtZVNoYWRlcigncG9pbnRfbGlnaHQnKSxcblxuICAgICAgICBfc3BoZXJlTGlnaHRTaGFkZXI6IGNyZWF0ZVZvbHVtZVNoYWRlcignc3BoZXJlX2xpZ2h0JyksXG4gICAgICAgIF90dWJlTGlnaHRTaGFkZXI6IGNyZWF0ZVZvbHVtZVNoYWRlcigndHViZV9saWdodCcpLFxuXG4gICAgICAgIF9saWdodFNwaGVyZUdlbzogbmV3IFNwaGVyZUdlbyh7XG4gICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiAxMCxcbiAgICAgICAgICAgIGhlaWdodFNlZ2VtZW50czogMTBcbiAgICAgICAgfSksXG5cbiAgICAgICAgX2xpZ2h0Q29uZUdlbzogY29uZUdlbyxcblxuICAgICAgICBfbGlnaHRDeWxpbmRlckdlbzogY3lsaW5kZXJHZW8sXG5cbiAgICAgICAgX291dHB1dFBhc3M6IG5ldyBGdWxsUXVhZFBhc3Moe1xuICAgICAgICAgICAgZnJhZ21lbnQ6IFNoYWRlci5zb3VyY2UoJ2NsYXkuY29tcG9zaXRvci5vdXRwdXQnKVxuICAgICAgICB9KVxuICAgIH07XG59LCAvKiogQGxlbmRzIGNsYXkuZGVmZXJyZWQuUmVuZGVyZXIjICovIHtcbiAgICAvKipcbiAgICAgKiBEbyByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqIEBwYXJhbSB7Y2xheS5DYW1lcmF9IGNhbWVyYVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnJlbmRlclRvVGFyZ2V0ID0gZmFsc2VdIElmIG5vdCBvdXB1dCBhbmQgcmVuZGVyIHRvIHRoZSB0YXJnZXQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMubm90VXBkYXRlU2hhZG93ID0gdHJ1ZV0gSWYgbm90IHVwZGF0ZSB0aGUgc2hhZG93LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMubm90VXBkYXRlU2NlbmUgPSB0cnVlXSBJZiBub3QgdXBkYXRlIHRoZSBzY2VuZS5cbiAgICAgKi9cbiAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgb3B0cykge1xuXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgICBvcHRzLnJlbmRlclRvVGFyZ2V0ID0gb3B0cy5yZW5kZXJUb1RhcmdldCB8fCBmYWxzZTtcbiAgICAgICAgb3B0cy5ub3RVcGRhdGVTaGFkb3cgPSBvcHRzLm5vdFVwZGF0ZVNoYWRvdyB8fCBmYWxzZTtcbiAgICAgICAgb3B0cy5ub3RVcGRhdGVTY2VuZSA9IG9wdHMubm90VXBkYXRlU2NlbmUgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKCFvcHRzLm5vdFVwZGF0ZVNjZW5lKSB7XG4gICAgICAgICAgICBzY2VuZS51cGRhdGUoZmFsc2UsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FtZXJhLnVwZGF0ZSh0cnVlKTtcblxuICAgICAgICAvLyBQRU5ESU5HIEZvciBzdGVyZW8gcmVuZGVyaW5nXG4gICAgICAgIHZhciBkcHIgPSByZW5kZXJlci5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9SZXNpemVcbiAgICAgICAgICAgICYmIChyZW5kZXJlci5nZXRXaWR0aCgpICogZHByICE9PSB0aGlzLl9saWdodEFjY3VtVGV4LndpZHRoXG4gICAgICAgICAgICB8fCByZW5kZXJlci5nZXRIZWlnaHQoKSAqIGRwciAhPT0gdGhpcy5fbGlnaHRBY2N1bVRleC5oZWlnaHQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemUocmVuZGVyZXIuZ2V0V2lkdGgoKSAqIGRwciwgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgKiBkcHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ0J1ZmZlci51cGRhdGUocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgICAgIC8vIEFjY3VtdWxhdGUgbGlnaHQgYnVmZmVyXG4gICAgICAgIHRoaXMuX2FjY3VtdWxhdGVMaWdodEJ1ZmZlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgIW9wdHMubm90VXBkYXRlU2hhZG93KTtcblxuICAgICAgICBpZiAoIW9wdHMucmVuZGVyVG9UYXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dFBhc3Muc2V0VW5pZm9ybSgndGV4dHVyZScsIHRoaXMuX2xpZ2h0QWNjdW1UZXgpO1xuXG4gICAgICAgICAgICB0aGlzLl9vdXRwdXRQYXNzLnJlbmRlcihyZW5kZXJlcik7XG4gICAgICAgICAgICAvLyB0aGlzLl9nQnVmZmVyLnJlbmRlckRlYnVnKHJlbmRlcmVyLCBjYW1lcmEsICdub3JtYWwnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodEFjY3VtVGV4O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LkZyYW1lQnVmZmVyfVxuICAgICAqL1xuICAgIGdldFRhcmdldEZyYW1lQnVmZmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodEFjY3VtRnJhbWVCdWZmZXI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkuZGVmZXJyZWQuR0J1ZmZlcn1cbiAgICAgKi9cbiAgICBnZXRHQnVmZmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nQnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyBUT0RPIGlzIGRwciBuZWVkZWQ/XG4gICAgc2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBkcHIpIHtcbiAgICAgICAgdGhpcy5fZ0J1ZmZlci5zZXRWaWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBkcHIpO1xuICAgICAgICB0aGlzLl9saWdodEFjY3VtRnJhbWVCdWZmZXIudmlld3BvcnQgPSB0aGlzLl9nQnVmZmVyLmdldFZpZXdwb3J0KCk7XG4gICAgfSxcblxuICAgIC8vIGdldEZ1bGxRdWFkTGlnaHRQYXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9mdWxsUXVhZFBhc3M7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIFNldCByZW5kZXJlciBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAgICAgKi9cbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX2xpZ2h0QWNjdW1UZXgud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5fbGlnaHRBY2N1bVRleC5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgLy8gUEVORElORyB2aWV3cG9ydCA/XG4gICAgICAgIHRoaXMuX2dCdWZmZXIucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG5cbiAgICBfYWNjdW11bGF0ZUxpZ2h0QnVmZmVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIHVwZGF0ZVNoYWRvdykge1xuICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGxpZ2h0QWNjdW1UZXggPSB0aGlzLl9saWdodEFjY3VtVGV4O1xuICAgICAgICB2YXIgbGlnaHRBY2N1bUZyYW1lQnVmZmVyID0gdGhpcy5fbGlnaHRBY2N1bUZyYW1lQnVmZmVyO1xuXG4gICAgICAgIHZhciBleWVQb3NpdGlvbiA9IGNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZvbHVtZSBtZXNoZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZS5saWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxpZ2h0UHJveHkoc2NlbmUubGlnaHRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaGFkb3dNYXBQYXNzID0gdGhpcy5zaGFkb3dNYXBQYXNzO1xuICAgICAgICBpZiAoc2hhZG93TWFwUGFzcyAmJiB1cGRhdGVTaGFkb3cpIHtcbiAgICAgICAgICAgIGdsLmNsZWFyQ29sb3IoMSwgMSwgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlTGlnaHRTaGFkb3cocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVsaWdodGFjY3VtdWxhdGUnLCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgdXBkYXRlU2hhZG93KTtcblxuICAgICAgICBsaWdodEFjY3VtRnJhbWVCdWZmZXIuYXR0YWNoKGxpZ2h0QWNjdW1UZXgpO1xuICAgICAgICBsaWdodEFjY3VtRnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIHZhciBjbGVhckNvbG9yID0gcmVuZGVyZXIuY2xlYXJDb2xvcjtcblxuICAgICAgICB2YXIgdmlld3BvcnQgPSBsaWdodEFjY3VtRnJhbWVCdWZmZXIudmlld3BvcnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgdmFyIGRwciA9IHZpZXdwb3J0LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICAvLyB1c2Ugc2Npc3NvciB0byBtYWtlIHN1cmUgb25seSBjbGVhciB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgZ2wuc2Npc3Nvcih2aWV3cG9ydC54ICogZHByLCB2aWV3cG9ydC55ICogZHByLCB2aWV3cG9ydC53aWR0aCAqIGRwciwgdmlld3BvcnQuaGVpZ2h0ICogZHByKTtcbiAgICAgICAgfVxuICAgICAgICBnbC5jbGVhckNvbG9yKGNsZWFyQ29sb3JbMF0sIGNsZWFyQ29sb3JbMV0sIGNsZWFyQ29sb3JbMl0sIGNsZWFyQ29sb3JbM10pO1xuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcbiAgICAgICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ3N0YXJ0bGlnaHRhY2N1bXVsYXRlJywgcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgICAgIHZhciB2aWV3UHJvamVjdGlvbkludiA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIE1hdHJpeDQubXVsdGlwbHkodmlld1Byb2plY3Rpb25JbnYsIGNhbWVyYS53b3JsZFRyYW5zZm9ybSwgY2FtZXJhLmludlByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgIHZhciB2b2x1bWVNZXNoTGlzdCA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmUubGlnaHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbGlnaHQgPSBzY2VuZS5saWdodHNbaV07XG4gICAgICAgICAgICB2YXIgdVRwbCA9IGxpZ2h0LnVuaWZvcm1UZW1wbGF0ZXM7XG5cbiAgICAgICAgICAgIHZhciB2b2x1bWVNZXNoID0gbGlnaHQudm9sdW1lTWVzaCB8fCBsaWdodC5fX3ZvbHVtZU1lc2g7XG5cbiAgICAgICAgICAgIGlmICh2b2x1bWVNZXNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gdm9sdW1lTWVzaC5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICAvLyBWb2x1bWUgbWVzaCB3aWxsIGFmZmVjdCB0aGUgc2NlbmUgYm91bmRpbmcgYm94IHdoZW4gcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgLy8gaWYgY2FzdFNoYWRvdyBpcyB0cnVlXG4gICAgICAgICAgICAgICAgdm9sdW1lTWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkxpZ2h0VHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlnaHQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdQT0lOVF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodENvbG9yJywgdVRwbC5wb2ludExpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnBvaW50TGlnaHRSYW5nZS52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRQb3NpdGlvbicsIHVUcGwucG9pbnRMaWdodFBvc2l0aW9uLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1BPVF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodFBvc2l0aW9uJywgdVRwbC5zcG90TGlnaHRQb3NpdGlvbi52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRDb2xvcicsIHVUcGwuc3BvdExpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnNwb3RMaWdodFJhbmdlLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodERpcmVjdGlvbicsIHVUcGwuc3BvdExpZ2h0RGlyZWN0aW9uLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCd1bWJyYUFuZ2xlQ29zaW5lJywgdVRwbC5zcG90TGlnaHRVbWJyYUFuZ2xlQ29zaW5lLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdwZW51bWJyYUFuZ2xlQ29zaW5lJywgdVRwbC5zcG90TGlnaHRQZW51bWJyYUFuZ2xlQ29zaW5lLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdmYWxsb2ZmRmFjdG9yJywgdVRwbC5zcG90TGlnaHRGYWxsb2ZmRmFjdG9yLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1BIRVJFX0xJR0hUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29sb3InLCB1VHBsLnNwaGVyZUxpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnNwaGVyZUxpZ2h0UmFuZ2UudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFkaXVzJywgdVRwbC5zcGhlcmVMaWdodFJhZGl1cy52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRQb3NpdGlvbicsIHVUcGwuc3BoZXJlTGlnaHRQb3NpdGlvbi52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RVQkVfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRDb2xvcicsIHVUcGwudHViZUxpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnR1YmVMaWdodFJhbmdlLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodEV4dGVuZCcsIHVUcGwudHViZUxpZ2h0RXh0ZW5kLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodFBvc2l0aW9uJywgdVRwbC50dWJlTGlnaHRQb3NpdGlvbi52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duTGlnaHRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodW5rbm93bkxpZ2h0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdleWVQb3NpdGlvbicsIGV5ZVBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCd2aWV3UHJvamVjdGlvbkludicsIHZpZXdQcm9qZWN0aW9uSW52LmFycmF5KTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTEnLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUxKCkpO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2dCdWZmZXJUZXh0dXJlMicsIHRoaXMuX2dCdWZmZXIuZ2V0VGFyZ2V0VGV4dHVyZTIoKSk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnZ0J1ZmZlclRleHR1cmUzJywgdGhpcy5fZ0J1ZmZlci5nZXRUYXJnZXRUZXh0dXJlMygpKTtcblxuICAgICAgICAgICAgICAgIHZvbHVtZU1lc2hMaXN0LnB1c2godm9sdW1lTWVzaCk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXNzID0gdGhpcy5fZnVsbFF1YWRQYXNzO1xuICAgICAgICAgICAgICAgIHZhciB1bmtub3duTGlnaHRUeXBlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gRnVsbCBxdWFkIGxpZ2h0XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsaWdodC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FNQklFTlRfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbCA9IHRoaXMuX2FtYmllbnRNYXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29sb3InLCB1VHBsLmFtYmllbnRMaWdodENvbG9yLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQU1CSUVOVF9TSF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsID0gdGhpcy5fYW1iaWVudFNITWF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodENvbG9yJywgdVRwbC5hbWJpZW50U0hMaWdodENvbG9yLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29lZmZpY2llbnRzJywgdVRwbC5hbWJpZW50U0hMaWdodENvZWZmaWNpZW50cy52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FNQklFTlRfQ1VCRU1BUF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsID0gdGhpcy5fYW1iaWVudEN1YmVtYXBNYXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29sb3InLCB1VHBsLmFtYmllbnRDdWJlbWFwTGlnaHRDb2xvci52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodEN1YmVtYXAnLCB1VHBsLmFtYmllbnRDdWJlbWFwTGlnaHRDdWJlbWFwLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2JyZGZMb29rdXAnLCB1VHBsLmFtYmllbnRDdWJlbWFwTGlnaHRCUkRGTG9va3VwLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRElSRUNUSU9OQUxfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhc1NoYWRvdyA9IHNoYWRvd01hcFBhc3MgJiYgbGlnaHQuY2FzdFNoYWRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MubWF0ZXJpYWwgPSB0aGlzLl9kaXJlY3Rpb25hbExpZ2h0TWF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbFtoYXNTaGFkb3cgPyAnZGVmaW5lJyA6ICd1bmRlZmluZSddKCdmcmFnbWVudCcsICdTSEFET1dNQVBfRU5BQkxFRCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1NoYWRvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdTSEFET1dfQ0FTQ0FERScsIGxpZ2h0LnNoYWRvd0Nhc2NhZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodENvbG9yJywgdVRwbC5kaXJlY3Rpb25hbExpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MubWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHREaXJlY3Rpb24nLCB1VHBsLmRpcmVjdGlvbmFsTGlnaHREaXJlY3Rpb24udmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rb253IGxpZ2h0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25MaWdodFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodW5rbm93bkxpZ2h0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcGFzc01hdGVyaWFsID0gcGFzcy5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICBwYXNzTWF0ZXJpYWwuc2V0VW5pZm9ybSgnZXllUG9zaXRpb24nLCBleWVQb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcGFzc01hdGVyaWFsLnNldFVuaWZvcm0oJ3ZpZXdQcm9qZWN0aW9uSW52Jywgdmlld1Byb2plY3Rpb25JbnYuYXJyYXkpO1xuICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTEnLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUxKCkpO1xuICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTInLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUyKCkpO1xuICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTMnLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUzKCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgICAgIGlmIChzaGFkb3dNYXBQYXNzICYmIGxpZ2h0LmNhc3RTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc01hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0U2hhZG93TWFwJywgbGlnaHQuX19zaGFkb3dNYXApO1xuICAgICAgICAgICAgICAgICAgICBwYXNzTWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRNYXRyaWNlcycsIGxpZ2h0Ll9fbGlnaHRNYXRyaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdzaGFkb3dDYXNjYWRlQ2xpcHNOZWFyJywgbGlnaHQuX19jYXNjYWRlQ2xpcHNOZWFyKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc01hdGVyaWFsLnNldFVuaWZvcm0oJ3NoYWRvd0Nhc2NhZGVDbGlwc0ZhcicsIGxpZ2h0Ll9fY2FzY2FkZUNsaXBzRmFyKTtcblxuICAgICAgICAgICAgICAgICAgICBwYXNzTWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRTaGFkb3dNYXBTaXplJywgbGlnaHQuc2hhZG93UmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFzcy5yZW5kZXJRdWFkKHJlbmRlcmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlclZvbHVtZU1lc2hMaXN0KHJlbmRlcmVyLCBjYW1lcmEsIHZvbHVtZU1lc2hMaXN0KTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2xpZ2h0YWNjdW11bGF0ZScsIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcblxuICAgICAgICBsaWdodEFjY3VtRnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2FmdGVybGlnaHRhY2N1bXVsYXRlJywgcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgfSxcblxuICAgIF9wcmVwYXJlTGlnaHRTaGFkb3c6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JsZFZpZXcgPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XG4gICAgICAgICAgICB2YXIgc2hhZG93Q2FzdGVycztcblxuICAgICAgICAgICAgc2hhZG93Q2FzdGVycyA9IHRoaXMuX3NoYWRvd0Nhc3RlcnMgfHwgKHRoaXMuX3NoYWRvd0Nhc3RlcnMgPSBbXSk7XG4gICAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgICAgdmFyIGxpc3QgPSBzY2VuZS5vcGFxdWVMaXN0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbaV0uY2FzdFNoYWRvdykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dDYXN0ZXJzW2NvdW50KytdID0gbGlzdFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkb3dDYXN0ZXJzLmxlbmd0aCA9IGNvdW50O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjZW5lLmxpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBsaWdodCA9IHNjZW5lLmxpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgdm9sdW1lTWVzaCA9IGxpZ2h0LnZvbHVtZU1lc2ggfHwgbGlnaHQuX192b2x1bWVNZXNoO1xuICAgICAgICAgICAgICAgIGlmICghbGlnaHQuY2FzdFNoYWRvdykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpZ2h0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUE9JTlRfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdTUE9UX0xJR0hUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZydXN0dW0gY3VsbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4NC5tdWx0aXBseSh3b3JsZFZpZXcsIGNhbWVyYS52aWV3TWF0cml4LCB2b2x1bWVNZXNoLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5pc0ZydXN0dW1DdWxsZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lTWVzaCwgbnVsbCwgY2FtZXJhLCB3b3JsZFZpZXcuYXJyYXksIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVTaW5nbGVMaWdodFNoYWRvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgbGlnaHQsIHNoYWRvd0Nhc3RlcnMsIHZvbHVtZU1lc2gubWF0ZXJpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRElSRUNUSU9OQUxfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVNpbmdsZUxpZ2h0U2hhZG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBsaWdodCwgc2hhZG93Q2FzdGVycywgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIF9wcmVwYXJlU2luZ2xlTGlnaHRTaGFkb3c6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgbGlnaHQsIGNhc3RlcnMsIG1hdGVyaWFsKSB7XG4gICAgICAgIHN3aXRjaCAobGlnaHQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnUE9JTlRfTElHSFQnOlxuICAgICAgICAgICAgICAgIHZhciBzaGFkb3dNYXBzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLnJlbmRlclBvaW50TGlnaHRTaGFkb3coXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLCBzY2VuZSwgbGlnaHQsIGNhc3RlcnMsIHNoYWRvd01hcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0U2hhZG93TWFwJywgc2hhZG93TWFwc1swXSk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRTaGFkb3dNYXBTaXplJywgbGlnaHQuc2hhZG93UmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdTUE9UX0xJR0hUJzpcbiAgICAgICAgICAgICAgICB2YXIgc2hhZG93TWFwcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBsaWdodE1hdHJpY2VzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLnJlbmRlclNwb3RMaWdodFNoYWRvdyhcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIsIHNjZW5lLCBsaWdodCwgY2FzdGVycywgbGlnaHRNYXRyaWNlcywgc2hhZG93TWFwc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRTaGFkb3dNYXAnLCBzaGFkb3dNYXBzWzBdKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodE1hdHJpeCcsIGxpZ2h0TWF0cmljZXNbMF0pO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0U2hhZG93TWFwU2l6ZScsIGxpZ2h0LnNoYWRvd1Jlc29sdXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRElSRUNUSU9OQUxfTElHSFQnOlxuICAgICAgICAgICAgICAgIHZhciBzaGFkb3dNYXBzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGxpZ2h0TWF0cmljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgY2FzY2FkZUNsaXBzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLnJlbmRlckRpcmVjdGlvbmFsTGlnaHRTaGFkb3coXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBsaWdodCwgY2FzdGVycywgY2FzY2FkZUNsaXBzLCBsaWdodE1hdHJpY2VzLCBzaGFkb3dNYXBzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FzY2FkZUNsaXBzTmVhciA9IGNhc2NhZGVDbGlwcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHZhciBjYXNjYWRlQ2xpcHNGYXIgPSBjYXNjYWRlQ2xpcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBjYXNjYWRlQ2xpcHNOZWFyLnBvcCgpO1xuICAgICAgICAgICAgICAgIGNhc2NhZGVDbGlwc0Zhci5zaGlmdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBmcm9tIGZhciB0byBuZWFyXG4gICAgICAgICAgICAgICAgY2FzY2FkZUNsaXBzTmVhci5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgY2FzY2FkZUNsaXBzRmFyLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBsaWdodE1hdHJpY2VzLnJldmVyc2UoKTtcblxuICAgICAgICAgICAgICAgIGxpZ2h0Ll9fY2FzY2FkZUNsaXBzTmVhciA9IGNhc2NhZGVDbGlwc05lYXI7XG4gICAgICAgICAgICAgICAgbGlnaHQuX19jYXNjYWRlQ2xpcHNGYXIgPSBjYXNjYWRlQ2xpcHNGYXI7XG4gICAgICAgICAgICAgICAgbGlnaHQuX19zaGFkb3dNYXAgPSBzaGFkb3dNYXBzWzBdO1xuICAgICAgICAgICAgICAgIGxpZ2h0Ll9fbGlnaHRNYXRyaWNlcyA9IGxpZ2h0TWF0cmljZXM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVXBkYXRlIGxpZ2h0IHZvbHVtZSBtZXNoXG4gICAgLy8gTGlnaHQgdm9sdW1lIG1lc2ggaXMgcmVuZGVyZWQgaW4gbGlnaHQgYWNjdW11bGF0ZSBwYXNzIGluc3RlYWQgb2YgZnVsbCBxdWFkLlxuICAgIC8vIEl0IHdpbGwgcmVkdWNlIHBpeGVscyBzaWduaWZpY2FudGx5IHdoZW4gbG9jYWwgbGlnaHQgaXMgcmVsYXRpdmVseSBzbWFsbC5cbiAgICAvLyBBbmQgd2UgY2FuIHVzZSBjdXN0b20gdm9sdW1lIG1lc2ggdG8gc2hhcGUgdGhlIGxpZ2h0LlxuICAgIC8vXG4gICAgLy8gU2VlIFwiRGVmZXJyZWQgU2hhZGluZyBPcHRpbWl6YXRpb25zXCIgaW4gR0RDMjAxMVxuICAgIF91cGRhdGVMaWdodFByb3h5OiBmdW5jdGlvbiAobGlnaHQpIHtcbiAgICAgICAgdmFyIHZvbHVtZU1lc2g7XG4gICAgICAgIGlmIChsaWdodC52b2x1bWVNZXNoKSB7XG4gICAgICAgICAgICB2b2x1bWVNZXNoID0gbGlnaHQudm9sdW1lTWVzaDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAobGlnaHQudHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9jYWwgbGlnaHQgKHBvaW50IGFuZCBzcG90KSBuZWVkcyB2b2x1bWUgbWVzaC5cbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Rpb25hbCBhbmQgYW1iaWVudCBsaWdodCByZW5kZXJzIGluIGZ1bGwgcXVhZFxuICAgICAgICAgICAgICAgIGNhc2UgJ1BPSU5UX0xJR0hUJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTUEhFUkVfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICB2YXIgc2hhZGVyID0gbGlnaHQudHlwZSA9PT0gJ1NQSEVSRV9MSUdIVCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fc3BoZXJlTGlnaHRTaGFkZXIgOiB0aGlzLl9wb2ludExpZ2h0U2hhZGVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBWb2x1bWUgbWVzaCBjcmVhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaWdodC5fX3ZvbHVtZU1lc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0Ll9fdm9sdW1lTWVzaCA9IG5ldyBNZXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbDogdGhpcy5fY3JlYXRlTGlnaHRQYXNzTWF0KHNoYWRlciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHRoaXMuX2xpZ2h0U3BoZXJlR2VvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY3VsbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGxpZ2h0IHZvbHVtZSBtZXNoIGludGVyc2VjdCBjYW1lcmEgbmVhciBwbGFuZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgbWVzaCBpbnNpZGUgY2FuIHN0aWxsIGJlIHJlbmRlcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsbGluZzogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZU1lc2ggPSBsaWdodC5fX3ZvbHVtZU1lc2g7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gbGlnaHQucmFuZ2UgKyAobGlnaHQucmFkaXVzIHx8IDApO1xuICAgICAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLnNjYWxlLnNldChyLCByLCByKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnU1BPVF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0Ll9fdm9sdW1lTWVzaCA9IGxpZ2h0Ll9fdm9sdW1lTWVzaCB8fCBuZXcgTWVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbDogdGhpcy5fY3JlYXRlTGlnaHRQYXNzTWF0KHRoaXMuX3Nwb3RMaWdodFNoYWRlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogdGhpcy5fbGlnaHRDb25lR2VvLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VsbGluZzogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZU1lc2ggPSBsaWdodC5fX3ZvbHVtZU1lc2g7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3BlY3QgPSBNYXRoLnRhbihsaWdodC5wZW51bWJyYUFuZ2xlICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IGxpZ2h0LnJhbmdlO1xuICAgICAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLnNjYWxlLnNldChhc3BlY3QgKiByYW5nZSwgYXNwZWN0ICogcmFuZ2UsIHJhbmdlIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RVQkVfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICBsaWdodC5fX3ZvbHVtZU1lc2ggPSBsaWdodC5fX3ZvbHVtZU1lc2ggfHwgbmV3IE1lc2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWw6IHRoaXMuX2NyZWF0ZUxpZ2h0UGFzc01hdCh0aGlzLl90dWJlTGlnaHRTaGFkZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHRoaXMuX2xpZ2h0Q3lsaW5kZXJHZW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBjdWxsaW5nOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lTWVzaCA9IGxpZ2h0Ll9fdm9sdW1lTWVzaDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gbGlnaHQucmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZU1lc2guc2NhbGUuc2V0KGxpZ2h0Lmxlbmd0aCAvIDIgKyByYW5nZSwgcmFuZ2UsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZvbHVtZU1lc2gpIHtcbiAgICAgICAgICAgIHZvbHVtZU1lc2gudXBkYXRlKCk7XG4gICAgICAgICAgICAvLyBBcHBseSBsaWdodCB0cmFuc2Zvcm1cbiAgICAgICAgICAgIE1hdHJpeDQubXVsdGlwbHkodm9sdW1lTWVzaC53b3JsZFRyYW5zZm9ybSwgbGlnaHQud29ybGRUcmFuc2Zvcm0sIHZvbHVtZU1lc2gud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgdmFyIGhhc1NoYWRvdyA9IHRoaXMuc2hhZG93TWFwUGFzcyAmJiBsaWdodC5jYXN0U2hhZG93O1xuICAgICAgICAgICAgdm9sdW1lTWVzaC5tYXRlcmlhbFtoYXNTaGFkb3cgPyAnZGVmaW5lJyA6ICd1bmRlZmluZSddKCdmcmFnbWVudCcsICdTSEFET1dNQVBfRU5BQkxFRCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZW5kZXJWb2x1bWVNZXNoTGlzdDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdvcmxkVmlld1Byb2plY3Rpb24gPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICB2YXIgd29ybGRWaWV3ID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgdmFyIHByZVpNYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5wcmV6LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnByZXouZnJhZ21lbnQnKSlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVuZGVyZXIsIGNhbWVyYSwgdm9sdW1lTWVzaExpc3QpIHtcbiAgICAgICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBnbC5ibGVuZEVxdWF0aW9uKGdsLkZVTkNfQUREKTtcbiAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSk7XG4gICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVRVUFMKTtcblxuICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG5cbiAgICAgICAgICAgIHZhciB2aWV3cG9ydCA9IHJlbmRlcmVyLnZpZXdwb3J0O1xuICAgICAgICAgICAgdmFyIGRwciA9IHZpZXdwb3J0LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICB2YXIgdmlld3BvcnRVbmlmb3JtID0gW1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LnggKiBkcHIsIHZpZXdwb3J0LnkgKiBkcHIsXG4gICAgICAgICAgICAgICAgdmlld3BvcnQud2lkdGggKiBkcHIsIHZpZXdwb3J0LmhlaWdodCAqIGRwclxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgdmFyIHdpbmRvd1NpemVVbmlmb3JtID0gW1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0QWNjdW1UZXgud2lkdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlnaHRBY2N1bVRleC5oZWlnaHRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm9sdW1lTWVzaExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdm9sdW1lTWVzaCA9IHZvbHVtZU1lc2hMaXN0W2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gRnJ1c3R1bSBjdWxsaW5nXG4gICAgICAgICAgICAgICAgTWF0cml4NC5tdWx0aXBseSh3b3JsZFZpZXcsIGNhbWVyYS52aWV3TWF0cml4LCB2b2x1bWVNZXNoLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuaXNGcnVzdHVtQ3VsbGVkKFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLCBudWxsLCBjYW1lcmEsIHdvcmxkVmlldy5hcnJheSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguYXJyYXlcbiAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV6IHRvIGF2b2lkIG9uZSBwaXhlbCByZW5kZXJlZCB0d2ljZVxuICAgICAgICAgICAgICAgIGdsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICAgICAgICAgIC8vIGRlcHRoTWFzayBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIGNsZWFyIERFUFRIX0JVRkZFUlxuICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgICAgICAgICAgTWF0cml4NC5tdWx0aXBseSh3b3JsZFZpZXdQcm9qZWN0aW9uLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgd29ybGRWaWV3KTtcblxuICAgICAgICAgICAgICAgIHZhciBwcmVaUHJvZ3JhbSA9IHJlbmRlcmVyLmdldFByb2dyYW0odm9sdW1lTWVzaCwgcHJlWk1hdGVyaWFsKTtcbiAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLl9fcHJvZ3JhbSA9IHByZVpQcm9ncmFtO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnZhbGlkYXRlUHJvZ3JhbShwcmVaUHJvZ3JhbSk7XG4gICAgICAgICAgICAgICAgcHJlWlByb2dyYW0uYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2VtYW50aWNJbmZvID0gcHJlWk1hdGVyaWFsLnNoYWRlci5tYXRyaXhTZW1hbnRpY3MuV09STERWSUVXUFJPSkVDVElPTjtcbiAgICAgICAgICAgICAgICBwcmVaUHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCBzZW1hbnRpY0luZm8udHlwZSwgc2VtYW50aWNJbmZvLnN5bWJvbCwgd29ybGRWaWV3UHJvamVjdGlvbi5hcnJheSk7XG4gICAgICAgICAgICAgICAgdm9sdW1lTWVzaC5yZW5kZXIocmVuZGVyZXIsIHByZVpNYXRlcmlhbCwgcHJlWlByb2dyYW0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIGxpZ2h0XG4gICAgICAgICAgICAgICAgZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGdsLmRlcHRoTWFzayhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIHByb2dyYW0gPSByZW5kZXJlci5nZXRQcm9ncmFtKHZvbHVtZU1lc2gsIHZvbHVtZU1lc2gubWF0ZXJpYWwpO1xuICAgICAgICAgICAgICAgIHZvbHVtZU1lc2guX19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgICAgICAgICByZW5kZXJlci52YWxpZGF0ZVByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5iaW5kKHJlbmRlcmVyKTtcblxuICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpY0luZm8gPSB2b2x1bWVNZXNoLm1hdGVyaWFsLnNoYWRlci5tYXRyaXhTZW1hbnRpY3MuV09STERWSUVXUFJPSkVDVElPTjtcbiAgICAgICAgICAgICAgICAvLyBTZXQgc29tZSBjb21tb24gdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsIHNlbWFudGljSW5mby50eXBlLCBzZW1hbnRpY0luZm8uc3ltYm9sLCB3b3JsZFZpZXdQcm9qZWN0aW9uLmFycmF5KTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKGdsLCAnV0lORE9XX1NJWkUnLCB3aW5kb3dTaXplVW5pZm9ybSk7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhnbCwgJ1ZJRVdQT1JUJywgdmlld3BvcnRVbmlmb3JtKTtcblxuICAgICAgICAgICAgICAgIHZvbHVtZU1lc2gubWF0ZXJpYWwuYmluZChyZW5kZXJlciwgcHJvZ3JhbSk7XG4gICAgICAgICAgICAgICAgdm9sdW1lTWVzaC5yZW5kZXIocmVuZGVyZXIsIHZvbHVtZU1lc2gubWF0ZXJpYWwsIHByb2dyYW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVTUyk7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuX2dCdWZmZXIuZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fbGlnaHRBY2N1bUZyYW1lQnVmZmVyLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICB0aGlzLl9saWdodEFjY3VtVGV4LmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgICAgIHRoaXMuX2xpZ2h0Q29uZUdlby5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICAgICAgdGhpcy5fbGlnaHRDeWxpbmRlckdlby5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICAgICAgdGhpcy5fbGlnaHRTcGhlcmVHZW8uZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fZnVsbFF1YWRQYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICB0aGlzLl9vdXRwdXRQYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbmFsTGlnaHRNYXQuZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBEZWZlcnJlZFJlbmRlcmVyO1xuIiwiaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5TcGhlcmVcbiAqIEBleHRlbmRzIHtjbGF5LkxpZ2h0fVxuICovXG52YXIgU3BoZXJlTGlnaHQgPSBMaWdodC5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkubGlnaHQuU3BoZXJlIyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFuZ2U6IDEwMCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFkaXVzOiA1XG59LCB7XG5cbiAgICB0eXBlOiAnU1BIRVJFX0xJR0hUJyxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgc3BoZXJlTGlnaHRQb3NpdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwaGVyZUxpZ2h0UmFuZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICcxZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UucmFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwaGVyZUxpZ2h0UmFkaXVzOiB7XG4gICAgICAgICAgICB0eXBlOiAnMWYnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJhZGl1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BoZXJlTGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTcGhlcmVMaWdodDtcbiIsImltcG9ydCBMaWdodCBmcm9tICcuLi9MaWdodCc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LmxpZ2h0LlR1YmVcbiAqIEBleHRlbmRzIHtjbGF5LkxpZ2h0fVxuICovXG52YXIgVHViZUxpZ2h0ID0gTGlnaHQuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LmxpZ2h0LlR1YmUjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICByYW5nZTogMTAwLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW5ndGg6IDEwXG59LCB7XG5cbiAgICB0eXBlOiAnVFVCRV9MSUdIVCcsXG5cbiAgICB1bmlmb3JtVGVtcGxhdGVzOiB7XG4gICAgICAgIHR1YmVMaWdodFBvc2l0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLmdldFdvcmxkUG9zaXRpb24oKS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0dWJlTGlnaHRFeHRlbmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIGluIHggYXhpc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5jb3B5KGluc3RhbmNlLndvcmxkVHJhbnNmb3JtLngpXG4gICAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCkuc2NhbGUoaW5zdGFuY2UubGVuZ3RoIC8gMikuYXJyYXk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgfSxcblxuICAgICAgICB0dWJlTGlnaHRSYW5nZToge1xuICAgICAgICAgICAgdHlwZTogJzFmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0dWJlTGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBUdWJlTGlnaHQ7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vY29yZS9yZXF1ZXN0JztcbmltcG9ydCBjcmVhdGVDb21wb3NpdG9yIGZyb20gJy4uL2NvbXBvc2l0b3IvY3JlYXRlQ29tcG9zaXRvcic7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkubG9hZGVyLkZYXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRlhMb2FkZXIgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5sb2FkZXIuRlgjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICByb290UGF0aDogJycsXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0ZXh0dXJlUm9vdFBhdGg6ICcnLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2hhZGVyUm9vdFBhdGg6ICcnLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkuU2NlbmV9XG4gICAgICovXG4gICAgc2NlbmU6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5DYW1lcmF9XG4gICAgICovXG4gICAgY2FtZXJhOiBudWxsXG59LFxuLyoqIEBsZW5kcyBjbGF5LmxvYWRlci5GWC5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKHVybCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLnJvb3RQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RQYXRoID0gdXJsLnNsaWNlKDAsIHVybC5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgb25wcm9ncmVzczogZnVuY3Rpb24ocGVyY2VudCwgbG9hZGVkLCB0b3RhbCkge1xuICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigncHJvZ3Jlc3MnLCBwZXJjZW50LCBsb2FkZWQsIHRvdGFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCdlcnJvcicsIGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBvc2l0b3IoSlNPTi5wYXJzZShkYXRhKSwge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlUm9vdFBhdGg6IHRoaXMudGV4dHVyZVJvb3RQYXRoIHx8IHRoaXMucm9vdFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogdGhpcy5jYW1lcmEsXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lOiB0aGlzLnNjZW5lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBGWExvYWRlcjtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDIgPSBnbE1hdHJpeC5tYXQyO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5NYXRyaXgyXG4gKi9cbnZhciBNYXRyaXgyID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIE1hdHJpeDJcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXgyI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBtYXQyLmNyZWF0ZSgpO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXgyI1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cbk1hdHJpeDIucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IE1hdHJpeDIsXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbaV0gPSBhcnJbaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IE1hdHJpeDJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAobmV3IE1hdHJpeDIoKSkuY29weSh0aGlzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29weSBmcm9tIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0Mi5jb3B5KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGFkanVnYXRlIG9mIHNlbGYsIGluLXBsYWNlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gICAgICovXG4gICAgYWRqb2ludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDIuYWRqb2ludCh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG1hdHJpeCBkZXRlcm1pbmFudFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkZXRlcm1pbmFudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtYXQyLmRldGVybWluYW50KHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYSBpZGVudGl0eSBtYXRyaXhcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBpZGVudGl0eTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDIuaWRlbnRpdHkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludmVydCBzZWxmXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gICAgICovXG4gICAgaW52ZXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWF0Mi5pbnZlcnQodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdXRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0Mi5tdWwodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdWx0aXBseUxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIG11bExlZnQ6IGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgbWF0Mi5tdWwodGhpcy5hcnJheSwgYS5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIG11bHRpcGx5OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDIubXVsdGlwbHkodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IGEgYW5kIHNlbGYsIGEgaXMgb24gdGhlIGxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIG11bHRpcGx5TGVmdDogZnVuY3Rpb24oYSkge1xuICAgICAgICBtYXQyLm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSBhIGdpdmVuIHJhZGlhblxuICAgICAqIEBwYXJhbSAge251bWJlcn0gICByYWRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICByb3RhdGU6IGZ1bmN0aW9uKHJhZCkge1xuICAgICAgICBtYXQyLnJvdGF0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCByYWQpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTY2FsZSBzZWxmIGJ5IHNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gIHNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQyLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHYuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVHJhbnNwb3NlIHNlbGYsIGluLXBsYWNlLlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIHRyYW5zcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDIudHJhbnNwb3NlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnWycgKyBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHRoaXMuYXJyYXksICcsJykgKyAnXSc7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQHBhcmFtICB7TWF0cml4Mn0gb3V0XG4gKiBAcGFyYW0gIHtNYXRyaXgyfSBhXG4gKiBAcmV0dXJuIHtNYXRyaXgyfVxuICovXG5NYXRyaXgyLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyLmFkam9pbnQob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG1hdDIuY29weShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbk1hdHJpeDIuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbihhKSB7XG4gICAgcmV0dXJuIG1hdDIuZGV0ZXJtaW5hbnQoYS5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICovXG5NYXRyaXgyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgbWF0Mi5pZGVudGl0eShvdXQuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAqL1xuTWF0cml4Mi5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyLmludmVydChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIubXVsID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgbWF0Mi5tdWwob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIubXVsdGlwbHkgPSBNYXRyaXgyLm11bDtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICogQHBhcmFtICB7bnVtYmVyfSAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIucm90YXRlID0gZnVuY3Rpb24ob3V0LCBhLCByYWQpIHtcbiAgICBtYXQyLnJvdGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICBtYXQyLnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge01hdHJpeDJ9IG91dFxuICogQHBhcmFtICB7TWF0cml4Mn0gYVxuICogQHJldHVybiB7TWF0cml4Mn1cbiAqL1xuTWF0cml4Mi50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyLnRyYW5zcG9zZShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXgyO1xuIiwiaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgbWF0MmQgPSBnbE1hdHJpeC5tYXQyZDtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5Lm1hdGguTWF0cml4MmRcbiAqL1xudmFyIE1hdHJpeDJkID0gZnVuY3Rpb24oKSB7XG4gICAgLyoqXG4gICAgICogU3RvcmFnZSBvZiBNYXRyaXgyZFxuICAgICAqIEBuYW1lIGFycmF5XG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLk1hdHJpeDJkI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBtYXQyZC5jcmVhdGUoKTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4MmQjXG4gICAgICovXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xufTtcblxuTWF0cml4MmQucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IE1hdHJpeDJkLFxuXG4gICAgLyoqXG4gICAgICogU2V0IGNvbXBvbmVudHMgZnJvbSBhcnJheVxuICAgICAqIEBwYXJhbSAge0Zsb2F0MzJBcnJheXxudW1iZXJbXX0gYXJyXG4gICAgICovXG4gICAgc2V0QXJyYXk6IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5W2ldID0gYXJyW2ldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBNYXRyaXgyZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAobmV3IE1hdHJpeDJkKCkpLmNvcHkodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0MmQuY29weSh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG1hdHJpeCBkZXRlcm1pbmFudFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkZXRlcm1pbmFudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtYXQyZC5kZXRlcm1pbmFudCh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgaWRlbnRpdHkgbWF0cml4XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIGlkZW50aXR5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWF0MmQuaWRlbnRpdHkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludmVydCBzZWxmXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIGludmVydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDJkLmludmVydCh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11dGlwbHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gICAgICovXG4gICAgbXVsOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDJkLm11bCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11bHRpcGx5TGVmdFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBtdWxMZWZ0OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDJkLm11bCh0aGlzLmFycmF5LCBiLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBtdWx0aXBseTogZnVuY3Rpb24oYikge1xuICAgICAgICBtYXQyZC5tdWx0aXBseSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgYSBhbmQgc2VsZiwgYSBpcyBvbiB0aGUgbGVmdFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBtdWx0aXBseUxlZnQ6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0MmQubXVsdGlwbHkodGhpcy5hcnJheSwgYi5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBzZWxmIGJ5IGEgZ2l2ZW4gcmFkaWFuXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgIHJhZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICByb3RhdGU6IGZ1bmN0aW9uKHJhZCkge1xuICAgICAgICBtYXQyZC5yb3RhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgc2VsZiBieSBzXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICBzXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbihzKSB7XG4gICAgICAgIG1hdDJkLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgc2VsZiBieSB2XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICB2XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQyZC50cmFuc2xhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgdi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwodGhpcy5hcnJheSwgJywnKSArICddJztcbiAgICB9LFxuXG4gICAgdG9BcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyZC5jb3B5KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbk1hdHJpeDJkLmRldGVybWluYW50ID0gZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiBtYXQyZC5kZXRlcm1pbmFudChhLmFycmF5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAqL1xuTWF0cml4MmQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBtYXQyZC5pZGVudGl0eShvdXQuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAqL1xuTWF0cml4MmQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgbWF0MmQuaW52ZXJ0KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLm11bCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG1hdDJkLm11bChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLm11bHRpcGx5ID0gTWF0cml4MmQubXVsO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICByYWRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAqL1xuTWF0cml4MmQucm90YXRlID0gZnVuY3Rpb24ob3V0LCBhLCByYWQpIHtcbiAgICBtYXQyZC5yb3RhdGUob3V0LmFycmF5LCBhLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICovXG5NYXRyaXgyZC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIG1hdDJkLnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICB2XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIG1hdDJkLnRyYW5zbGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXgyZDtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDMgPSBnbE1hdHJpeC5tYXQzO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5NYXRyaXgzXG4gKi9cbnZhciBNYXRyaXgzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgLyoqXG4gICAgICogU3RvcmFnZSBvZiBNYXRyaXgzXG4gICAgICogQG5hbWUgYXJyYXlcbiAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4MyNcbiAgICAgKi9cbiAgICB0aGlzLmFycmF5ID0gbWF0My5jcmVhdGUoKTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4MyNcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG59O1xuXG5NYXRyaXgzLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBNYXRyaXgzLFxuXG4gICAgLyoqXG4gICAgICogU2V0IGNvbXBvbmVudHMgZnJvbSBhcnJheVxuICAgICAqIEBwYXJhbSAge0Zsb2F0MzJBcnJheXxudW1iZXJbXX0gYXJyXG4gICAgICovXG4gICAgc2V0QXJyYXk6IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5W2ldID0gYXJyW2ldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGFkanVnYXRlIG9mIHNlbGYsIGluLXBsYWNlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgYWRqb2ludDogZnVuY3Rpb24gKCkge1xuICAgICAgICBtYXQzLmFkam9pbnQodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IE1hdHJpeDNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKG5ldyBNYXRyaXgzKCkpLmNvcHkodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAoYikge1xuICAgICAgICBtYXQzLmNvcHkodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBtYXRyaXggZGV0ZXJtaW5hbnRcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1hdDMuZGV0ZXJtaW5hbnQodGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIE1hdHJpeDJkIGFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBmcm9tTWF0MmQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIG1hdDMuZnJvbU1hdDJkKHRoaXMuYXJyYXksIGEuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHVwcGVyLWxlZnQgM3gzIHZhbHVlcyBvZiBNYXRyaXg0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBmcm9tTWF0NDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgbWF0My5mcm9tTWF0NCh0aGlzLmFycmF5LCBhLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBhIHJvdGF0aW9uIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBmcm9tUXVhdDogZnVuY3Rpb24gKHEpIHtcbiAgICAgICAgbWF0My5mcm9tUXVhdCh0aGlzLmFycmF5LCBxLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgaWRlbnRpdHkgbWF0cml4XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgaWRlbnRpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWF0My5pZGVudGl0eSh0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW52ZXJ0IHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBpbnZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWF0My5pbnZlcnQodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdXRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIG1hdDMubXVsKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgbXVsdGlwbHlMZWZ0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBtdWxMZWZ0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBtYXQzLm11bCh0aGlzLmFycmF5LCBhLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgbXVsdGlwbHk6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIG1hdDMubXVsdGlwbHkodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IGEgYW5kIHNlbGYsIGEgaXMgb24gdGhlIGxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICAgICAqL1xuICAgIG11bHRpcGx5TGVmdDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgbWF0My5tdWx0aXBseSh0aGlzLmFycmF5LCBhLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHNlbGYgYnkgYSBnaXZlbiByYWRpYW5cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICAgcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgcm90YXRlOiBmdW5jdGlvbiAocmFkKSB7XG4gICAgICAgIG1hdDMucm90YXRlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHNlbGYgYnkgc1xuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgc1xuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbiAodikge1xuICAgICAgICBtYXQzLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHYuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgc2VsZiBieSB2XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICB2XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAodikge1xuICAgICAgICBtYXQzLnRyYW5zbGF0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCB2LmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gICAgICovXG4gICAgbm9ybWFsRnJvbU1hdDQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIG1hdDMubm9ybWFsRnJvbU1hdDQodGhpcy5hcnJheSwgYS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zcG9zZSBzZWxmLCBpbi1wbGFjZS5cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICB0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWF0My50cmFuc3Bvc2UodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnWycgKyBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHRoaXMuYXJyYXksICcsJykgKyAnXSc7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpO1xuICAgIH1cbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5hZGpvaW50ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuYWRqb2ludChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5jb3B5ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuY29weShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbk1hdHJpeDMuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiBtYXQzLmRldGVybWluYW50KGEuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gb3V0XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5pZGVudGl0eSA9IGZ1bmN0aW9uIChvdXQpIHtcbiAgICBtYXQzLmlkZW50aXR5KG91dC5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLmludmVydCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBtYXQzLmludmVydChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMubXVsID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIG1hdDMubXVsKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLm11bHRpcGx5ID0gTWF0cml4My5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9ICBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMuZnJvbU1hdDJkID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuZnJvbU1hdDJkKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLmZyb21NYXQ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuZnJvbU1hdDQob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gICAgb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMuZnJvbVF1YXQgPSBmdW5jdGlvbiAob3V0LCBxKSB7XG4gICAgbWF0My5mcm9tUXVhdChvdXQuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5ub3JtYWxGcm9tTWF0NCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBtYXQzLm5vcm1hbEZyb21NYXQ0KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgbWF0My5yb3RhdGUob3V0LmFycmF5LCBhLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMuc2NhbGUgPSBmdW5jdGlvbiAob3V0LCBhLCB2KSB7XG4gICAgbWF0My5zY2FsZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My50cmFuc3Bvc2UgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgbWF0My50cmFuc3Bvc2Uob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IHZcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHYpIHtcbiAgICBtYXQzLnRyYW5zbGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXgzO1xuIiwiaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi9WZWN0b3IzJztcbmltcG9ydCBWZWN0b3IyIGZyb20gJy4vVmVjdG9yMic7XG5cbi8qKlxuICogUmFuZG9tIG9yIGNvbnN0YW50IDFkLCAyZCwgM2QgdmVjdG9yIGdlbmVyYXRvclxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlZhbHVlXG4gKi9cbnZhciBWYWx1ZSA9IGZ1bmN0aW9uKCkge307XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnxjbGF5Lm1hdGguVmVjdG9yMnxjbGF5Lm1hdGguVmVjdG9yM30gW291dF1cbiAqIEByZXR1cm4ge251bWJlcnxjbGF5Lm1hdGguVmVjdG9yMnxjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG91dCkge307XG5cbi8vIENvbnN0YW50XG52YXIgQ29uc3RhbnRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcbn07XG5Db25zdGFudFZhbHVlLnByb3RvdHlwZSA9IG5ldyBWYWx1ZSgpO1xuQ29uc3RhbnRWYWx1ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdGFudFZhbHVlO1xuXG4vLyBWZWN0b3JcbnZhciBWZWN0b3JWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHZhbC5jb25zdHJ1Y3RvcjtcbiAgICB0aGlzLmdldCA9IGZ1bmN0aW9uKG91dCkge1xuICAgICAgICBpZiAoIW91dCkge1xuICAgICAgICAgICAgb3V0ID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LmNvcHkodmFsKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9O1xufTtcblZlY3RvclZhbHVlLnByb3RvdHlwZSA9IG5ldyBWYWx1ZSgpO1xuVmVjdG9yVmFsdWUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVjdG9yVmFsdWU7XG4vL1JhbmRvbSAxRFxudmFyIFJhbmRvbTFEID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG4gICAgdGhpcy5nZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiByYW5nZSArIG1pbjtcbiAgICB9O1xufTtcblJhbmRvbTFELnByb3RvdHlwZSA9IG5ldyBWYWx1ZSgpO1xuUmFuZG9tMUQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmFuZG9tMUQ7XG5cbi8vIFJhbmRvbTJEXG52YXIgUmFuZG9tMkQgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHZhciByYW5nZVggPSBtYXgueCAtIG1pbi54O1xuICAgIHZhciByYW5nZVkgPSBtYXgueSAtIG1pbi55O1xuXG4gICAgdGhpcy5nZXQgPSBmdW5jdGlvbihvdXQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgICAgIH1cbiAgICAgICAgVmVjdG9yMi5zZXQoXG4gICAgICAgICAgICBvdXQsXG4gICAgICAgICAgICByYW5nZVggKiBNYXRoLnJhbmRvbSgpICsgbWluLmFycmF5WzBdLFxuICAgICAgICAgICAgcmFuZ2VZICogTWF0aC5yYW5kb20oKSArIG1pbi5hcnJheVsxXVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbn07XG5SYW5kb20yRC5wcm90b3R5cGUgPSBuZXcgVmFsdWUoKTtcblJhbmRvbTJELnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhbmRvbTJEO1xuXG52YXIgUmFuZG9tM0QgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHZhciByYW5nZVggPSBtYXgueCAtIG1pbi54O1xuICAgIHZhciByYW5nZVkgPSBtYXgueSAtIG1pbi55O1xuICAgIHZhciByYW5nZVogPSBtYXgueiAtIG1pbi56O1xuXG4gICAgdGhpcy5nZXQgPSBmdW5jdGlvbihvdXQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIH1cbiAgICAgICAgVmVjdG9yMy5zZXQoXG4gICAgICAgICAgICBvdXQsXG4gICAgICAgICAgICByYW5nZVggKiBNYXRoLnJhbmRvbSgpICsgbWluLmFycmF5WzBdLFxuICAgICAgICAgICAgcmFuZ2VZICogTWF0aC5yYW5kb20oKSArIG1pbi5hcnJheVsxXSxcbiAgICAgICAgICAgIHJhbmdlWiAqIE1hdGgucmFuZG9tKCkgKyBtaW4uYXJyYXlbMl1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH07XG59O1xuUmFuZG9tM0QucHJvdG90eXBlID0gbmV3IFZhbHVlKCk7XG5SYW5kb20zRC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYW5kb20zRDtcblxuLy8gRmFjdG9yeSBtZXRob2RzXG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RhbnQgMWQgdmFsdWUgZ2VuZXJhdG9yXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGNvbnN0YW50XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmFsdWV9XG4gKi9cblZhbHVlLmNvbnN0YW50ID0gZnVuY3Rpb24oY29uc3RhbnQpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50VmFsdWUoY29uc3RhbnQpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb25zdGFudCB2ZWN0b3IgdmFsdWUoMmQgb3IgM2QpIGdlbmVyYXRvclxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ8Y2xheS5tYXRoLlZlY3RvcjN9IHZlY3RvclxuICogQHJldHVybiB7Y2xheS5tYXRoLlZhbHVlfVxuICovXG5WYWx1ZS52ZWN0b3IgPSBmdW5jdGlvbih2ZWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvclZhbHVlKHZlY3Rvcik7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhbmRvbSAxZCB2YWx1ZSBnZW5lcmF0b3JcbiAqIEBwYXJhbSAge251bWJlcn0gbWluXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG1heFxuICogQHJldHVybiB7Y2xheS5tYXRoLlZhbHVlfVxuICovXG5WYWx1ZS5yYW5kb20xRCA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIG5ldyBSYW5kb20xRChtaW4sIG1heCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhbmRvbSAyZCB2YWx1ZSBnZW5lcmF0b3JcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBtaW5cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBtYXhcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WYWx1ZX1cbiAqL1xuVmFsdWUucmFuZG9tMkQgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBuZXcgUmFuZG9tMkQobWluLCBtYXgpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByYW5kb20gM2QgdmFsdWUgZ2VuZXJhdG9yXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gbWluXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gbWF4XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmFsdWV9XG4gKi9cblZhbHVlLnJhbmRvbTNEID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gbmV3IFJhbmRvbTNEKG1pbiwgbWF4KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZhbHVlO1xuIiwiaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjNCA9IGdsTWF0cml4LnZlYzQ7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlZlY3RvcjRcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IHpcbiAqIEBwYXJhbSB7bnVtYmVyfSB3XG4gKi9cbnZhciBWZWN0b3I0ID0gZnVuY3Rpb24oeCwgeSwgeiwgdykge1xuXG4gICAgeCA9IHggfHwgMDtcbiAgICB5ID0geSB8fCAwO1xuICAgIHogPSB6IHx8IDA7XG4gICAgdyA9IHcgfHwgMDtcblxuICAgIC8qKlxuICAgICAqIFN0b3JhZ2Ugb2YgVmVjdG9yNCwgcmVhZCBhbmQgd3JpdGUgb2YgeCwgeSwgeiwgdyB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIGluIGFycmF5XG4gICAgICogQWxsIG1ldGhvZHMgYWxzbyBvcGVyYXRlIG9uIHRoZSBhcnJheSBpbnN0ZWFkIG9mIHgsIHksIHosIHcgY29tcG9uZW50c1xuICAgICAqIEBuYW1lIGFycmF5XG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjQjXG4gICAgICovXG4gICAgdGhpcy5hcnJheSA9IHZlYzQuZnJvbVZhbHVlcyh4LCB5LCB6LCB3KTtcblxuICAgIC8qKlxuICAgICAqIERpcnR5IGZsYWcgaXMgdXNlZCBieSB0aGUgTm9kZSB0byBkZXRlcm1pbmVcbiAgICAgKiBpZiB0aGUgbWF0cml4IGlzIHVwZGF0ZWQgdG8gbGF0ZXN0XG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3I0I1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cblZlY3RvcjQucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IFZlY3RvcjQsXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYiB0byBzZWxmXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5hZGQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB4LCB5IGFuZCB6IGNvbXBvbmVudHNcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgeVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHpcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB3XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgICAgIHRoaXMuYXJyYXlbMF0gPSB4O1xuICAgICAgICB0aGlzLmFycmF5WzFdID0geTtcbiAgICAgICAgdGhpcy5hcnJheVsyXSA9IHo7XG4gICAgICAgIHRoaXMuYXJyYXlbM10gPSB3O1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgeCwgeSwgeiBhbmQgdyBjb21wb25lbnRzIGZyb20gYXJyYXlcbiAgICAgKiBAcGFyYW0gIHtGbG9hdDMyQXJyYXl8bnVtYmVyW119IGFyclxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIHNldEFycmF5OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IGFyclswXTtcbiAgICAgICAgdGhpcy5hcnJheVsxXSA9IGFyclsxXTtcbiAgICAgICAgdGhpcy5hcnJheVsyXSA9IGFyclsyXTtcbiAgICAgICAgdGhpcy5hcnJheVszXSA9IGFyclszXTtcblxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBWZWN0b3I0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjQodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29weSBmcm9tIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5jb3B5KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGlzdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWM0LmRpc3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3RhbmNlIGJldHdlZW4gc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRpc3RhbmNlOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWM0LmRpc3RhbmNlKHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGl2aWRlXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBkaXY6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5kaXYodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSBzZWxmIGJ5IGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIGRpdmlkZTogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWM0LmRpdmlkZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRG90IHByb2R1Y3Qgb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRvdDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjNC5kb3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmVjNC5sZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWM0Lmxlbmd0aCh0aGlzLmFycmF5KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gYSBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgbGVycDogZnVuY3Rpb24oYSwgYiwgdCkge1xuICAgICAgICB2ZWM0LmxlcnAodGhpcy5hcnJheSwgYS5hcnJheSwgYi5hcnJheSwgdCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgbWluOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzQubWluKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIG1heDogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWM0Lm1heCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11bHRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5tdWwodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11dGlwbHkgc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgbXVsdGlwbHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5tdWx0aXBseSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTmVnYXRlIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBuZWdhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2ZWM0Lm5lZ2F0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2ZWM0Lm5vcm1hbGl6ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgcmFuZG9tIHgsIHksIHosIHcgY29tcG9uZW50cyB3aXRoIGEgZ2l2ZW4gc2NhbGVcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHNjYWxlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgcmFuZG9tOiBmdW5jdGlvbihzY2FsZSkge1xuICAgICAgICB2ZWM0LnJhbmRvbSh0aGlzLmFycmF5LCBzY2FsZSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHNlbGZcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbihzKSB7XG4gICAgICAgIHZlYzQuc2NhbGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcyk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTY2FsZSBiIGFuZCBhZGQgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBzY2FsZUFuZEFkZDogZnVuY3Rpb24oYiwgcykge1xuICAgICAgICB2ZWM0LnNjYWxlQW5kQWRkKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXksIHMpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Igc3F1YXJlZERpc3RhbmNlXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3FyRGlzdDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjNC5zcXJEaXN0KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxdWFyZWREaXN0YW5jZTogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjNC5zcXVhcmVkRGlzdGFuY2UodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzcXVhcmVkTGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckxlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWM0LnNxckxlbih0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlZCBsZW5ndGggb2Ygc2VsZlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzcXVhcmVkTGVuZ3RoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQuc3F1YXJlZExlbmd0aCh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHN1YnRyYWN0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBzdWI6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5zdWIodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IGIgZnJvbSBzZWxmXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWM0LnN1YnRyYWN0KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gc2VsZiB3aXRoIGEgTWF0cml4NCBtXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1NYXQ0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBtLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIFF1YXRlcm5pb24gcVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBxXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgdHJhbnNmb3JtUXVhdDogZnVuY3Rpb24ocSkge1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybVF1YXQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwodGhpcy5hcnJheSwgJywnKSArICddJztcbiAgICB9LFxuXG4gICAgdG9BcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSk7XG4gICAgfVxufTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gR2V0dGVyIGFuZCBTZXR0ZXJcbmlmIChkZWZpbmVQcm9wZXJ0eSkge1xuXG4gICAgdmFyIHByb3RvID0gVmVjdG9yNC5wcm90b3R5cGU7XG4gICAgLyoqXG4gICAgICogQG5hbWUgeFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3I0XG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd4Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzBdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVswXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSB5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3knLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbMV07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzFdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHpcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguVmVjdG9yNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbMl0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgd1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3I0XG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd3Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzNdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVszXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIFN1cHBseSBtZXRob2RzIHRoYXQgYXJlIG5vdCBpbiBwbGFjZVxuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjNC5hZGQob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB5XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB6XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICB2ZWM0LnNldChvdXQuYXJyYXksIHgsIHksIHosIHcpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQuY29weSA9IGZ1bmN0aW9uKG91dCwgYikge1xuICAgIHZlYzQuY29weShvdXQuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3I0LmRpc3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIHZlYzQuZGlzdGFuY2UoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjQuZGlzdGFuY2UgPSBWZWN0b3I0LmRpc3Q7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5kaXYgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWM0LmRpdmlkZShvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5kaXZpZGUgPSBWZWN0b3I0LmRpdjtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yNC5kb3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIHZlYzQuZG90KGEuYXJyYXksIGIuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3I0LmxlbiA9IGZ1bmN0aW9uKGIpIHtcbiAgICByZXR1cm4gdmVjNC5sZW5ndGgoYi5hcnJheSk7XG59O1xuXG4vLyBWZWN0b3I0Lmxlbmd0aCA9IFZlY3RvcjQubGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQubGVycCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgdCkge1xuICAgIHZlYzQubGVycChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjNC5taW4ob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzQubWF4KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5tdWwgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWM0Lm11bHRpcGx5KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm11bHRpcGx5ID0gVmVjdG9yNC5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZlYzQubmVnYXRlKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZlYzQubm9ybWFsaXplKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0LnJhbmRvbSA9IGZ1bmN0aW9uKG91dCwgc2NhbGUpIHtcbiAgICB2ZWM0LnJhbmRvbShvdXQuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0LnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCBzY2FsZSkge1xuICAgIHZlYzQuc2NhbGUob3V0LmFycmF5LCBhLmFycmF5LCBzY2FsZSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgdmVjNC5zY2FsZUFuZEFkZChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yNC5zcXJEaXN0ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWM0LnNxckRpc3QoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjQuc3F1YXJlZERpc3RhbmNlID0gVmVjdG9yNC5zcXJEaXN0O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjQuc3FyTGVuID0gZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiB2ZWM0LnNxckxlbihhLmFycmF5KTtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yNC5zcXVhcmVkTGVuZ3RoID0gVmVjdG9yNC5zcXJMZW47XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5zdWIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWM0LnN1YnRyYWN0KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5zdWJ0cmFjdCA9IFZlY3RvcjQuc3ViO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZlYzQudHJhbnNmb3JtTWF0NChvdXQuYXJyYXksIGEuYXJyYXksIG0uYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gcVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZlYzQudHJhbnNmb3JtUXVhdChvdXQuYXJyYXksIGEuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWZWN0b3I0O1xuIiwiaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkucGFydGljbGUuUGFydGljbGVcbiAqL1xudmFyIFBhcnRpY2xlID0gZnVuY3Rpb24oKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgLyoqXG4gICAgICogVXNlIGV1bGVyIGFuZ2xlIHRvIHJlcHJlc2VudCBwYXJ0aWNsZSByb3RhdGlvblxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0aGlzLnJvdGF0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy52ZWxvY2l0eSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMuYW5ndWxhclZlbG9jaXR5ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5saWZlID0gMTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5hZ2UgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnNwcml0ZVNpemUgPSAxO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLndlaWdodCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5wYXJ0aWNsZS5FbWl0dGVyfVxuICAgICAqL1xuICAgIHRoaXMuZW1pdHRlciA9IG51bGw7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBwYXJ0aWNsZSBwb3NpdGlvblxuICogQHBhcmFtICB7bnVtYmVyfSBkZWx0YVRpbWVcbiAqL1xuUGFydGljbGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGRlbHRhVGltZSkge1xuICAgIGlmICh0aGlzLnZlbG9jaXR5KSB7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQodGhpcy5wb3NpdGlvbi5hcnJheSwgdGhpcy5wb3NpdGlvbi5hcnJheSwgdGhpcy52ZWxvY2l0eS5hcnJheSwgZGVsdGFUaW1lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYW5ndWxhclZlbG9jaXR5KSB7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQodGhpcy5yb3RhdGlvbi5hcnJheSwgdGhpcy5yb3RhdGlvbi5hcnJheSwgdGhpcy5hbmd1bGFyVmVsb2NpdHkuYXJyYXksIGRlbHRhVGltZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFydGljbGU7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBQYXJ0aWNsZSBmcm9tICcuL1BhcnRpY2xlJztcbmltcG9ydCBWYWx1ZSBmcm9tICcuLi9tYXRoL1ZhbHVlJztcbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHZlYzMgPSAgZ2xNYXRyaXgudmVjMztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5wYXJ0aWNsZS5FbWl0dGVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRW1pdHRlciA9IEJhc2UuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LnBhcnRpY2xlLkVtaXR0ZXIjICovXG57XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgcGFydGljbGVzIGNyZWF0ZWQgYnkgdGhpcyBlbWl0dGVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBtYXg6IDEwMDAsXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHBhcnRpY2xlcyBjcmVhdGVkIGJ5IHRoaXMgZW1pdHRlciBlYWNoIHNob3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGFtb3VudDogMjAsXG5cbiAgICAvLyBJbml0IHN0YXR1cyBmb3IgZWFjaCBwYXJ0aWNsZVxuICAgIC8qKlxuICAgICAqIFBhcnRpY2xlIGxpZmUgZ2VuZXJhdG9yXG4gICAgICogQHR5cGUgez9jbGF5Lm1hdGguVmFsdWUuPG51bWJlcj59XG4gICAgICovXG4gICAgbGlmZTogbnVsbCxcbiAgICAvKipcbiAgICAgKiBQYXJ0aWNsZSBwb3NpdGlvbiBnZW5lcmF0b3JcbiAgICAgKiBAdHlwZSB7P2NsYXkubWF0aC5WYWx1ZS48Y2xheS5tYXRoLlZlY3RvcjM+fVxuICAgICAqL1xuICAgIHBvc2l0aW9uOiBudWxsLFxuICAgIC8qKlxuICAgICAqIFBhcnRpY2xlIHJvdGF0aW9uIGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxjbGF5Lm1hdGguVmVjdG9yMz59XG4gICAgICovXG4gICAgcm90YXRpb246IG51bGwsXG4gICAgLyoqXG4gICAgICogUGFydGljbGUgdmVsb2NpdHkgZ2VuZXJhdG9yXG4gICAgICogQHR5cGUgez9jbGF5Lm1hdGguVmFsdWUuPGNsYXkubWF0aC5WZWN0b3IzPn1cbiAgICAgKi9cbiAgICB2ZWxvY2l0eTogbnVsbCxcbiAgICAvKipcbiAgICAgKiBQYXJ0aWNsZSBhbmd1bGFyIHZlbG9jaXR5IGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxjbGF5Lm1hdGguVmVjdG9yMz59XG4gICAgICovXG4gICAgYW5ndWxhclZlbG9jaXR5OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFBhcnRpY2xlIHNwcml0ZSBzaXplIGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxudW1iZXI+fVxuICAgICAqL1xuICAgIHNwcml0ZVNpemU6IG51bGwsXG4gICAgLyoqXG4gICAgICogUGFydGljbGUgd2VpZ2h0IGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxudW1iZXI+fVxuICAgICAqL1xuICAgIHdlaWdodDogbnVsbCxcblxuICAgIF9wYXJ0aWNsZVBvb2w6IG51bGxcblxufSwgZnVuY3Rpb24oKSB7XG5cbiAgICB0aGlzLl9wYXJ0aWNsZVBvb2wgPSBbXTtcblxuICAgIC8vIFRPRE8gUmVkdWNlIGhlYXAgbWVtb3J5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1heDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0aWNsZSA9IG5ldyBQYXJ0aWNsZSgpO1xuICAgICAgICBwYXJ0aWNsZS5lbWl0dGVyID0gdGhpcztcbiAgICAgICAgdGhpcy5fcGFydGljbGVQb29sLnB1c2gocGFydGljbGUpO1xuXG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5KSB7XG4gICAgICAgICAgICBwYXJ0aWNsZS52ZWxvY2l0eSA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYW5ndWxhclZlbG9jaXR5KSB7XG4gICAgICAgICAgICBwYXJ0aWNsZS5hbmd1bGFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB9XG4gICAgfVxufSxcbi8qKiBAbGVuZHMgY2xheS5wYXJ0aWNsZS5FbWl0dGVyLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZXIgbnVtYmVyIG9mIHBhcnRpY2xlcyBhbmQgcHVzaCB0aGVtIHRvIGEgZ2l2ZW4gcGFydGljbGUgbGlzdC4gRW1taXQgbnVtYmVyIGlzIGRlZmluZWQgYnkgYW1vdW50IHByb3BlcnR5XG4gICAgICogQHBhcmFtICB7QXJyYXkuPGNsYXkucGFydGljbGUuUGFydGljbGU+fSBvdXRcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbihvdXQpIHtcbiAgICAgICAgdmFyIGFtb3VudCA9IE1hdGgubWluKHRoaXMuX3BhcnRpY2xlUG9vbC5sZW5ndGgsIHRoaXMuYW1vdW50KTtcblxuICAgICAgICB2YXIgcGFydGljbGU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW1vdW50OyBpKyspIHtcbiAgICAgICAgICAgIHBhcnRpY2xlID0gdGhpcy5fcGFydGljbGVQb29sLnBvcCgpO1xuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYXJ0aWNsZSBzdGF0dXNcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi5nZXQocGFydGljbGUucG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdGF0aW9uLmdldChwYXJ0aWNsZS5yb3RhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52ZWxvY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVsb2NpdHkuZ2V0KHBhcnRpY2xlLnZlbG9jaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFuZ3VsYXJWZWxvY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ndWxhclZlbG9jaXR5LmdldChwYXJ0aWNsZS5hbmd1bGFyVmVsb2NpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubGlmZSkge1xuICAgICAgICAgICAgICAgIHBhcnRpY2xlLmxpZmUgPSB0aGlzLmxpZmUuZ2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zcHJpdGVTaXplKSB7XG4gICAgICAgICAgICAgICAgcGFydGljbGUuc3ByaXRlU2l6ZSA9IHRoaXMuc3ByaXRlU2l6ZS5nZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLndlaWdodCkge1xuICAgICAgICAgICAgICAgIHBhcnRpY2xlLndlaWdodCA9IHRoaXMud2VpZ2h0LmdldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydGljbGUuYWdlID0gMDtcblxuICAgICAgICAgICAgb3V0LnB1c2gocGFydGljbGUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBLaWxsIGEgZGVhZCBwYXJ0aWNsZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIHBvb2xcbiAgICAgKiBAcGFyYW0gIHtjbGF5LnBhcnRpY2xlLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgICAqL1xuICAgIGtpbGw6IGZ1bmN0aW9uKHBhcnRpY2xlKSB7XG4gICAgICAgIHRoaXMuX3BhcnRpY2xlUG9vbC5wdXNoKHBhcnRpY2xlKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb25zdGFudCAxZCB2YWx1ZSBnZW5lcmF0b3IuIEFsaWFzIGZvciB7QGxpbmsgY2xheS5tYXRoLlZhbHVlLmNvbnN0YW50fVxuICogQGZ1bmN0aW9uIGNsYXkucGFydGljbGUuRW1pdHRlci5jb25zdGFudFxuICovXG5FbWl0dGVyLmNvbnN0YW50ID0gVmFsdWUuY29uc3RhbnQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RhbnQgdmVjdG9yIHZhbHVlKDJkIG9yIDNkKSBnZW5lcmF0b3IuIEFsaWFzIGZvciB7QGxpbmsgY2xheS5tYXRoLlZhbHVlLnZlY3Rvcn1cbiAqIEBmdW5jdGlvbiBjbGF5LnBhcnRpY2xlLkVtaXR0ZXIudmVjdG9yXG4gKi9cbkVtaXR0ZXIudmVjdG9yID0gVmFsdWUudmVjdG9yO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhbmRvbSAxZCB2YWx1ZSBnZW5lcmF0b3IuIEFsaWFzIGZvciB7QGxpbmsgY2xheS5tYXRoLlZhbHVlLnJhbmRvbTFEfVxuICogQGZ1bmN0aW9uIGNsYXkucGFydGljbGUuRW1pdHRlci5yYW5kb20xRFxuICovXG5FbWl0dGVyLnJhbmRvbTFEID0gVmFsdWUucmFuZG9tMUQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgcmFuZG9tIDJkIHZhbHVlIGdlbmVyYXRvci4gQWxpYXMgZm9yIHtAbGluayBjbGF5Lm1hdGguVmFsdWUucmFuZG9tMkR9XG4gKiBAZnVuY3Rpb24gY2xheS5wYXJ0aWNsZS5FbWl0dGVyLnJhbmRvbTJEXG4gKi9cbkVtaXR0ZXIucmFuZG9tMkQgPSBWYWx1ZS5yYW5kb20yRDtcblxuLyoqXG4gKiBDcmVhdGUgYSByYW5kb20gM2QgdmFsdWUgZ2VuZXJhdG9yLiBBbGlhcyBmb3Ige0BsaW5rIGNsYXkubWF0aC5WYWx1ZS5yYW5kb20zRH1cbiAqIEBmdW5jdGlvbiBjbGF5LnBhcnRpY2xlLkVtaXR0ZXIucmFuZG9tM0RcbiAqL1xuRW1pdHRlci5yYW5kb20zRCA9IFZhbHVlLnJhbmRvbTNEO1xuXG5leHBvcnQgZGVmYXVsdCBFbWl0dGVyO1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi4vY29yZS9CYXNlJztcbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGFydGljbGUuRmllbGRcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBGaWVsZCA9IEJhc2UuZXh0ZW5kKHt9LCB7XG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBmaWVsZCB0byB0aGUgcGFydGljbGUgYW5kIHVwZGF0ZSB0aGUgcGFydGljbGUgdmVsb2NpdHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gdmVsb2NpdHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHdlaWdodFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGVsdGFUaW1lXG4gICAgICogQG1lbWJlck9mIGNsYXkucGFydGljbGUuRmllbGQucHJvdG90eXBlXG4gICAgICovXG4gICAgYXBwbHlUbzogZnVuY3Rpb24odmVsb2NpdHksIHBvc2l0aW9uLCB3ZWlnaHQsIGRlbHRhVGltZSkge31cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBGaWVsZDtcbiIsImltcG9ydCBGaWVsZCBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gIGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGFydGljbGUuRm9yY2VGaWVsZFxuICogQGV4dGVuZHMgY2xheS5wYXJ0aWNsZS5GaWVsZFxuICovXG52YXIgRm9yY2VGaWVsZCA9IEZpZWxkLmV4dGVuZChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JjZTogbmV3IFZlY3RvcjMoKVxuICAgIH07XG59LCB7XG4gICAgYXBwbHlUbzogZnVuY3Rpb24odmVsb2NpdHksIHBvc2l0aW9uLCB3ZWlnaHQsIGRlbHRhVGltZSkge1xuICAgICAgICBpZiAod2VpZ2h0ID4gMCkge1xuICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZCh2ZWxvY2l0eS5hcnJheSwgdmVsb2NpdHkuYXJyYXksIHRoaXMuZm9yY2UuYXJyYXksIGRlbHRhVGltZSAvIHdlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRm9yY2VGaWVsZDtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LnBhcnRpY2xlLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXcgOiBXT1JMRFZJRVc7XFxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb24gOiBQUk9KRUNUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uIDogUE9TSVRJT047XFxuYXR0cmlidXRlIHZlYzMgbm9ybWFsIDogTk9STUFMO1xcbiNpZmRlZiBVVl9BTklNQVRJT05cXG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZDAgOiBURVhDT09SRF8wO1xcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkMSA6IFRFWENPT1JEXzE7XFxudmFyeWluZyB2ZWMyIHZfVXYwO1xcbnZhcnlpbmcgdmVjMiB2X1V2MTtcXG4jZW5kaWZcXG52YXJ5aW5nIGZsb2F0IHZfQWdlO1xcbnZvaWQgbWFpbigpIHtcXG4gICAgdl9BZ2UgPSBub3JtYWwueDtcXG4gICAgZmxvYXQgcm90YXRpb24gPSBub3JtYWwueTtcXG4gICAgdmVjNCB3b3JsZFZpZXdQb3NpdGlvbiA9IHdvcmxkVmlldyAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxuICAgIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbiAqIHdvcmxkVmlld1Bvc2l0aW9uO1xcbiAgICBmbG9hdCB3ID0gZ2xfUG9zaXRpb24udztcXG4gICAgZ2xfUG9pbnRTaXplID0gbm9ybWFsLnogKiBwcm9qZWN0aW9uWzBdLnggLyB3O1xcbiAgICAjaWZkZWYgVVZfQU5JTUFUSU9OXFxuICAgICAgICB2X1V2MCA9IHRleGNvb3JkMDtcXG4gICAgICAgIHZfVXYxID0gdGV4Y29vcmQxO1xcbiAgICAjZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5wYXJ0aWNsZS5mcmFnbWVudFxcbnVuaWZvcm0gc2FtcGxlcjJEIHNwcml0ZTtcXG51bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudDtcXG51bmlmb3JtIHZlYzMgY29sb3IgOiBbMS4wLCAxLjAsIDEuMF07XFxudW5pZm9ybSBmbG9hdCBhbHBoYSA6IDEuMDtcXG52YXJ5aW5nIGZsb2F0IHZfQWdlO1xcbiNpZmRlZiBVVl9BTklNQVRJT05cXG52YXJ5aW5nIHZlYzIgdl9VdjA7XFxudmFyeWluZyB2ZWMyIHZfVXYxO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjNCBjb2xvciA9IHZlYzQoY29sb3IsIGFscGhhKTtcXG4gICAgI2lmZGVmIFNQUklURV9FTkFCTEVEXFxuICAgICAgICAjaWZkZWYgVVZfQU5JTUFUSU9OXFxuICAgICAgICAgICAgY29sb3IgKj0gdGV4dHVyZTJEKHNwcml0ZSwgbWl4KHZfVXYwLCB2X1V2MSwgZ2xfUG9pbnRDb29yZCkpO1xcbiAgICAgICAgI2Vsc2VcXG4gICAgICAgICAgICBjb2xvciAqPSB0ZXh0dXJlMkQoc3ByaXRlLCBnbF9Qb2ludENvb3JkKTtcXG4gICAgICAgICNlbmRpZlxcbiAgICAjZW5kaWZcXG4gICAgI2lmZGVmIEdSQURJRU5UX0VOQUJMRURcXG4gICAgICAgIGNvbG9yICo9IHRleHR1cmUyRChncmFkaWVudCwgdmVjMih2X0FnZSwgMC41KSk7XFxuICAgICNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXG59XFxuQGVuZFwiO1xuIiwiaW1wb3J0IFJlbmRlcmFibGUgZnJvbSAnLi4vUmVuZGVyYWJsZSc7XG5cbmltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuXG5pbXBvcnQgcGFydGljbGVFc3NsIGZyb20gJy4vcGFydGljbGUuZ2xzbC5qcyc7XG5TaGFkZXJbJ2ltcG9ydCddKHBhcnRpY2xlRXNzbCk7XG5cbnZhciBwYXJ0aWNsZVNoYWRlciA9IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5wYXJ0aWNsZS52ZXJ0ZXgnKSwgU2hhZGVyLnNvdXJjZSgnY2xheS5wYXJ0aWNsZS5mcmFnbWVudCcpKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5wYXJ0aWNsZS5QYXJ0aWNsZVJlbmRlcmFibGVcbiAqIEBleHRlbmRzIGNsYXkuUmVuZGVyYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgdmFyIHBhcnRpY2xlUmVuZGVyYWJsZSA9IG5ldyBjbGF5LnBhcnRpY2xlLlBhcnRpY2xlUmVuZGVyYWJsZSh7XG4gKiAgICAgICAgIHNwcml0ZUFuaW1hdGlvblRpbGVYOiA0LFxuICogICAgICAgICBzcHJpdGVBbmltYXRpb25UaWxlWTogNCxcbiAqICAgICAgICAgc3ByaXRlQW5pbWF0aW9uUmVwZWF0OiAxXG4gKiAgICAgfSk7XG4gKiAgICAgc2NlbmUuYWRkKHBhcnRpY2xlUmVuZGVyYWJsZSk7XG4gKiAgICAgLy8gRW5hYmxlIHV2IGFuaW1hdGlvbiBpbiB0aGUgc2hhZGVyXG4gKiAgICAgcGFydGljbGVSZW5kZXJhYmxlLm1hdGVyaWFsLmRlZmluZSgnYm90aCcsICdVVl9BTklNQVRJT04nKTtcbiAqICAgICB2YXIgRW1pdHRlciA9IGNsYXkucGFydGljbGUuRW1pdHRlcjtcbiAqICAgICB2YXIgVmVjdG9yMyA9IGNsYXkubWF0aC5WZWN0b3IzO1xuICogICAgIHZhciBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoe1xuICogICAgICAgICBtYXg6IDIwMDAsXG4gKiAgICAgICAgIGFtb3VudDogMTAwLFxuICogICAgICAgICBsaWZlOiBFbWl0dGVyLnJhbmRvbTFEKDEwLCAyMCksXG4gKiAgICAgICAgIHBvc2l0aW9uOiBFbWl0dGVyLnZlY3RvcihuZXcgVmVjdG9yMygpKSxcbiAqICAgICAgICAgdmVsb2NpdHk6IEVtaXR0ZXIucmFuZG9tM0QobmV3IFZlY3RvcjMoLTEwLCAwLCAtMTApLCBuZXcgVmVjdG9yMygxMCwgMCwgMTApKTtcbiAqICAgICB9KTtcbiAqICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuYWRkRW1pdHRlcihlbWl0dGVyKTtcbiAqICAgICB2YXIgZ3Jhdml0eUZpZWxkID0gbmV3IGNsYXkucGFydGljbGUuRm9yY2VGaWVsZCgpO1xuICogICAgIGdyYXZpdHlGaWVsZC5mb3JjZS55ID0gLTEwO1xuICogICAgIHBhcnRpY2xlUmVuZGVyYWJsZS5hZGRGaWVsZChncmF2aXR5RmllbGQpO1xuICogICAgIC4uLlxuICogICAgIGFuaW1hdGlvbi5vbignZnJhbWUnLCBmdW5jdGlvbihmcmFtZVRpbWUpIHtcbiAqICAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLnVwZGF0ZVBhcnRpY2xlcyhmcmFtZVRpbWUpO1xuICogICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XG4gKiAgICAgfSk7XG4gKi9cbnZhciBQYXJ0aWNsZVJlbmRlcmFibGUgPSBSZW5kZXJhYmxlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5wYXJ0aWNsZS5QYXJ0aWNsZVJlbmRlcmFibGUjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgbG9vcDogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBvbmVzaG90OiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBEdXJhdGlvbiBvZiBwYXJ0aWNsZSBzeXN0ZW0gaW4gbWlsbGlzZWNvbmRzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogMSxcblxuICAgIC8vIFVWIEFuaW1hdGlvblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3ByaXRlQW5pbWF0aW9uVGlsZVg6IDEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBzcHJpdGVBbmltYXRpb25UaWxlWTogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNwcml0ZUFuaW1hdGlvblJlcGVhdDogMCxcblxuICAgIG1vZGU6IFJlbmRlcmFibGUuUE9JTlRTLFxuXG4gICAgaWdub3JlUGlja2luZzogdHJ1ZSxcblxuICAgIF9lbGFwc2VkVGltZTogMCxcblxuICAgIF9lbWl0dGluZzogdHJ1ZVxuXG59LCBmdW5jdGlvbigpe1xuXG4gICAgdGhpcy5nZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSh7XG4gICAgICAgIGR5bmFtaWM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5tYXRlcmlhbCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgIHNoYWRlcjogcGFydGljbGVTaGFkZXIsXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHRoTWFzazogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXRlcmlhbC5lbmFibGVUZXh0dXJlKCdzcHJpdGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLl9maWVsZHMgPSBbXTtcbiAgICB0aGlzLl9lbWl0dGVycyA9IFtdO1xufSxcbi8qKiBAbGVuZHMgY2xheS5wYXJ0aWNsZS5QYXJ0aWNsZVJlbmRlcmFibGUucHJvdG90eXBlICovXG57XG5cbiAgICBjdWxsaW5nOiBmYWxzZSxcblxuICAgIGZydXN0dW1DdWxsaW5nOiBmYWxzZSxcblxuICAgIGNhc3RTaGFkb3c6IGZhbHNlLFxuICAgIHJlY2VpdmVTaGFkb3c6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGVtaXR0ZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkucGFydGljbGUuRW1pdHRlcn0gZW1pdHRlclxuICAgICAqL1xuICAgIGFkZEVtaXR0ZXI6IGZ1bmN0aW9uKGVtaXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlcnMucHVzaChlbWl0dGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGVtaXR0ZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkucGFydGljbGUuRW1pdHRlcn0gZW1pdHRlclxuICAgICAqL1xuICAgIHJlbW92ZUVtaXR0ZXI6IGZ1bmN0aW9uKGVtaXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlcnMuc3BsaWNlKHRoaXMuX2VtaXR0ZXJzLmluZGV4T2YoZW1pdHRlciksIDEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgZmllbGRcbiAgICAgKiBAcGFyYW0ge2NsYXkucGFydGljbGUuRmllbGR9IGZpZWxkXG4gICAgICovXG4gICAgYWRkRmllbGQ6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGZpZWxkXG4gICAgICogQHBhcmFtIHtjbGF5LnBhcnRpY2xlLkZpZWxkfSBmaWVsZFxuICAgICAqL1xuICAgIHJlbW92ZUZpZWxkOiBmdW5jdGlvbihmaWVsZCkge1xuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKHRoaXMuX2ZpZWxkcy5pbmRleE9mKGZpZWxkKSwgMSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBwYXJ0aWNsZSBzeXN0ZW0uXG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBQdXQgYWxsIHRoZSBwYXJ0aWNsZXMgYmFja1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3BhcnRpY2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLl9wYXJ0aWNsZXNbaV07XG4gICAgICAgICAgICBwLmVtaXR0ZXIua2lsbChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYXJ0aWNsZXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUgPSAwO1xuICAgICAgICB0aGlzLl9lbWl0dGluZyA9IHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGVsdGFUaW1lXG4gICAgICovXG4gICAgdXBkYXRlUGFydGljbGVzOiBmdW5jdGlvbihkZWx0YVRpbWUpIHtcblxuICAgICAgICAvLyBNUyA9PiBTZWNvbmRzXG4gICAgICAgIGRlbHRhVGltZSAvPSAxMDAwO1xuICAgICAgICB0aGlzLl9lbGFwc2VkVGltZSArPSBkZWx0YVRpbWU7XG5cbiAgICAgICAgdmFyIHBhcnRpY2xlcyA9IHRoaXMuX3BhcnRpY2xlcztcblxuICAgICAgICBpZiAodGhpcy5fZW1pdHRpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZW1pdHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyc1tpXS5lbWl0KHBhcnRpY2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5vbmVzaG90KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFnaW5nXG4gICAgICAgIHZhciBsZW4gPSBwYXJ0aWNsZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjspIHtcbiAgICAgICAgICAgIHZhciBwID0gcGFydGljbGVzW2ldO1xuICAgICAgICAgICAgcC5hZ2UgKz0gZGVsdGFUaW1lO1xuICAgICAgICAgICAgaWYgKHAuYWdlID49IHAubGlmZSkge1xuICAgICAgICAgICAgICAgIHAuZW1pdHRlci5raWxsKHApO1xuICAgICAgICAgICAgICAgIHBhcnRpY2xlc1tpXSA9IHBhcnRpY2xlc1tsZW4tMV07XG4gICAgICAgICAgICAgICAgcGFydGljbGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGVcbiAgICAgICAgICAgIHZhciBwID0gcGFydGljbGVzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLl9maWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW2pdLmFwcGx5VG8ocC52ZWxvY2l0eSwgcC5wb3NpdGlvbiwgcC53ZWlnaHQsIGRlbHRhVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC51cGRhdGUoZGVsdGFUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVZlcnRpY2VzKCk7XG4gICAgfSxcblxuICAgIF91cGRhdGVWZXJ0aWNlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG4gICAgICAgIC8vIElmIGhhcyB1diBhbmltYXRpb25cbiAgICAgICAgdmFyIGFuaW1UaWxlWCA9IHRoaXMuc3ByaXRlQW5pbWF0aW9uVGlsZVg7XG4gICAgICAgIHZhciBhbmltVGlsZVkgPSB0aGlzLnNwcml0ZUFuaW1hdGlvblRpbGVZO1xuICAgICAgICB2YXIgYW5pbVJlcGVhdCA9IHRoaXMuc3ByaXRlQW5pbWF0aW9uUmVwZWF0O1xuICAgICAgICB2YXIgblV2QW5pbUZyYW1lID0gYW5pbVRpbGVZICogYW5pbVRpbGVYICogYW5pbVJlcGVhdDtcbiAgICAgICAgdmFyIGhhc1V2QW5pbWF0aW9uID0gblV2QW5pbUZyYW1lID4gMTtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWU7XG4gICAgICAgIC8vIFB1dCBwYXJ0aWNsZSBzdGF0dXMgaW4gbm9ybWFsXG4gICAgICAgIHZhciBub3JtYWxzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwudmFsdWU7XG4gICAgICAgIHZhciB1dnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRleGNvb3JkMC52YWx1ZTtcbiAgICAgICAgdmFyIHV2czIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRleGNvb3JkMS52YWx1ZTtcblxuICAgICAgICB2YXIgbGVuID0gdGhpcy5fcGFydGljbGVzLmxlbmd0aDtcbiAgICAgICAgaWYgKCFwb3NpdGlvbnMgfHwgcG9zaXRpb25zLmxlbmd0aCAhPT0gbGVuICogMykge1xuICAgICAgICAgICAgLy8gVE9ETyBPcHRpbWl6ZVxuICAgICAgICAgICAgcG9zaXRpb25zID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkobGVuICogMyk7XG4gICAgICAgICAgICBub3JtYWxzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KGxlbiAqIDMpO1xuICAgICAgICAgICAgaWYgKGhhc1V2QW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdXZzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy50ZXhjb29yZDAudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KGxlbiAqIDIpO1xuICAgICAgICAgICAgICAgIHV2czIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRleGNvb3JkMS52YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkobGVuICogMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW52QW5pbVRpbGVYID0gMSAvIGFuaW1UaWxlWDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnRpY2xlID0gdGhpcy5fcGFydGljbGVzW2ldO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IGkgKiAzO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgal0gPSBwYXJ0aWNsZS5wb3NpdGlvbi5hcnJheVtqXTtcbiAgICAgICAgICAgICAgICBub3JtYWxzW29mZnNldF0gPSBwYXJ0aWNsZS5hZ2UgLyBwYXJ0aWNsZS5saWZlO1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbHNbb2Zmc2V0ICsgMV0gPSBwYXJ0aWNsZS5yb3RhdGlvbjtcbiAgICAgICAgICAgICAgICBub3JtYWxzW29mZnNldCArIDFdID0gMDtcbiAgICAgICAgICAgICAgICBub3JtYWxzW29mZnNldCArIDJdID0gcGFydGljbGUuc3ByaXRlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvZmZzZXQyID0gaSAqIDI7XG4gICAgICAgICAgICBpZiAoaGFzVXZBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBwYXJ0aWNsZS5hZ2UgLyBwYXJ0aWNsZS5saWZlO1xuICAgICAgICAgICAgICAgIHZhciBzdGFnZSA9IE1hdGgucm91bmQocCAqIChuVXZBbmltRnJhbWUgLSAxKSkgKiBhbmltUmVwZWF0O1xuICAgICAgICAgICAgICAgIHZhciB2ID0gTWF0aC5mbG9vcihzdGFnZSAqIGludkFuaW1UaWxlWCk7XG4gICAgICAgICAgICAgICAgdmFyIHUgPSBzdGFnZSAtIHYgKiBhbmltVGlsZVg7XG4gICAgICAgICAgICAgICAgdXZzW29mZnNldDJdID0gdSAvIGFuaW1UaWxlWDtcbiAgICAgICAgICAgICAgICB1dnNbb2Zmc2V0MiArIDFdID0gMSAtIHYgLyBhbmltVGlsZVk7XG4gICAgICAgICAgICAgICAgdXZzMltvZmZzZXQyXSA9ICh1ICsgMSkgLyBhbmltVGlsZVg7XG4gICAgICAgICAgICAgICAgdXZzMltvZmZzZXQyICsgMV0gPSAxIC0gKHYgKyAxKSAvIGFuaW1UaWxlWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlb21ldHJ5LmRpcnR5KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGaW5pc2hlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGFwc2VkVGltZSA+IHRoaXMuZHVyYXRpb24gJiYgIXRoaXMubG9vcDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbihyZW5kZXJlcikge1xuICAgICAgICAvLyBQdXQgYWxsIHRoZSBwYXJ0aWNsZXMgYmFja1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3BhcnRpY2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLl9wYXJ0aWNsZXNbaV07XG4gICAgICAgICAgICBwLmVtaXR0ZXIua2lsbChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICAvLyBUT0RPIERpc3Bvc2UgdGV4dHVyZSA/XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkucGFydGljbGUuUGFydGljbGVSZW5kZXJhYmxlfVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHBhcnRpY2xlUmVuZGVyYWJsZSA9IG5ldyBQYXJ0aWNsZVJlbmRlcmFibGUoe1xuICAgICAgICAgICAgbWF0ZXJpYWw6IHRoaXMubWF0ZXJpYWxcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnRpY2xlUmVuZGVyYWJsZS5sb29wID0gdGhpcy5sb29wO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUub25lc2hvdCA9IHRoaXMub25lc2hvdDtcbiAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLnNwcml0ZUFuaW1hdGlvblJlcGVhdCA9IHRoaXMuc3ByaXRlQW5pbWF0aW9uUmVwZWF0O1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuc3ByaXRlQW5pbWF0aW9uVGlsZVkgPSB0aGlzLnNwcml0ZUFuaW1hdGlvblRpbGVZO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuc3ByaXRlQW5pbWF0aW9uVGlsZVggPSB0aGlzLnNwcml0ZUFuaW1hdGlvblRpbGVYO1xuXG4gICAgICAgIHBhcnRpY2xlUmVuZGVyYWJsZS5wb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24pO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUucm90YXRpb24uY29weSh0aGlzLnJvdGF0aW9uKTtcbiAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLnNjYWxlLmNvcHkodGhpcy5zY2FsZSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLmFkZCh0aGlzLl9jaGlsZHJlbltpXS5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydGljbGVSZW5kZXJhYmxlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBQYXJ0aWNsZVJlbmRlcmFibGU7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5waWNraW5nLmNvbG9yLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52b2lkIG1haW4oKXtcXG4gICAgdmVjMyBza2lubmVkUG9zaXRpb24gPSBwb3NpdGlvbjtcXG4gICAgI2lmZGVmIFNLSU5OSU5HXFxuICAgICAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgICAgIHNraW5uZWRQb3NpdGlvbiA9IChza2luTWF0cml4V1MgKiB2ZWM0KHBvc2l0aW9uLCAxLjApKS54eXo7XFxuICAgICNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG59XFxuQGVuZFxcbkBlbmRcXG5AZXhwb3J0IGNsYXkucGlja2luZy5jb2xvci5mcmFnbWVudFxcbnVuaWZvcm0gdmVjNCBjb2xvciA6IFsxLjAsIDEuMCwgMS4wLCAxLjBdO1xcbnZvaWQgbWFpbigpIHtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XFxufVxcbkBlbmRcIjtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL01hdGVyaWFsJztcblxuaW1wb3J0IGNvbG9yRXNzbCBmcm9tICcuL2NvbG9yLmdsc2wuanMnO1xuU2hhZGVyLmltcG9ydChjb2xvckVzc2wpO1xuXG4vKipcbiAqIFBpeGVsIHBpY2tpbmcgaXMgZ3B1IGJhc2VkIHBpY2tpbmcsIHdoaWNoIGlzIGZhc3QgYW5kIGFjY3VyYXRlLlxuICogQnV0IG5vdCBsaWtlIHJheSBwaWNraW5nLCBpdCBjYW4ndCBnZXQgdGhlIGludGVyc2VjdGlvbiBwb2ludCBhbmQgdHJpYW5nbGUuXG4gKiBAY29uc3RydWN0b3IgY2xheS5waWNraW5nLlBpeGVsUGlja2luZ1xuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIFBpeGVsUGlja2luZyA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkucGlja2luZy5QaXhlbFBpY2tpbmcjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcmdldCByZW5kZXJlclxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5SZW5kZXJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHJlbmRlcmVyOiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogRG93bnNhbXBsZSByYXRpbyBvZiBoaWRkZW4gZnJhbWUgYnVmZmVyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBkb3duU2FtcGxlUmF0aW86IDEsXG5cbiAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgaGVpZ2h0OiAxMDAsXG5cbiAgICAgICAgbG9va3VwT2Zmc2V0OiAxLFxuXG4gICAgICAgIF9mcmFtZUJ1ZmZlcjogbnVsbCxcbiAgICAgICAgX3RleHR1cmU6IG51bGwsXG4gICAgICAgIF9zaGFkZXI6IG51bGwsXG5cbiAgICAgICAgX2lkTWF0ZXJpYWxzOiBbXSxcbiAgICAgICAgX2xvb2t1cFRhYmxlOiBbXSxcblxuICAgICAgICBfbWVzaE1hdGVyaWFsczogW10sXG5cbiAgICAgICAgX2lkT2Zmc2V0OiAwXG4gICAgfTtcbn0sIGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnJlbmRlcmVyLmdldFdpZHRoKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5yZW5kZXJlci5nZXRIZWlnaHQoKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdCgpO1xufSwgLyoqIEBsZW5kcyBjbGF5LnBpY2tpbmcuUGl4ZWxQaWNraW5nLnByb3RvdHlwZSAqLyB7XG4gICAgX2luaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl90ZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCAqIHRoaXMuZG93blNhbXBsZVJhdGlvLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCAqIHRoaXMuZG93blNhbXBsZVJhdGlvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlciA9IG5ldyBGcmFtZUJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuX3NoYWRlciA9IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5waWNraW5nLmNvbG9yLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnBpY2tpbmcuY29sb3IuZnJhZ21lbnQnKSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXQgcGlja2luZyBwcmVzaXNpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmF0aW9cbiAgICAgKi9cbiAgICBzZXRQcmVjaXNpb246IGZ1bmN0aW9uKHJhdGlvKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmUud2lkdGggPSB0aGlzLndpZHRoICogcmF0aW87XG4gICAgICAgIHRoaXMuX3RleHR1cmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiByYXRpbztcbiAgICAgICAgdGhpcy5kb3duU2FtcGxlUmF0aW8gPSByYXRpbztcbiAgICB9LFxuICAgIHJlc2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLl90ZXh0dXJlLndpZHRoID0gd2lkdGggKiB0aGlzLmRvd25TYW1wbGVSYXRpbztcbiAgICAgICAgdGhpcy5fdGV4dHVyZS5oZWlnaHQgPSBoZWlnaHQgKiB0aGlzLmRvd25TYW1wbGVSYXRpbztcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5fdGV4dHVyZS5kaXJ0eSgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBwaWNraW5nIGZyYW1lYnVmZmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGlvXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbihzY2VuZSwgY2FtZXJhKSB7XG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIGlmIChyZW5kZXJlci5nZXRXaWR0aCgpICE9PSB0aGlzLndpZHRoIHx8IHJlbmRlcmVyLmdldEhlaWdodCgpICE9PSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemUocmVuZGVyZXIud2lkdGgsIHJlbmRlcmVyLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci5hdHRhY2godGhpcy5fdGV4dHVyZSk7XG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICB0aGlzLl9pZE9mZnNldCA9IHRoaXMubG9va3VwT2Zmc2V0O1xuICAgICAgICB0aGlzLl9zZXRNYXRlcmlhbChzY2VuZSk7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgdGhpcy5fcmVzdG9yZU1hdGVyaWFsKCk7XG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG4gICAgfSxcblxuICAgIF9zZXRNYXRlcmlhbDogZnVuY3Rpb24ocm9vdCkge1xuICAgICAgICBmb3IgKHZhciBpID0wOyBpIDwgcm9vdC5fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJvb3QuX2NoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmdlb21ldHJ5ICYmIGNoaWxkLm1hdGVyaWFsICYmIGNoaWxkLm1hdGVyaWFsLnNoYWRlcikge1xuICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuX2lkT2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9IGlkIC0gdGhpcy5sb29rdXBPZmZzZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gdGhpcy5faWRNYXRlcmlhbHNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcjogdGhpcy5fc2hhZGVyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBwYWNrSUQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xvclswXSAvPSAyNTU7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yWzFdIC89IDI1NTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3JbMl0gLz0gMjU1O1xuICAgICAgICAgICAgICAgICAgICBjb2xvclszXSA9IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0KCdjb2xvcicsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRNYXRlcmlhbHNbaWR4XSA9IG1hdGVyaWFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNoTWF0ZXJpYWxzW2lkeF0gPSBjaGlsZC5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb29rdXBUYWJsZVtpZHhdID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2hpbGQubWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5fY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0TWF0ZXJpYWwoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBpY2sgdGhlIG9iamVjdFxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCBNb3VzZSBwb3NpdGlvbiB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB5IE1vdXNlIHBvc2l0aW9uIHlcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lk5vZGV9XG4gICAgICovXG4gICAgcGljazogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgICAgIHZhciByYXRpbyA9IHRoaXMuZG93blNhbXBsZVJhdGlvO1xuICAgICAgICB4ID0gTWF0aC5jZWlsKHJhdGlvICogeCk7XG4gICAgICAgIHkgPSBNYXRoLmNlaWwocmF0aW8gKiAodGhpcy5oZWlnaHQgLSB5KSk7XG5cbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIHZhciBwaXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIC8vIFRPRE8gb3V0IG9mIGJvdW5kcyA/XG4gICAgICAgIC8vIHByZXNlcnZlRHJhd2luZ0J1ZmZlciA/XG4gICAgICAgIF9nbC5yZWFkUGl4ZWxzKHgsIHksIDEsIDEsIF9nbC5SR0JBLCBfZ2wuVU5TSUdORURfQllURSwgcGl4ZWwpO1xuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAvLyBTa2lwIGludGVycG9sYXRlZCBwaXhlbCBiZWNhdXNlIG9mIGFudGkgYWxpYXNcbiAgICAgICAgaWYgKHBpeGVsWzNdID09PSAyNTUpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IHVucGFja0lEKHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pO1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5fbG9va3VwVGFibGVbaWQgLSB0aGlzLmxvb2t1cE9mZnNldF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZXN0b3JlTWF0ZXJpYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xvb2t1cFRhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9sb29rdXBUYWJsZVtpXS5tYXRlcmlhbCA9IHRoaXMuX21lc2hNYXRlcmlhbHNbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzcG9zZTogZnVuY3Rpb24ocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIHBhY2tJRChpZCl7XG4gICAgdmFyIHIgPSBpZCA+PiAxNjtcbiAgICB2YXIgZyA9IChpZCAtIChyIDw8IDgpKSA+PiA4O1xuICAgIHZhciBiID0gaWQgLSAociA8PCAxNikgLSAoZzw8OCk7XG4gICAgcmV0dXJuIFtyLCBnLCBiXTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrSUQociwgZywgYil7XG4gICAgcmV0dXJuIChyIDw8IDE2KSArIChnPDw4KSArIGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBpeGVsUGlja2luZztcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LnBsdWdpbi5GcmVlQ29udHJvbFxuICogQGV4YW1wbGVcbiAqICAgICB2YXIgY29udHJvbCA9IG5ldyBjbGF5LnBsdWdpbi5GcmVlQ29udHJvbCh7XG4gKiAgICAgICAgIHRhcmdldDogY2FtZXJhLFxuICogICAgICAgICBkb21FbGVtZW50OiByZW5kZXJlci5jYW52YXNcbiAqICAgICB9KTtcbiAqICAgICAuLi5cbiAqICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24oZnJhbWVUaW1lKSB7XG4gKiAgICAgICAgIGNvbnRyb2wudXBkYXRlKGZyYW1lVGltZSk7XG4gKiAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAqICAgICB9KTtcbiAqL1xudmFyIEZyZWVDb250cm9sID0gQmFzZS5leHRlbmQoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5wbHVnaW4uRnJlZUNvbnRyb2wjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNjZW5lIG5vZGUgdG8gY29udHJvbCwgbW9zdGx5IGl0IGlzIGEgY2FtZXJhXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lk5vZGV9XG4gICAgICAgICAqL1xuICAgICAgICB0YXJnZXQ6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcmdldCBkb20gdG8gYmluZCB3aXRoIG1vdXNlIGV2ZW50c1xuICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBkb21FbGVtZW50OiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNb3VzZSBtb3ZlIHNlbnNpdGl2aXR5XG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBzZW5zaXRpdml0eTogMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGFyZ2V0IG1vdmUgc3BlZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNwZWVkOiAwLjQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwIGF4aXNcbiAgICAgICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAgICAgKi9cbiAgICAgICAgdXA6IG5ldyBWZWN0b3IzKDAsIDEsIDApLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBsb2NrIHZlcnRpY2FsIG1vdmVtZW50XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdmVydGljYWxNb3ZlTG9jazogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5BbmltYXRpb259XG4gICAgICAgICAqL1xuICAgICAgICBhbmltYXRpb246IG51bGwsXG5cbiAgICAgICAgX21vdmVGb3J3YXJkOiBmYWxzZSxcbiAgICAgICAgX21vdmVCYWNrd2FyZDogZmFsc2UsXG4gICAgICAgIF9tb3ZlTGVmdDogZmFsc2UsXG4gICAgICAgIF9tb3ZlUmlnaHQ6IGZhbHNlLFxuXG4gICAgICAgIF9vZmZzZXRQaXRjaDogMCxcbiAgICAgICAgX29mZnNldFJvbGw6IDBcbiAgICB9O1xufSwgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbG9ja0NoYW5nZSA9IHRoaXMuX2xvY2tDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9rZXlEb3duID0gdGhpcy5fa2V5RG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2tleVVwID0gdGhpcy5fa2V5VXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9tb3VzZU1vdmUgPSB0aGlzLl9tb3VzZU1vdmUuYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLmRvbUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICB9XG59LFxuLyoqIEBsZW5kcyBjbGF5LnBsdWdpbi5GcmVlQ29udHJvbC5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29udHJvbFxuICAgICAqL1xuICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBwb2ludGVyIGxvY2tcbiAgICAgICAgLy8gaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvcG9pbnRlcmxvY2svaW50cm8vXG4gICAgICAgIHZhciBlbCA9IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICAvL011c3QgcmVxdWVzdCBwb2ludGVyIGxvY2sgYWZ0ZXIgY2xpY2sgZXZlbnQsIGNhbid0IG5vdCBkbyBpdCBkaXJlY3RseVxuICAgICAgICAvL1doeSA/ID9cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9yZXF1ZXN0UG9pbnRlckxvY2spO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2tleURvd24pO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2tleVVwKTtcblxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uLm9uKCdmcmFtZScsIHRoaXMuX2RldGVjdE1vdmVtZW50Q2hhbmdlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGNvbnRyb2xcbiAgICAgKi9cbiAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICB0aGlzLnRhcmdldC5vZmYoJ2JlZm9yZXVwZGF0ZScsIHRoaXMuX2JlZm9yZVVwZGF0ZUNhbWVyYSk7XG5cbiAgICAgICAgdmFyIGVsID0gdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAgIGVsLmV4aXRQb2ludGVyTG9jayA9IGVsLmV4aXRQb2ludGVyTG9ja1xuICAgICAgICAgICAgfHwgZWwubW96RXhpdFBvaW50ZXJMb2NrXG4gICAgICAgICAgICB8fCBlbC53ZWJraXRFeGl0UG9pbnRlckxvY2s7XG5cbiAgICAgICAgaWYgKGVsLmV4aXRQb2ludGVyTG9jaykge1xuICAgICAgICAgICAgZWwuZXhpdFBvaW50ZXJMb2NrKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9yZXF1ZXN0UG9pbnRlckxvY2spO1xuXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG5cbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2tleURvd24pO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2tleVVwKTtcblxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uLm9mZignZnJhbWUnLCB0aGlzLl9kZXRlY3RNb3ZlbWVudENoYW5nZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3JlcXVlc3RQb2ludGVyTG9jazogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXM7XG4gICAgICAgIGVsLnJlcXVlc3RQb2ludGVyTG9jayA9IGVsLnJlcXVlc3RQb2ludGVyTG9ja1xuICAgICAgICAgICAgfHwgZWwubW96UmVxdWVzdFBvaW50ZXJMb2NrXG4gICAgICAgICAgICB8fCBlbC53ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2s7XG5cbiAgICAgICAgZWwucmVxdWVzdFBvaW50ZXJMb2NrKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2wgdXBkYXRlLiBTaG91bGQgYmUgaW52b2tlZCBldmVyeSBmcmFtZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcmFtZVRpbWUgRnJhbWUgdGltZVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oZnJhbWVUaW1lKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDtcblxuICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLnRhcmdldC5wb3NpdGlvbjtcbiAgICAgICAgdmFyIHhBeGlzID0gdGFyZ2V0LmxvY2FsVHJhbnNmb3JtLngubm9ybWFsaXplKCk7XG4gICAgICAgIHZhciB6QXhpcyA9IHRhcmdldC5sb2NhbFRyYW5zZm9ybS56Lm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZlcnRpY2FsTW92ZUxvY2spIHtcbiAgICAgICAgICAgIHpBeGlzLnkgPSAwO1xuICAgICAgICAgICAgekF4aXMubm9ybWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3BlZWQgPSB0aGlzLnNwZWVkICogZnJhbWVUaW1lIC8gMjA7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vdmVGb3J3YXJkKSB7XG4gICAgICAgICAgICAvLyBPcHBvc2l0ZSBkaXJlY3Rpb24gb2YgelxuICAgICAgICAgICAgcG9zaXRpb24uc2NhbGVBbmRBZGQoekF4aXMsIC1zcGVlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21vdmVCYWNrd2FyZCkge1xuICAgICAgICAgICAgcG9zaXRpb24uc2NhbGVBbmRBZGQoekF4aXMsIHNwZWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW92ZUxlZnQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uLnNjYWxlQW5kQWRkKHhBeGlzLCAtc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW92ZVJpZ2h0KSB7XG4gICAgICAgICAgICBwb3NpdGlvbi5zY2FsZUFuZEFkZCh4QXhpcywgc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldC5yb3RhdGVBcm91bmQodGFyZ2V0LnBvc2l0aW9uLCB0aGlzLnVwLCAtdGhpcy5fb2Zmc2V0UGl0Y2ggKiBmcmFtZVRpbWUgKiBNYXRoLlBJIC8gMzYwKTtcbiAgICAgICAgdmFyIHhBeGlzID0gdGFyZ2V0LmxvY2FsVHJhbnNmb3JtLng7XG4gICAgICAgIHRhcmdldC5yb3RhdGVBcm91bmQodGFyZ2V0LnBvc2l0aW9uLCB4QXhpcywgLXRoaXMuX29mZnNldFJvbGwgKiBmcmFtZVRpbWUgKiBNYXRoLlBJIC8gMzYwKTtcblxuICAgICAgICB0aGlzLl9vZmZzZXRSb2xsID0gdGhpcy5fb2Zmc2V0UGl0Y2ggPSAwO1xuICAgIH0sXG5cbiAgICBfbG9ja0NoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCA9PT0gdGhpcy5kb21FbGVtZW50XG4gICAgICAgICAgICB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQgPT09IHRoaXMuZG9tRWxlbWVudFxuICAgICAgICAgICAgfHwgZG9jdW1lbnQud2Via2l0UG9pbnRlckxvY2tFbGVtZW50ID09PSB0aGlzLmRvbUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX21vdXNlTW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgZHggPSBlLm1vdmVtZW50WCB8fCBlLm1vek1vdmVtZW50WCB8fCBlLndlYmtpdE1vdmVtZW50WCB8fCAwO1xuICAgICAgICB2YXIgZHkgPSBlLm1vdmVtZW50WSB8fCBlLm1vek1vdmVtZW50WSB8fCBlLndlYmtpdE1vdmVtZW50WSB8fCAwO1xuXG4gICAgICAgIHRoaXMuX29mZnNldFBpdGNoICs9IGR4ICogdGhpcy5zZW5zaXRpdml0eSAvIDIwMDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0Um9sbCArPSBkeSAqIHRoaXMuc2Vuc2l0aXZpdHkgLyAyMDA7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgdG8gcmVtaW5kIHJlbmRlcmVyIGRvIHJlbmRlclxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH0sXG5cbiAgICBfZGV0ZWN0TW92ZW1lbnRDaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vdmVGb3J3YXJkIHx8IHRoaXMuX21vdmVCYWNrd2FyZCB8fCB0aGlzLl9tb3ZlTGVmdCB8fCB0aGlzLl9tb3ZlUmlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2tleURvd246IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgc3dpdGNoKGUua2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSA4NzogLy93XG4gICAgICAgICAgICBjYXNlIDM3OiAvL3VwIGFycm93XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZUZvcndhcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4MzogLy9zXG4gICAgICAgICAgICBjYXNlIDQwOiAvL2Rvd24gYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlQmFja3dhcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NTogLy9hXG4gICAgICAgICAgICBjYXNlIDM3OiAvL2xlZnQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlTGVmdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDY4OiAvL2RcbiAgICAgICAgICAgIGNhc2UgMzk6IC8vcmlnaHQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlUmlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGV2ZW50IHRvIHJlbWluZCByZW5kZXJlciBkbyByZW5kZXJcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9LFxuXG4gICAgX2tleVVwOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHN3aXRjaChlLmtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgODc6IC8vd1xuICAgICAgICAgICAgY2FzZSAzNzogLy91cCBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVGb3J3YXJkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDgzOiAvL3NcbiAgICAgICAgICAgIGNhc2UgNDA6IC8vZG93biBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVCYWNrd2FyZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NTogLy9hXG4gICAgICAgICAgICBjYXNlIDM3OiAvL2xlZnQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlTGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2ODogLy9kXG4gICAgICAgICAgICBjYXNlIDM5OiAvL3JpZ2h0IGFycm93XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVJpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRnJlZUNvbnRyb2w7XG4iLCJ2YXIgR2VzdHVyZU1nciA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHRoaXMuX3RyYWNrID0gW107XG59O1xuXG5HZXN0dXJlTWdyLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBHZXN0dXJlTWdyLFxuXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCwgcm9vdCkge1xuICAgICAgICB0aGlzLl9kb1RyYWNrKGV2ZW50LCB0YXJnZXQsIHJvb3QpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVjb2duaXplKGV2ZW50KTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdHJhY2subGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kb1RyYWNrOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCwgcm9vdCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRhcmdldFRvdWNoZXM7XG5cbiAgICAgICAgaWYgKCF0b3VjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHJhY2tJdGVtID0ge1xuICAgICAgICAgICAgcG9pbnRzOiBbXSxcbiAgICAgICAgICAgIHRvdWNoZXM6IFtdLFxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG91Y2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcbiAgICAgICAgICAgIHRyYWNrSXRlbS5wb2ludHMucHVzaChbdG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WV0pO1xuICAgICAgICAgICAgdHJhY2tJdGVtLnRvdWNoZXMucHVzaCh0b3VjaCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFjay5wdXNoKHRyYWNrSXRlbSk7XG4gICAgfSxcblxuICAgIF9yZWNvZ25pemU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gcmVjb2duaXplcnMpIHtcbiAgICAgICAgICAgIGlmIChyZWNvZ25pemVycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdlc3R1cmVJbmZvID0gcmVjb2duaXplcnNbZXZlbnROYW1lXSh0aGlzLl90cmFjaywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChnZXN0dXJlSW5mbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VzdHVyZUluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gZGlzdChwb2ludFBhaXIpIHtcbiAgICB2YXIgZHggPSBwb2ludFBhaXJbMV1bMF0gLSBwb2ludFBhaXJbMF1bMF07XG4gICAgdmFyIGR5ID0gcG9pbnRQYWlyWzFdWzFdIC0gcG9pbnRQYWlyWzBdWzFdO1xuXG4gICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG59XG5cbmZ1bmN0aW9uIGNlbnRlcihwb2ludFBhaXIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAocG9pbnRQYWlyWzBdWzBdICsgcG9pbnRQYWlyWzFdWzBdKSAvIDIsXG4gICAgICAgIChwb2ludFBhaXJbMF1bMV0gKyBwb2ludFBhaXJbMV1bMV0pIC8gMlxuICAgIF07XG59XG5cbnZhciByZWNvZ25pemVycyA9IHtcblxuICAgIHBpbmNoOiBmdW5jdGlvbiAodHJhY2ssIGV2ZW50KSB7XG4gICAgICAgIHZhciB0cmFja0xlbiA9IHRyYWNrLmxlbmd0aDtcblxuICAgICAgICBpZiAoIXRyYWNrTGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGluY2hFbmQgPSAodHJhY2tbdHJhY2tMZW4gLSAxXSB8fCB7fSkucG9pbnRzO1xuICAgICAgICB2YXIgcGluY2hQcmUgPSAodHJhY2tbdHJhY2tMZW4gLSAyXSB8fCB7fSkucG9pbnRzIHx8IHBpbmNoRW5kO1xuXG4gICAgICAgIGlmIChwaW5jaFByZVxuICAgICAgICAgICAgJiYgcGluY2hQcmUubGVuZ3RoID4gMVxuICAgICAgICAgICAgJiYgcGluY2hFbmRcbiAgICAgICAgICAgICYmIHBpbmNoRW5kLmxlbmd0aCA+IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2YXIgcGluY2hTY2FsZSA9IGRpc3QocGluY2hFbmQpIC8gZGlzdChwaW5jaFByZSk7XG4gICAgICAgICAgICAhaXNGaW5pdGUocGluY2hTY2FsZSkgJiYgKHBpbmNoU2NhbGUgPSAxKTtcblxuICAgICAgICAgICAgZXZlbnQucGluY2hTY2FsZSA9IHBpbmNoU2NhbGU7XG5cbiAgICAgICAgICAgIHZhciBwaW5jaENlbnRlciA9IGNlbnRlcihwaW5jaEVuZCk7XG4gICAgICAgICAgICBldmVudC5waW5jaFggPSBwaW5jaENlbnRlclswXTtcbiAgICAgICAgICAgIGV2ZW50LnBpbmNoWSA9IHBpbmNoQ2VudGVyWzFdO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwaW5jaCcsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0cmFja1swXS50YXJnZXQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgR2VzdHVyZU1ncjtcbiIsImltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4uL0dlb21ldHJ5JztcbmltcG9ydCBQbGFuZSBmcm9tICcuLi9tYXRoL1BsYW5lJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgTWF0cml4NCBmcm9tICcuLi9tYXRoL01hdHJpeDQnO1xuaW1wb3J0IFJheSBmcm9tICcuLi9tYXRoL1JheSc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xudmFyIHZlYzQgPSBnbE1hdHJpeC52ZWM0O1xuXG52YXIgdXZzID0gW1swLCAwXSwgWzAsIDFdLCBbMSwgMV0sIFsxLCAwXV07XG52YXIgdHJpcyA9IFswLCAxLCAyLCAyLCAzLCAwXTtcblxudmFyIEluZmluaXRlUGxhbmUgPSBNZXNoLmV4dGVuZCh7XG5cbiAgICBjYW1lcmE6IG51bGwsXG5cbiAgICBwbGFuZTogbnVsbCxcblxuICAgIG1heEdyaWQ6IDAsXG5cbiAgICAvLyBUT0RPXG4gICAgZnJ1c3R1bUN1bGxpbmc6IGZhbHNlXG5cbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KHtcbiAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgIH0pO1xuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uaW5pdCg2KTtcbiAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5pbml0KDYpO1xuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGV4Y29vcmQwLmluaXQoNik7XG4gICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSg2KTtcblxuICAgIHRoaXMucGxhbmUgPSBuZXcgUGxhbmUoKTtcbn0sIHtcblxuICAgIHVwZGF0ZUdlb21ldHJ5OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX3VuUHJvamVjdEdyaWQoKTtcbiAgICAgICAgaWYgKCFjb29yZHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zaXRpb25BdHRyID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuICAgICAgICB2YXIgbm9ybWFsQXR0ciA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMudGV4Y29vcmQwO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuZ2VvbWV0cnkuaW5kaWNlcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRyaXNbaV07XG4gICAgICAgICAgICBwb3NpdGlvbkF0dHIuc2V0KGksIGNvb3Jkc1tpZHhdLmFycmF5KTtcbiAgICAgICAgICAgIG5vcm1hbEF0dHIuc2V0KGksIHRoaXMucGxhbmUubm9ybWFsLmFycmF5KTtcbiAgICAgICAgICAgIHRleGNvb3Jkcy5zZXQoaSwgdXZzW2lkeF0pO1xuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW9tZXRyeS5kaXJ0eSgpO1xuICAgIH0sXG5cbiAgICAvLyBodHRwOi8vZmlsZWFkbWluLmNzLmx0aC5zZS9ncmFwaGljcy90aGVzZXMvcHJvamVjdHMvcHJvamdyaWQvXG4gICAgX3VuUHJvamVjdEdyaWQ6IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIHBsYW5lVmlld1NwYWNlID0gbmV3IFBsYW5lKCk7XG4gICAgICAgIHZhciBsaW5lcyA9IFtcbiAgICAgICAgICAgIDAsIDEsIDAsIDIsIDEsIDMsIDIsIDMsXG4gICAgICAgICAgICA0LCA1LCA0LCA2LCA1LCA3LCA2LCA3LFxuICAgICAgICAgICAgMCwgNCwgMSwgNSwgMiwgNiwgMywgN1xuICAgICAgICBdO1xuXG4gICAgICAgIHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcblxuICAgICAgICAvLyAxLS0tLTJcbiAgICAgICAgLy8gfCAgICB8XG4gICAgICAgIC8vIDAtLS0tM1xuICAgICAgICB2YXIgY29vcmRzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBjb29yZHNbaV0gPSBuZXcgVmVjdG9yMygwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByYXkgPSBuZXcgUmF5KCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBsYW5lVmlld1NwYWNlLmNvcHkodGhpcy5wbGFuZSk7XG4gICAgICAgICAgICBwbGFuZVZpZXdTcGFjZS5hcHBseVRyYW5zZm9ybSh0aGlzLmNhbWVyYS52aWV3TWF0cml4KTtcblxuICAgICAgICAgICAgdmFyIGZydXN0dW1WZXJ0aWNlcyA9IHRoaXMuY2FtZXJhLmZydXN0dW0udmVydGljZXM7XG5cbiAgICAgICAgICAgIHZhciBuUG9pbnRzID0gMDtcbiAgICAgICAgICAgIC8vIEludGVyc2VjdCB3aXRoIGxpbmVzIG9mIGZydXN0dW1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgICAgIHN0YXJ0LmFycmF5ID0gZnJ1c3R1bVZlcnRpY2VzW2xpbmVzW2kgKiAyXV07XG4gICAgICAgICAgICAgICAgZW5kLmFycmF5ID0gZnJ1c3R1bVZlcnRpY2VzW2xpbmVzW2kgKiAyICsgMV1dO1xuXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gcGxhbmVWaWV3U3BhY2UuaW50ZXJzZWN0TGluZShzdGFydCwgZW5kLCBwb2ludHNbblBvaW50c10pO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50c1tuUG9pbnRzXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW25Qb2ludHNdID0gcG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgblBvaW50cysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuUG9pbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwb2ludHNbaV0uYXBwbHlQcm9qZWN0aW9uKHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1pblggPSBwb2ludHNbMF0uYXJyYXlbMF07XG4gICAgICAgICAgICB2YXIgbWluWSA9IHBvaW50c1swXS5hcnJheVsxXTtcbiAgICAgICAgICAgIHZhciBtYXhYID0gcG9pbnRzWzBdLmFycmF5WzBdO1xuICAgICAgICAgICAgdmFyIG1heFkgPSBwb2ludHNbMF0uYXJyYXlbMV07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG5Qb2ludHM7IGkrKykge1xuICAgICAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwb2ludHNbaV0uYXJyYXlbMF0pO1xuICAgICAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwb2ludHNbaV0uYXJyYXlbMV0pO1xuICAgICAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwb2ludHNbaV0uYXJyYXlbMF0pO1xuICAgICAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwb2ludHNbaV0uYXJyYXlbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1pblggPT0gbWF4WCB8fCBtaW5ZID09IG1heFkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb29yZHNbMF0uYXJyYXlbMF0gPSBtaW5YO1xuICAgICAgICAgICAgY29vcmRzWzBdLmFycmF5WzFdID0gbWluWTtcbiAgICAgICAgICAgIGNvb3Jkc1sxXS5hcnJheVswXSA9IG1pblg7XG4gICAgICAgICAgICBjb29yZHNbMV0uYXJyYXlbMV0gPSBtYXhZO1xuICAgICAgICAgICAgY29vcmRzWzJdLmFycmF5WzBdID0gbWF4WDtcbiAgICAgICAgICAgIGNvb3Jkc1syXS5hcnJheVsxXSA9IG1heFk7XG4gICAgICAgICAgICBjb29yZHNbM10uYXJyYXlbMF0gPSBtYXhYO1xuICAgICAgICAgICAgY29vcmRzWzNdLmFycmF5WzFdID0gbWluWTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbWVyYS5jYXN0UmF5KGNvb3Jkc1tpXSwgcmF5KTtcbiAgICAgICAgICAgICAgICByYXkuaW50ZXJzZWN0UGxhbmUodGhpcy5wbGFuZSwgY29vcmRzW2ldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICAgICAgfTtcbiAgICB9KSgpXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSW5maW5pdGVQbGFuZTtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgVmVjdG9yMiBmcm9tICcuLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBHZXN0dXJlTWdyIGZyb20gJy4vR2VzdHVyZU1ncic7XG5cbmZ1bmN0aW9uIGZpcnN0Tm90TnVsbCgpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHNbaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFRvQXJyYXkodmFsKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbCwgdmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LnBsdWdpbi5PcmJpdENvbnRyb2xcbiAqL1xudmFyIE9yYml0Q29udHJvbCA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkucGx1Z2luLk9yYml0Q29udHJvbCMgKi8ge1xuXG4gICAgICAgIHRpbWVsaW5lOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7SFRNTERvbUVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBkb21FbGVtZW50OiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5Ob2RlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAgICAgKi9cbiAgICAgICAgX2NlbnRlcjogbmV3IFZlY3RvcjMoKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWluaW11bSBkaXN0YW5jZSB0byB0aGUgY2VudGVyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDAuNVxuICAgICAgICAgKi9cbiAgICAgICAgbWluRGlzdGFuY2U6IDAuMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWF4aW11bSBkaXN0YW5jZSB0byB0aGUgY2VudGVyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDJcbiAgICAgICAgICovXG4gICAgICAgIG1heERpc3RhbmNlOiAxMDAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNaW5pbXVtIGFscGhhIHJvdGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBtaW5BbHBoYTogLTkwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXhpbXVtIGFscGhhIHJvdGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBtYXhBbHBoYTogOTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gYmV0YSByb3RhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbWluQmV0YTogLUluZmluaXR5LFxuICAgICAgICAvKipcbiAgICAgICAgICogTWF4aW11bSBiZXRhIHJvdGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBtYXhCZXRhOiBJbmZpbml0eSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnQgYXV0byByb3RhdGluZyBhZnRlciBzdGlsbCBmb3IgdGhlIGdpdmVuIHRpbWVcbiAgICAgICAgICovXG4gICAgICAgIGF1dG9Sb3RhdGVBZnRlclN0aWxsOiAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXJlY3Rpb24gb2YgYXV0b1JvdGF0ZS4gY3cgb3IgY2N3IHdoZW4gbG9va2luZyB0b3AgZG93bi5cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9Sb3RhdGVEaXJlY3Rpb246ICdjdycsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZ3JlZSBwZXIgc2Vjb25kXG4gICAgICAgICAqL1xuICAgICAgICBhdXRvUm90YXRlU3BlZWQ6IDYwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYW4gb3Igcm90YXRlXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBfbW9kZTogJ3JvdGF0ZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFtcGluZzogMC44LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHJvdGF0ZVNlbnNpdGl2aXR5OiAxLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHpvb21TZW5zaXRpdml0eTogMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBwYW5TZW5zaXRpdml0eTogMSxcblxuICAgICAgICBfbmVlZHNVcGRhdGU6IGZhbHNlLFxuXG4gICAgICAgIF9yb3RhdGluZzogZmFsc2UsXG5cbiAgICAgICAgLy8gUm90YXRpb24gYXJvdW5kIHlBeGlzXG4gICAgICAgIF9waGk6IDAsXG4gICAgICAgIC8vIFJvdGF0aW9uIGFyb3VuZCB4QXhpc1xuICAgICAgICBfdGhldGE6IDAsXG5cbiAgICAgICAgX21vdXNlWDogMCxcbiAgICAgICAgX21vdXNlWTogMCxcblxuICAgICAgICBfcm90YXRlVmVsb2NpdHk6IG5ldyBWZWN0b3IyKCksXG5cbiAgICAgICAgX3BhblZlbG9jaXR5OiBuZXcgVmVjdG9yMigpLFxuXG4gICAgICAgIF9kaXN0YW5jZTogMjAsXG5cbiAgICAgICAgX3pvb21TcGVlZDogMCxcblxuICAgICAgICBfc3RpbGxUaW1lb3V0OiAwLFxuXG4gICAgICAgIF9hbmltYXRvcnM6IFtdLFxuXG4gICAgICAgIF9nZXN0dXJlTWdyOiBuZXcgR2VzdHVyZU1ncigpXG4gICAgfTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBFYWNoIE9yYml0Q29udHJvbCBoYXMgaXQncyBvd24gaGFuZGxlclxuICAgIHRoaXMuX21vdXNlRG93bkhhbmRsZXIgPSB0aGlzLl9tb3VzZURvd25IYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VXaGVlbEhhbmRsZXIgPSB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIgPSB0aGlzLl9tb3VzZU1vdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VVcEhhbmRsZXIgPSB0aGlzLl9tb3VzZVVwSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3BpbmNoSGFuZGxlciA9IHRoaXMuX3BpbmNoSGFuZGxlci5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pbml0KCk7XG59LCAvKiogQGxlbmRzIGNsYXkucGx1Z2luLk9yYml0Q29udHJvbCMgKi8ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUuXG4gICAgICogTW91c2UgZXZlbnQgYmluZGluZ1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRvbSA9IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX21vdXNlRG93bkhhbmRsZXIpO1xuXG4gICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9tb3VzZURvd25IYW5kbGVyKTtcbiAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZWxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUub24oJ2ZyYW1lJywgdGhpcy51cGRhdGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2UuXG4gICAgICogTW91c2UgZXZlbnQgdW5iaW5kaW5nXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZG9tID0gdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fbW91c2VEb3duSGFuZGxlcik7XG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9tb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fbW91c2VVcEhhbmRsZXIpO1xuXG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9tb3VzZURvd25IYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBIYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZWxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUub2ZmKCdmcmFtZScsIHRoaXMudXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3BBbGxBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGRpc3RhbmNlXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXN0YW5jZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3RhbmNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgc2V0RGlzdGFuY2U6IGZ1bmN0aW9uIChkaXN0YW5jZSkge1xuICAgICAgICB0aGlzLl9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbHBoYSByb3RhdGlvblxuICAgICAqIEFscGhhIGFuZ2xlIGZvciB0b3AtZG93biByb3RhdGlvbi4gUG9zaXRpdmUgdG8gcm90YXRlIHRvIHRvcC5cbiAgICAgKlxuICAgICAqIFdoaWNoIG1lYW5zIGNhbWVyYSByb3RhdGlvbiBhcm91bmQgeCBheGlzLlxuICAgICAqL1xuICAgIGdldEFscGhhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aGV0YSAvIE1hdGguUEkgKiAxODA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBiZXRhIHJvdGF0aW9uXG4gICAgICogQmV0YSBhbmdsZSBmb3IgbGVmdC1yaWdodCByb3RhdGlvbi4gUG9zaXRpdmUgdG8gcm90YXRlIHRvIHJpZ2h0LlxuICAgICAqXG4gICAgICogV2hpY2ggbWVhbnMgY2FtZXJhIHJvdGF0aW9uIGFyb3VuZCB5IGF4aXMuXG4gICAgICovXG4gICAgZ2V0QmV0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gLXRoaXMuX3BoaSAvIE1hdGguUEkgKiAxODA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBjb250cm9sIGNlbnRlclxuICAgICAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fVxuICAgICAqL1xuICAgIGdldENlbnRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VudGVyLnRvQXJyYXkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGFscGhhIHJvdGF0aW9uIGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXG4gICAgICovXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uIChhbHBoYSkge1xuICAgICAgICBhbHBoYSA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4QWxwaGEsIGFscGhhKSwgdGhpcy5taW5BbHBoYSk7XG5cbiAgICAgICAgdGhpcy5fdGhldGEgPSBhbHBoYSAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGJldGEgcm90YXRpb24gYW5nbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmV0YVxuICAgICAqL1xuICAgIHNldEJldGE6IGZ1bmN0aW9uIChiZXRhKSB7XG4gICAgICAgIGJldGEgPSBNYXRoLm1heChNYXRoLm1pbih0aGlzLm1heEJldGEsIGJldGEpLCB0aGlzLm1pbkJldGEpO1xuXG4gICAgICAgIHRoaXMuX3BoaSA9IC1iZXRhIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29udHJvbCBjZW50ZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBjZW50ZXJcbiAgICAgKi9cbiAgICBzZXRDZW50ZXI6IGZ1bmN0aW9uIChjZW50ZXJBcnIpIHtcbiAgICAgICAgdGhpcy5fY2VudGVyLnNldEFycmF5KGNlbnRlckFycik7XG4gICAgfSxcblxuICAgIHNldE9wdGlvbjogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICAgICAgWydhdXRvUm90YXRlJywgJ2F1dG9Sb3RhdGVBZnRlclN0aWxsJyxcbiAgICAgICAgICAgICdhdXRvUm90YXRlRGlyZWN0aW9uJywgJ2F1dG9Sb3RhdGVTcGVlZCcsXG4gICAgICAgICAgICAnZGFtcGluZycsXG4gICAgICAgICAgICAnbWluRGlzdGFuY2UnLCAnbWF4RGlzdGFuY2UnLFxuICAgICAgICAgICAgJ21pbkFscGhhJywgJ21heEFscGhhJywgJ21pbkJldGEnLCAnbWF4QmV0YScsXG4gICAgICAgICAgICAncm90YXRlU2Vuc2l0aXZpdHknLCAnem9vbVNlbnNpdGl2aXR5JywgJ3BhblNlbnNpdGl2aXR5J1xuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKG9wdHNba2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3B0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICBpZiAob3B0cy5kaXN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3RhbmNlKG9wdHMuZGlzdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMuYWxwaGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBbHBoYShvcHRzLmFscGhhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5iZXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmV0YShvcHRzLmJldGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMuY2VudGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNldENlbnRlcihvcHRzLmNlbnRlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0cy5kaXN0YW5jZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRzLmFscGhhXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdHMuYmV0YVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5kdXJhdGlvbj0xMDAwXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5lYXNpbmc9J2xpbmVhciddXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmRvbmVdXG4gICAgICovXG4gICAgYW5pbWF0ZVRvOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICB2YXIgdGFyZ2V0ID0ge307XG4gICAgICAgIHZhciB0aW1lbGluZSA9IHRoaXMudGltZWxpbmU7XG4gICAgICAgIGlmICghdGltZWxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5kaXN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouZGlzdGFuY2UgPSB0aGlzLmdldERpc3RhbmNlKCk7XG4gICAgICAgICAgICB0YXJnZXQuZGlzdGFuY2UgPSBvcHRzLmRpc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmFscGhhICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5hbHBoYSA9IHRoaXMuZ2V0QWxwaGEoKTtcbiAgICAgICAgICAgIHRhcmdldC5hbHBoYSA9IG9wdHMuYWxwaGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuYmV0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouYmV0YSA9IHRoaXMuZ2V0QmV0YSgpO1xuICAgICAgICAgICAgdGFyZ2V0LmJldGEgPSBvcHRzLmJldGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuY2VudGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5jZW50ZXIgPSB0aGlzLmdldENlbnRlcigpO1xuICAgICAgICAgICAgdGFyZ2V0LmNlbnRlciA9IG9wdHMuY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEFuaW1hdG9yKFxuICAgICAgICAgICAgdGltZWxpbmUuYW5pbWF0ZShvYmopXG4gICAgICAgICAgICAgICAgLndoZW4ob3B0cy5kdXJhdGlvbiB8fCAxMDAwLCB0YXJnZXQpXG4gICAgICAgICAgICAgICAgLmR1cmluZyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouYWxwaGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRBbHBoYShvYmouYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouYmV0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEJldGEob2JqLmJldGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouZGlzdGFuY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXREaXN0YW5jZShvYmouZGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouY2VudGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0Q2VudGVyKG9iai5jZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX25lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5kb25lKG9wdHMuZG9uZSlcbiAgICAgICAgKS5zdGFydChvcHRzLmVhc2luZyB8fCAnbGluZWFyJyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgYWxsIGFuaW1hdGlvbnNcbiAgICAgKi9cbiAgICBzdG9wQWxsQW5pbWF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fYW5pbWF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvcnNbaV0uc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FuaW1hdG9ycy5sZW5ndGggPSAwO1xuICAgIH0sXG5cbiAgICBfaXNBbmltYXRpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FuaW1hdG9ycy5sZW5ndGggPiAwO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2FsbCB1cGRhdGUgZWFjaCBmcmFtZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGVsdGFUaW1lIEZyYW1lIHRpbWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChkZWx0YVRpbWUpIHtcblxuICAgICAgICBkZWx0YVRpbWUgPSBkZWx0YVRpbWUgfHwgMTY7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nKSB7XG4gICAgICAgICAgICB2YXIgcmFkaWFuID0gKHRoaXMuYXV0b1JvdGF0ZURpcmVjdGlvbiA9PT0gJ2N3JyA/IDEgOiAtMSlcbiAgICAgICAgICAgICAgICAqIHRoaXMuYXV0b1JvdGF0ZVNwZWVkIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgICAgIHRoaXMuX3BoaSAtPSByYWRpYW4gKiBkZWx0YVRpbWUgLyAxMDAwO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3JvdGF0ZVZlbG9jaXR5LmxlbigpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuX3pvb21TcGVlZCkgPiAwLjAxIHx8IHRoaXMuX3BhblZlbG9jaXR5LmxlbigpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9uZWVkc1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRml4ZWQgZGVsdGFUaW1lXG4gICAgICAgIHRoaXMuX3VwZGF0ZURpc3RhbmNlKE1hdGgubWluKGRlbHRhVGltZSwgNTApKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGFuKE1hdGgubWluKGRlbHRhVGltZSwgNTApKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVSb3RhdGUoTWF0aC5taW4oZGVsdGFUaW1lLCA1MCkpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVRyYW5zZm9ybSgpO1xuXG4gICAgICAgIHRoaXMudGFyZ2V0LnVwZGF0ZSgpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcigndXBkYXRlJyk7XG5cbiAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVJvdGF0ZTogZnVuY3Rpb24gKGRlbHRhVGltZSkge1xuICAgICAgICB2YXIgdmVsb2NpdHkgPSB0aGlzLl9yb3RhdGVWZWxvY2l0eTtcbiAgICAgICAgdGhpcy5fcGhpID0gdmVsb2NpdHkueSAqIGRlbHRhVGltZSAvIDIwICsgdGhpcy5fcGhpO1xuICAgICAgICB0aGlzLl90aGV0YSA9IHZlbG9jaXR5LnggKiBkZWx0YVRpbWUgLyAyMCArIHRoaXMuX3RoZXRhO1xuXG4gICAgICAgIHRoaXMuc2V0QWxwaGEodGhpcy5nZXRBbHBoYSgpKTtcbiAgICAgICAgdGhpcy5zZXRCZXRhKHRoaXMuZ2V0QmV0YSgpKTtcblxuICAgICAgICB0aGlzLl92ZWN0b3JEYW1waW5nKHZlbG9jaXR5LCB0aGlzLmRhbXBpbmcpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlRGlzdGFuY2U6IGZ1bmN0aW9uIChkZWx0YVRpbWUpIHtcbiAgICAgICAgdGhpcy5fc2V0RGlzdGFuY2UodGhpcy5fZGlzdGFuY2UgKyB0aGlzLl96b29tU3BlZWQgKiBkZWx0YVRpbWUgLyAyMCk7XG4gICAgICAgIHRoaXMuX3pvb21TcGVlZCAqPSB0aGlzLmRhbXBpbmc7XG4gICAgfSxcblxuICAgIF9zZXREaXN0YW5jZTogZnVuY3Rpb24gKGRpc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlID0gTWF0aC5tYXgoTWF0aC5taW4oZGlzdGFuY2UsIHRoaXMubWF4RGlzdGFuY2UpLCB0aGlzLm1pbkRpc3RhbmNlKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVBhbjogZnVuY3Rpb24gKGRlbHRhVGltZSkge1xuICAgICAgICB2YXIgdmVsb2NpdHkgPSB0aGlzLl9wYW5WZWxvY2l0eTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMuX2Rpc3RhbmNlO1xuXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDtcbiAgICAgICAgdmFyIHlBeGlzID0gdGFyZ2V0LndvcmxkVHJhbnNmb3JtLnk7XG4gICAgICAgIHZhciB4QXhpcyA9IHRhcmdldC53b3JsZFRyYW5zZm9ybS54O1xuXG4gICAgICAgIC8vIFBFTkRJTkdcbiAgICAgICAgdGhpcy5fY2VudGVyXG4gICAgICAgICAgICAuc2NhbGVBbmRBZGQoeEF4aXMsIC12ZWxvY2l0eS54ICogbGVuIC8gMjAwKVxuICAgICAgICAgICAgLnNjYWxlQW5kQWRkKHlBeGlzLCAtdmVsb2NpdHkueSAqIGxlbiAvIDIwMCk7XG5cbiAgICAgICAgdGhpcy5fdmVjdG9yRGFtcGluZyh2ZWxvY2l0eSwgMCk7XG4gICAgfSxcblxuICAgIF91cGRhdGVUcmFuc2Zvcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMudGFyZ2V0O1xuXG4gICAgICAgIHZhciBkaXIgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB2YXIgdGhldGEgPSB0aGlzLl90aGV0YSArIE1hdGguUEkgLyAyO1xuICAgICAgICB2YXIgcGhpID0gdGhpcy5fcGhpICsgTWF0aC5QSSAvIDI7XG4gICAgICAgIHZhciByID0gTWF0aC5zaW4odGhldGEpO1xuXG4gICAgICAgIGRpci54ID0gciAqIE1hdGguY29zKHBoaSk7XG4gICAgICAgIGRpci55ID0gLU1hdGguY29zKHRoZXRhKTtcbiAgICAgICAgZGlyLnogPSByICogTWF0aC5zaW4ocGhpKTtcblxuICAgICAgICBjYW1lcmEucG9zaXRpb24uY29weSh0aGlzLl9jZW50ZXIpLnNjYWxlQW5kQWRkKGRpciwgdGhpcy5fZGlzdGFuY2UpO1xuICAgICAgICBjYW1lcmEucm90YXRpb24uaWRlbnRpdHkoKVxuICAgICAgICAgICAgLy8gRmlyc3QgYXJvdW5kIHksIHRoZW4gYXJvdW5kIHhcbiAgICAgICAgICAgIC5yb3RhdGVZKC10aGlzLl9waGkpXG4gICAgICAgICAgICAucm90YXRlWCgtdGhpcy5fdGhldGEpO1xuICAgIH0sXG5cbiAgICBfc3RhcnRDb3VudGluZ1N0aWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zdGlsbFRpbWVvdXQpO1xuXG4gICAgICAgIHZhciB0aW1lID0gdGhpcy5hdXRvUm90YXRlQWZ0ZXJTdGlsbDtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoIWlzTmFOKHRpbWUpICYmIHRpbWUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGlsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9yb3RhdGluZyA9IHRydWU7XG4gICAgICAgICAgICB9LCB0aW1lICogMTAwMCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3ZlY3RvckRhbXBpbmc6IGZ1bmN0aW9uICh2LCBkYW1waW5nKSB7XG4gICAgICAgIHZhciBzcGVlZCA9IHYubGVuKCk7XG4gICAgICAgIHNwZWVkID0gc3BlZWQgKiBkYW1waW5nO1xuICAgICAgICBpZiAoc3BlZWQgPCAxZS00KSB7XG4gICAgICAgICAgICBzcGVlZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdi5ub3JtYWxpemUoKS5zY2FsZShzcGVlZCk7XG4gICAgfSxcblxuICAgIGRlY29tcG9zZVRyYW5zZm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRSBldWxlciBvcmRlci4uLi4uLlxuICAgICAgICAvLyBGSVhNRSBhbHBoYSBpcyBub3QgY2VydGFpbiB3aGVuIGJldGEgaXMgOTAgb3IgLTkwXG4gICAgICAgIC8vIHZhciBldWxlciA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIC8vIGV1bGVyLmV1bGVyRnJvbU1hdDMoXG4gICAgICAgIC8vICAgIG5ldyBNYXRyaXgzKCkuZnJvbVF1YXQodGhpcy50YXJnZXQucm90YXRpb24pLCAnWllYJ1xuICAgICAgICAvLyApO1xuICAgICAgICAvLyBldWxlci5ldWxlckZyb21RdWF0KFxuICAgICAgICAvLyAgICAgdGhpcy50YXJnZXQucm90YXRpb24ubm9ybWFsaXplKCksICdaWVgnXG4gICAgICAgIC8vICk7XG4gICAgICAgIHRoaXMudGFyZ2V0LnVwZGF0ZVdvcmxkVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgdmFyIGZvcndhcmQgPSB0aGlzLnRhcmdldC53b3JsZFRyYW5zZm9ybS56O1xuICAgICAgICB2YXIgYWxwaGEgPSBNYXRoLmFzaW4oZm9yd2FyZC55KTtcbiAgICAgICAgdmFyIGJldGEgPSBNYXRoLmF0YW4yKGZvcndhcmQueCwgZm9yd2FyZC56KTtcblxuICAgICAgICB0aGlzLl90aGV0YSA9IGFscGhhO1xuICAgICAgICB0aGlzLl9waGkgPSAtYmV0YTtcblxuICAgICAgICB0aGlzLnNldEJldGEodGhpcy5nZXRCZXRhKCkpO1xuICAgICAgICB0aGlzLnNldEFscGhhKHRoaXMuZ2V0QWxwaGEoKSk7XG5cbiAgICAgICAgdGhpcy5fc2V0RGlzdGFuY2UodGhpcy50YXJnZXQucG9zaXRpb24uZGlzdCh0aGlzLl9jZW50ZXIpKTtcbiAgICB9LFxuXG4gICAgX21vdXNlRG93bkhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0FuaW1hdGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHggPSBlLmNsaWVudFg7XG4gICAgICAgIHZhciB5ID0gZS5jbGllbnRZO1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzKSB7XG4gICAgICAgICAgICB2YXIgdG91Y2ggPSBlLnRhcmdldFRvdWNoZXNbMF07XG4gICAgICAgICAgICB4ID0gdG91Y2guY2xpZW50WDtcbiAgICAgICAgICAgIHkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAgICAgICB0aGlzLl9tb2RlID0gJ3JvdGF0ZSc7XG5cbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NHZXN0dXJlKGUsICdzdGFydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbSA9IHRoaXMuZG9tRWxlbWVudDtcbiAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9tb3VzZVVwSGFuZGxlcik7XG5cbiAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBIYW5kbGVyKTtcblxuICAgICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX21vZGUgPSAncm90YXRlJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlLmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZSA9ICdwYW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgcm90YXRlIHZlbG9jaXR5XG4gICAgICAgIHRoaXMuX3JvdGF0ZVZlbG9jaXR5LnNldCgwLCAwKTtcbiAgICAgICAgdGhpcy5fcm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuYXV0b1JvdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRDb3VudGluZ1N0aWxsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3VzZVggPSB4O1xuICAgICAgICB0aGlzLl9tb3VzZVkgPSB5O1xuICAgIH0sXG5cbiAgICBfbW91c2VNb3ZlSGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeCA9IGUuY2xpZW50WDtcbiAgICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG5cbiAgICAgICAgdmFyIGhhdmVHZXN0dXJlO1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzKSB7XG4gICAgICAgICAgICB2YXIgdG91Y2ggPSBlLnRhcmdldFRvdWNoZXNbMF07XG4gICAgICAgICAgICB4ID0gdG91Y2guY2xpZW50WDtcbiAgICAgICAgICAgIHkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAgICAgICBoYXZlR2VzdHVyZSA9IHRoaXMuX3Byb2Nlc3NHZXN0dXJlKGUsICdjaGFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYW5TZW5zaXRpdml0eSA9IGNvbnZlcnRUb0FycmF5KHRoaXMucGFuU2Vuc2l0aXZpdHkpO1xuICAgICAgICB2YXIgcm90YXRlU2Vuc2l0aXZpdHkgPSBjb252ZXJ0VG9BcnJheSh0aGlzLnJvdGF0ZVNlbnNpdGl2aXR5KTtcblxuICAgICAgICBpZiAoIWhhdmVHZXN0dXJlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gJ3JvdGF0ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGVWZWxvY2l0eS55ID0gKHggLSB0aGlzLl9tb3VzZVgpIC8gdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCAqIDIgKiByb3RhdGVTZW5zaXRpdml0eVswXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGVWZWxvY2l0eS54ID0gKHkgLSB0aGlzLl9tb3VzZVkpIC8gdGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoICogMiAqIHJvdGF0ZVNlbnNpdGl2aXR5WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fbW9kZSA9PT0gJ3BhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYW5WZWxvY2l0eS54ID0gKHggLSB0aGlzLl9tb3VzZVgpIC8gdGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoICogcGFuU2Vuc2l0aXZpdHlbMF0gKiA0MDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFuVmVsb2NpdHkueSA9ICgteSArIHRoaXMuX21vdXNlWSkgLyB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0ICogcGFuU2Vuc2l0aXZpdHlbMV0gKiA0MDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3VzZVggPSB4O1xuICAgICAgICB0aGlzLl9tb3VzZVkgPSB5O1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX21vdXNlV2hlZWxIYW5kbGVyOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5faXNBbmltYXRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9IGUud2hlZWxEZWx0YSAvLyBXZWJraXRcbiAgICAgICAgICAgICAgICB8fCAtZS5kZXRhaWw7IC8vIEZpcmVmb3hcbiAgICAgICAgaWYgKGRlbHRhID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fem9vbUhhbmRsZXIoZSwgZGVsdGEgPiAwID8gLTEgOiAxKTtcbiAgICB9LFxuXG4gICAgX3BpbmNoSGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl96b29tSGFuZGxlcihlLCBlLnBpbmNoU2NhbGUgPiAxID8gLTAuNCA6IDAuNCk7XG4gICAgfSxcblxuICAgIF96b29tSGFuZGxlcjogZnVuY3Rpb24gKGUsIGRlbHRhKSB7XG5cbiAgICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5tYXgoTWF0aC5taW4oXG4gICAgICAgICAgICB0aGlzLl9kaXN0YW5jZSAtIHRoaXMubWluRGlzdGFuY2UsXG4gICAgICAgICAgICB0aGlzLm1heERpc3RhbmNlIC0gdGhpcy5fZGlzdGFuY2VcbiAgICAgICAgKSk7XG4gICAgICAgIHRoaXMuX3pvb21TcGVlZCA9IGRlbHRhICogTWF0aC5tYXgoZGlzdGFuY2UgLyA0MCAqIHRoaXMuem9vbVNlbnNpdGl2aXR5LCAwLjIpO1xuXG4gICAgICAgIHRoaXMuX3JvdGF0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b1JvdGF0ZSAmJiB0aGlzLl9tb2RlID09PSAncm90YXRlJykge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRDb3VudGluZ1N0aWxsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcblxuICAgIF9tb3VzZVVwSGFuZGxlcjogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBkb20gPSB0aGlzLmRvbUVsZW1lbnQ7XG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9tb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fbW91c2VVcEhhbmRsZXIpO1xuICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fbW91c2VNb3ZlSGFuZGxlcik7XG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fbW91c2VVcEhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NHZXN0dXJlKGV2ZW50LCAnZW5kJyk7XG4gICAgfSxcblxuICAgIF9hZGRBbmltYXRvcjogZnVuY3Rpb24gKGFuaW1hdG9yKSB7XG4gICAgICAgIHZhciBhbmltYXRvcnMgPSB0aGlzLl9hbmltYXRvcnM7XG4gICAgICAgIGFuaW1hdG9ycy5wdXNoKGFuaW1hdG9yKTtcbiAgICAgICAgYW5pbWF0b3IuZG9uZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gYW5pbWF0b3JzLmluZGV4T2YoYW5pbWF0b3IpO1xuICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0b3JzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFuaW1hdG9yO1xuICAgIH0sXG5cblxuICAgIF9wcm9jZXNzR2VzdHVyZTogZnVuY3Rpb24gKGV2ZW50LCBzdGFnZSkge1xuICAgICAgICB2YXIgZ2VzdHVyZU1nciA9IHRoaXMuX2dlc3R1cmVNZ3I7XG5cbiAgICAgICAgc3RhZ2UgPT09ICdzdGFydCcgJiYgZ2VzdHVyZU1nci5jbGVhcigpO1xuXG4gICAgICAgIHZhciBnZXN0dXJlSW5mbyA9IGdlc3R1cmVNZ3IucmVjb2duaXplKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGhpcy5kb21FbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgc3RhZ2UgPT09ICdlbmQnICYmIGdlc3R1cmVNZ3IuY2xlYXIoKTtcblxuICAgICAgICAvLyBEbyBub3QgZG8gYW55IHByZXZlbnREZWZhdWx0IGhlcmUuIFVwcGVyIGFwcGxpY2F0aW9uIGRvIHRoYXQgaWYgbmVjZXNzYXJ5LlxuICAgICAgICBpZiAoZ2VzdHVyZUluZm8pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZ2VzdHVyZUluZm8udHlwZTtcbiAgICAgICAgICAgIGV2ZW50Lmdlc3R1cmVFdmVudCA9IHR5cGU7XG5cbiAgICAgICAgICAgIHRoaXMuX3BpbmNoSGFuZGxlcihnZXN0dXJlSW5mby5ldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2VzdHVyZUluZm87XG4gICAgfVxufSk7XG5cbi8qKlxuICogSWYgYXV0byByb3RhdGUgdGhlIHRhcmdldFxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT3JiaXRDb250cm9sLnByb3RvdHlwZSwgJ2F1dG9Sb3RhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvUm90YXRlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuX2F1dG9Sb3RhdGUgPSB2YWw7XG4gICAgICAgIHRoaXMuX3JvdGF0aW5nID0gdmFsO1xuICAgIH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT3JiaXRDb250cm9sLnByb3RvdHlwZSwgJ3RhcmdldCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBpZiAodmFsICYmIHZhbC50YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2VudGVyKHZhbC50YXJnZXQudG9BcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90YXJnZXQgPSB2YWw7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlVHJhbnNmb3JtKCk7XG4gICAgfVxufSk7XG5cblxuZXhwb3J0IGRlZmF1bHQgT3JiaXRDb250cm9sO1xuIiwiLyoqXG4gKiBTdGF0aWNHZW9tZXRyeSBjYW4gbm90IGJlIGNoYW5nZWQgb25jZSB0aGV5J3ZlIGJlZW4gc2V0dXBcbiAqL1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4vR2VvbWV0cnknO1xuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5TdGF0aWNHZW9tZXRyeVxuICogQGV4dGVuZHMgY2xheS5HZW9tZXRyeVxuICovXG52YXIgU3RhdGljR2VvbWV0cnkgPSBHZW9tZXRyeS5leHRlbmQoe1xuICAgIGR5bmFtaWM6IGZhbHNlXG59KTtcbmV4cG9ydCBkZWZhdWx0IFN0YXRpY0dlb21ldHJ5O1xuIiwiLy8gVE9ETyB0ZXN0XG5pbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuaW1wb3J0IE1lc2ggZnJvbSAnLi4vTWVzaCc7XG5pbXBvcnQgTm9kZSBmcm9tICcuLi9Ob2RlJztcbmltcG9ydCBTdGFuZGFyZE1hdGVyaWFsIGZyb20gJy4uL1N0YW5kYXJkTWF0ZXJpYWwnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICogQG5hbWVzcGFjZSBjbGF5LnV0aWwubWVzaFxuICovXG52YXIgbWVzaFV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogTWVyZ2UgbXVsdGlwbGUgbWVzaGVzIHRvIG9uZS5cbiAgICAgKiBOb3RlIHRoYXQgdGhlc2UgbWVzaGVzIG11c3QgaGF2ZSB0aGUgc2FtZSBtYXRlcmlhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48Y2xheS5NZXNoPn0gbWVzaGVzXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcHBseVdvcmxkVHJhbnNmb3JtXG4gICAgICogQHJldHVybiBjbGF5Lk1lc2hcbiAgICAgKiBAbWVtYmVyT2YgY2xheS51dGlsLm1lc2hcbiAgICAgKi9cbiAgICBtZXJnZTogZnVuY3Rpb24gKG1lc2hlcywgYXBwbHlXb3JsZFRyYW5zZm9ybSkge1xuXG4gICAgICAgIGlmICghIG1lc2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZW1wbGF0ZU1lc2ggPSBtZXNoZXNbMF07XG4gICAgICAgIHZhciB0ZW1wbGF0ZUdlbyA9IHRlbXBsYXRlTWVzaC5nZW9tZXRyeTtcbiAgICAgICAgdmFyIG1hdGVyaWFsID0gdGVtcGxhdGVNZXNoLm1hdGVyaWFsO1xuXG4gICAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSh7XG4gICAgICAgICAgICBkeW5hbWljOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcblxuICAgICAgICB2YXIgYXR0cmlidXRlTmFtZXMgPSB0ZW1wbGF0ZUdlby5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZXNbaV07XG4gICAgICAgICAgICB2YXIgYXR0ciA9IHRlbXBsYXRlR2VvLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICAvLyBFeHRlbmQgY3VzdG9tIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICghZ2VvbWV0cnkuYXR0cmlidXRlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyLmNsb25lKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnZlcnNlVHJhbnNwb3NlTWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXJyYXkgZGF0YSBhbmQgbWVyZ2UgYm91bmRpbmcgYm94XG4gICAgICAgIHZhciBuVmVydGV4ID0gMDtcbiAgICAgICAgdmFyIG5GYWNlID0gMDtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBtZXNoZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50R2VvID0gbWVzaGVzW2tdLmdlb21ldHJ5O1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRHZW8uYm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50R2VvLmJvdW5kaW5nQm94LmFwcGx5VHJhbnNmb3JtKGFwcGx5V29ybGRUcmFuc2Zvcm0gPyBtZXNoZXNba10ud29ybGRUcmFuc2Zvcm0gOiBtZXNoZXNba10ubG9jYWxUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmJvdW5kaW5nQm94LnVuaW9uKGN1cnJlbnRHZW8uYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgblZlcnRleCArPSBjdXJyZW50R2VvLnZlcnRleENvdW50O1xuICAgICAgICAgICAgbkZhY2UgKz0gY3VycmVudEdlby50cmlhbmdsZUNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZXNbbl07XG4gICAgICAgICAgICB2YXIgYXR0cmliID0gZ2VvbWV0cnkuYXR0cmlidXRlc1tuYW1lXTtcbiAgICAgICAgICAgIGF0dHJpYi5pbml0KG5WZXJ0ZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuVmVydGV4ID49IDB4ZmZmZikge1xuICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShuRmFjZSAqIDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShuRmFjZSAqIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZlcnRleE9mZnNldCA9IDA7XG4gICAgICAgIHZhciBpbmRpY2VzT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIHVzZUluZGljZXMgPSB0ZW1wbGF0ZUdlby5pc1VzZUluZGljZXMoKTtcblxuICAgICAgICBmb3IgKHZhciBtbSA9IDA7IG1tIDwgbWVzaGVzLmxlbmd0aDsgbW0rKykge1xuICAgICAgICAgICAgdmFyIG1lc2ggPSBtZXNoZXNbbW1dO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRHZW8gPSBtZXNoLmdlb21ldHJ5O1xuXG4gICAgICAgICAgICB2YXIgblZlcnRleCA9IGN1cnJlbnRHZW8udmVydGV4Q291bnQ7XG5cbiAgICAgICAgICAgIHZhciBtYXRyaXggPSBhcHBseVdvcmxkVHJhbnNmb3JtID8gbWVzaC53b3JsZFRyYW5zZm9ybS5hcnJheSA6IG1lc2gubG9jYWxUcmFuc2Zvcm0uYXJyYXk7XG4gICAgICAgICAgICBtYXQ0LmludmVydChpbnZlcnNlVHJhbnNwb3NlTWF0cml4LCBtYXRyaXgpO1xuICAgICAgICAgICAgbWF0NC50cmFuc3Bvc2UoaW52ZXJzZVRyYW5zcG9zZU1hdHJpeCwgaW52ZXJzZVRyYW5zcG9zZU1hdHJpeCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIG5uID0gMDsgbm4gPCBhdHRyaWJ1dGVOYW1lcy5sZW5ndGg7IG5uKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWVzW25uXTtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEF0dHIgPSBjdXJyZW50R2VvLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEF0dHIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIHVudXNlZCBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudEF0dHIudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbGVuID0gY3VycmVudEF0dHIudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gY3VycmVudEF0dHIuc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdmVydGV4T2Zmc2V0ICogc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBsZW4gLyBzaXplO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXR0ci52YWx1ZVtvZmZzZXQgKyBpXSA9IGN1cnJlbnRBdHRyLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gcG9zaXRpb24sIG5vcm1hbCBhbmQgdGFuZ2VudFxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAncG9zaXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzMuZm9yRWFjaCh0YXJnZXRBdHRyLnZhbHVlLCBzaXplLCBvZmZzZXQsIGNvdW50LCB2ZWMzLnRyYW5zZm9ybU1hdDQsIG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdub3JtYWwnIHx8IG5hbWUgPT09ICd0YW5nZW50Jykge1xuICAgICAgICAgICAgICAgICAgICB2ZWMzLmZvckVhY2godGFyZ2V0QXR0ci52YWx1ZSwgc2l6ZSwgb2Zmc2V0LCBjb3VudCwgdmVjMy50cmFuc2Zvcm1NYXQ0LCBpbnZlcnNlVHJhbnNwb3NlTWF0cml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1c2VJbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGN1cnJlbnRHZW8uaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzW2kgKyBpbmRpY2VzT2Zmc2V0XSA9IGN1cnJlbnRHZW8uaW5kaWNlc1tpXSArIHZlcnRleE9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kaWNlc09mZnNldCArPSBsZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlcnRleE9mZnNldCArPSBuVmVydGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNZXNoKHtcbiAgICAgICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcbiAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3BsaXQgbWVzaCBpbnRvIHN1YiBtZXNoZXMsIGVhY2ggbWVzaCB3aWxsIGhhdmUgbWF4Sm9pbnROdW1iZXIgam9pbnRzLlxuICAgICAqIEBwYXJhbSB7Y2xheS5NZXNofSBtZXNoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heEpvaW50TnVtYmVyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpblBsYWNlXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIGNsYXkudXRpbC5tZXNoXG4gICAgICovXG5cbiAgICAvLyBGSVhNRSwgSGF2ZSBpc3N1ZXMgb24gc29tZSBtb2RlbHNcbiAgICBzcGxpdEJ5Sm9pbnRzOiBmdW5jdGlvbiAobWVzaCwgbWF4Sm9pbnROdW1iZXIsIGluUGxhY2UpIHtcbiAgICAgICAgdmFyIGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeTtcbiAgICAgICAgdmFyIHNrZWxldG9uID0gbWVzaC5za2VsZXRvbjtcbiAgICAgICAgdmFyIG1hdGVyaWFsID0gbWVzaC5tYXRlcmlhbDtcbiAgICAgICAgdmFyIGpvaW50cyA9IG1lc2guam9pbnRzO1xuICAgICAgICBpZiAoIWdlb21ldHJ5IHx8ICFza2VsZXRvbiB8fCAham9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqb2ludHMubGVuZ3RoIDwgbWF4Sm9pbnROdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNoO1xuICAgICAgICB9XG5cblxuICAgICAgICB2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7XG5cbiAgICAgICAgdmFyIGZhY2VMZW4gPSBnZW9tZXRyeS50cmlhbmdsZUNvdW50O1xuICAgICAgICB2YXIgcmVzdCA9IGZhY2VMZW47XG4gICAgICAgIHZhciBpc0ZhY2VBZGRlZCA9IFtdO1xuICAgICAgICB2YXIgam9pbnRWYWx1ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLmpvaW50LnZhbHVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZhY2VMZW47IGkrKykge1xuICAgICAgICAgICAgaXNGYWNlQWRkZWRbaV0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWRkZWRKb2ludElkeFBlckZhY2UgPSBbXTtcblxuICAgICAgICB2YXIgYnVja2V0cyA9IFtdO1xuXG4gICAgICAgIHZhciBnZXRKb2ludEJ5SW5kZXggPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgICAgICByZXR1cm4gam9pbnRzW2lkeF07XG4gICAgICAgIH07XG4gICAgICAgIHdoaWxlIChyZXN0ID4gMCkge1xuICAgICAgICAgICAgdmFyIGJ1Y2tldFRyaWFuZ2xlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGJ1Y2tldEpvaW50UmV2ZXJzZU1hcCA9IFtdO1xuICAgICAgICAgICAgdmFyIGJ1Y2tldEpvaW50cyA9IFtdO1xuICAgICAgICAgICAgdmFyIHN1YkpvaW50TnVtYmVyID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRSZXZlcnNlTWFwW2ldID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGZhY2VMZW47IGYrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0ZhY2VBZGRlZFtmXSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNhbkFkZFRvQnVja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgYWRkZWROdW1iZXIgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IGluZGljZXNbZiAqIDMgKyBpXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpvaW50SWR4ID0gam9pbnRWYWx1ZXNbaWR4ICogNCArIGpdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoam9pbnRJZHggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXRKb2ludFJldmVyc2VNYXBbam9pbnRJZHhdID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViSm9pbnROdW1iZXIgPCBtYXhKb2ludE51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRSZXZlcnNlTWFwW2pvaW50SWR4XSA9IHN1YkpvaW50TnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRzW3N1YkpvaW50TnVtYmVyKytdID0gam9pbnRJZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEpvaW50SWR4UGVyRmFjZVthZGRlZE51bWJlcisrXSA9IGpvaW50SWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWRkVG9CdWNrZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbkFkZFRvQnVja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJldmVyc2Ugb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkZWROdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRSZXZlcnNlTWFwW2FkZGVkSm9pbnRJZHhQZXJGYWNlW2ldXSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViSm9pbnROdW1iZXItLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHJpYW5nbGVzLnB1c2goaW5kaWNlcy5zdWJhcnJheShmICogMywgKGYgKyAxKSAqIDMpKTtcblxuICAgICAgICAgICAgICAgICAgICBpc0ZhY2VBZGRlZFtmXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3QtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWNrZXRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRyaWFuZ2xlczogYnVja2V0VHJpYW5nbGVzLFxuICAgICAgICAgICAgICAgIGpvaW50czogYnVja2V0Sm9pbnRzLm1hcChnZXRKb2ludEJ5SW5kZXgpLFxuICAgICAgICAgICAgICAgIGpvaW50UmV2ZXJzZU1hcDogYnVja2V0Sm9pbnRSZXZlcnNlTWFwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByb290ID0gbmV3IE5vZGUoe1xuICAgICAgICAgICAgbmFtZTogbWVzaC5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYXR0cmliTmFtZXMgPSBnZW9tZXRyeS5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgIGF0dHJpYk5hbWVzLnNwbGljZShhdHRyaWJOYW1lcy5pbmRleE9mKCdqb2ludCcpLCAxKTtcbiAgICAgICAgLy8gTWFwIGZyb20gb2xkIHZlcnRleCBpbmRleCB0byBuZXcgdmVydGV4IGluZGV4XG4gICAgICAgIHZhciBuZXdJbmRpY2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYnVja2V0cy5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgdmFyIGJ1Y2tldCA9IGJ1Y2tldHNbYl07XG4gICAgICAgICAgICB2YXIgam9pbnRSZXZlcnNlTWFwID0gYnVja2V0LmpvaW50UmV2ZXJzZU1hcDtcbiAgICAgICAgICAgIHZhciBzdWJKb2ludE51bWJlciA9IGJ1Y2tldC5qb2ludHMubGVuZ3RoO1xuXG4gICAgICAgICAgICB2YXIgc3ViTWF0ID0gbWF0ZXJpYWwuY2xvbmUoKTtcbiAgICAgICAgICAgIHN1Yk1hdC5uYW1lID0gW21hdGVyaWFsLm5hbWUsIGJdLmpvaW4oJy0nKTtcblxuICAgICAgICAgICAgdmFyIHN1YkdlbyA9IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgICAgICAgICB2YXIgc3ViTWVzaCA9IG5ldyBNZXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBbbWVzaC5uYW1lLCBpXS5qb2luKCctJyksXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWw6IHN1Yk1hdCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogc3ViR2VvLFxuICAgICAgICAgICAgICAgIHNrZWxldG9uOiBza2VsZXRvbixcbiAgICAgICAgICAgICAgICBqb2ludHM6IGJ1Y2tldC5qb2ludHMuc2xpY2UoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgblZlcnRleCA9IDA7XG4gICAgICAgICAgICB2YXIgblZlcnRleDIgPSBnZW9tZXRyeS52ZXJ0ZXhDb3VudDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblZlcnRleDI7IGkrKykge1xuICAgICAgICAgICAgICAgIG5ld0luZGljZXNbaV0gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50IHN1YiBnZW8gbnVtYmVyXG4gICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGJ1Y2tldC50cmlhbmdsZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmFjZSA9IGJ1Y2tldC50cmlhbmdsZXNbZl07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IGZhY2VbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbmRpY2VzW2lkeF0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbmRpY2VzW2lkeF0gPSBuVmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgblZlcnRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdHRyaWJOYW1lcy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJOYW1lID0gYXR0cmliTmFtZXNbYV07XG4gICAgICAgICAgICAgICAgdmFyIHN1YkF0dHJpYiA9IHN1Ykdlby5hdHRyaWJ1dGVzW2F0dHJpYk5hbWVdO1xuICAgICAgICAgICAgICAgIHN1YkF0dHJpYi5pbml0KG5WZXJ0ZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViR2VvLmF0dHJpYnV0ZXMuam9pbnQudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KG5WZXJ0ZXggKiA0KTtcblxuICAgICAgICAgICAgaWYgKG5WZXJ0ZXggPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICBzdWJHZW8uaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShidWNrZXQudHJpYW5nbGVzLmxlbmd0aCAqIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViR2VvLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoYnVja2V0LnRyaWFuZ2xlcy5sZW5ndGggKiAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGluZGljZXNPZmZzZXQgPSAwO1xuICAgICAgICAgICAgblZlcnRleCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5WZXJ0ZXgyOyBpKyspIHtcbiAgICAgICAgICAgICAgICBuZXdJbmRpY2VzW2ldID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGYgPSAwOyBmIDwgYnVja2V0LnRyaWFuZ2xlcy5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciB0cmlhbmdsZSA9IGJ1Y2tldC50cmlhbmdsZXNbZl07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdHJpYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0luZGljZXNbaWR4XSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luZGljZXNbaWR4XSA9IG5WZXJ0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGF0dHJpYk5hbWVzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYk5hbWUgPSBhdHRyaWJOYW1lc1thXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmliID0gZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViQXR0cmliID0gc3ViR2VvLmF0dHJpYnV0ZXNbYXR0cmliTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemUgPSBhdHRyaWIuc2l6ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkF0dHJpYi52YWx1ZVtuVmVydGV4ICogc2l6ZSArIGpdID0gYXR0cmliLnZhbHVlW2lkeCAqIHNpemUgKyBqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqb2ludElkeCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuam9pbnQudmFsdWVbaWR4ICogNCArIGpdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBuVmVydGV4ICogNCArIGo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW50SWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViR2VvLmF0dHJpYnV0ZXMuam9pbnQudmFsdWVbb2Zmc2V0XSA9IGpvaW50UmV2ZXJzZU1hcFtqb2ludElkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJHZW8uYXR0cmlidXRlcy5qb2ludC52YWx1ZVtvZmZzZXRdID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgblZlcnRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1Ykdlby5pbmRpY2VzW2luZGljZXNPZmZzZXQrK10gPSBuZXdJbmRpY2VzW2lkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViR2VvLnVwZGF0ZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgICAgICAgIHJvb3QuYWRkKHN1Yk1lc2gpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG1lc2guY2hpbGRyZW4oKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm9vdC5hZGQoY2hpbGRyZW5baV0pO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QucG9zaXRpb24uY29weShtZXNoLnBvc2l0aW9uKTtcbiAgICAgICAgcm9vdC5yb3RhdGlvbi5jb3B5KG1lc2gucm90YXRpb24pO1xuICAgICAgICByb290LnNjYWxlLmNvcHkobWVzaC5zY2FsZSk7XG5cbiAgICAgICAgaWYgKGluUGxhY2UpIHtcbiAgICAgICAgICAgIGlmIChtZXNoLmdldFBhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IG1lc2guZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZShtZXNoKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuYWRkKHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc2hVdGlsO1xuIiwiaW1wb3J0IHV0aWwgZnJvbSAnLi4vY29yZS91dGlsJztcbmltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi4vbWF0aC9Cb3VuZGluZ0JveCc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG52YXIgTUVUQSA9IHtcbiAgICB2ZXJzaW9uOiAxLjAsXG4gICAgdHlwZTogJ0dlb21ldHJ5JyxcbiAgICBnZW5lcmF0b3I6ICd1dGlsLnRyYW5zZmVyYWJsZS50b09iamVjdCdcbn07XG5cbi8qKlxuICogQGFsaWFzIGNsYXkudXRpbC50cmFuc2ZlcmFibGVcbiAqL1xudmFyIHRyYW5zZmVyYWJsZVV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogQ29udmVydCBnZW9tZXRyeSB0byBhIG9iamVjdCBjb250YWluaW5nIHRyYW5zZmVyYWJsZSBkYXRhXG4gICAgICogQHBhcmFtIHtHZW9tZXRyeX0gZ2VvbWV0cnkgZ2VvbWV0cnlcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNoYWxsb3cgd2hldGhlciBzaGFsbG93IGNvcHlcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IGRhdGEgOiBkYXRhLCBidWZmZXJzIDogYnVmZmVycyB9LCBidWZmZXJzIGlzIHRoZSB0cmFuc2ZlcmFibGUgbGlzdFxuICAgICAqL1xuICAgIHRvT2JqZWN0IDogZnVuY3Rpb24gKGdlb21ldHJ5LCBzaGFsbG93KSB7XG4gICAgICAgIGlmICghZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgbWV0YWRhdGEgOiB1dGlsLmV4dGVuZCh7fSwgTUVUQSlcbiAgICAgICAgfTtcbiAgICAgICAgLy90cmFuc2ZlcmFibGUgYnVmZmVyc1xuICAgICAgICB2YXIgYnVmZmVycyA9IFtdO1xuXG4gICAgICAgIC8vZHluYW1pY1xuICAgICAgICBkYXRhLmR5bmFtaWMgPSBnZW9tZXRyeS5keW5hbWljO1xuXG4gICAgICAgIC8vYm91bmRpbmcgYm94XG4gICAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ0JveCkge1xuICAgICAgICAgICAgZGF0YS5ib3VuZGluZ0JveCA9IHtcbiAgICAgICAgICAgICAgICBtaW4gOiBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLFxuICAgICAgICAgICAgICAgIG1heCA6IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC50b0FycmF5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvL2luZGljZXNcbiAgICAgICAgaWYgKGdlb21ldHJ5LmluZGljZXMgJiYgZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkYXRhLmluZGljZXMgPSBjb3B5SWZOZWNlc3NhcnkoZ2VvbWV0cnkuaW5kaWNlcywgc2hhbGxvdyk7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goZGF0YS5pbmRpY2VzLmJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2F0dHJpYnV0ZXNcbiAgICAgICAgZGF0YS5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gZ2VvbWV0cnkuYXR0cmlidXRlcykgeyBcbiAgICAgICAgICAgIGlmIChnZW9tZXRyeS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzW3BdO1xuICAgICAgICAgICAgICAgIC8vaWdub3JlIGVtcHR5IGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICBpZiAoYXR0ciAmJiBhdHRyLnZhbHVlICYmIGF0dHIudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyID0gZGF0YS5hdHRyaWJ1dGVzW3BdID0gY29weUF0dHJpYnV0ZShhdHRyLCBzaGFsbG93KTtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGF0dHIudmFsdWUuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBidWZmZXJzIDogYnVmZmVyc1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcm9kdWNlIGEgZ2VvbWV0cnkgZnJvbSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRvT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRvT2JqZWN0XG4gICAgICogQHJldHVybnMge0dlb21ldHJ5fSBnZW9tZXRyeVxuICAgICAqL1xuICAgIHRvR2VvbWV0cnkgOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0LmRhdGEgJiYgb2JqZWN0LmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2ZlcmFibGVVdGlsLnRvR2VvbWV0cnkob2JqZWN0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb2JqZWN0Lm1ldGFkYXRhIHx8IG9iamVjdC5tZXRhZGF0YS5nZW5lcmF0b3IgIT09IE1FVEEuZ2VuZXJhdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1t1dGlsLnRyYW5zZmVyYWJsZS50b0dlb21ldHJ5XSB0aGUgb2JqZWN0IGlzIG5vdCBnZW5lcmF0ZWQgYnkgdXRpbC50cmFuc2ZlcmFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2Jhc2ljIG9wdGlvbnNcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBkeW5hbWljIDogb2JqZWN0LmR5bmFtaWMsXG4gICAgICAgICAgICBpbmRpY2VzIDogb2JqZWN0LmluZGljZXNcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob2JqZWN0LmJvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICB2YXIgbWluID0gbmV3IFZlY3RvcjMoKS5zZXRBcnJheShvYmplY3QuYm91bmRpbmdCb3gubWluKTtcbiAgICAgICAgICAgIHZhciBtYXggPSBuZXcgVmVjdG9yMygpLnNldEFycmF5KG9iamVjdC5ib3VuZGluZ0JveC5tYXgpO1xuICAgICAgICAgICAgb3B0aW9ucy5ib3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveChtaW4sIG1heCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2F0dHJpYnV0ZXNcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBvYmplY3QuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKG9iamVjdC5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBvYmplY3QuYXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW3BdID0gbmV3IEdlb21ldHJ5LkF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudHlwZSwgYXR0ci5zaXplLCBhdHRyLnNlbWFudGljKTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW3BdLnZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnkob3B0aW9ucyk7XG4gICAgfVxuICAgIFxufVxuXG5mdW5jdGlvbiBjb3B5QXR0cmlidXRlKGF0dHIsIHNoYWxsb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lIDogYXR0ci5uYW1lLFxuICAgICAgICB0eXBlIDogYXR0ci50eXBlLFxuICAgICAgICBzaXplIDogYXR0ci5zaXplLFxuICAgICAgICBzZW1hbnRpYyA6IGF0dHIuc2VtYW50aWMsXG4gICAgICAgIHZhbHVlIDogY29weUlmTmVjZXNzYXJ5KGF0dHIudmFsdWUsIHNoYWxsb3cpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29weUlmTmVjZXNzYXJ5KGFyciwgc2hhbGxvdykge1xuICAgIGlmICghc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gbmV3IGFyci5jb25zdHJ1Y3RvcihhcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB0cmFuc2ZlcmFibGVVdGlsO1xuIiwiLyoqXG4gKiBAbmFtZSBjbGF5LnZlcnNpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgJzEuMC4wLXJjLjEnO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkudnIuZGlzb3J0ZXIub3V0cHV0LnZlcnRleFxcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkOiBURVhDT09SRF8wO1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOiBQT1NJVElPTjtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueHksIDAuNSwgMS4wKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS52ci5kaXNvcnRlci5vdXRwdXQuZnJhZ21lbnRcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgdl9UZXhjb29yZCk7XFxufVxcbkBlbmRcIjtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGV2ci93ZWJ2ci1wb2x5ZmlsbC9ibG9iL21hc3Rlci9zcmMvY2FyZGJvYXJkLWRpc3RvcnRlci5qc1xuXG4vLyBVc2Ugd2VidnIgbWF5IGhhdmUgc2NhbGUgcHJvYmxlbS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGV2ci93ZWJ2ci1wb2x5ZmlsbC9pc3N1ZXMvMTQwXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xldnIvd2VidnItcG9seWZpbGwvc2VhcmNoP3E9U0NBTEUmdHlwZT1Jc3N1ZXMmdXRmOD0lRTIlOUMlOTNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGV2ci93ZWJ2ci1wb2x5ZmlsbC9pc3N1ZXMvMTQ3XG5cblxuaW1wb3J0IE1lc2ggZnJvbSAnLi4vTWVzaCc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4uL0dlb21ldHJ5JztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgUGVyc3BlY3RpdmVDYW1lcmEgZnJvbSAnLi4vY2FtZXJhL1BlcnNwZWN0aXZlJztcblxuaW1wb3J0IG91dHB1dEVzc2wgZnJvbSAnLi9vdXRwdXQuZ2xzbC5qcyc7XG5cblNoYWRlci5pbXBvcnQob3V0cHV0RXNzbCk7XG5cbmZ1bmN0aW9uIGxlcnAgKGEsIGIsIHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbn1cblxudmFyIENhcmRib2FyZERpc3RvcnRlciA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuXG4gICAgICAgIGNsZWFyQ29sb3I6IFswLCAwLCAwLCAxXSxcblxuICAgICAgICBfbWVzaDogbmV3IE1lc2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ldyBHZW9tZXRyeSh7XG4gICAgICAgICAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjdWxsaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG1hdGVyaWFsOiBuZXcgTWF0ZXJpYWwoe1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIFdoeSBkaXNhYmxlIGRlcHRoTWFzayB3aWxsIGJlIHdyb25nXG4gICAgICAgICAgICAgICAgLy8gZGVwdGhNYXNrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNoYWRlcjogbmV3IFNoYWRlcih7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleDogU2hhZGVyLnNvdXJjZSgnY2xheS52ci5kaXNvcnRlci5vdXRwdXQudmVydGV4JyksXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50OiBTaGFkZXIuc291cmNlKCdjbGF5LnZyLmRpc29ydGVyLm91dHB1dC5mcmFnbWVudCcpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICBfZmFrZUNhbWVyYTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKClcbiAgICB9O1xufSwge1xuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHNvdXJjZVRleHR1cmUpIHtcbiAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XG4gICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBnbC5jbGVhckNvbG9yKGNsZWFyQ29sb3JbMF0sIGNsZWFyQ29sb3JbMV0sIGNsZWFyQ29sb3JbMl0sIGNsZWFyQ29sb3JbM10pO1xuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcblxuICAgICAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcblxuICAgICAgICB0aGlzLl9tZXNoLm1hdGVyaWFsLnNldCgndGV4dHVyZScsIHNvdXJjZVRleHR1cmUpO1xuXG4gICAgICAgIC8vIEZ1bGwgc2l6ZT9cbiAgICAgICAgcmVuZGVyZXIuc2F2ZVZpZXdwb3J0KCk7XG4gICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KDAsIDAsIHJlbmRlcmVyLmdldFdpZHRoKCksIHJlbmRlcmVyLmdldEhlaWdodCgpKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyUGFzcyhbdGhpcy5fbWVzaF0sIHRoaXMuX2Zha2VDYW1lcmEpO1xuICAgICAgICByZW5kZXJlci5yZXN0b3JlVmlld3BvcnQoKTtcbiAgICAgICAgLy8gdGhpcy5fbWVzaC5tYXRlcmlhbC5zaGFkZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIC8vIHRoaXMuX21lc2gubWF0ZXJpYWwuYmluZChyZW5kZXJlcik7XG4gICAgICAgIC8vIHRoaXMuX21lc2gucmVuZGVyKHJlbmRlcmVyLmdsKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlRnJvbVZSRGlzcGxheTogZnVuY3Rpb24gKHZyRGlzcGxheSkge1xuXG4gICAgICAgIC8vIEZJWE1FXG4gICAgICAgIGlmICh2ckRpc3BsYXkuZGV2aWNlSW5mb18pIHtcbiAgICAgICAgICAgIC8vIEhhcmRjb2RlZCBtZXNoIHNpemVcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1lc2goMjAsIDIwLCB2ckRpc3BsYXkuZGV2aWNlSW5mb18pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDYW50IGdldCB2ckRpc3BsYXkuZGV2aWNlSW5mb18sIHNlZW1zIGNvZGUgY2hhbmdlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF91cGRhdGVNZXNoOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgZGV2aWNlSW5mbykge1xuXG4gICAgICAgIHZhciBwb3NpdGlvbkF0dHIgPSB0aGlzLl9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG4gICAgICAgIHZhciB0ZXhjb29yZEF0dHIgPSB0aGlzLl9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMudGV4Y29vcmQwO1xuICAgICAgICBwb3NpdGlvbkF0dHIuaW5pdCgyICogd2lkdGggKiBoZWlnaHQpO1xuICAgICAgICB0ZXhjb29yZEF0dHIuaW5pdCgyICogd2lkdGggKiBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBsZW5zRnJ1c3R1bSA9IGRldmljZUluZm8uZ2V0TGVmdEV5ZVZpc2libGVUYW5BbmdsZXMoKTtcbiAgICAgICAgdmFyIG5vTGVuc0ZydXN0dW0gPSBkZXZpY2VJbmZvLmdldExlZnRFeWVOb0xlbnNUYW5BbmdsZXMoKTtcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gZGV2aWNlSW5mby5nZXRMZWZ0RXllVmlzaWJsZVNjcmVlblJlY3Qobm9MZW5zRnJ1c3R1bSk7XG4gICAgICAgIHZhciB2aWR4ID0gMDtcblxuICAgICAgICB2YXIgcG9zID0gW107XG4gICAgICAgIHZhciB1diA9IFtdO1xuXG4gICAgICAgIC8vIFZlcnRpY2VzXG4gICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgMjsgZSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aDsgaSsrLCB2aWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBpIC8gKHdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gaiAvIChoZWlnaHQgLSAxKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBHcmlkIHBvaW50cyByZWd1bGFybHkgc3BhY2VkIGluIFN0cmVvU2NyZWVuLCBhbmQgYmFycmVsIGRpc3RvcnRlZCBpblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzaC5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB1O1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHY7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbGVycChsZW5zRnJ1c3R1bVswXSwgbGVuc0ZydXN0dW1bMl0sIHUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IGxlcnAobGVuc0ZydXN0dW1bM10sIGxlbnNGcnVzdHVtWzFdLCB2KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gZGV2aWNlSW5mby5kaXN0b3J0aW9uLmRpc3RvcnRJbnZlcnNlKGQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHggKiByIC8gZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSB5ICogciAvIGQ7XG4gICAgICAgICAgICAgICAgICAgIHUgPSAocCAtIG5vTGVuc0ZydXN0dW1bMF0pIC8gKG5vTGVuc0ZydXN0dW1bMl0gLSBub0xlbnNGcnVzdHVtWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdiA9IChxIC0gbm9MZW5zRnJ1c3R1bVszXSkgLyAobm9MZW5zRnJ1c3R1bVsxXSAtIG5vTGVuc0ZydXN0dW1bM10pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdSx2IHRvIG1lc2ggc2NyZWVuIGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgICAgICAgICB2YXIgYXNwZWN0ID0gZGV2aWNlSW5mby5kZXZpY2Uud2lkdGhNZXRlcnMgLyBkZXZpY2VJbmZvLmRldmljZS5oZWlnaHRNZXRlcnM7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoZSBvcmlnaW5hbCBVbml0eSBwbHVnaW4gbXVsdGlwbGllZCBVIGJ5IHRoZSBhc3BlY3QgcmF0aW9cbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRpZG4ndCBtdWx0aXBseSBlaXRoZXIgdmFsdWUgYnkgMiwgYnV0IHRoYXQgc2VlbXMgdG8gZ2V0IGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBjbG9zZSB0byBjb3JyZWN0IGxvb2tpbmcgZm9yIG1lLiBJIGhhdGUgdGhpcyBraW5kIG9mIFwiRG9uJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8ga25vdyB3aHkgaXQgd29ya3NcIiBjb2RlIHRob3VnaCwgYW5kIHdvbGQgbG92ZSBhIG1vcmUgbG9naWNhbFxuICAgICAgICAgICAgICAgICAgICAvLyBleHBsYW5hdGlvbiBvZiB3aGF0IG5lZWRzIHRvIGhhcHBlbiBoZXJlLlxuICAgICAgICAgICAgICAgICAgICB1ID0gKHZpZXdwb3J0LnggKyB1ICogdmlld3BvcnQud2lkdGggLSAwLjUpICogMi4wOyAvLyogYXNwZWN0O1xuICAgICAgICAgICAgICAgICAgICB2ID0gKHZpZXdwb3J0LnkgKyB2ICogdmlld3BvcnQuaGVpZ2h0IC0gMC41KSAqIDIuMDtcblxuICAgICAgICAgICAgICAgICAgICBwb3NbMF0gPSB1O1xuICAgICAgICAgICAgICAgICAgICBwb3NbMV0gPSB2O1xuICAgICAgICAgICAgICAgICAgICBwb3NbMl0gPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIHV2WzBdID0gcyAqIDAuNSArIGUgKiAwLjU7XG4gICAgICAgICAgICAgICAgICAgIHV2WzFdID0gdDtcblxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkF0dHIuc2V0KHZpZHgsIHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHRleGNvb3JkQXR0ci5zZXQodmlkeCwgdXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHcgPSBsZW5zRnJ1c3R1bVsyXSAtIGxlbnNGcnVzdHVtWzBdO1xuICAgICAgICAgICAgbGVuc0ZydXN0dW1bMF0gPSAtKHcgKyBsZW5zRnJ1c3R1bVswXSk7XG4gICAgICAgICAgICBsZW5zRnJ1c3R1bVsyXSA9IHcgLSBsZW5zRnJ1c3R1bVsyXTtcbiAgICAgICAgICAgIHcgPSBub0xlbnNGcnVzdHVtWzJdIC0gbm9MZW5zRnJ1c3R1bVswXTtcbiAgICAgICAgICAgIG5vTGVuc0ZydXN0dW1bMF0gPSAtKHcgKyBub0xlbnNGcnVzdHVtWzBdKTtcbiAgICAgICAgICAgIG5vTGVuc0ZydXN0dW1bMl0gPSB3IC0gbm9MZW5zRnJ1c3R1bVsyXTtcbiAgICAgICAgICAgIHZpZXdwb3J0LnggPSAxIC0gKHZpZXdwb3J0LnggKyB2aWV3cG9ydC53aWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmRpY2VzXG4gICAgICAgIHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KDIgKiAod2lkdGggLSAxKSAqIChoZWlnaHQgLSAxKSAqIDYpO1xuICAgICAgICB2YXIgaGFsZndpZHRoID0gd2lkdGggLyAyO1xuICAgICAgICB2YXIgaGFsZmhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgICAgIHZhciB2aWR4ID0gMDtcbiAgICAgICAgdmFyIGlpZHggPSAwO1xuICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IDI7IGUrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkdGg7IGkrKywgdmlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IGogPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgcXVhZC4gIExvd2VyIHJpZ2h0IGFuZCB1cHBlciBsZWZ0IHF1YWRyYW50cyBoYXZlIHF1YWRzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWFuZ2xlIGRpYWdvbmFsIGZsaXBwZWQgdG8gZ2V0IHRoZSB2aWduZXR0ZSB0byBpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoaSA8PSBoYWxmd2lkdGgpID09IChqIDw9IGhhbGZoZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWFkIGRpYWdvbmFsIGxvd2VyIGxlZnQgdG8gdXBwZXIgcmlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpaWR4KytdID0gdmlkeCAtIHdpZHRoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpaWR4KytdID0gdmlkeCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWFkIGRpYWdvbmFsIHVwcGVyIGxlZnQgdG8gbG93ZXIgcmlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4IC0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tZXNoLmdlb21ldHJ5LmluZGljZXMgPSBpbmRpY2VzO1xuXG4gICAgICAgIHRoaXMuX21lc2guZ2VvbWV0cnkuZGlydHkoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FyZGJvYXJkRGlzdG9ydGVyO1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi4vTm9kZSc7XG5pbXBvcnQgQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgTWF0cml4NCBmcm9tICcuLi9tYXRoL01hdHJpeDQnO1xuXG52YXIgdG1wUHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbnZhciBTdGVyZW9DYW1lcmEgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgICAgICBhc3BlY3Q6IDAuNSxcblxuICAgICAgICBfbGVmdENhbWVyYTogbmV3IENhbWVyYSgpLFxuXG4gICAgICAgIF9yaWdodENhbWVyYTogbmV3IENhbWVyYSgpLFxuXG4gICAgICAgIF9leWVMZWZ0OiBuZXcgTWF0cml4NCgpLFxuICAgICAgICBfZXllUmlnaHQ6IG5ldyBNYXRyaXg0KCksXG5cbiAgICAgICAgX2ZyYW1lRGF0YTogbnVsbFxuICAgIH07XG59LCB7XG5cbiAgICB1cGRhdGVGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoY2FtZXJhLCBmb2N1cywgem9vbSwgZXllU2VwKSB7XG4gICAgICAgIGlmIChjYW1lcmEudHJhbnNmb3JtTmVlZHNVcGRhdGUoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdOb2RlIHRyYW5zZm9ybSBpcyBub3QgdXBkYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9jdXMgPSBmb2N1cyA9PSBudWxsID8gMTAgOiBmb2N1cztcbiAgICAgICAgem9vbSA9IHpvb20gPT0gbnVsbCA/IDEgOiB6b29tO1xuICAgICAgICBleWVTZXAgPSBleWVTZXAgPT0gbnVsbCA/IDAuMDY0IDogZXllU2VwO1xuXG4gICAgICAgIHZhciBmb3YgPSBjYW1lcmEuZm92O1xuICAgICAgICB2YXIgYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuICAgICAgICB2YXIgbmVhciA9IGNhbWVyYS5uZWFyO1xuXG4gICAgICAgIC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb25cbiAgICAgICAgLy8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci9cblxuICAgICAgICB0bXBQcm9qZWN0aW9uTWF0cml4LmNvcHkoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICB2YXIgZXllU2VwID0gZXllU2VwIC8gMjtcbiAgICAgICAgdmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1cztcbiAgICAgICAgdmFyIHltYXggPSAobmVhciAqIE1hdGgudGFuKE1hdGguUEkgLyAxODAgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcbiAgICAgICAgdmFyIHhtaW4sIHhtYXg7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRlIHhPZmZzZXRcbiAgICAgICAgdGhpcy5fZXllTGVmdC5hcnJheVsxMl0gPSAtIGV5ZVNlcDtcbiAgICAgICAgdGhpcy5fZXllUmlnaHQuYXJyYXlbMTJdID0gZXllU2VwO1xuXG4gICAgICAgIC8vIGZvciBsZWZ0IGV5ZVxuICAgICAgICB4bWluID0gLSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuICAgICAgICB4bWF4ID0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuICAgICAgICB0bXBQcm9qZWN0aW9uTWF0cml4LmFycmF5WzBdID0gMiAqIG5lYXIgLyAoeG1heCAtIHhtaW4pO1xuICAgICAgICB0bXBQcm9qZWN0aW9uTWF0cml4LmFycmF5WzhdID0gKHhtYXggKyB4bWluICkgLyAoeG1heCAtIHhtaW4pO1xuXG4gICAgICAgIHRoaXMuX2xlZnRDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KHRtcFByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgIC8vIGZvciByaWdodCBleWVcbiAgICAgICAgeG1pbiA9IC0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcbiAgICAgICAgeG1heCA9IHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cbiAgICAgICAgdG1wUHJvamVjdGlvbk1hdHJpeC5hcnJheVswXSA9IDIgKiBuZWFyIC8gKHhtYXggLSB4bWluKTtcbiAgICAgICAgdG1wUHJvamVjdGlvbk1hdHJpeC5hcnJheVs4XSA9ICh4bWF4ICsgeG1pbiApIC8gKHhtYXggLSB4bWluKTtcblxuICAgICAgICB0aGlzLl9yaWdodENhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkodG1wUHJvamVjdGlvbk1hdHJpeCk7XG5cbiAgICAgICAgdGhpcy5fbGVmdENhbWVyYS53b3JsZFRyYW5zZm9ybVxuICAgICAgICAgICAgLmNvcHkoY2FtZXJhLndvcmxkVHJhbnNmb3JtKVxuICAgICAgICAgICAgLm11bHRpcGx5KHRoaXMuX2V5ZUxlZnQpO1xuXG4gICAgICAgIHRoaXMuX3JpZ2h0Q2FtZXJhLndvcmxkVHJhbnNmb3JtXG4gICAgICAgICAgICAuY29weShjYW1lcmEud29ybGRUcmFuc2Zvcm0pXG4gICAgICAgICAgICAubXVsdGlwbHkodGhpcy5fZXllUmlnaHQpO1xuXG4gICAgICAgIHRoaXMuX2xlZnRDYW1lcmEuZGVjb21wb3NlV29ybGRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdGhpcy5fbGVmdENhbWVyYS5kZWNvbXBvc2VQcm9qZWN0aW9uTWF0cml4KCk7XG5cbiAgICAgICAgdGhpcy5fcmlnaHRDYW1lcmEuZGVjb21wb3NlV29ybGRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdGhpcy5fcmlnaHRDYW1lcmEuZGVjb21wb3NlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVGcm9tVlJEaXNwbGF5OiBmdW5jdGlvbiAodnJEaXNwbGF5LCBwYXJlbnROb2RlKSB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBWUkZyYW1lRGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmcmFtZURhdGEgPSB0aGlzLl9mcmFtZURhdGEgfHwgKHRoaXMuX2ZyYW1lRGF0YSA9IG5ldyBWUkZyYW1lRGF0YSgpKTtcbiAgICAgICAgdnJEaXNwbGF5LmdldEZyYW1lRGF0YShmcmFtZURhdGEpO1xuICAgICAgICB2YXIgbGVmdENhbWVyYSA9IHRoaXMuX2xlZnRDYW1lcmE7XG4gICAgICAgIHZhciByaWdodENhbWVyYSA9IHRoaXMuX3JpZ2h0Q2FtZXJhO1xuXG4gICAgICAgIGxlZnRDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5zZXRBcnJheShmcmFtZURhdGEubGVmdFByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICBsZWZ0Q2FtZXJhLmRlY29tcG9zZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgbGVmdENhbWVyYS52aWV3TWF0cml4LnNldEFycmF5KGZyYW1lRGF0YS5sZWZ0Vmlld01hdHJpeCk7XG4gICAgICAgIGxlZnRDYW1lcmEuc2V0Vmlld01hdHJpeChsZWZ0Q2FtZXJhLnZpZXdNYXRyaXgpO1xuXG4gICAgICAgIHJpZ2h0Q2FtZXJhLnByb2plY3Rpb25NYXRyaXguc2V0QXJyYXkoZnJhbWVEYXRhLnJpZ2h0UHJvamVjdGlvbk1hdHJpeCk7XG4gICAgICAgIHJpZ2h0Q2FtZXJhLmRlY29tcG9zZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgcmlnaHRDYW1lcmEudmlld01hdHJpeC5zZXRBcnJheShmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4KTtcbiAgICAgICAgcmlnaHRDYW1lcmEuc2V0Vmlld01hdHJpeChyaWdodENhbWVyYS52aWV3TWF0cml4KTtcblxuICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLndvcmxkVHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS50cmFuc2Zvcm1OZWVkc1VwZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdOb2RlIHRyYW5zZm9ybSBpcyBub3QgdXBkYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVmdENhbWVyYS53b3JsZFRyYW5zZm9ybS5tdWx0aXBseUxlZnQocGFyZW50Tm9kZS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICBsZWZ0Q2FtZXJhLmRlY29tcG9zZVdvcmxkVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICByaWdodENhbWVyYS53b3JsZFRyYW5zZm9ybS5tdWx0aXBseUxlZnQocGFyZW50Tm9kZS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICByaWdodENhbWVyYS5kZWNvbXBvc2VXb3JsZFRyYW5zZm9ybSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldExlZnRDYW1lcmE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xlZnRDYW1lcmE7XG4gICAgfSxcblxuICAgIGdldFJpZ2h0Q2FtZXJhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yaWdodENhbWVyYTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU3RlcmVvQ2FtZXJhO1xuIiwiLyoqIEBuYW1lc3BhY2UgY2xheSAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5tYXRoICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LmFuaW1hdGlvbiAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5hc3luYyAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5jYW1lcmEgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkuY29tcG9zaXRvciAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5jb3JlICovXG4vKiogQG5hbWVzcGFjZSBjbGF5Lmdlb21ldHJ5ICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LmhlbHBlciAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5saWdodCAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5sb2FkZXIgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkucGFydGljbGVTeXN0ZW0gKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkucGx1Z2luICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LnByZVBhc3MgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkuc2hhZGVyICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LnRleHR1cmUgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkudXRpbCAqL1xuXG5pbXBvcnQgQW5pbWF0b3IkMCBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRvcic7XG5pbXBvcnQgQmxlbmQxRENsaXAkMSBmcm9tICcuL2FuaW1hdGlvbi9CbGVuZDFEQ2xpcCc7XG5pbXBvcnQgQmxlbmQyRENsaXAkMiBmcm9tICcuL2FuaW1hdGlvbi9CbGVuZDJEQ2xpcCc7XG5pbXBvcnQgQ2xpcCQzIGZyb20gJy4vYW5pbWF0aW9uL0NsaXAnO1xuaW1wb3J0IGVhc2luZyQ0IGZyb20gJy4vYW5pbWF0aW9uL2Vhc2luZyc7XG5pbXBvcnQgU2FtcGxlclRyYWNrJDUgZnJvbSAnLi9hbmltYXRpb24vU2FtcGxlclRyYWNrJztcbmltcG9ydCBUaW1lbGluZSQ2IGZyb20gJy4vYW5pbWF0aW9uL1RpbWVsaW5lJztcbmltcG9ydCBUcmFja0NsaXAkNyBmcm9tICcuL2FuaW1hdGlvbi9UcmFja0NsaXAnO1xuaW1wb3J0IFRyYW5zZm9ybVRyYWNrJDggZnJvbSAnLi9hbmltYXRpb24vVHJhbnNmb3JtVHJhY2snO1xuaW1wb3J0IGFwcGxpY2F0aW9uJDkgZnJvbSAnLi9hcHBsaWNhdGlvbic7XG5pbXBvcnQgVGFzayQxMCBmcm9tICcuL2FzeW5jL1Rhc2snO1xuaW1wb3J0IFRhc2tHcm91cCQxMSBmcm9tICcuL2FzeW5jL1Rhc2tHcm91cCc7XG5pbXBvcnQgQ2FtZXJhJDEyIGZyb20gJy4vQ2FtZXJhJztcbmltcG9ydCBPcnRob2dyYXBoaWMkMTMgZnJvbSAnLi9jYW1lcmEvT3J0aG9ncmFwaGljJztcbmltcG9ydCBQZXJzcGVjdGl2ZSQxNCBmcm9tICcuL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgTWF0ZXJpYWwkMTUgZnJvbSAnLi9jYW52YXMvTWF0ZXJpYWwnO1xuaW1wb3J0IFJlbmRlcmVyJDE2IGZyb20gJy4vY2FudmFzL1JlbmRlcmVyJztcbmltcG9ydCBDb21wb3NpdG9yJDE3IGZyb20gJy4vY29tcG9zaXRvci9Db21wb3NpdG9yJztcbmltcG9ydCBjcmVhdGVDb21wb3NpdG9yJDE4IGZyb20gJy4vY29tcG9zaXRvci9jcmVhdGVDb21wb3NpdG9yJztcbmltcG9ydCBGaWx0ZXJOb2RlJDE5IGZyb20gJy4vY29tcG9zaXRvci9GaWx0ZXJOb2RlJztcbmltcG9ydCBHcmFwaCQyMCBmcm9tICcuL2NvbXBvc2l0b3IvR3JhcGgnO1xuaW1wb3J0IE5vZGUkMjEgZnJvbSAnLi9jb21wb3NpdG9yL05vZGUnO1xuaW1wb3J0IFBhc3MkMjIgZnJvbSAnLi9jb21wb3NpdG9yL1Bhc3MnO1xuaW1wb3J0IFNjZW5lTm9kZSQyMyBmcm9tICcuL2NvbXBvc2l0b3IvU2NlbmVOb2RlJztcbmltcG9ydCBUZXh0dXJlTm9kZSQyNCBmcm9tICcuL2NvbXBvc2l0b3IvVGV4dHVyZU5vZGUnO1xuaW1wb3J0IFRleHR1cmVQb29sJDI1IGZyb20gJy4vY29tcG9zaXRvci9UZXh0dXJlUG9vbCc7XG5pbXBvcnQgQmFzZSQyNiBmcm9tICcuL2NvcmUvQmFzZSc7XG5pbXBvcnQgQ2FjaGUkMjcgZnJvbSAnLi9jb3JlL0NhY2hlJztcbmltcG9ydCBjb2xvciQyOCBmcm9tICcuL2NvcmUvY29sb3InO1xuaW1wb3J0IGdsZW51bSQyOSBmcm9tICcuL2NvcmUvZ2xlbnVtJztcbmltcG9ydCBHTEluZm8kMzAgZnJvbSAnLi9jb3JlL0dMSW5mbyc7XG5pbXBvcnQgTGlua2VkTGlzdCQzMSBmcm9tICcuL2NvcmUvTGlua2VkTGlzdCc7XG5pbXBvcnQgTFJVJDMyIGZyb20gJy4vY29yZS9MUlUnO1xuaW1wb3J0IGV4dGVuZCQzMyBmcm9tICcuL2NvcmUvbWl4aW4vZXh0ZW5kJztcbmltcG9ydCBub3RpZmllciQzNCBmcm9tICcuL2NvcmUvbWl4aW4vbm90aWZpZXInO1xuaW1wb3J0IHJlcXVlc3QkMzUgZnJvbSAnLi9jb3JlL3JlcXVlc3QnO1xuaW1wb3J0IHV0aWwkMzYgZnJvbSAnLi9jb3JlL3V0aWwnO1xuaW1wb3J0IHZlbmRvciQzNyBmcm9tICcuL2NvcmUvdmVuZG9yJztcbmltcG9ydCBHQnVmZmVyJDM4IGZyb20gJy4vZGVmZXJyZWQvR0J1ZmZlcic7XG5pbXBvcnQgUmVuZGVyZXIkMzkgZnJvbSAnLi9kZWZlcnJlZC9SZW5kZXJlcic7XG5pbXBvcnQgZ2xtYXRyaXgkNDAgZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xuaW1wb3J0IEZyYW1lQnVmZmVyJDQxIGZyb20gJy4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IEdlb21ldHJ5JDQyIGZyb20gJy4vR2VvbWV0cnknO1xuaW1wb3J0IENvbmUkNDMgZnJvbSAnLi9nZW9tZXRyeS9Db25lJztcbmltcG9ydCBDdWJlJDQ0IGZyb20gJy4vZ2VvbWV0cnkvQ3ViZSc7XG5pbXBvcnQgQ3lsaW5kZXIkNDUgZnJvbSAnLi9nZW9tZXRyeS9DeWxpbmRlcic7XG5pbXBvcnQgUGxhbmUkNDYgZnJvbSAnLi9nZW9tZXRyeS9QbGFuZSc7XG5pbXBvcnQgU3BoZXJlJDQ3IGZyb20gJy4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCBHTFByb2dyYW0kNDggZnJvbSAnLi9ncHUvR0xQcm9ncmFtJztcbmltcG9ydCBQcm9ncmFtTWFuYWdlciQ0OSBmcm9tICcuL2dwdS9Qcm9ncmFtTWFuYWdlcic7XG5pbXBvcnQgSm9pbnQkNTAgZnJvbSAnLi9Kb2ludCc7XG5pbXBvcnQgTGlnaHQkNTEgZnJvbSAnLi9MaWdodCc7XG5pbXBvcnQgQW1iaWVudCQ1MiBmcm9tICcuL2xpZ2h0L0FtYmllbnQnO1xuaW1wb3J0IEFtYmllbnRDdWJlbWFwJDUzIGZyb20gJy4vbGlnaHQvQW1iaWVudEN1YmVtYXAnO1xuaW1wb3J0IEFtYmllbnRTSCQ1NCBmcm9tICcuL2xpZ2h0L0FtYmllbnRTSCc7XG5pbXBvcnQgRGlyZWN0aW9uYWwkNTUgZnJvbSAnLi9saWdodC9EaXJlY3Rpb25hbCc7XG5pbXBvcnQgUG9pbnQkNTYgZnJvbSAnLi9saWdodC9Qb2ludCc7XG5pbXBvcnQgU3BoZXJlJDU3IGZyb20gJy4vbGlnaHQvU3BoZXJlJztcbmltcG9ydCBTcG90JDU4IGZyb20gJy4vbGlnaHQvU3BvdCc7XG5pbXBvcnQgVHViZSQ1OSBmcm9tICcuL2xpZ2h0L1R1YmUnO1xuaW1wb3J0IEZYJDYwIGZyb20gJy4vbG9hZGVyL0ZYJztcbmltcG9ydCBHTFRGJDYxIGZyb20gJy4vbG9hZGVyL0dMVEYnO1xuaW1wb3J0IE1hdGVyaWFsJDYyIGZyb20gJy4vTWF0ZXJpYWwnO1xuaW1wb3J0IEJvdW5kaW5nQm94JDYzIGZyb20gJy4vbWF0aC9Cb3VuZGluZ0JveCc7XG5pbXBvcnQgRnJ1c3R1bSQ2NCBmcm9tICcuL21hdGgvRnJ1c3R1bSc7XG5pbXBvcnQgTWF0cml4MiQ2NSBmcm9tICcuL21hdGgvTWF0cml4Mic7XG5pbXBvcnQgTWF0cml4MmQkNjYgZnJvbSAnLi9tYXRoL01hdHJpeDJkJztcbmltcG9ydCBNYXRyaXgzJDY3IGZyb20gJy4vbWF0aC9NYXRyaXgzJztcbmltcG9ydCBNYXRyaXg0JDY4IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBQbGFuZSQ2OSBmcm9tICcuL21hdGgvUGxhbmUnO1xuaW1wb3J0IFF1YXRlcm5pb24kNzAgZnJvbSAnLi9tYXRoL1F1YXRlcm5pb24nO1xuaW1wb3J0IFJheSQ3MSBmcm9tICcuL21hdGgvUmF5JztcbmltcG9ydCB1dGlsJDcyIGZyb20gJy4vbWF0aC91dGlsJztcbmltcG9ydCBWYWx1ZSQ3MyBmcm9tICcuL21hdGgvVmFsdWUnO1xuaW1wb3J0IFZlY3RvcjIkNzQgZnJvbSAnLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IFZlY3RvcjMkNzUgZnJvbSAnLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IFZlY3RvcjQkNzYgZnJvbSAnLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IE1lc2gkNzcgZnJvbSAnLi9NZXNoJztcbmltcG9ydCBOb2RlJDc4IGZyb20gJy4vTm9kZSc7XG5pbXBvcnQgRW1pdHRlciQ3OSBmcm9tICcuL3BhcnRpY2xlL0VtaXR0ZXInO1xuaW1wb3J0IEZpZWxkJDgwIGZyb20gJy4vcGFydGljbGUvRmllbGQnO1xuaW1wb3J0IEZvcmNlRmllbGQkODEgZnJvbSAnLi9wYXJ0aWNsZS9Gb3JjZUZpZWxkJztcbmltcG9ydCBQYXJ0aWNsZSQ4MiBmcm9tICcuL3BhcnRpY2xlL1BhcnRpY2xlJztcbmltcG9ydCBQYXJ0aWNsZVJlbmRlcmFibGUkODMgZnJvbSAnLi9wYXJ0aWNsZS9QYXJ0aWNsZVJlbmRlcmFibGUnO1xuaW1wb3J0IFBpeGVsUGlja2luZyQ4NCBmcm9tICcuL3BpY2tpbmcvUGl4ZWxQaWNraW5nJztcbmltcG9ydCBSYXlQaWNraW5nJDg1IGZyb20gJy4vcGlja2luZy9SYXlQaWNraW5nJztcbmltcG9ydCBGcmVlQ29udHJvbCQ4NiBmcm9tICcuL3BsdWdpbi9GcmVlQ29udHJvbCc7XG5pbXBvcnQgR2VzdHVyZU1nciQ4NyBmcm9tICcuL3BsdWdpbi9HZXN0dXJlTWdyJztcbmltcG9ydCBJbmZpbml0ZVBsYW5lJDg4IGZyb20gJy4vcGx1Z2luL0luZmluaXRlUGxhbmUnO1xuaW1wb3J0IE9yYml0Q29udHJvbCQ4OSBmcm9tICcuL3BsdWdpbi9PcmJpdENvbnRyb2wnO1xuaW1wb3J0IFNreWJveCQ5MCBmcm9tICcuL3BsdWdpbi9Ta3lib3gnO1xuaW1wb3J0IFNreWRvbWUkOTEgZnJvbSAnLi9wbHVnaW4vU2t5ZG9tZSc7XG5pbXBvcnQgRW52aXJvbm1lbnRNYXAkOTIgZnJvbSAnLi9wcmVQYXNzL0Vudmlyb25tZW50TWFwJztcbmltcG9ydCBTaGFkb3dNYXAkOTMgZnJvbSAnLi9wcmVQYXNzL1NoYWRvd01hcCc7XG5pbXBvcnQgUmVuZGVyYWJsZSQ5NCBmcm9tICcuL1JlbmRlcmFibGUnO1xuaW1wb3J0IFJlbmRlcmVyJDk1IGZyb20gJy4vUmVuZGVyZXInO1xuaW1wb3J0IFNjZW5lJDk2IGZyb20gJy4vU2NlbmUnO1xuaW1wb3J0IFNoYWRlciQ5NyBmcm9tICcuL1NoYWRlcic7XG5pbXBvcnQgbGlicmFyeSQ5OCBmcm9tICcuL3NoYWRlci9saWJyYXJ5JztcbmltcG9ydCBsaWdodCQ5OSBmcm9tICcuL3NoYWRlci9zb3VyY2UvaGVhZGVyL2xpZ2h0JztcbmltcG9ydCBTa2VsZXRvbiQxMDAgZnJvbSAnLi9Ta2VsZXRvbic7XG5pbXBvcnQgU3RhbmRhcmRNYXRlcmlhbCQxMDEgZnJvbSAnLi9TdGFuZGFyZE1hdGVyaWFsJztcbmltcG9ydCBTdGF0aWNHZW9tZXRyeSQxMDIgZnJvbSAnLi9TdGF0aWNHZW9tZXRyeSc7XG5pbXBvcnQgVGV4dHVyZSQxMDMgZnJvbSAnLi9UZXh0dXJlJztcbmltcG9ydCBUZXh0dXJlMkQkMTA0IGZyb20gJy4vVGV4dHVyZTJEJztcbmltcG9ydCBUZXh0dXJlQ3ViZSQxMDUgZnJvbSAnLi9UZXh0dXJlQ3ViZSc7XG5pbXBvcnQgY3ViZW1hcCQxMDYgZnJvbSAnLi91dGlsL2N1YmVtYXAnO1xuaW1wb3J0IGRkcyQxMDcgZnJvbSAnLi91dGlsL2Rkcyc7XG5pbXBvcnQgZGVsYXVuYXkkMTA4IGZyb20gJy4vdXRpbC9kZWxhdW5heSc7XG5pbXBvcnQgaGRyJDEwOSBmcm9tICcuL3V0aWwvaGRyJztcbmltcG9ydCBtZXNoJDExMCBmcm9tICcuL3V0aWwvbWVzaCc7XG5pbXBvcnQgc2gkMTExIGZyb20gJy4vdXRpbC9zaCc7XG5pbXBvcnQgdGV4dHVyZSQxMTIgZnJvbSAnLi91dGlsL3RleHR1cmUnO1xuaW1wb3J0IHRyYW5zZmVyYWJsZSQxMTMgZnJvbSAnLi91dGlsL3RyYW5zZmVyYWJsZSc7XG5pbXBvcnQgdmVyc2lvbiQxMTQgZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCBDYXJkYm9hcmREaXN0b3J0ZXIkMTE1IGZyb20gJy4vdnIvQ2FyZGJvYXJkRGlzdG9ydGVyJztcbmltcG9ydCBTdGVyZW9DYW1lcmEkMTE2IGZyb20gJy4vdnIvU3RlcmVvQ2FtZXJhJztcblxuXG52YXIgYW5pbWF0aW9uID0ge1xuICAgIEFuaW1hdG9yIDogQW5pbWF0b3IkMCxcbiAgICBCbGVuZDFEQ2xpcCA6IEJsZW5kMURDbGlwJDEsXG4gICAgQmxlbmQyRENsaXAgOiBCbGVuZDJEQ2xpcCQyLFxuICAgIENsaXAgOiBDbGlwJDMsXG4gICAgZWFzaW5nIDogZWFzaW5nJDQsXG4gICAgU2FtcGxlclRyYWNrIDogU2FtcGxlclRyYWNrJDUsXG4gICAgVGltZWxpbmUgOiBUaW1lbGluZSQ2LFxuICAgIFRyYWNrQ2xpcCA6IFRyYWNrQ2xpcCQ3LFxuICAgIFRyYW5zZm9ybVRyYWNrIDogVHJhbnNmb3JtVHJhY2skOFxufTtcbmV4cG9ydCB7IGFuaW1hdGlvbiB9O1xuXG5leHBvcnQgeyBhcHBsaWNhdGlvbiQ5IGFzIGFwcGxpY2F0aW9uIH07XG5cbnZhciBhc3luYyA9IHtcbiAgICBUYXNrIDogVGFzayQxMCxcbiAgICBUYXNrR3JvdXAgOiBUYXNrR3JvdXAkMTFcbn07XG5leHBvcnQgeyBhc3luYyB9O1xuXG5leHBvcnQgeyBDYW1lcmEkMTIgYXMgQ2FtZXJhIH07XG5cbnZhciBjYW1lcmEgPSB7XG4gICAgT3J0aG9ncmFwaGljIDogT3J0aG9ncmFwaGljJDEzLFxuICAgIFBlcnNwZWN0aXZlIDogUGVyc3BlY3RpdmUkMTRcbn07XG5leHBvcnQgeyBjYW1lcmEgfTtcblxuXG52YXIgY2FudmFzID0ge1xuICAgIE1hdGVyaWFsIDogTWF0ZXJpYWwkMTUsXG4gICAgUmVuZGVyZXIgOiBSZW5kZXJlciQxNlxufTtcbmV4cG9ydCB7IGNhbnZhcyB9O1xuXG5cbnZhciBjb21wb3NpdG9yID0ge1xuICAgIENvbXBvc2l0b3IgOiBDb21wb3NpdG9yJDE3LFxuICAgIGNyZWF0ZUNvbXBvc2l0b3IgOiBjcmVhdGVDb21wb3NpdG9yJDE4LFxuICAgIEZpbHRlck5vZGUgOiBGaWx0ZXJOb2RlJDE5LFxuICAgIEdyYXBoIDogR3JhcGgkMjAsXG4gICAgTm9kZSA6IE5vZGUkMjEsXG4gICAgUGFzcyA6IFBhc3MkMjIsXG4gICAgU2NlbmVOb2RlIDogU2NlbmVOb2RlJDIzLFxuICAgIFRleHR1cmVOb2RlIDogVGV4dHVyZU5vZGUkMjQsXG4gICAgVGV4dHVyZVBvb2wgOiBUZXh0dXJlUG9vbCQyNVxufTtcbmV4cG9ydCB7IGNvbXBvc2l0b3IgfTtcblxuXG52YXIgY29yZSA9IHtcbiAgICBCYXNlIDogQmFzZSQyNixcbiAgICBDYWNoZSA6IENhY2hlJDI3LFxuICAgIGNvbG9yIDogY29sb3IkMjgsXG4gICAgZ2xlbnVtIDogZ2xlbnVtJDI5LFxuICAgIEdMSW5mbyA6IEdMSW5mbyQzMCxcbiAgICBMaW5rZWRMaXN0IDogTGlua2VkTGlzdCQzMSxcbiAgICBMUlUgOiBMUlUkMzIsXG4gICAgbWl4aW4gOiB7XG4gICAgICAgIGV4dGVuZCA6IGV4dGVuZCQzMyxcbiAgICAgICAgbm90aWZpZXIgOiBub3RpZmllciQzNFxuICAgIH0sXG4gICAgcmVxdWVzdCA6IHJlcXVlc3QkMzUsXG4gICAgdXRpbCA6IHV0aWwkMzYsXG4gICAgdmVuZG9yIDogdmVuZG9yJDM3XG59O1xuZXhwb3J0IHsgY29yZSB9O1xuXG5cbnZhciBkZWZlcnJlZCA9IHtcbiAgICBHQnVmZmVyIDogR0J1ZmZlciQzOCxcbiAgICBSZW5kZXJlciA6IFJlbmRlcmVyJDM5XG59O1xuZXhwb3J0IHsgZGVmZXJyZWQgfTtcblxuXG52YXIgZGVwID0ge1xuICAgIGdsbWF0cml4IDogZ2xtYXRyaXgkNDBcbn07XG5leHBvcnQgeyBkZXAgfTtcblxuZXhwb3J0IHsgRnJhbWVCdWZmZXIkNDEgYXMgRnJhbWVCdWZmZXIgfTtcbmV4cG9ydCB7IEdlb21ldHJ5JDQyIGFzIEdlb21ldHJ5IH07XG5cbnZhciBnZW9tZXRyeSA9IHtcbiAgICBDb25lIDogQ29uZSQ0MyxcbiAgICBDdWJlIDogQ3ViZSQ0NCxcbiAgICBDeWxpbmRlciA6IEN5bGluZGVyJDQ1LFxuICAgIFBsYW5lIDogUGxhbmUkNDYsXG4gICAgU3BoZXJlIDogU3BoZXJlJDQ3XG59O1xuZXhwb3J0IHsgZ2VvbWV0cnkgfTtcblxuXG52YXIgZ3B1ID0ge1xuICAgIEdMUHJvZ3JhbSA6IEdMUHJvZ3JhbSQ0OCxcbiAgICBQcm9ncmFtTWFuYWdlciA6IFByb2dyYW1NYW5hZ2VyJDQ5XG59O1xuZXhwb3J0IHsgZ3B1IH07XG5cbmV4cG9ydCB7IEpvaW50JDUwIGFzIEpvaW50IH07XG5leHBvcnQgeyBMaWdodCQ1MSBhcyBMaWdodCB9O1xuXG52YXIgbGlnaHQgPSB7XG4gICAgQW1iaWVudCA6IEFtYmllbnQkNTIsXG4gICAgQW1iaWVudEN1YmVtYXAgOiBBbWJpZW50Q3ViZW1hcCQ1MyxcbiAgICBBbWJpZW50U0ggOiBBbWJpZW50U0gkNTQsXG4gICAgRGlyZWN0aW9uYWwgOiBEaXJlY3Rpb25hbCQ1NSxcbiAgICBQb2ludCA6IFBvaW50JDU2LFxuICAgIFNwaGVyZSA6IFNwaGVyZSQ1NyxcbiAgICBTcG90IDogU3BvdCQ1OCxcbiAgICBUdWJlIDogVHViZSQ1OVxufTtcbmV4cG9ydCB7IGxpZ2h0IH07XG5cblxudmFyIGxvYWRlciA9IHtcbiAgICBGWCA6IEZYJDYwLFxuICAgIEdMVEYgOiBHTFRGJDYxXG59O1xuZXhwb3J0IHsgbG9hZGVyIH07XG5cbmV4cG9ydCB7IE1hdGVyaWFsJDYyIGFzIE1hdGVyaWFsIH07XG5cbnZhciBtYXRoID0ge1xuICAgIEJvdW5kaW5nQm94IDogQm91bmRpbmdCb3gkNjMsXG4gICAgRnJ1c3R1bSA6IEZydXN0dW0kNjQsXG4gICAgTWF0cml4MiA6IE1hdHJpeDIkNjUsXG4gICAgTWF0cml4MmQgOiBNYXRyaXgyZCQ2NixcbiAgICBNYXRyaXgzIDogTWF0cml4MyQ2NyxcbiAgICBNYXRyaXg0IDogTWF0cml4NCQ2OCxcbiAgICBQbGFuZSA6IFBsYW5lJDY5LFxuICAgIFF1YXRlcm5pb24gOiBRdWF0ZXJuaW9uJDcwLFxuICAgIFJheSA6IFJheSQ3MSxcbiAgICB1dGlsIDogdXRpbCQ3MixcbiAgICBWYWx1ZSA6IFZhbHVlJDczLFxuICAgIFZlY3RvcjIgOiBWZWN0b3IyJDc0LFxuICAgIFZlY3RvcjMgOiBWZWN0b3IzJDc1LFxuICAgIFZlY3RvcjQgOiBWZWN0b3I0JDc2XG59O1xuZXhwb3J0IHsgbWF0aCB9O1xuXG5leHBvcnQgeyBNZXNoJDc3IGFzIE1lc2ggfTtcbmV4cG9ydCB7IE5vZGUkNzggYXMgTm9kZSB9O1xuXG52YXIgcGFydGljbGUgPSB7XG4gICAgRW1pdHRlciA6IEVtaXR0ZXIkNzksXG4gICAgRmllbGQgOiBGaWVsZCQ4MCxcbiAgICBGb3JjZUZpZWxkIDogRm9yY2VGaWVsZCQ4MSxcbiAgICBQYXJ0aWNsZSA6IFBhcnRpY2xlJDgyLFxuICAgIFBhcnRpY2xlUmVuZGVyYWJsZSA6IFBhcnRpY2xlUmVuZGVyYWJsZSQ4M1xufTtcbmV4cG9ydCB7IHBhcnRpY2xlIH07XG5cblxudmFyIHBpY2tpbmcgPSB7XG4gICAgUGl4ZWxQaWNraW5nIDogUGl4ZWxQaWNraW5nJDg0LFxuICAgIFJheVBpY2tpbmcgOiBSYXlQaWNraW5nJDg1XG59O1xuZXhwb3J0IHsgcGlja2luZyB9O1xuXG5cbnZhciBwbHVnaW4gPSB7XG4gICAgRnJlZUNvbnRyb2wgOiBGcmVlQ29udHJvbCQ4NixcbiAgICBHZXN0dXJlTWdyIDogR2VzdHVyZU1nciQ4NyxcbiAgICBJbmZpbml0ZVBsYW5lIDogSW5maW5pdGVQbGFuZSQ4OCxcbiAgICBPcmJpdENvbnRyb2wgOiBPcmJpdENvbnRyb2wkODksXG4gICAgU2t5Ym94IDogU2t5Ym94JDkwLFxuICAgIFNreWRvbWUgOiBTa3lkb21lJDkxXG59O1xuZXhwb3J0IHsgcGx1Z2luIH07XG5cblxudmFyIHByZVBhc3MgPSB7XG4gICAgRW52aXJvbm1lbnRNYXAgOiBFbnZpcm9ubWVudE1hcCQ5MixcbiAgICBTaGFkb3dNYXAgOiBTaGFkb3dNYXAkOTNcbn07XG5leHBvcnQgeyBwcmVQYXNzIH07XG5cbmV4cG9ydCB7IFJlbmRlcmFibGUkOTQgYXMgUmVuZGVyYWJsZSB9O1xuZXhwb3J0IHsgUmVuZGVyZXIkOTUgYXMgUmVuZGVyZXIgfTtcbmV4cG9ydCB7IFNjZW5lJDk2IGFzIFNjZW5lIH07XG5leHBvcnQgeyBTaGFkZXIkOTcgYXMgU2hhZGVyIH07XG5cbnZhciBzaGFkZXIgPSB7XG4gICAgbGlicmFyeSA6IGxpYnJhcnkkOTgsXG4gICAgc291cmNlIDoge1xuICAgIGhlYWRlciA6IHtcbiAgICAgICAgbGlnaHQgOiBsaWdodCQ5OVxuICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IHsgc2hhZGVyIH07XG5cbmV4cG9ydCB7IFNrZWxldG9uJDEwMCBhcyBTa2VsZXRvbiB9O1xuZXhwb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCQxMDEgYXMgU3RhbmRhcmRNYXRlcmlhbCB9O1xuZXhwb3J0IHsgU3RhdGljR2VvbWV0cnkkMTAyIGFzIFN0YXRpY0dlb21ldHJ5IH07XG5leHBvcnQgeyBUZXh0dXJlJDEwMyBhcyBUZXh0dXJlIH07XG5leHBvcnQgeyBUZXh0dXJlMkQkMTA0IGFzIFRleHR1cmUyRCB9O1xuZXhwb3J0IHsgVGV4dHVyZUN1YmUkMTA1IGFzIFRleHR1cmVDdWJlIH07XG5cbnZhciB1dGlsID0ge1xuICAgIGN1YmVtYXAgOiBjdWJlbWFwJDEwNixcbiAgICBkZHMgOiBkZHMkMTA3LFxuICAgIGRlbGF1bmF5IDogZGVsYXVuYXkkMTA4LFxuICAgIGhkciA6IGhkciQxMDksXG4gICAgbWVzaCA6IG1lc2gkMTEwLFxuICAgIHNoIDogc2gkMTExLFxuICAgIHRleHR1cmUgOiB0ZXh0dXJlJDExMixcbiAgICB0cmFuc2ZlcmFibGUgOiB0cmFuc2ZlcmFibGUkMTEzXG59O1xuZXhwb3J0IHsgdXRpbCB9O1xuXG5leHBvcnQgeyB2ZXJzaW9uJDExNCBhcyB2ZXJzaW9uIH07XG5cbnZhciB2ciA9IHtcbiAgICBDYXJkYm9hcmREaXN0b3J0ZXIgOiBDYXJkYm9hcmREaXN0b3J0ZXIkMTE1LFxuICAgIFN0ZXJlb0NhbWVyYSA6IFN0ZXJlb0NhbWVyYSQxMTZcbn07XG5leHBvcnQgeyB2ciB9O1xuO1xuIl0sIm5hbWVzIjpbImVhc2luZyIsIkVhc2luZyIsInRoaXMiLCJnbE1hdHJpeCIsInF1YXQiLCJ2ZWMzIiwidXRpbCIsIm5vdGlmaWVyTWl4aW4iLCJjYW52YXMiLCJwcm90byIsIm1hdDQiLCJkZWZpbmVQcm9wZXJ0eSIsIkxSVSIsInBhcnNlQ29sb3IiLCJnZXREZWZpbmVDb2RlIiwibWF0MyIsImxpZ2h0U2hhZGVyIiwicHJlekVzc2wiLCJub29wIiwidmVjNCIsIlBsYW5lIiwidmVjM1NldCIsInZlYzNDb3B5IiwiRVBTSUxPTiIsInByb2dyYW1LZXlDYWNoZSIsImdldFByb2dyYW1LZXkiLCJDdWJlIiwiU3BoZXJlIiwiUGVyc3BlY3RpdmUiLCJPcnRob2dyYXBoaWMiLCJ1dGlsRXNzbCIsInNoYWRlckxpYnJhcnkiLCJQZXJzcGVjdGl2ZUNhbWVyYSIsIk9ydGhvZ3JhcGhpY0NhbWVyYSIsImlzUG93ZXJPZlR3byIsImNhbWVyYSIsIk9ydGhvQ2FtZXJhIiwiQ3ViZUdlb21ldHJ5IiwidGFyZ2V0cyIsIlNwaGVyZUdlb21ldHJ5IiwicmV0IiwiaGRyIiwiZGRzIiwiTFJVQ2FjaGUiLCJDdWJlR2VvIiwiU3BoZXJlR2VvIiwiUGxhbmVHZW8iLCJzaFV0aWwiLCJOb2RlIiwiR3JhcGhOb2RlIiwiU2NlbmVOb2RlIiwiVGV4dHVyZU5vZGUiLCJGaWx0ZXJOb2RlIiwiQ29tcG9TY2VuZU5vZGUiLCJDb21wb1RleHR1cmVOb2RlIiwiQ29tcG9GaWx0ZXJOb2RlIiwidmVjMiIsIkNvbmUiLCJDeWxpbmRlciIsIkNvbmVHZW9tZXRyeSIsIkNvbmVHZW8iLCJDeWxpbmRlckdlbyIsIkZ1bGxRdWFkUGFzcyIsIm1hdDIiLCJvdXRwdXRFc3NsIiwiQmFzZSIsIkNhbWVyYSIsIkFuaW1hdG9yJDAiLCJCbGVuZDFEQ2xpcCQxIiwiQmxlbmQyRENsaXAkMiIsIkNsaXAkMyIsImVhc2luZyQ0IiwiU2FtcGxlclRyYWNrJDUiLCJUaW1lbGluZSQ2IiwiVHJhY2tDbGlwJDciLCJUcmFuc2Zvcm1UcmFjayQ4IiwiVGFzayQxMCIsIlRhc2tHcm91cCQxMSIsIk9ydGhvZ3JhcGhpYyQxMyIsIlBlcnNwZWN0aXZlJDE0IiwiTWF0ZXJpYWwkMTUiLCJSZW5kZXJlciQxNiIsIkNvbXBvc2l0b3IkMTciLCJjcmVhdGVDb21wb3NpdG9yJDE4IiwiRmlsdGVyTm9kZSQxOSIsIkdyYXBoJDIwIiwiTm9kZSQyMSIsIlBhc3MkMjIiLCJTY2VuZU5vZGUkMjMiLCJUZXh0dXJlTm9kZSQyNCIsIlRleHR1cmVQb29sJDI1IiwiQmFzZSQyNiIsIkNhY2hlJDI3IiwiY29sb3IkMjgiLCJnbGVudW0kMjkiLCJHTEluZm8kMzAiLCJMaW5rZWRMaXN0JDMxIiwiTFJVJDMyIiwiZXh0ZW5kJDMzIiwibm90aWZpZXIkMzQiLCJyZXF1ZXN0JDM1IiwidXRpbCQzNiIsInZlbmRvciQzNyIsIkdCdWZmZXIkMzgiLCJSZW5kZXJlciQzOSIsImdsbWF0cml4JDQwIiwiQ29uZSQ0MyIsIkN1YmUkNDQiLCJDeWxpbmRlciQ0NSIsIlBsYW5lJDQ2IiwiU3BoZXJlJDQ3IiwiR0xQcm9ncmFtJDQ4IiwiUHJvZ3JhbU1hbmFnZXIkNDkiLCJBbWJpZW50JDUyIiwiQW1iaWVudEN1YmVtYXAkNTMiLCJBbWJpZW50U0gkNTQiLCJEaXJlY3Rpb25hbCQ1NSIsIlBvaW50JDU2IiwiU3BoZXJlJDU3IiwiU3BvdCQ1OCIsIlR1YmUkNTkiLCJGWCQ2MCIsIkdMVEYkNjEiLCJCb3VuZGluZ0JveCQ2MyIsIkZydXN0dW0kNjQiLCJNYXRyaXgyJDY1IiwiTWF0cml4MmQkNjYiLCJNYXRyaXgzJDY3IiwiTWF0cml4NCQ2OCIsIlBsYW5lJDY5IiwiUXVhdGVybmlvbiQ3MCIsIlJheSQ3MSIsInV0aWwkNzIiLCJWYWx1ZSQ3MyIsIlZlY3RvcjIkNzQiLCJWZWN0b3IzJDc1IiwiVmVjdG9yNCQ3NiIsIkVtaXR0ZXIkNzkiLCJGaWVsZCQ4MCIsIkZvcmNlRmllbGQkODEiLCJQYXJ0aWNsZSQ4MiIsIlBhcnRpY2xlUmVuZGVyYWJsZSQ4MyIsIlBpeGVsUGlja2luZyQ4NCIsIlJheVBpY2tpbmckODUiLCJGcmVlQ29udHJvbCQ4NiIsIkdlc3R1cmVNZ3IkODciLCJJbmZpbml0ZVBsYW5lJDg4IiwiT3JiaXRDb250cm9sJDg5IiwiU2t5Ym94JDkwIiwiU2t5ZG9tZSQ5MSIsIkVudmlyb25tZW50TWFwJDkyIiwiU2hhZG93TWFwJDkzIiwibGlicmFyeSQ5OCIsImxpZ2h0JDk5IiwiY3ViZW1hcCQxMDYiLCJkZHMkMTA3IiwiZGVsYXVuYXkkMTA4IiwiaGRyJDEwOSIsIm1lc2gkMTEwIiwic2gkMTExIiwidGV4dHVyZSQxMTIiLCJ0cmFuc2ZlcmFibGUkMTEzIiwiQ2FyZGJvYXJkRGlzdG9ydGVyJDExNSIsIlN0ZXJlb0NhbWVyYSQxMTYiXSwibWFwcGluZ3MiOiJBQUFBOzs7OztBQUtBLElBQUksTUFBTSxHQUFHOzs7Ozs7SUFNVCxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDaEIsT0FBTyxDQUFDLENBQUM7S0FDWjs7Ozs7O0lBTUQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNoQjs7Ozs7O0lBTUQsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN0Qjs7Ozs7O0lBTUQsY0FBYyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN0Qzs7Ozs7O0lBTUQsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7Ozs7OztJQU1ELFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNsQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzFCOzs7Ozs7SUFNRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN2Qzs7Ozs7O0lBTUQsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3hCOzs7Ozs7SUFNRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNoQzs7Ozs7O0lBTUQsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3RCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzdDOzs7Ozs7SUFNRCxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVCOzs7Ozs7SUFNRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2xDOzs7Ozs7SUFNRCxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDL0M7Ozs7OztJQU1ELFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUN0QixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3hDOzs7Ozs7SUFNRCxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdkIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3BDOzs7Ozs7SUFNRCxlQUFlLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDekIsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVDOzs7Ozs7SUFNRCxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDOUM7Ozs7OztJQU1ELGNBQWMsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNsRDs7Ozs7O0lBTUQsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3BEOzs7Ozs7SUFNRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ25DOzs7Ozs7SUFNRCxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25DOzs7Ozs7SUFNRCxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdkIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7Ozs7OztJQU1ELFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDYixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEIsSUFBSTtZQUNELENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1QztRQUNELE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3REOzs7Ozs7SUFNRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLENBQUMsQ0FBQztTQUNaO1FBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1lBQ0c7WUFDQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUM7UUFDRCxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0tBQ3REOzs7Ozs7SUFNRCxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNULE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVCxPQUFPLENBQUMsQ0FBQztTQUNaO1FBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1lBQ0c7WUFDQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2tCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7a0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7S0FFN0Q7Ozs7OztJQU1ELE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNoQixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDcEM7Ozs7OztJQU1ELE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNqQixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDMUM7Ozs7OztJQU1ELFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3ZEOzs7Ozs7SUFNRCxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDdEM7Ozs7OztJQU1ELFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDaEIsT0FBTyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QjthQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRTtZQUNyQixPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNsRCxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRTtZQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUNyRCxNQUFNO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7U0FDeEQ7S0FDSjs7Ozs7O0lBTUQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtZQUNULE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUNsRDtDQUNKOztBQ3BWRCxTQUFTLElBQUksSUFBSSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JuQixJQUFJLElBQUksR0FBRyxVQUFVLElBQUksRUFBRTs7SUFFdkIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Ozs7O0lBS2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Ozs7O0lBSzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7SUFLMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQzs7Ozs7SUFLOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQzs7Ozs7SUFLN0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzs7Ozs7SUFLekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQzs7O0lBRzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDOztJQUUxQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzs7SUFFdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFFekIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQjs7Ozs7SUFLRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDOzs7OztJQUtwQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDOzs7OztJQUt0QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDOztJQUV4QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztDQUN4QixDQUFDOztBQUVGLElBQUksQ0FBQyxTQUFTLEdBQUc7O0lBRWIsR0FBRyxFQUFFLENBQUM7O0lBRU4sSUFBSSxFQUFFLENBQUM7O0lBRVAsS0FBSyxFQUFFLENBQUM7Ozs7O0lBS1IsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7YUFDN0I7aUJBQ0k7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7YUFDNUI7U0FDSjtLQUNKOzs7OztJQUtELFNBQVMsRUFBRSxVQUFVQSxTQUFNLEVBQUU7UUFDekIsSUFBSSxPQUFPQSxTQUFNLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDN0JBLFNBQU0sR0FBR0MsTUFBTSxDQUFDRCxTQUFNLENBQUMsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUdBLFNBQU0sQ0FBQztLQUN4Qjs7Ozs7O0lBTUQsSUFBSSxFQUFFLFVBQVUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUM1QjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDM0IsU0FBUyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7O1FBRXpCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLE9BQU8sUUFBUSxDQUFDO1NBQ25COztRQUVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDeEIsT0FBTztTQUNWOzs7UUFHRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzs7UUFFOUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1FBRXpELElBQUksT0FBTyxHQUFHLENBQUMsRUFBRTtZQUNiLE9BQU87U0FDVjs7UUFFRCxJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25DO2FBQ0k7WUFDRCxRQUFRLEdBQUcsT0FBTyxDQUFDO1NBQ3RCOztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNoQzs7UUFFRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDZixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxTQUFTLENBQUM7YUFDcEI7aUJBQ0k7OztnQkFHRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzs7Z0JBRXpCLE9BQU8sUUFBUSxDQUFDO2FBQ25CO1NBQ0o7YUFDSTtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7S0FDSjs7Ozs7O0lBTUQsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzVDOztJQUVELE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRTs7Ozs7UUFLckIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDOztRQUVsQixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QztRQUNELElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztRQUUxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzs7UUFFdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7S0FDeEI7O0lBRUQsY0FBYyxFQUFFLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzVCOztJQUVELGNBQWMsRUFBRSxVQUFVLElBQUksRUFBRTtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0tBQ3pCOztJQUVELE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxTQUFTLEVBQUU7UUFDaEMsSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztLQUN0RDs7SUFFRCxJQUFJLEVBQUUsVUFBVSxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQzVCLElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDckM7S0FDSjs7SUFFRCxLQUFLLEVBQUUsWUFBWTtRQUNmLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDOztRQUV4QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7UUFFeEIsT0FBTyxJQUFJLENBQUM7S0FDZjs7OztJQUlELEtBQUssRUFBRSxZQUFZO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7S0FDdkI7Ozs7O0lBS0QsTUFBTSxFQUFFLFlBQVk7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7S0FDeEI7Q0FDSixDQUFDO0FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztBQzNQbEM7OztBQUdBLEFBRUEsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7O0FBRXZDLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7SUFDaEMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDdEI7QUFDRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtJQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3ZCOztBQUVELFNBQVMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7SUFDeEMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNuQzs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7SUFDcEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNwQixJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JEO0tBQ0osTUFBTTtRQUNILElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCO29CQUN6QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU87aUJBQzlCLENBQUM7YUFDTDtTQUNKO0tBQ0o7Q0FDSjs7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUU7SUFDdkIsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQztLQUNoQixNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUM7S0FDaEIsTUFBTTtRQUNILE9BQU8sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDO0tBQzFDO0NBQ0o7O0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFO0lBQ3ZCLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDdkIsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkM7WUFDRCxPQUFPLEdBQUcsQ0FBQztTQUNkLE1BQU07WUFDSCxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDakM7S0FDSixNQUFNO1FBQ0gsT0FBTyxLQUFLLENBQUM7S0FDaEI7Q0FDSjs7QUFFRCxTQUFTLDBCQUEwQjtJQUMvQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU07RUFDeEM7SUFDRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ3BCLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLHFCQUFxQjtnQkFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTthQUN4QyxDQUFDO1NBQ0w7S0FDSixNQUFNO1FBQ0gsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUI7b0JBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtpQkFDWixDQUFDO2FBQ0w7U0FDSjtLQUNKO0NBQ0o7O0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7SUFDdEQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztJQUN6QixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO0lBQ3pCLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtjQUMzQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO2NBQ3BDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCOzs7O0FBSUQsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7SUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUMxQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFCLElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRTs7UUFFckIsSUFBSSxnQkFBZ0IsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3pDLElBQUksZ0JBQWdCLEVBQUU7O1lBRWxCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1NBQ3pCO2FBQ0k7O1lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLElBQUk7b0JBQ0wsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BELENBQUM7YUFDTDtTQUNKO0tBQ0o7O0lBRUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2QsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckI7U0FDSjthQUNJO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNCO2FBQ0o7U0FDSjtLQUNKO0NBQ0o7O0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7SUFDckMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1FBQ2YsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdEIsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNyQixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNELElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNyQixPQUFPLEtBQUssQ0FBQzthQUNoQjtTQUNKO0tBQ0o7U0FDSTtRQUNELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzNCLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0o7S0FDSjtJQUNELE9BQU8sSUFBSSxDQUFDO0NBQ2Y7O0FBRUQsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7SUFDeEYsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUM5QixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQzlCLElBQUksU0FBUyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUM7O0lBRXBDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNYLE9BQU87S0FDVjs7SUFFRCxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2xDLElBQUksWUFBWSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7O0lBR3pDLElBQUksTUFBTSxHQUFHO1lBQ0wsWUFBWTtlQUNULFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O1VBRTdCLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVosU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDMUIsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7S0FDMUIsQ0FBQyxDQUFDOztJQUVILElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOztJQUVoRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7O0lBRXBCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7SUFFbEIsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNuQyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQixVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUM7OztRQUdsRCxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDOzs7UUFHL0IsSUFBSSxFQUFFLENBQUMsWUFBWSxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztnQkFDcEQsQ0FBQyxZQUFZLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsZUFBZSxHQUFHLEtBQUssQ0FBQztTQUMzQjtRQUNELFNBQVMsR0FBRyxLQUFLLENBQUM7O1FBRWxCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEI7SUFDRCxJQUFJLGVBQWUsRUFBRTtRQUNqQixPQUFPO0tBQ1Y7O0lBRUQsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQzs7SUFFdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxZQUFZLEVBQUU7WUFDZCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMzQzthQUNJO1lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3pDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7YUFDM0I7U0FDSjtLQUNKO0lBQ0QsWUFBWSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7Ozs7SUFJL0UsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJLEtBQUssQ0FBQztJQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNULElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztJQUVuQixJQUFJLE9BQU8sR0FBRyxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUU7Ozs7UUFJcEMsSUFBSSxPQUFPLEdBQUcsWUFBWSxFQUFFOztZQUV4QixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3QyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFO29CQUMxQixNQUFNO2lCQUNUO2FBQ0o7WUFDRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CLE1BQU07WUFDSCxLQUFLLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFO29CQUN6QixNQUFNO2lCQUNUO2FBQ0o7WUFDRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUNELFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixZQUFZLEdBQUcsT0FBTyxDQUFDOztRQUV2QixJQUFJLEtBQUssSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUNiLE9BQU87U0FDVixNQUFNO1lBQ0gsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7U0FDekM7UUFDRCxJQUFJLFNBQVMsRUFBRTtZQUNYLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2RCxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksWUFBWSxFQUFFO2dCQUNkLE1BQU07b0JBQ0YsTUFBTTtvQkFDTixRQUFRO29CQUNSLFlBQVk7d0JBQ1IsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7d0JBQ3hCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO3FCQUNwQjtpQkFDSixDQUFDO2FBQ0wsTUFBTSxJQUFJLFlBQVksRUFBRTtnQkFDckIsMEJBQTBCO29CQUN0QixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztvQkFDeEIsTUFBTTtpQkFDVCxDQUFDO2FBQ0wsTUFBTTtnQkFDSCxNQUFNO29CQUNGLE1BQU07b0JBQ04sUUFBUTtvQkFDUixxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZELENBQUM7YUFDTDtTQUNKLE1BQU07WUFDSCxJQUFJLFlBQVksRUFBRTtnQkFDZCxNQUFNO29CQUNGLE1BQU07b0JBQ04sUUFBUTtvQkFDUixZQUFZO3dCQUNSLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO3dCQUN4QixRQUFRLENBQUMsQ0FBQyxDQUFDO3dCQUNYLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNmLENBQUM7cUJBQ0o7aUJBQ0osQ0FBQzthQUNMO2lCQUNJLElBQUksWUFBWSxFQUFFO2dCQUNuQixnQkFBZ0I7b0JBQ1osUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7b0JBQ3hCLE1BQU07aUJBQ1QsQ0FBQzthQUNMLE1BQU07Z0JBQ0gsTUFBTTtvQkFDRixNQUFNO29CQUNOLFFBQVE7b0JBQ1IsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuRCxDQUFDO2FBQ0w7U0FDSjtLQUNKLENBQUM7O0lBRUYsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUM7UUFDaEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3hCLElBQUksRUFBRSxZQUFZO1FBQ2xCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztRQUNwQixLQUFLLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdEIsT0FBTyxFQUFFLE9BQU87UUFDaEIsUUFBUSxFQUFFLFlBQVk7S0FDekIsQ0FBQyxDQUFDOztJQUVILElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQjs7SUFFRCxPQUFPLElBQUksQ0FBQztDQUNmOzs7Ozs7Ozs7Ozs7Ozs7QUFlRCxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO0lBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDOztJQUV0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLENBQUM7O0lBRTNCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLGFBQWEsQ0FBQztJQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSSxhQUFhLENBQUM7O0lBRXZDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQzs7SUFFMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0lBRWhCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDOztJQUVwQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzs7SUFFdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Q0FDdkI7O0FBRUQsUUFBUSxDQUFDLFNBQVMsR0FBRzs7SUFFakIsV0FBVyxFQUFFLFFBQVE7Ozs7Ozs7O0lBUXJCLElBQUksRUFBRSxVQUFVLElBQUksRUFBRSxLQUFLLEVBQUU7UUFDekIsS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDOzs7OztnQkFLNUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUN4QixJQUFJLEVBQUUsQ0FBQzt3QkFDUCxLQUFLLEVBQUUsVUFBVTs0QkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO3lCQUN2QztxQkFDSixDQUFDLENBQUM7aUJBQ047YUFDSjtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN4QixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7YUFDekIsQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsTUFBTSxFQUFFLFVBQVUsUUFBUSxFQUFFO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7O0lBRUQsYUFBYSxFQUFFLFlBQVk7O1FBRXZCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDOztRQUVsQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O1FBRTFCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7S0FDSjs7Ozs7OztJQU9ELEtBQUssRUFBRSxVQUFVLE1BQU0sRUFBRTs7UUFFckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQzs7UUFFbEIsSUFBSSxZQUFZLEdBQUcsV0FBVztZQUMxQixTQUFTLEVBQUUsQ0FBQztZQUNaLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3hCO1NBQ0osQ0FBQzs7UUFFRixJQUFJLFFBQVEsQ0FBQztRQUNiLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMvQixJQUFJLElBQUksR0FBRyxlQUFlO2dCQUN0QixJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVk7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhO2FBQ3ZELENBQUM7WUFDRixJQUFJLElBQUksRUFBRTtnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsU0FBUyxFQUFFLENBQUM7OztnQkFHWixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNoQzs7Z0JBRUQsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNuQjtTQUNKOzs7UUFHRCxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDbEMsUUFBUSxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU0sRUFBRSxPQUFPLEVBQUU7Z0JBQzFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7O2dCQUU1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUN6QzthQUNKLENBQUM7U0FDTDs7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ1osSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7O0lBTUQsSUFBSSxFQUFFLFlBQVk7UUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0tBQ3ZCOzs7Ozs7O0lBT0QsS0FBSyxFQUFFLFVBQVUsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxJQUFJLEVBQUUsVUFBVSxJQUFJLEVBQUU7UUFDbEIsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELFFBQVEsRUFBRSxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztLQUN6QjtDQUNKLENBQUM7O0FDMWdCRjs7O0FBR0EsQUFFQSxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDL0IsT0FBTyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7Q0FDbEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0YsSUFBSSxXQUFXLEdBQUcsVUFBVSxJQUFJLEVBQUU7O0lBRTlCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDOztJQUVsQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7Ozs7SUFLdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQzs7OztJQUlsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDOzs7O0lBSWhDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztJQUVsQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsUUFBUSxDQUFDOztJQUVoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztDQUNsQyxDQUFDOztBQUVGLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNuQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7Ozs7Ozs7O0FBUWhELFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7SUFDcEUsSUFBSSxHQUFHLEdBQUc7UUFDTixRQUFRLEVBQUUsUUFBUTtRQUNsQixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztLQUN0QixDQUFDO0lBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLENBQUM7S0FDZDtJQUNELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxFQUFFO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVCLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFO1FBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3pCLE1BQU07UUFDSCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNoQzs7SUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7O0FBRUYsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTs7SUFFeEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFL0MsSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7S0FDdkM7OztJQUdELElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3RCO0lBQ0QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOztBQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFVBQVUsSUFBSSxFQUFFO0lBQzVDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN6QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7O0lBRWpDLElBQUksUUFBUSxJQUFJLEdBQUcsSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFO1FBQ3BDLElBQUksR0FBRyxHQUFHLFFBQVEsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNwQixJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O1FBRzFDLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2pDLE1BQU07WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQjtLQUNKLE1BQU07UUFDSCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDckIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQzs7UUFFckIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOztRQUVoRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFFdkUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDN0QsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQztDQUNKLENBQUM7Ozs7Ozs7QUFPRixXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLFdBQVcsRUFBRTtJQUNqRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxJQUFJLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3BGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDNUU7SUFDRCxPQUFPLElBQUksQ0FBQztDQUNmLENBQUM7OztBQUdGLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsUUFBUSxFQUFFO0lBQ2pELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN6QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLEVBQUU7UUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUNuRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ1g7U0FDSjtLQUNKLE1BQU07UUFDSCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ25FLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDWDtTQUNKO0tBQ0o7SUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDVixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztLQUNsQzs7SUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7O0FDOUxGOztBQUVBLElBQUksT0FBTyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7O0FBRTlCLFNBQVMsYUFBYSxDQUFDLFFBQVEsRUFBRTtJQUM3QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDcEMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0lBQ3BDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUNwQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDcEMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzs7SUFFaEMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSTtRQUM3QixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckQsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3JELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNyRCxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDeEQ7O0lBRUQsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDakIsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDakIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7O0lBRXZCLE9BQU87UUFDSCxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksUUFBUSxJQUFJLENBQUM7UUFDcEMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDcEMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxJQUFJLFFBQVEsSUFBSSxDQUFDO0tBQ3ZDLENBQUM7Q0FDTDs7QUFFRCxTQUFTLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDNUIsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUM1QixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7OztJQUduRCxJQUFJLFFBQVEsR0FBRyxPQUFPLElBQUksUUFBUSxHQUFHLE9BQU8sRUFBRTtRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7S0FDOUM7O0lBRUQsSUFBSSxRQUFRLEdBQUcsT0FBTyxFQUFFO1FBQ3BCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDL0I7O1NBRUksSUFBSSxRQUFRLEdBQUcsT0FBTyxFQUFFO1FBQ3pCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDL0I7O1NBRUk7UUFDRCxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwRCxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUTtZQUN0QixFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7WUFDckIsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDN0I7O0lBRUQsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDYixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJ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QUcsQ0FBQyxFQUFFO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEQ7U0FDSjs7O1FBR0QsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELFFBQVEsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7O1FBRXZCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRSxPQUFPLElBQUksQ0FBQztTQUNmOztRQUVELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7UUFHdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUM7U0FDZjs7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxDQUFDLEdB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QUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7OztBQVdGLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7SUFDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMsQ0FB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QUFFLENBQUMsRUFBRTtJQUNoQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRTtJQUNoQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztJQUNyQixJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7Ozs7QUFZRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLFdBQVc7SUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztJQUV4QixPQUFPLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNSLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDZDs7UUFFRCxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ1IsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNkOztRQUVELEdBQUcsS0FBSyxFQUFFO1lBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckQsTUFBTTtZQUNILENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ2hCOztRQUVELElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQzs7UUFFRCxPQUFPLENBQUMsQ0FBQztLQUNaLENBQUM7Q0FDTCxHQUFHLENBQUM7Ozs7Ozs7O0FBUUwsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNwQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDN0MsQ0FBQzs7QUFFRixHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO0lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3ZCO0FBQ0QsQUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Ozs7Ozs7QUFPZCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVc7SUFDckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRTtJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNoQyxJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7OztBQVdGLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7OztBQU1GLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7OztBQVV6QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7QUFVekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBVXZCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0lBQzFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7OztBQVMxQixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMUIsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDOzs7Ozs7OztBQVFwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7O0FBUXZCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMUIsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDOzs7Ozs7Ozs7QUFTakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixPQUFPLEdBQUcsQ0FBQztDQUNaLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7O1FBRVQsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ3ZCO0lBQ0QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2xELENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXBDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFO0lBQ2hDLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDOztJQUVyQixJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQzs7SUFFeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7OztJQUdyQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O1FBRzFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDN0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUM3QixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7SUFHbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbEQsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7TUFFZCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O01BR2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7TUFHM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXZCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0lBRWpCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7SUFHbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztJQUczQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OztJQUduQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OztJQUdaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVyQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLFdBQVc7SUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztJQUV4QixPQUFPLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNSLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDZDs7UUFFRCxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ1IsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNkOztRQUVELEdBQUcsS0FBSyxFQUFFO1lBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckQsTUFBTTtZQUNILENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ2hCOztRQUVELElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7O1FBRUQsT0FBTyxDQUFDLENBQUM7S0FDWixDQUFDO0NBQ0wsR0FBRyxDQUFDOzs7Ozs7OztBQVFMLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFOztJQUV4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUU5QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs7SUFFN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7O0lBRXBDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNaLE9BQU8sQ0FBQyxDQUFDO0tBQ1osTUFBTTtRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM1QjtDQUNKLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNwQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxDQUFDOztBQUVGLEdBQUcsT0FBTyxPQUFPLENBQUMsS0FBSyxXQUFXLEVBQUU7SUFDaEMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Q0FDdkI7QUFDRCxBQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Ozs7OztBQU9kLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVztJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRTtJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNuQyxJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7OztBQVlGLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7O0FBVXpCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7OztBQU1GLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7OztBQVV6QixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7Ozs7QUFVdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtJQUMxQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMzQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7OztBQVMxQixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNoQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7Ozs7O0FBUXBDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMzQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7O0FBUXZCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2hDLENBQUM7Ozs7OztBQU1GLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0FBU2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsT0FBTyxHQUFHLENBQUM7Q0FDWixDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtRQUNULEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFH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QUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztRQUcxQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDN0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7O0lBR25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2xELE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFjRixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsV0FBVztJQUN2QixJQUFJLEdBQUcs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Q0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7O0FBVXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNqQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDcEIsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUN6RSxDQUFDOzs7Ozs7OztBQVFGLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbkcsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDcEIsQ0FBQzs7QUFFRixHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO0lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3ZCO0FBQ0QsQUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7Ozs7OztBQU9mLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVztJQUN0QixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxFQUFFO0lBQ3RCLElBQUksR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLEdBQUcsRUFBRTtJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUUzQixJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDNUIsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNyQyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUM3QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNwQyxDQUFDOzs7Ozs7Ozs7O0FBVUYsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEMsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBVzNCLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFF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LENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRTtJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEVBQUU7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTs7SUFFOUIsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQ1gsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDaEIsTUFBTTtRQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNqQjs7SUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FB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QyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUN6RyxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRWxDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztJQUUzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7QUFVekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUV2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7O0lBRWIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOztJQUViLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNqQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUVsQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRXRCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztJQUUzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7SUFFM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUV2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRWxCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUVYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNWLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNWLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7UUFFVixFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztJQUVqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRWpCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7UUFFbEQsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7OztRQUczQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0lBRWhGLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0lBRWhCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDOztJQUVuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQzs7SUFFbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7O0lBRW5ELE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtvQkFDeEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO29CQUN2QyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FB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SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxFQUFFO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFOztJQUU5QixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7UUFDWCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRWhCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDakIsTUFBTTtRQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDbkI7O0lBRUQsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUMzQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hELEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztRQUVsRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRzs7O1FBRzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFaEYsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNOLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDOztJQUVwRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzVCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7SUFFdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQzVCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O1FBRWxELEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7OztJQUdoQyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQ2hGLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDakMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7SUFHdkQsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztJQUUzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztJQUUzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztJQUU1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN2QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7SUFHMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7O0lBR2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7O0lBR2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7O0lBR25DLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDekMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFekMsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztBQU16QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7Ozs7Ozs7OztBQVNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7SUFFdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ1gsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNyRCxNQUFNO1FBQ0gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRWpELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDOztRQUV6RCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2pEOztJQUVELE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNQLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7UUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNiLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNiLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDOztJQUVsQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRTs7SUFFbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZCxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ1QsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNULENBQUMsSUFBSSxHQUFHLENBQUM7O0lBRVQsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVYsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7OztJQUdqRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7O0lBR3RFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzND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RyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ2pCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNqQixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FB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LENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNuQjs7O0lBR0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFD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LEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVgsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVgsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVosR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUMvRCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUN2QixFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDdkIsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDN0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7O0FBWUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDdkQsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUM1QixFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNoQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQWNGLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDN0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7UUFDdkIsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUM5QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUM5QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7OztBQVdGLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDMUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHO1FBQ3ZDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNiLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1gsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDWCxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNYLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXhCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsYUFBYTtRQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxhQUFhO1FBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLGFBQWEsRUFBRTtRQUMxQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDN0I7O0lBRUQsRUFBRSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7SUFDcEIsRUFBRSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7SUFDcEIsRUFBRSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7O0lBRXBCLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDVixFQUFFLElBQUksR0FBRyxDQUFDO0lBQ1YsRUFBRSxJQUFJLEdBQUcsQ0FBQzs7SUFFVixFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDekIsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUN6QixHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDTixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1AsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNQLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDVixNQUFNO1FBQ0gsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDZCxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ1YsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7S0FDYjs7SUFFRCxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDdkIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ04sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNQLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDUCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ1YsTUFBTTtRQUNILEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2QsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7UUFDVixFQUFFLElBQUksR0FBRyxDQUFDO0tBQ2I7O0lBRUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9DLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDL0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNwQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtvQkFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7b0JBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJO29CQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQzVFLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMxVixDQUFDOzs7QUFHRixHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO0lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3ZCO0FBQ0QsQUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Ozs7Ozs7QUFPZCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVc7SUFDckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNs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QUFDLENBQUMsQ0FBQzs7SUFFL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBV3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Ozs7Ozs7OztBQVV4QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDbEMsR0FBRyxJQUFJLEdBQUcsQ0FBQzs7SUFFWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUUzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNsQyxHQUFHLElBQUksR0FBRyxDQUFDOztJQUVYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRTNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLEdBQUcsSUFBSSxHQUFHLENBQUM7O0lBRVgsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FB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QyxFQUFFLEtBQUssQ0FBQztRQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztLQUM5QixNQUFNOztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQ2xCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRWhCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENB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Q0FBQzs7UUFFbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBRWhGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLENB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LEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztJQUVuRSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7OztJQUd4QyxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFOUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2IsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ2YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ1YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ1YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ1YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLElBQUksUUFBUSxFQUFFOztRQUUxQixLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksS0FBSyxD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UUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN2RTtRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM5RCxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDN0U7O0lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLENBQUMsUUFBUSxD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LE1BQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xDOzs7Ozs7OztJQVFELElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3JCQSxNQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDbkJBLE1BQUksQ0FBQyxRQUFRLENB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SUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLE9BQU8sQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM5QkEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUJBLE1BQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUJBLE1BQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDOzs7Ozs7QUFNL0IsT0FBTyxDQUFD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LENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztJQUVaLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRWYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDOztJQUUzQyxRQUFRLEtBQUs7UUFDVCxLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTTtRQUNWLEtBQUssS0FBSztZQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzVELE1BQU07UUFDVixLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFB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LENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVFOzs7Ozs7O0lBT0QsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDOztRQUUxQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztRQUVqQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztlQUN4RCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuRTs7Ozs7SUFLRCxRQUFRLEVBQUUsWUFBWTtRQUNsQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUMxQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztlQUMzRCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN0RTs7Ozs7O0lBTUQsY0FBYyxFQUFFLENBQUMsWUFBWTs7UUFFekIsSUFBSSxFQUFFLEdBQUdBLE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsR0FBR0EsTUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxFQUFFLEdBQUdBLE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsR0FBR0EsTUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O1FBRXZCLE9BQU8sVUFBVSxNQUFNLEVBQUU7WUFDckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7O1lBRXpCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7O1lBRXJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXBFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXBFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXJFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUUxRixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFF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QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUU3QyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7UUFHN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FB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QUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDcENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDcENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDcENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDaENBLE1BQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENB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LENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckQsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUQsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdELGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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Q0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JELFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFB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O2dCQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFB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QUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixVQUFVLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQzFCLE9BQU9BLE1BQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQy9CLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN0Q0EsTUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdkNBLE1BQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNsQ0EsTUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsVUFBVSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDOzs7Ozs7OztBQVFyQyxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDaERBLE1BQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLFVBQVUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDQSxNQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsRUFBRTtJQUM3QixPQUFPQSxNQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUMvQixDQUFDOzs7Ozs7O0FBT0YsVUFBVSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDOzs7Ozs7O0FBTzdDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3BDQSxNQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsVUFBVSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUNqREEsTUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN6Q0EsTUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7O0lBRTVDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztJQUVsQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0lBRTVCLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQzs7Ozs7O0lBTTNDLFFBQVEsS0FBSztRQUNULEtBQUssS0FBSztZQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU07UUFDVixLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTTtRQUNWLEtBQUssS0FBSztZQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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QUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7OztRQUd2RGdCLFNBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOztRQUV0QkEsU0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7O1FBRXRCQSxTQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7UUFFdEJBLFNBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOztRQUV0QkEsU0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7O1FBRXRCQSxTQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7O1FBR3RCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHO1lBQ1osSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7O1lBRXhCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7WUFFaEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7O1lBRzdCQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUVqREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pEQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUVoREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckRBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BEQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3REO2FBQ0k7WUFDRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDNUIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQzs7O1lBRzFCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkYsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7WUFFdkYsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDaEMsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDaEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7O1lBRzdCQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0NBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFN0NBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3Q0EsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUU3Q0EsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0NBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFH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QyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3JDLENBQUM7WUFDRixNQUFNO1FBQ1YsS0FBSyxDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQzNCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxHQUFHLENBQUM7YUFDZCxDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQzNCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQixDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUU7Z0JBQ2xDLElBQUks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QUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O1lBRWhDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNkLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDZCxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2QsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNkLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDZCxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7WUFFbkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7Z0JBQ2hCLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSTtnQkFDaEIsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJO2dCQUNoQixFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQzs7WUFFckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUVsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFFbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLEdBQUcsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQyxDQUFD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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDOztRQUV4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUM5QixJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O1lBRTVCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMs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QU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQy9CQSxNQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsR0FBRyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDL0JBLE1BQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7Ozs7OztBQU8vQixPQUFPLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUNsQ0EsTUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUNqQ0EsTUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENB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SSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQzlCLE9BQU87YUFDVjtZQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDOztZQUUxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3Qzs7WUFFRCxPQUFPLE1BQU0sQ0FBQztTQUNqQixDQUFDO0tBQ0wsR0FBRztDQUNQLENBQUM7O0FDL0hGLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRTtJQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNyQixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztDQUNkOzs7Ozs7QUFNRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7O0lBRXZDLCtDQUErQzs7UUFFM0MsUUFBUSxFQUFFLElBQUk7Ozs7O1FBS2QsVUFBVSxFQUFFLElBQUk7Ozs7O1FBS2hCLE1BQU0sRUFBRSxJQUFJOzs7O1FBSVosT0FBTyxFQUFFLElBQUksT0FBTyxFQUFFOzs7Ozs7O1FBT3RCLFdBQVcsRUFBRSxHQUFHOzs7Ozs7O1FBT2hCLFdBQVcsRUFBRSxJQUFJOzs7OztRQUtqQixRQUFRLEVBQUUsQ0FBQyxFQUFFOzs7OztRQUtiLFFBQVEsRUFBRSxFQUFFOzs7OztRQUtaLE9BQU8sRUFBRSxDQUFDLFFBQVE7Ozs7UUFJbEIsT0FBTyxFQUFFLFFBQVE7Ozs7O1FBS2pCLG9CQUFvQixFQUFFLENBQUM7Ozs7O1FBS3ZCLG1CQUFtQixFQUFFLElBQUk7Ozs7O1FBS3pCLGVBQWUsRUFBRSxFQUFFOzs7Ozs7UUFNbkIsS0FBSyxFQUFFLFFBQVE7Ozs7O1FBS2YsT0FBTyxFQUFFLEdBQUc7Ozs7O1FBS1osaUJBQWlCLEVBQUUsQ0FBQzs7Ozs7UUFLcEIsZUFBZSxFQUFFLENBQUM7Ozs7O1FBS2xCLGNBQWMsRUFBRSxDQUFDOztRQUVqQixZQUFZLEVBQUUsS0FBSzs7UUFFbkIsU0FBUyxFQUFFLEtBQUs7OztRQUdoQixJQUFJLEVBQUUsQ0FBQzs7UUFFUCxNQUFNLEVBQUUsQ0FBQzs7UUFFVCxPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxDQUFDOztRQUVWLGVBQWUsRUFBRSxJQUFJLE9BQU8sRUFBRTs7UUFFOUIsWUFBWSxFQUFFLElBQUksT0FBTyxFQUFFOztRQUUzQixTQUFTLEVBQUUsRUFBRTs7UUFFYixVQUFVLEVBQUUsQ0FBQzs7UUFFYixhQUFhLEVBQUUsQ0FBQzs7UUFFaEIsVUFBVSxFQUFFLEVBQUU7O1FBRWQsV0FBVyxFQUFFLElBQUksVUFBVSxFQUFFO0tBQ2hDLENBQUM7Q0FDTCxFQUFFLFlBQVk7O0lBRVgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUVuRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUVyQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDZiwwQ0FBMEM7Ozs7O0lBS3ZDLElBQUksRUFBRSxZQUFZO1FBQ2QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7UUFFMUIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7UUFFM0QsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOztRQUU1RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFDO0tBQ0o7Ozs7OztJQU1ELE9BQU8sRUFBRSxZQUFZO1FBQ2pCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O1FBRTFCLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzs7UUFFMUQsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pELEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7O1FBRS9ELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztLQUMzQjs7Ozs7O0lBTUQsV0FBVyxFQUFFLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0tBQ3pCOzs7Ozs7SUFNRCxXQUFXLEVBQUUsVUFBVSxRQUFRLEVBQUU7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7S0FDNUI7Ozs7Ozs7O0lBUUQsUUFBUSxFQUFFLFlBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0tBQ3RDOzs7Ozs7OztJQVFELE9BQU8sRUFBRSxZQUFZO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0tBQ3JDOzs7Ozs7SUFNRCxTQUFTLEVBQUUsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDakM7Ozs7OztJQU1ELFFBQVEsRUFBRSxVQUFVLEtBQUssRUFBRTtRQUN2QixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUVoRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztLQUM1Qjs7Ozs7O0lBTUQsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFO1FBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBRTVELElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7S0FDNUI7Ozs7OztJQU1ELFNBQVMsRUFBRSxVQUFVLFNBQVMsRUFBRTtRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNwQzs7SUFFRCxTQUFTLEVBQUUsVUFBVSxJQUFJLEVBQUU7UUFDdkIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7O1FBRWxCLENBQUMsWUFBWSxFQUFFLHNCQUFzQjtZQUNqQyxxQkFBcUIsRUFBRSxpQkFBaUI7WUFDeEMsU0FBUztZQUNULGFBQWEsRUFBRSxhQUFhO1lBQzVCLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVM7WUFDNUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCO1NBQzNELENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFO1lBQ3JCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN6QjtTQUNKLEVBQUUsSUFBSSxDQUFDLENBQUM7O1FBRVQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuQzs7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtZQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjs7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtLQUNKOzs7Ozs7Ozs7OztJQVdELFNBQVMsRUFBRSxVQUFVLElBQUksRUFBRTtRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7O1FBRWhCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3ZCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNuQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDcEIsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtZQUNuQixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDM0I7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3JCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMvQjs7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZO1lBQ3BCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsTUFBTSxDQUFDO2lCQUNuQyxNQUFNLENBQUMsWUFBWTtvQkFDaEIsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTt3QkFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzVCO29CQUNELElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7d0JBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMxQjtvQkFDRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDbEM7b0JBQ0QsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTt3QkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzlCO29CQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2lCQUM1QixDQUFDO2lCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3ZCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUM7S0FDcEM7Ozs7O0lBS0QsZ0JBQWdCLEVBQUUsWUFBWTtRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUM5Qjs7SUFFRCxZQUFZLEVBQUUsWUFBWTtRQUN0QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNyQzs7Ozs7SUFLRCxNQUFNLEVBQUUsVUFBVSxTQUFTLEVBQUU7O1FBRXpCLFNBQVMsR0FBRyxTQUFTLElBQUksRUFBRSxDQUFDOztRQUU1QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7a0JBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUM1QjthQUNJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDNUI7O1FBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDNUI7O1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsT0FBTztTQUNWOzs7UUFHRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDOztRQUV6QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1FBRTVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztRQUV4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztRQUVyQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUV2QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztLQUM3Qjs7SUFFRCxhQUFhLEVBQUUsVUFBVSxTQUFTLEVBQUU7UUFDaEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O1FBRXhELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzs7UUFFN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQy9DOztJQUVELGVBQWUsRUFBRSxVQUFVLFNBQVMsRUFBRTtRQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO0tBQ25DOztJQUVELFlBQVksRUFBRSxVQUFVLFFBQVEsRUFBRTtRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUNyRjs7SUFFRCxVQUFVLEVBQUUsVUFBVSxTQUFTLEVBQUU7UUFDN0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNqQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztRQUV6QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDOzs7UUFHcEMsSUFBSSxDQUFDLE9BQU87YUFDUCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO2FBQzNDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7UUFFakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDcEM7O0lBRUQsZ0JBQWdCLEVBQUUsWUFBWTtRQUMxQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztRQUV6QixJQUFJLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOztRQUV4QixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBRTFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTs7YUFFckIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNuQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDOUI7O0lBRUQsbUJBQW1CLEVBQUUsWUFBWTtRQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOztRQUVqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxZQUFZO2dCQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzthQUN6QixFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNuQjtLQUNKOztJQUVELGNBQWMsRUFBRSxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUU7UUFDbEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksRUFBRTtZQUNkLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDYjtRQUNELENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDOUI7O0lBRUQsa0JBQWtCLEVBQUUsWUFBWTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLE9BQU87U0FDVjs7Ozs7Ozs7Ozs7UUFXRCxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O1FBRW5DLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUU1QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDOztRQUVsQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O1FBRS9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQzlEOztJQUVELGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQzVCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3JCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7UUFFbEIsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFO1lBQ2pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbEIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7O1lBRWxCLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDOztZQUV0QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNwQzs7UUFFRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBRXZELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBRXRELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7U0FDekI7YUFDSSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3RCOzs7UUFHRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzlCOztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0tBQ3BCOztJQUVELGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQzVCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3JCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7UUFFbEIsSUFBSSxXQUFXLENBQUM7O1FBRWhCLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRTtZQUNqQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2xCLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDOztZQUVsQixXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDbkQ7O1FBRUQsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6RCxJQUFJLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7UUFFL0QsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4RztpQkFDSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ2pHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQ3RHO1NBQ0o7O1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7O1FBRWpCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztLQUN0Qjs7SUFFRCxrQkFBa0IsRUFBRSxVQUFVLENBQUMsRUFBRTtRQUM3QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsVUFBVTttQkFDYixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDckIsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2IsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUM1Qzs7SUFFRCxhQUFhLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDckIsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkQ7O0lBRUQsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRTs7UUFFOUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXO1lBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7O1FBRTlFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztRQUV2QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDNUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDOUI7O1FBRUQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0tBQ3RCOztJQUVELGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRTtRQUM5QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUQsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxHQUFHLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzs7UUFFekQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDdEM7O0lBRUQsWUFBWSxFQUFFLFVBQVUsUUFBUSxFQUFFO1FBQzlCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDdEIsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7Z0JBQ1YsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDNUI7U0FDSixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztLQUNuQjs7O0lBR0QsZUFBZSxFQUFFLFVBQVUsS0FBSyxFQUFFLEtBQUssRUFBRTtRQUNyQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDOztRQUVsQyxLQUFLLEtBQUssT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7UUFFeEMsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVM7WUFDbEMsS0FBSztZQUNMLElBQUk7WUFDSixJQUFJLENBQUMsVUFBVTtTQUNsQixDQUFDOztRQUVGLEtBQUssS0FBSyxLQUFLLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7UUFHdEMsSUFBSSxXQUFXLEVBQUU7WUFDYixJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDOztZQUUxQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6Qzs7UUFFRCxPQUFPLFdBQVcsQ0FBQztLQUN0QjtDQUNKLENBQUMsQ0FBQzs7Ozs7OztBQU9ILE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUU7SUFDeEQsR0FBRyxFQUFFLFlBQVk7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7S0FDM0I7SUFDRCxHQUFHLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7S0FDeEI7Q0FDSixDQUFDLENBQUM7O0FBRUgsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRTtJQUNwRCxHQUFHLEVBQUUsWUFBWTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUN2QjtJQUNELEdBQUcsRUFBRSxVQUFVLEdBQUcsRUFBRTtRQUNoQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7S0FDN0I7Q0FDSixDQUFDLENBQUM7O0FDbHNCSDs7O0FBR0EsQUFDQTs7OztBQUlBLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDakMsT0FBTyxFQUFFLEtBQUs7Q0FDakIsQ0FBQzs7QUNWRjtBQUNBLEFBTUEsSUFBSVYsT0FBSSxHQUFHUCxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQ3pCLElBQUlFLE9BQUksR0FBR0YsUUFBUSxDQUFDLElBQUksQ0FBQzs7Ozs7QUFLekIsSUFBSSxRQUFRLEdBQUc7Ozs7Ozs7Ozs7SUFVWCxLQUFLLEVBQUUsVUFBVSxNQUFNLEVBQUUsbUJBQW1CLEVBQUU7O1FBRTFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLE9BQU87U0FDVjs7UUFFRCxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUN4QyxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDOztRQUVyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQztZQUN4QixPQUFPLEVBQUUsS0FBSztTQUNqQixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7O1FBRXpDLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztRQUV4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFFeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzVCLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRDtTQUNKOztRQUVELElBQUksc0JBQXNCLEdBQUdPLE9BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7UUFFM0MsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDcEMsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN4QixVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDakgsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDbEMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDckM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxPQUFPLElBQUksTUFBTSxFQUFFO1lBQ25CLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO2FBQ0k7WUFDRCxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNqRDs7UUFFRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7UUFFNUMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDdkMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O1lBRS9CLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7O1lBRXJDLElBQUksTUFBTSxHQUFHLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ3pGQSxPQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVDQSxPQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixDQUFDLENBQUM7O1lBRS9ELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUUzQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQzNCLFNBQVM7aUJBQ1o7Z0JBQ0QsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ25DLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQzVCLElBQUksTUFBTSxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzFCLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3ZEOztnQkFFRCxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUU7b0JBQ3JCTCxPQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUVBLE9BQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ25GO3FCQUNJLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO29CQUM5Q0EsT0FBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFQSxPQUFJLENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLENBQUM7aUJBQ25HO2FBQ0o7O1lBRUQsSUFBSSxVQUFVLEVBQUU7Z0JBQ1osSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzFCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDO2lCQUM5RTtnQkFDRCxhQUFhLElBQUksR0FBRyxDQUFDO2FBQ3hCOztZQUVELFlBQVksSUFBSSxPQUFPLENBQUM7U0FDM0I7O1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQztZQUNaLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ3JCLENBQUMsQ0FBQztLQUNOOzs7Ozs7Ozs7Ozs7O0lBYUQsYUFBYSxFQUFFLFVBQVUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUU7UUFDcEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM3QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUMxQyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsY0FBYyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7OztRQUdELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7O1FBRS9CLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDckMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ25CLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7O1FBRTlCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQzs7UUFFakIsSUFBSSxlQUFlLEdBQUcsVUFBVSxHQUFHLEVBQUU7WUFDakMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEIsQ0FBQztRQUNGLE9BQU8sSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNiLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztZQUMvQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNqQztZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNoQixTQUFTO2lCQUNaO2dCQUNELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFOztvQkFFeEIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O29CQUU3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN4QixJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7d0JBRXhDLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTs0QkFDZixJQUFJLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dDQUN4QyxJQUFJLGNBQWMsR0FBRyxjQUFjLEVBQUU7b0NBQ2pDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQztvQ0FDakQsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDO29DQUMxQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztpQ0FDbEQ7cUNBQ0k7b0NBQ0QsY0FBYyxHQUFHLEtBQUssQ0FBQztpQ0FDMUI7NkJBQ0o7eUJBQ0o7cUJBQ0o7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRTs7b0JBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ2xDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3BELFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbkIsY0FBYyxFQUFFLENBQUM7cUJBQ3BCO2lCQUNKO3FCQUNJO29CQUNELGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztvQkFFM0QsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDdEIsSUFBSSxFQUFFLENBQUM7aUJBQ1Y7YUFDSjtZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztnQkFDekMsZUFBZSxFQUFFLHFCQUFxQjthQUN6QyxDQUFDLENBQUM7U0FDTjs7UUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztZQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O1FBRWxELFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7UUFFcEQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQzdDLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDOztZQUUxQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztZQUUzQyxJQUFJLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDOztZQUU1QixJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQztnQkFDbkIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUM5QixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7YUFDaEMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3RCOztZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDeEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDeEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQzt3QkFDMUIsT0FBTyxFQUFFLENBQUM7cUJBQ2I7aUJBQ0o7YUFDSjtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDM0I7WUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDOztZQUU5RCxJQUFJLE9BQU8sR0FBRyxNQUFNLEVBQUU7Z0JBQ2xCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDakU7aUJBQ0k7Z0JBQ0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNqRTs7WUFFRCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFDdEIsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN0Qjs7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUV4QixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUV0QixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDeEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQzt3QkFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3pDLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDaEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQzs0QkFDOUMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQzs7NEJBRXZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQzNCLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkJBQ3RFO3lCQUNKO3dCQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3hCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUM1RCxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDN0IsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO2dDQUNmLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7NkJBQ3JFO2lDQUNJO2dDQUNELE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs2QkFDOUM7eUJBQ0o7d0JBQ0QsT0FBTyxFQUFFLENBQUM7cUJBQ2I7b0JBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDckQ7YUFDSjtZQUNELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztZQUUzQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7UUFFNUIsSUFBSSxPQUFPLEVBQUU7WUFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNmO0NBQ0o7O0FDaFZELElBQUksSUFBSSxHQUFHO0lBQ1AsT0FBTyxFQUFFLEdBQUc7SUFDWixJQUFJLEVBQUUsVUFBVTtJQUNoQixTQUFTLEVBQUUsNEJBQTRCO0NBQzFDLENBQUM7Ozs7O0FBS0YsSUFBSSxnQkFBZ0IsR0FBRzs7Ozs7OztJQU9uQixRQUFRLEdBQUcsVUFBVSxRQUFRLEVBQUUsT0FBTyxFQUFFO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxJQUFJLEdBQUc7WUFDUCxRQUFRLEdBQUdDLE1BQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztTQUNuQyxDQUFDOztRQUVGLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQzs7O1FBR2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQzs7O1FBR2hDLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHO2dCQUNmLEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3hDLEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7YUFDM0MsQ0FBQztTQUNMOzs7UUFHRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDOzs7UUFHRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDL0IsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRWxDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ25DO2FBQ0o7U0FDSjs7UUFFRCxPQUFPO1lBQ0gsSUFBSSxHQUFHLElBQUk7WUFDWCxPQUFPLEdBQUcsT0FBTztTQUNwQixDQUFDO0tBQ0w7Ozs7Ozs7SUFPRCxVQUFVLEdBQUcsVUFBVSxNQUFNLEVBQUU7UUFDM0IsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUMvQixPQUFPLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLENBQUMsQ0FBQztTQUN2Rzs7O1FBR0QsSUFBSSxPQUFPLEdBQUc7WUFDVixPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU87WUFDeEIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPO1NBQzNCLENBQUM7O1FBRUYsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNuRDs7O1FBR0QsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUM3QixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkYsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ3BDO1NBQ0o7UUFDRCxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQzs7UUFFaEMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNoQzs7RUFFSjs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQ2xDLE9BQU87UUFDSCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUk7UUFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJO1FBQ2hCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSTtRQUNoQixRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVE7UUFDeEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztLQUMvQyxDQUFDO0NBQ0w7O0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRTtJQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ1YsT0FBTyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbkMsTUFBTTtRQUNILE9BQU8sR0FBRyxDQUFDO0tBQ2Q7Q0FDSjs7QUMvSEQ7OztBQUdBLGNBQWUsWUFBWSxDQUFDOztBQ0g1QixtQkFBZSw4WkFBOFosQ0FBQzs7QUNBOWE7Ozs7Ozs7O0FBUUEsQUFTQSxNQUFNLENBQUMsTUFBTSxDQUFDMEQsWUFBVSxDQUFDLENBQUM7O0FBRTFCLFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzlCOztBQUVELElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBQzdDLE9BQU87O1FBRUgsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztRQUV4QixLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFDWixRQUFRLEVBQUUsSUFBSSxRQUFRLENBQUM7Z0JBQ25CLE9BQU8sRUFBRSxJQUFJO2FBQ2hCLENBQUM7WUFDRixPQUFPLEVBQUUsS0FBSztZQUNkLFFBQVEsRUFBRSxJQUFJLFFBQVEsQ0FBQzs7O2dCQUduQixTQUFTLEVBQUUsS0FBSztnQkFDaEIsTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDO29CQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDO29CQUN2RCxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQztpQkFDOUQsQ0FBQzthQUNMLENBQUM7U0FDTCxDQUFDO1FBQ0YsV0FBVyxFQUFFLElBQUloQyxhQUFpQixFQUFFO0tBQ3ZDLENBQUM7Q0FDTCxFQUFFOztJQUVDLE1BQU0sRUFBRSxVQUFVLFFBQVEsRUFBRSxhQUFhLEVBQUU7UUFDdkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNqQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7UUFFOUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7O1FBRXJCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7OztRQUdsRCxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN0RSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7Ozs7S0FJOUI7O0lBRUQsbUJBQW1CLEVBQUUsVUFBVSxTQUFTLEVBQUU7OztRQUd0QyxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUU7O1lBRXZCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbkQ7YUFDSTtZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUN0RTtLQUNKOztJQUVELFdBQVcsRUFBRSxVQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFOztRQUU5QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQzNELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDNUQsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQzs7UUFFdEMsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDMUQsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDM0QsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQzs7UUFFYixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7OztRQUdaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs7OztvQkFJekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDVixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNuRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O29CQUduRSxBQU9BLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztvQkFDbEQsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDOztvQkFFbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O29CQUVYLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O29CQUVWLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDOUI7YUFDSjs7WUFFRCxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEQ7OztRQUdELElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNwQixTQUFTO3FCQUNaOzs7O29CQUlELElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRTs7d0JBRXZDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQ25DLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7d0JBQy9CLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7cUJBQzlCO3lCQUNJOzt3QkFFRCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3dCQUMzQixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO3dCQUMvQixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7d0JBQy9CLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO3FCQUN0QztpQkFDSjthQUNKO1NBQ0o7O1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs7UUFFdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDL0I7Q0FDSixDQUFDOztBQ3ZMRixJQUFJLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0FBRXhDLElBQUksWUFBWSxHQUFHaUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBQ3ZDLE9BQU87O1FBRUgsTUFBTSxFQUFFLEdBQUc7O1FBRVgsV0FBVyxFQUFFLElBQUlDLGFBQU0sRUFBRTs7UUFFekIsWUFBWSxFQUFFLElBQUlBLGFBQU0sRUFBRTs7UUFFMUIsUUFBUSxFQUFFLElBQUksT0FBTyxFQUFFO1FBQ3ZCLFNBQVMsRUFBRSxJQUFJLE9BQU8sRUFBRTs7UUFFeEIsVUFBVSxFQUFFLElBQUk7S0FDbkIsQ0FBQztDQUNMLEVBQUU7O0lBRUMsZ0JBQWdCLEVBQUUsVUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7UUFDckQsSUFBSSxNQUFNLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtZQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7U0FDakQ7O1FBRUQsS0FBSyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7O1FBRXpDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Ozs7O1FBS3ZCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksa0JBQWtCLEdBQUcsTUFBTSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDO1FBQ2pFLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQzs7O1FBR2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDOzs7UUFHbEMsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztRQUM1QyxJQUFJLEdBQUcsSUFBSSxHQUFHLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQzs7UUFFMUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDOztRQUU5RCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOzs7UUFHNUQsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztRQUM1QyxJQUFJLEdBQUcsSUFBSSxHQUFHLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQzs7UUFFMUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDOztRQUU5RCxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOztRQUU3RCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7YUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFFN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjO2FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O1FBRTlCLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixFQUFFLENBQUM7O1FBRTdDLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLHlCQUF5QixFQUFFLENBQUM7S0FDakQ7O0lBRUQsbUJBQW1CLEVBQUUsVUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFOztRQUVsRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFdBQVcsRUFBRTtZQUNwQyxPQUFPO1NBQ1Y7O1FBRUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RSxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7UUFFcEMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxVQUFVLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN2QyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7O1FBRWhELFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkUsV0FBVyxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDeEMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNELFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztRQUVsRCxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsY0FBYyxFQUFFO1lBQ3pDLElBQUksVUFBVSxDQUFDLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNqRDtZQUNELFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRSxVQUFVLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNyQyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbkUsV0FBVyxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDekM7S0FDSjs7SUFFRCxhQUFhLEVBQUUsWUFBWTtRQUN2QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7S0FDM0I7O0lBRUQsY0FBYyxFQUFFLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzVCO0NBQ0osQ0FBQzs7QUN4SEY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxBQXVIQSxJQUFJLFNBQVMsR0FBRztJQUNaLFFBQVEsR0FBR0MsUUFBVTtJQUNyQixXQUFXLEdBQUdDLFdBQWE7SUFDM0IsV0FBVyxHQUFHQyxXQUFhO0lBQzNCLElBQUksR0FBR0MsSUFBTTtJQUNiLE1BQU0sR0FBR0MsTUFBUTtJQUNqQixZQUFZLEdBQUdDLFlBQWM7SUFDN0IsUUFBUSxHQUFHQyxRQUFVO0lBQ3JCLFNBQVMsR0FBR0MsU0FBVztJQUN2QixjQUFjLEdBQUdDLGNBQWdCO0NBQ3BDLENBQUM7QUFDRixBQUlBLElBQUksS0FBSyxHQUFHO0lBQ1IsSUFBSSxHQUFHQyxJQUFPO0lBQ2QsU0FBUyxHQUFHQyxTQUFZO0NBQzNCLENBQUM7QUFDRixBQUlBLElBQUksTUFBTSxHQUFHO0lBQ1QsWUFBWSxHQUFHQyxjQUFlO0lBQzlCLFdBQVcsR0FBR0MsYUFBYztDQUMvQixDQUFDO0FBQ0YsQUFHQSxJQUFJLE1BQU0sR0FBRztJQUNULFFBQVEsR0FBR0MsY0FBVztJQUN0QixRQUFRLEdBQUdDLGNBQVc7Q0FDekIsQ0FBQztBQUNGLEFBR0EsSUFBSSxVQUFVLEdBQUc7SUFDYixVQUFVLEdBQUdDLFVBQWE7SUFDMUIsZ0JBQWdCLEdBQUdDLGdCQUFtQjtJQUN0QyxVQUFVLEdBQUdDLFlBQWE7SUFDMUIsS0FBSyxHQUFHQyxLQUFRO0lBQ2hCLElBQUksR0FBR0MsTUFBTztJQUNkLElBQUksR0FBR0MsSUFBTztJQUNkLFNBQVMsR0FBR0MsV0FBWTtJQUN4QixXQUFXLEdBQUdDLGFBQWM7SUFDNUIsV0FBVyxHQUFHQyxXQUFjO0NBQy9CLENBQUM7QUFDRixBQUdBLElBQUksSUFBSSxHQUFHO0lBQ1AsSUFBSSxHQUFHQyxJQUFPO0lBQ2QsS0FBSyxHQUFHQyxLQUFRO0lBQ2hCLEtBQUssR0FBR0MsU0FBUTtJQUNoQixNQUFNLEdBQUdDLE1BQVM7SUFDbEIsTUFBTSxHQUFHQyxNQUFTO0lBQ2xCLFVBQVUsR0FBR0MsVUFBYTtJQUMxQixHQUFHLEdBQUdDLEtBQU07SUFDWixLQUFLLEdBQUc7UUFDSixNQUFNLEdBQUdDLFdBQVM7UUFDbEIsUUFBUSxHQUFHQyxRQUFXO0tBQ3pCO0lBQ0QsT0FBTyxHQUFHQyxPQUFVO0lBQ3BCLElBQUksR0FBR0MsTUFBTztJQUNkLE1BQU0sR0FBR0MsTUFBUztDQUNyQixDQUFDO0FBQ0YsQUFHQSxJQUFJLFFBQVEsR0FBRztJQUNYLE9BQU8sR0FBR0MsT0FBVTtJQUNwQixRQUFRLEdBQUdDLGdCQUFXO0NBQ3pCLENBQUM7QUFDRixBQUdBLElBQUksR0FBRyxHQUFHO0lBQ04sUUFBUSxHQUFHQyxRQUFXO0NBQ3pCLENBQUM7QUFDRixBQUtBLElBQUksUUFBUSxHQUFHO0lBQ1gsSUFBSSxHQUFHQyxNQUFPO0lBQ2QsSUFBSSxHQUFHQyxNQUFPO0lBQ2QsUUFBUSxHQUFHQyxVQUFXO0lBQ3RCLEtBQUssR0FBR0MsT0FBUTtJQUNoQixNQUFNLEdBQUdDLFFBQVM7Q0FDckIsQ0FBQztBQUNGLEFBR0EsSUFBSSxHQUFHLEdBQUc7SUFDTixTQUFTLEdBQUdDLFNBQVk7SUFDeEIsY0FBYyxHQUFHQyxjQUFpQjtDQUNyQyxDQUFDO0FBQ0YsQUFLQSxJQUFJLEtBQUssR0FBRztJQUNSLE9BQU8sR0FBR0MsWUFBVTtJQUNwQixjQUFjLEdBQUdDLG1CQUFpQjtJQUNsQyxTQUFTLEdBQUdDLGNBQVk7SUFDeEIsV0FBVyxHQUFHQyxnQkFBYztJQUM1QixLQUFLLEdBQUdDLFVBQVE7SUFDaEIsTUFBTSxHQUFHQyxXQUFTO0lBQ2xCLElBQUksR0FBR0MsU0FBTztJQUNkLElBQUksR0FBR0MsU0FBTztDQUNqQixDQUFDO0FBQ0YsQUFHQSxJQUFJLE1BQU0sR0FBRztJQUNULEVBQUUsR0FBR0MsUUFBSztJQUNWLElBQUksR0FBR0MsVUFBTztDQUNqQixDQUFDO0FBQ0YsQUFJQSxJQUFJLElBQUksR0FBRztJQUNQLFdBQVcsR0FBR0MsV0FBYztJQUM1QixPQUFPLEdBQUdDLE9BQVU7SUFDcEIsT0FBTyxHQUFHQyxPQUFVO0lBQ3BCLFFBQVEsR0FBR0MsUUFBVztJQUN0QixPQUFPLEdBQUdDLE9BQVU7SUFDcEIsT0FBTyxHQUFHQyxPQUFVO0lBQ3BCLEtBQUssR0FBR0MsT0FBUTtJQUNoQixVQUFVLEdBQUdDLFVBQWE7SUFDMUIsR0FBRyxHQUFHQyxHQUFNO0lBQ1osSUFBSSxHQUFHQyxRQUFPO0lBQ2QsS0FBSyxHQUFHQyxLQUFRO0lBQ2hCLE9BQU8sR0FBR0MsT0FBVTtJQUNwQixPQUFPLEdBQUdDLE9BQVU7SUFDcEIsT0FBTyxHQUFHQyxPQUFVO0NBQ3ZCLENBQUM7QUFDRixBQUtBLElBQUksUUFBUSxHQUFHO0lBQ1gsT0FBTyxHQUFHQyxPQUFVO0lBQ3BCLEtBQUssR0FBR0MsS0FBUTtJQUNoQixVQUFVLEdBQUdDLFVBQWE7SUFDMUIsUUFBUSxHQUFHQyxRQUFXO0lBQ3RCLGtCQUFrQixHQUFHQyxrQkFBcUI7Q0FDN0MsQ0FBQztBQUNGLEFBR0EsSUFBSSxPQUFPLEdBQUc7SUFDVixZQUFZLEdBQUdDLFlBQWU7SUFDOUIsVUFBVSxHQUFHQyxVQUFhO0NBQzdCLENBQUM7QUFDRixBQUdBLElBQUksTUFBTSxHQUFHO0lBQ1QsV0FBVyxHQUFHQyxXQUFjO0lBQzVCLFVBQVUsR0FBR0MsVUFBYTtJQUMxQixhQUFhLEdBQUdDLGFBQWdCO0lBQ2hDLFlBQVksR0FBR0MsWUFBZTtJQUM5QixNQUFNLEdBQUdDLE1BQVM7SUFDbEIsT0FBTyxHQUFHQyxPQUFVO0NBQ3ZCLENBQUM7QUFDRixBQUdBLElBQUksT0FBTyxHQUFHO0lBQ1YsY0FBYyxHQUFHQyxrQkFBaUI7SUFDbEMsU0FBUyxHQUFHQyxhQUFZO0NBQzNCLENBQUM7QUFDRixBQU9BLElBQUksTUFBTSxHQUFHO0lBQ1QsT0FBTyxHQUFHQyxPQUFVO0lBQ3BCLE1BQU0sR0FBRztJQUNULE1BQU0sR0FBRztRQUNMLEtBQUssR0FBR0MsU0FBUTtLQUNuQjtLQUNBO0NBQ0osQ0FBQztBQUNGLEFBU0EsSUFBSSxJQUFJLEdBQUc7SUFDUCxPQUFPLEdBQUdDLFdBQVc7SUFDckIsR0FBRyxHQUFHQyxHQUFPO0lBQ2IsUUFBUSxHQUFHQyxRQUFZO0lBQ3ZCLEdBQUcsR0FBR0MsS0FBTztJQUNiLElBQUksR0FBR0MsUUFBUTtJQUNmLEVBQUUsR0FBR0MsRUFBTTtJQUNYLE9BQU8sR0FBR0MsV0FBVztJQUNyQixZQUFZLEdBQUdDLGdCQUFnQjtDQUNsQyxDQUFDO0FBQ0YsQUFJQSxJQUFJLEVBQUUsR0FBRztJQUNMLGtCQUFrQixHQUFHQyxrQkFBc0I7SUFDM0MsWUFBWSxHQUFHQyxZQUFnQjtDQUNsQzs7OzsifQ== diff --git a/dist/claygl.js b/dist/claygl.js index 820754be0..6851245af 100644 --- a/dist/claygl.js +++ b/dist/claygl.js @@ -599,9 +599,6 @@ Clip.prototype = { }; Clip.prototype.constructor = Clip; -/** - * @module echarts/animation/Animator - */ var arraySlice = Array.prototype.slice; function defaultGetter(target, key) { @@ -621,7 +618,8 @@ function interpolateArray(p0, p1, percent, out, arrDim) { for (var i = 0; i < len; i++) { out[i] = interpolateNumber(p0[i], p1[i], percent); } - } else { + } + else { var len2 = p0[0].length; for (var i = 0; i < len; i++) { for (var j = 0; j < len2; j++) { @@ -758,10 +756,10 @@ function isArraySame(arr0, arr1, arrDim) { return true; } -function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, interpolater) { +function createTrackClip(animator, globalEasing, oneTrackDone, keyframes, propName, interpolater, maxTime) { var getter = animator._getter; var setter = animator._setter; - var useSpline = easing === 'spline'; + var useSpline = globalEasing === 'spline'; var trackLen = keyframes.length; if (!trackLen) { @@ -782,16 +780,17 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in return a.time - b.time; }); - var trackMaxTime = keyframes[trackLen - 1].time; // Percents of each keyframe var kfPercents = []; // Value of each keyframe var kfValues = []; + // Easing funcs of each keyframe. + var kfEasings = []; var prevValue = keyframes[0].value; var isAllValueEqual = true; for (var i = 0; i < trackLen; i++) { - kfPercents.push(keyframes[i].time / trackMaxTime); + kfPercents.push(keyframes[i].time / maxTime); // Assume value is a color when it is a string var value = keyframes[i].value; @@ -804,6 +803,7 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in prevValue = value; kfValues.push(value); + kfEasings.push(keyframes[i].easing); } if (isAllValueEqual) { return; @@ -834,7 +834,7 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in var onframe = function(target, percent) { // Find the range keyframes // kf1-----kf2---------current--------kf3 - // find kf2(i) and kf3(i+1) and do interpolation + // find kf2(i) and kf3(i + 1) and do interpolation if (percent < cachePercent) { // Start from next key start = Math.min(cacheKey + 1, trackLen - 1); @@ -843,24 +843,30 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in break; } } - i = Math.min(i, trackLen-2); - } else { + i = Math.min(i, trackLen - 2); + } + else { for (i = cacheKey; i < trackLen; i++) { if (kfPercents[i] > percent) { break; } } - i = Math.min(i-1, trackLen-2); + i = Math.min(i - 1, trackLen - 2); } cacheKey = i; cachePercent = percent; - var range = (kfPercents[i+1] - kfPercents[i]); + var range = (kfPercents[i + 1] - kfPercents[i]); if (range === 0) { return; - } else { + } + else { w = (percent - kfPercents[i]) / range; + // Clamp 0 - 1 + w = Math.max(Math.min(1, w), 0); } + w = kfEasings[i + 1](w); + if (useSpline) { p1 = kfValues[i]; p0 = kfValues[i === 0 ? i : i - 1]; @@ -875,20 +881,23 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in p0, p1, p2, p3, w ) ); - } else if (isValueArray) { + } + else if (isValueArray) { catmullRomInterpolateArray( p0, p1, p2, p3, w, w*w, w*w*w, getter(target, propName), arrDim ); - } else { + } + else { setter( target, propName, catmullRomInterpolate(p0, p1, p2, p3, w, w*w, w*w*w) ); } - } else { + } + else { if (interpolater) { setter( target, @@ -901,13 +910,15 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in ) ); } + else if (isValueArray) { interpolateArray( kfValues[i], kfValues[i+1], w, getter(target, propName), arrDim ); - } else { + } + else { setter( target, propName, @@ -919,15 +930,15 @@ function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, in var clip = new Clip({ target: animator._target, - life: trackMaxTime, + life: maxTime, loop: animator._loop, delay: animator._delay, onframe: onframe, onfinish: oneTrackDone }); - if (easing && easing !== 'spline') { - clip.setEasing(easing); + if (globalEasing && globalEasing !== 'spline') { + clip.setEasing(globalEasing); } return clip; @@ -964,6 +975,14 @@ function Animator(target, loop, getter, setter, interpolater) { this._onframeList = []; this._clipList = []; + + this._maxTime = 0; + + this._lastKFTime = 0; +} + +function noopEasing(w) { + return w; } Animator.prototype = { @@ -971,12 +990,17 @@ Animator.prototype = { constructor: Animator, /** - * @param {number} time Keyframe time using millisecond - * @param {Object} props A key-value object. Value can be number, 1d and 2d array + * @param {number} time Keyframe time using millisecond + * @param {Object} props A key-value object. Value can be number, 1d and 2d array + * @param {string|Function} [easing] * @return {clay.animation.Animator} * @memberOf clay.animation.Animator.prototype */ - when: function (time, props) { + when: function (time, props, easing$$1) { + + this._maxTime = Math.max(time, this._maxTime); + + easing$$1 = (typeof easing$$1 === 'function' ? easing$$1 : easing[easing$$1]) || noopEasing; for (var propName in props) { if (!this._tracks[propName]) { this._tracks[propName] = []; @@ -989,17 +1013,31 @@ Animator.prototype = { time: 0, value: cloneValue( this._getter(this._target, propName) - ) + ), + easing: easing$$1 }); } } this._tracks[propName].push({ time: parseInt(time), - value: props[propName] + value: props[propName], + easing: easing$$1 }); } return this; }, + /** + * @param {number} time Keyframe elapsed time since last keyframe + * @param {Object} props A key-value object. Value can be number, 1d and 2d array + * @param {string|Function} [easing] + * @return {clay.animation.Animator} + * @memberOf clay.animation.Animator.prototype + */ + then: function (duringTime, props, easing$$1) { + this.when(duringTime + this._lastKFTime, props, easing$$1); + this._lastKFTime += duringTime; + return this; + }, /** * callback when running animation * @param {Function} callback callback have two args, animating target and current percent @@ -1029,7 +1067,7 @@ Animator.prototype = { * @return {clay.animation.Animator} * @memberOf clay.animation.Animator.prototype */ - start: function (easing) { + start: function (globalEasing) { var self = this; var clipCount = 0; @@ -1044,8 +1082,8 @@ Animator.prototype = { var lastClip; for (var propName in this._tracks) { var clip = createTrackClip( - this, easing, oneTrackDone, - this._tracks[propName], propName, self._interpolater + this, globalEasing, oneTrackDone, + this._tracks[propName], propName, self._interpolater, self._maxTime ); if (clip) { this._clipList.push(clip); @@ -11014,6 +11052,11 @@ var Texture = Base.extend( * @default true */ flipY: true, + + /** + * A flag to indicate if texture source is sRGB + */ + sRGB: true, /** * @type {number} * @default 4 @@ -11652,6 +11695,9 @@ LRU$1.prototype.clear = function() { this._map = {}; }; +/** + * @namespace clay.core.color + */ var colorUtil = {}; var kCSSColorTable = { @@ -11804,10 +11850,10 @@ function putToCache(colorStr, rgbaArr) { } /** + * @name clay.core.color.parse * @param {string} colorStr * @param {Array.} out * @return {Array.} - * @memberOf module:zrender/util/color */ colorUtil.parse = function (colorStr, rgbaArr) { if (!colorStr) { @@ -11931,6 +11977,7 @@ colorUtil.parseToFloat = function (colorStr, rgbaArr) { }; /** + * @name clay.core.color.hsla2rgba * @param {Array.} hsla * @param {Array.} rgba * @return {Array.} rgba @@ -11960,6 +12007,7 @@ function hsla2rgba(hsla, rgba) { } /** + * @name clay.core.color.rgba2hsla * @param {Array.} rgba * @return {Array.} hsla */ @@ -12026,10 +12074,10 @@ function rgba2hsla(rgba) { } /** + * @name clay.core.color.lift * @param {string} color * @param {number} level * @return {string} - * @memberOf module:zrender/util/color */ colorUtil.lift = function (color, level) { var colorArr = colorUtil.parse(color); @@ -12047,9 +12095,9 @@ colorUtil.lift = function (color, level) { }; /** + * @name clay.core.color.toHex * @param {string} color * @return {string} - * @memberOf module:zrender/util/color */ colorUtil.toHex = function (color) { var colorArr = colorUtil.parse(color); @@ -12060,6 +12108,7 @@ colorUtil.toHex = function (color) { /** * Map value to color. Faster than lerp methods because color is represented by rgba array. + * @name clay.core.color * @param {number} normalizedValue A float between 0 and 1. * @param {Array.>} colors List of rgba color array * @param {Array.} [out] Mapped gba color array @@ -12088,9 +12137,6 @@ colorUtil.fastLerp = function (normalizedValue, colors, out) { return out; }; -/** - * @deprecated - */ colorUtil.fastMapToColor = colorUtil.fastLerp; /** @@ -12099,7 +12145,6 @@ colorUtil.fastMapToColor = colorUtil.fastLerp; * @param {boolean=} fullOutput Default false. * @return {(string|Object)} Result color. If fullOutput, * return {color: ..., leftIndex: ..., rightIndex: ..., value: ...}, - * @memberOf module:zrender/util/color */ colorUtil.lerp = function (normalizedValue, colors, fullOutput) { if (!(colors && colors.length) @@ -12141,12 +12186,12 @@ colorUtil.lerp = function (normalizedValue, colors, fullOutput) { colorUtil.mapToColor = colorUtil.lerp; /** + * @name clay.core.color * @param {string} color * @param {number=} h 0 ~ 360, ignore when null. * @param {number=} s 0 ~ 1, ignore when null. * @param {number=} l 0 ~ 1, ignore when null. * @return {string} Color string in rgba format. - * @memberOf module:zrender/util/color */ colorUtil.modifyHSL = function (color, h, s, l) { color = colorUtil.parse(color); @@ -12165,7 +12210,6 @@ colorUtil.modifyHSL = function (color, h, s, l) { * @param {string} color * @param {number=} alpha 0 ~ 1 * @return {string} Color string in rgba format. - * @memberOf module:zrender/util/color */ colorUtil.modifyAlpha = function (color, alpha) { color = colorUtil.parse(color); @@ -14302,7 +14346,6 @@ var Renderer = Base.extend(function () { } // Render opaque list - scene.trigger('beforerender:opaque', this, opaqueList); var opaqueRenderInfo = this.renderPass(opaqueList, camera, { getMaterial: function (renderable) { return sceneMaterial || renderable.material; @@ -14310,9 +14353,6 @@ var Renderer = Base.extend(function () { sortCompare: this.opaqueSortCompare }); - scene.trigger('afterrender:opaque', this, opaqueList, opaqueRenderInfo); - scene.trigger('beforerender:transparent', this, transparentList); - var transparentRenderInfo = this.renderPass(transparentList, camera, { getMaterial: function (renderable) { return sceneMaterial || renderable.material; @@ -14320,7 +14360,6 @@ var Renderer = Base.extend(function () { sortCompare: this.transparentSortCompare }); - scene.trigger('afterrender:transparent', this, transparentList, transparentRenderInfo); var renderInfo = {}; for (var name in opaqueRenderInfo) { renderInfo[name] = opaqueRenderInfo[name] + transparentRenderInfo[name]; @@ -14423,6 +14462,8 @@ var Renderer = Base.extend(function () { * @return {IRenderInfo} */ renderPass: function(list, camera, passConfig) { + this.trigger('beforerenderpass', this, list, camera, passConfig); + var renderInfo = { triangleCount: 0, vertexCount: 0, @@ -14613,6 +14654,8 @@ var Renderer = Base.extend(function () { list[i].__program = null; } + this.trigger('afterrenderpass', this, list, camera, passConfig); + return renderInfo; }, @@ -19019,6 +19062,104 @@ var Sphere$1 = Geometry.extend( } }); +/** + * @constructor clay.geometry.ParametricSurface + * @extends clay.Geometry + * @param {Object} [opt] + * @param {Object} [generator] + * @param {Function} generator.x + * @param {Function} generator.y + * @param {Function} generator.z + * @param {Array} [generator.u=[0, 1, 0.05]] + * @param {Array} [generator.v=[0, 1, 0.05]] + */ +var ParametricSurface$1 = Geometry.extend( +/** @lends clay.geometry.ParametricSurface# */ +{ + dynamic: false, + /** + * @type {Object} + */ + generator: null + +}, function() { + this.build(); +}, +/** @lends clay.geometry.ParametricSurface.prototype */ +{ + /** + * Build parametric surface geometry + */ + build: function () { + var generator = this.generator; + + if (!generator || !generator.x || !generator.y || !generator.z) { + throw new Error('Invalid generator'); + } + var xFunc = generator.x; + var yFunc = generator.y; + var zFunc = generator.z; + var uRange = generator.u || [0, 1, 0.05]; + var vRange = generator.v || [0, 1, 0.05]; + + var uNum = Math.floor((uRange[1] - uRange[0] + uRange[2]) / uRange[2]); + var vNum = Math.floor((vRange[1] - vRange[0] + vRange[2]) / vRange[2]); + + if (!isFinite(uNum) || !isFinite(vNum)) { + throw new Error('Infinite generator'); + } + + var vertexNum = uNum * vNum; + this.attributes.position.init(vertexNum); + this.attributes.texcoord0.init(vertexNum); + + var pos = []; + var texcoord = []; + var nVertex = 0; + for (var j = 0; j < vNum; j++) { + for (var i = 0; i < uNum; i++) { + var u = i * uRange[2] + uRange[0]; + var v = j * vRange[2] + vRange[0]; + pos[0] = xFunc(u, v); + pos[1] = yFunc(u, v); + pos[2] = zFunc(u, v); + + texcoord[0] = i / (uNum - 1); + texcoord[1] = j / (vNum - 1); + + this.attributes.position.set(nVertex, pos); + this.attributes.texcoord0.set(nVertex, texcoord); + nVertex++; + } + } + + var IndicesCtor = vertexNum > 0xffff ? Uint32Array : Uint16Array; + var nIndices = (uNum - 1) * (vNum - 1) * 6; + var indices = this.indices = new IndicesCtor(nIndices); + + var n = 0; + for (var j = 0; j < vNum - 1; j++) { + for (var i = 0; i < uNum - 1; i++) { + var i2 = j * uNum + i; + var i1 = (j * uNum + i + 1); + var i4 = (j + 1) * uNum + i + 1; + var i3 = (j + 1) * uNum + i; + + indices[n++] = i1; + indices[n++] = i2; + indices[n++] = i4; + + indices[n++] = i2; + indices[n++] = i3; + indices[n++] = i4; + } + } + + this.generateVertexNormals(); + this.updateBoundingBox(); + } +}); + var mathUtil = {}; mathUtil.isPowerOfTwo = function (value) { @@ -19264,6 +19405,271 @@ Object.defineProperty(Texture2D.prototype, 'height', { } }); +var isPowerOfTwo$1 = mathUtil.isPowerOfTwo; + +var targetList = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; + +/** + * @constructor clay.TextureCube + * @extends clay.Texture + * + * @example + * ... + * var mat = new clay.Material({ + * shader: clay.shader.library.get('clay.phong', 'environmentMap') + * }); + * var envMap = new clay.TextureCube(); + * envMap.load({ + * 'px': 'assets/textures/sky/px.jpg', + * 'nx': 'assets/textures/sky/nx.jpg' + * 'py': 'assets/textures/sky/py.jpg' + * 'ny': 'assets/textures/sky/ny.jpg' + * 'pz': 'assets/textures/sky/pz.jpg' + * 'nz': 'assets/textures/sky/nz.jpg' + * }); + * mat.set('environmentMap', envMap); + * ... + * envMap.success(function () { + * // Wait for the sky texture loaded + * animation.on('frame', function (frameTime) { + * renderer.render(scene, camera); + * }); + * }); + */ +var TextureCube = Texture.extend(function () { + return /** @lends clay.TextureCube# */{ + + /** + * @type {boolean} + * @default false + */ + // PENDING cubemap should not flipY in default. + // flipY: false, + + /** + * @type {Object} + * @property {?HTMLImageElement|HTMLCanvasElemnet} px + * @property {?HTMLImageElement|HTMLCanvasElemnet} nx + * @property {?HTMLImageElement|HTMLCanvasElemnet} py + * @property {?HTMLImageElement|HTMLCanvasElemnet} ny + * @property {?HTMLImageElement|HTMLCanvasElemnet} pz + * @property {?HTMLImageElement|HTMLCanvasElemnet} nz + */ + image: { + px: null, + nx: null, + py: null, + ny: null, + pz: null, + nz: null + }, + /** + * Pixels data of each side. Will be ignored if images are set. + * @type {Object} + * @property {?Uint8Array} px + * @property {?Uint8Array} nx + * @property {?Uint8Array} py + * @property {?Uint8Array} ny + * @property {?Uint8Array} pz + * @property {?Uint8Array} nz + */ + pixels: { + px: null, + nx: null, + py: null, + ny: null, + pz: null, + nz: null + }, + + /** + * @type {Array.} + */ + mipmaps: [] + }; +}, { + update: function (renderer) { + var _gl = renderer.gl; + _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); + + this.updateCommon(renderer); + + var glFormat = this.format; + var glType = this.type; + + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, this.getAvailableWrapS()); + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, this.getAvailableWrapT()); + + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, this.getAvailableMagFilter()); + _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, this.getAvailableMinFilter()); + + var anisotropicExt = renderer.getGLExtension('EXT_texture_filter_anisotropic'); + if (anisotropicExt && this.anisotropic > 1) { + _gl.texParameterf(_gl.TEXTURE_CUBE_MAP, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic); + } + + // Fallback to float type if browser don't have half float extension + if (glType === 36193) { + var halfFloatExt = renderer.getGLExtension('OES_texture_half_float'); + if (!halfFloatExt) { + glType = glenum.FLOAT; + } + } + + if (this.mipmaps.length) { + var width = this.width; + var height = this.height; + for (var i = 0; i < this.mipmaps.length; i++) { + var mipmap = this.mipmaps[i]; + this._updateTextureData(_gl, mipmap, i, width, height, glFormat, glType); + width /= 2; + height /= 2; + } + } + else { + this._updateTextureData(_gl, this, 0, this.width, this.height, glFormat, glType); + + if (!this.NPOT && this.useMipmap) { + _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + } + + _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, null); + }, + + _updateTextureData: function (_gl, data, level, width, height, glFormat, glType) { + for (var i = 0; i < 6; i++) { + var target = targetList[i]; + var img = data.image && data.image[target]; + if (img) { + _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, glFormat, glType, img); + } + else { + _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, width, height, 0, glFormat, glType, data.pixels && data.pixels[target]); + } + } + }, + + /** + * @param {clay.Renderer} renderer + * @memberOf clay.TextureCube.prototype + */ + generateMipmap: function (renderer) { + var _gl = renderer.gl; + if (this.useMipmap && !this.NPOT) { + _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); + _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); + } + }, + + bind: function (renderer) { + renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, this.getWebGLTexture(renderer)); + }, + + unbind: function (renderer) { + renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, null); + }, + + // Overwrite the isPowerOfTwo method + isPowerOfTwo: function () { + if (this.image.px) { + return isPowerOfTwo$1(this.image.px.width) + && isPowerOfTwo$1(this.image.px.height); + } + else { + return isPowerOfTwo$1(this.width) + && isPowerOfTwo$1(this.height); + } + }, + + isRenderable: function () { + if (this.image.px) { + return isImageRenderable(this.image.px) + && isImageRenderable(this.image.nx) + && isImageRenderable(this.image.py) + && isImageRenderable(this.image.ny) + && isImageRenderable(this.image.pz) + && isImageRenderable(this.image.nz); + } + else { + return !!(this.width && this.height); + } + }, + + load: function (imageList, crossOrigin) { + var loading = 0; + var self = this; + util$1.each(imageList, function (src, target){ + var image = new Image(); + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + image.onload = function () { + loading --; + if (loading === 0){ + self.dirty(); + self.trigger('success', self); + } + image.onload = null; + }; + image.onerror = function () { + loading --; + image.onerror = null; + }; + + loading++; + image.src = src; + self.image[target] = image; + }); + + return this; + } +}); + +Object.defineProperty(TextureCube.prototype, 'width', { + get: function () { + if (this.image && this.image.px) { + return this.image.px.width; + } + return this._width; + }, + set: function (value) { + if (this.image && this.image.px) { + console.warn('Texture from image can\'t set width'); + } + else { + if (this._width !== value) { + this.dirty(); + } + this._width = value; + } + } +}); +Object.defineProperty(TextureCube.prototype, 'height', { + get: function () { + if (this.image && this.image.px) { + return this.image.px.height; + } + return this._height; + }, + set: function (value) { + if (this.image && this.image.px) { + console.warn('Texture from image can\'t set height'); + } + else { + if (this._height !== value) { + this.dirty(); + } + this._height = value; + } + } +}); +function isImageRenderable(image) { + return image.nodeName === 'CANVAS' || + image.nodeName === 'VIDEO' || + image.complete; +} + var _library = {}; function ShaderLibrary () { @@ -20050,7 +20456,7 @@ var request = { get : get }; -var standardEssl = "\n@export clay.standard.vertex\n#define SHADER_NAME standard\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#if defined(AOMAP_ENABLED)\nattribute vec2 texcoord2 : TEXCOORD_1;\n#endif\nattribute vec3 normal : NORMAL;\nattribute vec4 tangent : TANGENT;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#if defined(AOMAP_ENABLED)\nvarying vec2 v_Texcoord2;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n v_Barycentric = barycentric;\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n#if defined(AOMAP_ENABLED)\n v_Texcoord2 = texcoord2;\n#endif\n}\n@end\n@export clay.standard.fragment\n#define PI 3.14159265358979\n#define GLOSSINESS_CHANNEL 0\n#define ROUGHNESS_CHANNEL 0\n#define METALNESS_CHANNEL 1\nuniform mat4 viewInverse : VIEWINVERSE;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\nuniform sampler2D diffuseMap;\n#endif\n#ifdef SPECULARMAP_ENABLED\nuniform sampler2D specularMap;\n#endif\n#ifdef USE_ROUGHNESS\nuniform float roughness : 0.5;\n #ifdef ROUGHNESSMAP_ENABLED\nuniform sampler2D roughnessMap;\n #endif\n#else\nuniform float glossiness: 0.5;\n #ifdef GLOSSINESSMAP_ENABLED\nuniform sampler2D glossinessMap;\n #endif\n#endif\n#ifdef METALNESSMAP_ENABLED\nuniform sampler2D metalnessMap;\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\nuniform samplerCube environmentMap;\n #ifdef PARALLAX_CORRECTED\nuniform vec3 environmentBoxMin;\nuniform vec3 environmentBoxMax;\n #endif\n#endif\n#ifdef BRDFLOOKUP_ENABLED\nuniform sampler2D brdfLookup;\n#endif\n#ifdef EMISSIVEMAP_ENABLED\nuniform sampler2D emissiveMap;\n#endif\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n#ifdef AOMAP_ENABLED\nuniform sampler2D aoMap;\nuniform float aoIntensity;\nvarying vec2 v_Texcoord2;\n#endif\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef USE_METALNESS\nuniform float metalness : 0.0;\n#else\nuniform vec3 specularColor : [0.1, 0.1, 0.1];\n#endif\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float emissionIntensity: 1;\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef ENVIRONMENTMAP_PREFILTER\nuniform float maxMipmapLevel: 5;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.plugin.compute_shadow_map\n@import clay.util.parallax_correct\n@import clay.util.ACES\nfloat G_Smith(float g, float ndv, float ndl)\n{\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(float g, float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (PI * tmp * tmp);\n}\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\nuniform float parallaxOcclusionScale : 0.02;\nuniform float parallaxMaxLayers : 20;\nuniform float parallaxMinLayers : 5;\nuniform sampler2D parallaxOcclusionMap;\nmat3 transpose(in mat3 inMat)\n{\n vec3 i0 = inMat[0];\n vec3 i1 = inMat[1];\n vec3 i2 = inMat[2];\n return mat3(\n vec3(i0.x, i1.x, i2.x),\n vec3(i0.y, i1.y, i2.y),\n vec3(i0.z, i1.z, i2.z)\n );\n}\nvec2 parallaxUv(vec2 uv, vec3 viewDir)\n{\n float numLayers = mix(parallaxMaxLayers, parallaxMinLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));\n float layerHeight = 1.0 / numLayers;\n float curLayerHeight = 0.0;\n vec2 deltaUv = viewDir.xy * parallaxOcclusionScale / (viewDir.z * numLayers);\n vec2 curUv = uv;\n float height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n for (int i = 0; i < 30; i++) {\n curLayerHeight += layerHeight;\n curUv -= deltaUv;\n height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n if (height < curLayerHeight) {\n break;\n }\n }\n vec2 prevUv = curUv + deltaUv;\n float next = height - curLayerHeight;\n float prev = 1.0 - texture2D(parallaxOcclusionMap, prevUv).r - curLayerHeight + layerHeight;\n return mix(curUv, prevUv, next / (next - prev));\n}\n#endif\nvoid main() {\n vec4 albedoColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n albedoColor *= v_Color;\n#endif\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n vec2 uv = v_Texcoord;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n#endif\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\n uv = parallaxUv(v_Texcoord, normalize(transpose(tbn) * -V));\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 texel = texture2D(diffuseMap, uv);\n #ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n #endif\n albedoColor.rgb *= texel.rgb;\n #ifdef DIFFUSEMAP_ALPHA_ALPHA\n albedoColor.a *= texel.a;\n #endif\n#endif\n#ifdef USE_METALNESS\n float m = metalness;\n #ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, uv)[METALNESS_CHANNEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n #endif\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 spec = mix(vec3(0.04), baseColor, m);\n#else\n vec3 spec = specularColor;\n#endif\n#ifdef USE_ROUGHNESS\n float g = 1.0 - roughness;\n #ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, uv)[ROUGHNESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#else\n float g = glossiness;\n #ifdef GLOSSINESSMAP_ENABLED\n float g2 = texture2D(glossinessMap, uv)[GLOSSINESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#endif\n#ifdef SPECULARMAP_ENABLED\n spec *= sRGBToLinear(texture2D(specularMap, uv)).rgb;\n#endif\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, uv).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n tbn[1] = -tbn[1];\n N = normalize(tbn * N);\n }\n }\n#endif\n vec3 diffuseTerm = vec3(0.0, 0.0, 0.0);\n vec3 specularTerm = vec3(0.0, 0.0, 0.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, spec);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_];\n }}\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_COUNT; _idx_++)\n {{\n vec3 lightPosition = pointLightPosition[_idx_];\n vec3 lc = pointLightColor[_idx_];\n float range = pointLightRange[_idx_];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsPoint[_idx_];\n }\n#endif\n vec3 li = lc * ndl * attenuation * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -normalize(directionalLightDirection[_idx_]);\n vec3 lc = directionalLightColor[_idx_];\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n vec3 li = lc * ndl * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = spotLightPosition[i];\n vec3 spotLightDirection = -normalize(spotLightDirection[i]);\n vec3 lc = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n float c = dot(spotLightDirection, L);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n vec3 li = lc * attenuation * (1.0 - falloff) * shadowContrib * ndl;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }\n#endif\n vec4 outColor = albedoColor;\n outColor.rgb *= diffuseTerm;\n outColor.rgb += specularTerm;\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = spec * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 51.5);\n outColor.rgb += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2;\n }}\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\n vec3 envWeight = g * fresnelTerm;\n vec3 L = reflect(-V, N);\n #ifdef PARALLAX_CORRECTED\n L = parallaxCorrect(L, v_WorldPosition, environmentBoxMin, environmentBoxMax);\n #endif\n #ifdef ENVIRONMENTMAP_PREFILTER\n float rough = clamp(1.0 - g, 0.0, 1.0);\n float bias = rough * maxMipmapLevel;\n vec3 envTexel = decodeHDR(textureCubeLodEXT(environmentMap, L, bias)).rgb;\n #ifdef BRDFLOOKUP_ENABLED\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n envWeight = spec * brdfParam.x + brdfParam.y;\n #endif\n #else\n vec3 envTexel = textureCube(environmentMap, L).xyz;\n #endif\n outColor.rgb += envTexel * envWeight;\n#endif\n float aoFactor = 1.0;\n#ifdef SSAOMAP_ENABLED\n aoFactor = min(texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r, aoFactor);\n#endif\n#ifdef AOMAP_ENABLED\n aoFactor = min(1.0 - clamp((1.0 - texture2D(aoMap, v_Texcoord2).r) * aoIntensity, 0.0, 1.0), aoFactor);\n#endif\n outColor.rgb *= aoFactor;\n vec3 lEmission = emission;\n#ifdef EMISSIVEMAP_ENABLED\n lEmission *= texture2D(emissiveMap, uv).rgb;\n#endif\n outColor.rgb += lEmission * emissionIntensity;\n#ifdef GAMMA_ENCODE\n outColor.rgb = pow(outColor.rgb, vec3(1 / 2.2));\n#endif\n if(lineWidth > 0.)\n {\n outColor.rgb = mix(outColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (outColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n outColor.rgb = ACESToneMapping(outColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n outColor = linearTosRGB(outColor);\n#endif\n gl_FragColor = encodeHDR(outColor);\n}\n@end\n@export clay.standardMR.vertex\n@import clay.standard.vertex\n@end\n@export clay.standardMR.fragment\n#define USE_METALNESS\n#define USE_ROUGHNESS\n@import clay.standard.fragment\n@end"; +var standardEssl = "\n@export clay.standard.vertex\n#define SHADER_NAME standard\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#if defined(AOMAP_ENABLED)\nattribute vec2 texcoord2 : TEXCOORD_1;\n#endif\nattribute vec3 normal : NORMAL;\nattribute vec4 tangent : TANGENT;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#if defined(AOMAP_ENABLED)\nvarying vec2 v_Texcoord2;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n v_Barycentric = barycentric;\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n#if defined(AOMAP_ENABLED)\n v_Texcoord2 = texcoord2;\n#endif\n}\n@end\n@export clay.standard.fragment\n#define PI 3.14159265358979\n#define GLOSSINESS_CHANNEL 0\n#define ROUGHNESS_CHANNEL 0\n#define METALNESS_CHANNEL 1\nuniform mat4 viewInverse : VIEWINVERSE;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\nuniform sampler2D diffuseMap;\n#endif\n#ifdef SPECULARMAP_ENABLED\nuniform sampler2D specularMap;\n#endif\n#ifdef USE_ROUGHNESS\nuniform float roughness : 0.5;\n #ifdef ROUGHNESSMAP_ENABLED\nuniform sampler2D roughnessMap;\n #endif\n#else\nuniform float glossiness: 0.5;\n #ifdef GLOSSINESSMAP_ENABLED\nuniform sampler2D glossinessMap;\n #endif\n#endif\n#ifdef METALNESSMAP_ENABLED\nuniform sampler2D metalnessMap;\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\nuniform samplerCube environmentMap;\n #ifdef PARALLAX_CORRECTED\nuniform vec3 environmentBoxMin;\nuniform vec3 environmentBoxMax;\n #endif\n#endif\n#ifdef BRDFLOOKUP_ENABLED\nuniform sampler2D brdfLookup;\n#endif\n#ifdef EMISSIVEMAP_ENABLED\nuniform sampler2D emissiveMap;\n#endif\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n#ifdef AOMAP_ENABLED\nuniform sampler2D aoMap;\nuniform float aoIntensity;\nvarying vec2 v_Texcoord2;\n#endif\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef USE_METALNESS\nuniform float metalness : 0.0;\n#else\nuniform vec3 specularColor : [0.1, 0.1, 0.1];\n#endif\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float emissionIntensity: 1;\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef ENVIRONMENTMAP_PREFILTER\nuniform float maxMipmapLevel: 5;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.plugin.compute_shadow_map\n@import clay.util.parallax_correct\n@import clay.util.ACES\nfloat G_Smith(float g, float ndv, float ndl)\n{\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(float g, float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (PI * tmp * tmp);\n}\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\nuniform float parallaxOcclusionScale : 0.02;\nuniform float parallaxMaxLayers : 20;\nuniform float parallaxMinLayers : 5;\nuniform sampler2D parallaxOcclusionMap;\nmat3 transpose(in mat3 inMat)\n{\n vec3 i0 = inMat[0];\n vec3 i1 = inMat[1];\n vec3 i2 = inMat[2];\n return mat3(\n vec3(i0.x, i1.x, i2.x),\n vec3(i0.y, i1.y, i2.y),\n vec3(i0.z, i1.z, i2.z)\n );\n}\nvec2 parallaxUv(vec2 uv, vec3 viewDir)\n{\n float numLayers = mix(parallaxMaxLayers, parallaxMinLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));\n float layerHeight = 1.0 / numLayers;\n float curLayerHeight = 0.0;\n vec2 deltaUv = viewDir.xy * parallaxOcclusionScale / (viewDir.z * numLayers);\n vec2 curUv = uv;\n float height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n for (int i = 0; i < 30; i++) {\n curLayerHeight += layerHeight;\n curUv -= deltaUv;\n height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n if (height < curLayerHeight) {\n break;\n }\n }\n vec2 prevUv = curUv + deltaUv;\n float next = height - curLayerHeight;\n float prev = 1.0 - texture2D(parallaxOcclusionMap, prevUv).r - curLayerHeight + layerHeight;\n return mix(curUv, prevUv, next / (next - prev));\n}\n#endif\nvoid main() {\n vec4 albedoColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n albedoColor *= v_Color;\n#endif\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n vec2 uv = v_Texcoord;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n#endif\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\n uv = parallaxUv(v_Texcoord, normalize(transpose(tbn) * -V));\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 texel = texture2D(diffuseMap, uv);\n #ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n #endif\n albedoColor.rgb *= texel.rgb;\n #ifdef DIFFUSEMAP_ALPHA_ALPHA\n albedoColor.a *= texel.a;\n #endif\n#endif\n#ifdef USE_METALNESS\n float m = metalness;\n #ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, uv)[METALNESS_CHANNEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n #endif\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 spec = mix(vec3(0.04), baseColor, m);\n#else\n vec3 spec = specularColor;\n#endif\n#ifdef USE_ROUGHNESS\n float g = 1.0 - roughness;\n #ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, uv)[ROUGHNESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#else\n float g = glossiness;\n #ifdef GLOSSINESSMAP_ENABLED\n float g2 = texture2D(glossinessMap, uv)[GLOSSINESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#endif\n#ifdef SPECULARMAP_ENABLED\n spec *= sRGBToLinear(texture2D(specularMap, uv)).rgb;\n#endif\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, uv).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n tbn[1] = -tbn[1];\n N = normalize(tbn * N);\n }\n }\n#endif\n vec3 diffuseTerm = vec3(0.0, 0.0, 0.0);\n vec3 specularTerm = vec3(0.0, 0.0, 0.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, spec);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_];\n }}\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_COUNT; _idx_++)\n {{\n vec3 lightPosition = pointLightPosition[_idx_];\n vec3 lc = pointLightColor[_idx_];\n float range = pointLightRange[_idx_];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsPoint[_idx_];\n }\n#endif\n vec3 li = lc * ndl * attenuation * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -normalize(directionalLightDirection[_idx_]);\n vec3 lc = directionalLightColor[_idx_];\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n vec3 li = lc * ndl * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = spotLightPosition[i];\n vec3 spotLightDirection = -normalize(spotLightDirection[i]);\n vec3 lc = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n float c = dot(spotLightDirection, L);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n vec3 li = lc * attenuation * (1.0 - falloff) * shadowContrib * ndl;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }\n#endif\n vec4 outColor = albedoColor;\n outColor.rgb *= diffuseTerm;\n outColor.rgb += specularTerm;\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = spec * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 51.5);\n outColor.rgb += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2;\n }}\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\n vec3 envWeight = g * fresnelTerm;\n vec3 L = reflect(-V, N);\n #ifdef PARALLAX_CORRECTED\n L = parallaxCorrect(L, v_WorldPosition, environmentBoxMin, environmentBoxMax);\n #endif\n #ifdef ENVIRONMENTMAP_PREFILTER\n float rough = clamp(1.0 - g, 0.0, 1.0);\n float bias = rough * maxMipmapLevel;\n vec3 envTexel = decodeHDR(textureCubeLodEXT(environmentMap, L, bias)).rgb;\n #ifdef BRDFLOOKUP_ENABLED\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n envWeight = spec * brdfParam.x + brdfParam.y;\n #endif\n #else\n vec3 envTexel = textureCube(environmentMap, L).xyz;\n #endif\n outColor.rgb += envTexel * envWeight;\n#endif\n float aoFactor = 1.0;\n#ifdef SSAOMAP_ENABLED\n aoFactor = min(texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r, aoFactor);\n#endif\n#ifdef AOMAP_ENABLED\n aoFactor = min(1.0 - clamp((1.0 - texture2D(aoMap, v_Texcoord2).r) * aoIntensity, 0.0, 1.0), aoFactor);\n#endif\n outColor.rgb *= aoFactor;\n vec3 lEmission = emission;\n#ifdef EMISSIVEMAP_ENABLED\n lEmission *= texture2D(emissiveMap, uv).rgb;\n#endif\n outColor.rgb += lEmission * emissionIntensity;\n if(lineWidth > 0.)\n {\n outColor.rgb = mix(outColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (outColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n outColor.rgb = ACESToneMapping(outColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n outColor = linearTosRGB(outColor);\n#endif\n gl_FragColor = encodeHDR(outColor);\n}\n@end\n@export clay.standardMR.vertex\n@import clay.standard.vertex\n@end\n@export clay.standardMR.fragment\n#define USE_METALNESS\n#define USE_ROUGHNESS\n@import clay.standard.fragment\n@end"; // Import standard shader Shader['import'](standardEssl); @@ -20668,13 +21074,13 @@ var Skeleton = Base.extend(function () { var utilGlsl = "\n@export clay.util.rand\nhighp float rand(vec2 uv) {\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot(uv.xy, vec2(a,b)), sn = mod(dt, 3.141592653589793);\n return fract(sin(sn) * c);\n}\n@end\n@export clay.util.calculate_attenuation\nuniform float attenuationFactor : 5.0;\nfloat lightAttenuation(float dist, float range)\n{\n float attenuation = 1.0;\n attenuation = dist*dist/(range*range+1.0);\n float att_s = attenuationFactor;\n attenuation = 1.0/(attenuation*att_s+1.0);\n att_s = 1.0/(att_s+1.0);\n attenuation = attenuation - att_s;\n attenuation /= 1.0 - att_s;\n return clamp(attenuation, 0.0, 1.0);\n}\n@end\n@export clay.util.edge_factor\nfloat edgeFactor(float width)\n{\n vec3 d = fwidth(v_Barycentric);\n vec3 a3 = smoothstep(vec3(0.0), d * width, v_Barycentric);\n return min(min(a3.x, a3.y), a3.z);\n}\n@end\n@export clay.util.encode_float\nvec4 encodeFloat(const in float depth)\n{\n const vec4 bitShifts = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);\n const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);\n vec4 res = fract(depth * bitShifts);\n res -= res.xxyz * bit_mask;\n return res;\n}\n@end\n@export clay.util.decode_float\nfloat decodeFloat(const in vec4 color)\n{\n const vec4 bitShifts = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);\n return dot(color, bitShifts);\n}\n@end\n@export clay.util.float\n@import clay.util.encode_float\n@import clay.util.decode_float\n@end\n@export clay.util.rgbm_decode\nvec3 RGBMDecode(vec4 rgbm, float range) {\n return range * rgbm.rgb * rgbm.a;\n}\n@end\n@export clay.util.rgbm_encode\nvec4 RGBMEncode(vec3 color, float range) {\n if (dot(color, color) == 0.0) {\n return vec4(0.0);\n }\n vec4 rgbm;\n color /= range;\n rgbm.a = clamp(max(max(color.r, color.g), max(color.b, 1e-6)), 0.0, 1.0);\n rgbm.a = ceil(rgbm.a * 255.0) / 255.0;\n rgbm.rgb = color / rgbm.a;\n return rgbm;\n}\n@end\n@export clay.util.rgbm\n@import clay.util.rgbm_decode\n@import clay.util.rgbm_encode\nvec4 decodeHDR(vec4 color)\n{\n#if defined(RGBM_DECODE) || defined(RGBM)\n return vec4(RGBMDecode(color, 51.5), 1.0);\n#else\n return color;\n#endif\n}\nvec4 encodeHDR(vec4 color)\n{\n#if defined(RGBM_ENCODE) || defined(RGBM)\n return RGBMEncode(color.xyz, 51.5);\n#else\n return color;\n#endif\n}\n@end\n@export clay.util.srgb\nvec4 sRGBToLinear(in vec4 value) {\n return vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\nvec4 linearTosRGB(in vec4 value) {\n return vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}\n@end\n@export clay.chunk.skinning_header\n#ifdef SKINNING\nattribute vec3 weight : WEIGHT;\nattribute vec4 joint : JOINT;\nuniform mat4 skinMatrix[JOINT_COUNT] : SKIN_MATRIX;\nmat4 getSkinMatrix(float idx) {\n return skinMatrix[int(idx)];\n}\n#endif\n@end\n@export clay.chunk.skin_matrix\nmat4 skinMatrixWS = getSkinMatrix(joint.x) * weight.x;\nif (weight.y > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.y) * weight.y;\n}\nif (weight.z > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.z) * weight.z;\n}\nfloat weightW = 1.0-weight.x-weight.y-weight.z;\nif (weightW > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.w) * weightW;\n}\n@end\n@export clay.util.parallax_correct\nvec3 parallaxCorrect(in vec3 dir, in vec3 pos, in vec3 boxMin, in vec3 boxMax) {\n vec3 first = (boxMax - pos) / dir;\n vec3 second = (boxMin - pos) / dir;\n vec3 further = max(first, second);\n float dist = min(further.x, min(further.y, further.z));\n vec3 fixedPos = pos + dir * dist;\n vec3 boxCenter = (boxMax + boxMin) * 0.5;\n return normalize(fixedPos - boxCenter);\n}\n@end\n@export clay.util.clamp_sample\nvec4 clampSample(const in sampler2D texture, const in vec2 coord)\n{\n#ifdef STEREO\n float eye = step(0.5, coord.x) * 0.5;\n vec2 coordClamped = clamp(coord, vec2(eye, 0.0), vec2(0.5 + eye, 1.0));\n#else\n vec2 coordClamped = clamp(coord, vec2(0.0), vec2(1.0));\n#endif\n return texture2D(texture, coordClamped);\n}\n@end\n@export clay.util.ACES\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\n@end"; -var basicEssl = "@export clay.basic.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Barycentric;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_Barycentric = barycentric;\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n}\n@end\n@export clay.basic.fragment\nvarying vec2 v_Texcoord;\nuniform sampler2D diffuseMap;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n#ifdef RENDER_TEXCOORD\n gl_FragColor = vec4(v_Texcoord, 1.0, 1.0);\n return;\n#endif\n gl_FragColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 tex = decodeHDR(texture2D(diffuseMap, v_Texcoord));\n#ifdef SRGB_DECODE\n tex = sRGBToLinear(tex);\n#endif\n#if defined(DIFFUSEMAP_ALPHA_ALPHA)\n gl_FragColor.a = tex.a;\n#endif\n gl_FragColor.rgb *= tex.rgb;\n#endif\n gl_FragColor.rgb += emission;\n if( lineWidth > 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef GAMMA_ENCODE\n gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1 / 2.2));\n#endif\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"; +var basicEssl = "@export clay.basic.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Barycentric;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_Barycentric = barycentric;\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n}\n@end\n@export clay.basic.fragment\nvarying vec2 v_Texcoord;\nuniform sampler2D diffuseMap;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n#ifdef RENDER_TEXCOORD\n gl_FragColor = vec4(v_Texcoord, 1.0, 1.0);\n return;\n#endif\n gl_FragColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 tex = decodeHDR(texture2D(diffuseMap, v_Texcoord));\n#ifdef SRGB_DECODE\n tex = sRGBToLinear(tex);\n#endif\n#if defined(DIFFUSEMAP_ALPHA_ALPHA)\n gl_FragColor.a = tex.a;\n#endif\n gl_FragColor.rgb *= tex.rgb;\n#endif\n gl_FragColor.rgb += emission;\n if( lineWidth > 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"; var lambertEssl = "\n@export clay.lambert.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 normal : NORMAL;\nattribute vec3 barycentric;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4( skinnedPosition, 1.0 );\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_Normal = normalize( ( worldInverseTranspose * vec4(skinnedNormal, 0.0) ).xyz );\n v_WorldPosition = ( world * vec4( skinnedPosition, 1.0) ).xyz;\n v_Barycentric = barycentric;\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n}\n@end\n@export clay.lambert.fragment\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D diffuseMap;\nuniform sampler2D alphaMap;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.plugin.compute_shadow_map\n@import clay.util.ACES\nvoid main()\n{\n#ifdef RENDER_NORMAL\n gl_FragColor = vec4(v_Normal * 0.5 + 0.5, 1.0);\n return;\n#endif\n#ifdef RENDER_TEXCOORD\n gl_FragColor = vec4(v_Texcoord, 1.0, 1.0);\n return;\n#endif\n gl_FragColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 tex = texture2D( diffuseMap, v_Texcoord );\n#ifdef SRGB_DECODE\n tex.rgb = pow(tex.rgb, vec3(2.2));\n#endif\n gl_FragColor.rgb *= tex.rgb;\n#ifdef DIFFUSEMAP_ALPHA_ALPHA\n gl_FragColor.a *= tex.a;\n#endif\n#endif\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {\n diffuseColor += ambientLightColor[_idx_];\n }\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseColor += calcAmbientSHLight(_idx_, v_Normal) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if( shadowEnabled )\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int i = 0; i < POINT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = pointLightPosition[i];\n vec3 lightColor = pointLightColor[i];\n float range = pointLightRange[i];\n vec3 lightDirection = lightPosition - v_WorldPosition;\n float dist = length(lightDirection);\n float attenuation = lightAttenuation(dist, range);\n lightDirection /= dist;\n float ndl = dot( v_Normal, lightDirection );\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if( shadowEnabled )\n {\n shadowContrib = shadowContribsPoint[i];\n }\n#endif\n diffuseColor += lightColor * clamp(ndl, 0.0, 1.0) * attenuation * shadowContrib;\n }\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++)\n {\n vec3 lightDirection = -directionalLightDirection[i];\n vec3 lightColor = directionalLightColor[i];\n float ndl = dot(v_Normal, normalize(lightDirection));\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if( shadowEnabled )\n {\n shadowContrib = shadowContribsDir[i];\n }\n#endif\n diffuseColor += lightColor * clamp(ndl, 0.0, 1.0) * shadowContrib;\n }\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = -spotLightPosition[i];\n vec3 spotLightDirection = -normalize( spotLightDirection[i] );\n vec3 lightColor = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 lightDirection = lightPosition - v_WorldPosition;\n float dist = length(lightDirection);\n float attenuation = lightAttenuation(dist, range);\n lightDirection /= dist;\n float c = dot(spotLightDirection, lightDirection);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n float ndl = dot(v_Normal, lightDirection);\n ndl = clamp(ndl, 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if( shadowEnabled )\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n diffuseColor += lightColor * ndl * attenuation * (1.0-falloff) * shadowContrib;\n }\n#endif\n gl_FragColor.rgb *= diffuseColor;\n gl_FragColor.rgb += emission;\n if(lineWidth > 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"; var wireframeEssl = "@export clay.wireframe.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 world : WORLD;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec3 v_Barycentric;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0 );\n v_Barycentric = barycentric;\n}\n@end\n@export clay.wireframe.fragment\nuniform vec3 color : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\nuniform float lineWidth : 1.0;\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\nvoid main()\n{\n gl_FragColor.rgb = color;\n gl_FragColor.a = (1.0-edgeFactor(lineWidth)) * alpha;\n}\n@end"; -var skyboxEssl = "@export clay.skybox.vertex\nuniform mat4 world : WORLD;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_WorldPosition;\nvoid main()\n{\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n@export clay.skybox.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform samplerCube environmentMap;\nuniform float lod: 0.0;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\nvoid main()\n{\n vec3 eyePos = viewInverse[3].xyz;\n vec3 viewDirection = normalize(v_WorldPosition - eyePos);\n vec3 tex = decodeHDR(textureCubeLodEXT(environmentMap, viewDirection, lod)).rgb;\n#ifdef SRGB_DECODE\n tex.rgb = pow(tex.rgb, vec3(2.2));\n#endif\n gl_FragColor = encodeHDR(vec4(tex, 1.0));\n}\n@end"; +var skyboxEssl = "@export clay.skybox.vertex\nuniform mat4 world : WORLD;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_WorldPosition;\nvoid main()\n{\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n@export clay.skybox.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform samplerCube environmentMap;\nuniform float lod: 0.0;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n vec3 eyePos = viewInverse[3].xyz;\n vec3 viewDirection = normalize(v_WorldPosition - eyePos);\n#ifdef LOD\n vec4 texel = decodeHDR(textureCubeLodEXT(environmentMap, viewDirection, lod));\n#else\n vec4 texel = decodeHDR(textureCube(environmentMap, viewDirection));\n#endif\n#ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n#endif\n#ifdef TONEMAPPING\n texel.rgb = ACESToneMapping(texel.rgb);\n#endif\n#ifdef SRGB_ENCODE\n texel = linearTosRGB(texel);\n#endif\n gl_FragColor = encodeHDR(vec4(texel.rgb, 1.0));\n}\n@end"; var coloradjustEssl = "@export clay.compositor.coloradjust\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float exposure : 0.0;\nuniform float gamma : 1.0;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n color = clamp( (color-vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n color = clamp( color * pow(2.0, exposure), 0.0, 1.0);\n color = clamp( pow(color, vec3(gamma)), 0.0, 1.0);\n float luminance = dot( color, w );\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.brightness\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = tex.rgb + vec3(brightness);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.contrast\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float contrast : 1.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = (tex.rgb-vec3(0.5))*contrast+vec3(0.5);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.exposure\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float exposure : 0.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb * pow(2.0, exposure);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.gamma\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float gamma : 1.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = pow(tex.rgb, vec3(gamma));\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.saturation\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb;\n float luminance = dot(color, w);\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end"; @@ -21056,7 +21462,7 @@ function () { textures: lib.textures, materials: lib.materials, skeletons: lib.skeletons, - meshes: lib.meshes, + meshes: lib.instancedMeshes, clips: lib.clips, nodes: lib.nodes }; @@ -21425,6 +21831,7 @@ function () { metalness: metallicRoughnessMatInfo.metallicFactor || 0, roughness: metallicRoughnessMatInfo.roughnessFactor || 0, emission: materialInfo.emissiveFactor || [0, 0, 0], + emissionIntensity: 1, alphaCutoff: materialInfo.alphaCutoff || 0 }; if (commonProperties.roughnessMap) { @@ -21515,6 +21922,7 @@ function () { specularColor: specularGlossinessMatInfo.specularFactor || [1, 1, 1], glossiness: specularGlossinessMatInfo.glossinessFactor || 0, emission: materialInfo.emissiveFactor || [0, 0, 0], + emissionIntensity: 1, alphaCutoff: materialInfo.alphaCutoff == null ? 0.9 : materialInfo.alphaCutoff }; if (commonProperties.glossinessMap) { @@ -21725,6 +22133,8 @@ function () { }); } + lib.instancedMeshes = []; + util$1.each(json.nodes, function (nodeInfo, idx) { var node; if (nodeInfo.camera != null && this.includeCamera) { @@ -21738,12 +22148,15 @@ function () { // Replace the node with mesh directly node = instanceMesh(primitives[0]); node.setName(nodeInfo.name); + lib.instancedMeshes.push(node); } else { node = new Node(); node.setName(nodeInfo.name); for (var j = 0; j < primitives.length; j++) { - node.add(instanceMesh(primitives[j])); + var newMesh = instanceMesh(primitives[j]); + node.add(newMesh); + lib.instancedMeshes.push(newMesh); } } } @@ -22124,263 +22537,6 @@ var AmbientLight = Light.extend({ */ }); -var isPowerOfTwo$1 = mathUtil.isPowerOfTwo; - -var targetList = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; - -/** - * @constructor clay.TextureCube - * @extends clay.Texture - * - * @example - * ... - * var mat = new clay.Material({ - * shader: clay.shader.library.get('clay.phong', 'environmentMap') - * }); - * var envMap = new clay.TextureCube(); - * envMap.load({ - * 'px': 'assets/textures/sky/px.jpg', - * 'nx': 'assets/textures/sky/nx.jpg' - * 'py': 'assets/textures/sky/py.jpg' - * 'ny': 'assets/textures/sky/ny.jpg' - * 'pz': 'assets/textures/sky/pz.jpg' - * 'nz': 'assets/textures/sky/nz.jpg' - * }); - * mat.set('environmentMap', envMap); - * ... - * envMap.success(function () { - * // Wait for the sky texture loaded - * animation.on('frame', function (frameTime) { - * renderer.render(scene, camera); - * }); - * }); - */ -var TextureCube = Texture.extend(function () { - return /** @lends clay.TextureCube# */{ - /** - * @type {Object} - * @property {?HTMLImageElement|HTMLCanvasElemnet} px - * @property {?HTMLImageElement|HTMLCanvasElemnet} nx - * @property {?HTMLImageElement|HTMLCanvasElemnet} py - * @property {?HTMLImageElement|HTMLCanvasElemnet} ny - * @property {?HTMLImageElement|HTMLCanvasElemnet} pz - * @property {?HTMLImageElement|HTMLCanvasElemnet} nz - */ - image: { - px: null, - nx: null, - py: null, - ny: null, - pz: null, - nz: null - }, - /** - * Pixels data of each side. Will be ignored if images are set. - * @type {Object} - * @property {?Uint8Array} px - * @property {?Uint8Array} nx - * @property {?Uint8Array} py - * @property {?Uint8Array} ny - * @property {?Uint8Array} pz - * @property {?Uint8Array} nz - */ - pixels: { - px: null, - nx: null, - py: null, - ny: null, - pz: null, - nz: null - }, - - /** - * @type {Array.} - */ - mipmaps: [] - }; -}, { - update: function (renderer) { - var _gl = renderer.gl; - _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); - - this.updateCommon(renderer); - - var glFormat = this.format; - var glType = this.type; - - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, this.getAvailableWrapS()); - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, this.getAvailableWrapT()); - - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, this.getAvailableMagFilter()); - _gl.texParameteri(_gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, this.getAvailableMinFilter()); - - var anisotropicExt = renderer.getGLExtension('EXT_texture_filter_anisotropic'); - if (anisotropicExt && this.anisotropic > 1) { - _gl.texParameterf(_gl.TEXTURE_CUBE_MAP, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic); - } - - // Fallback to float type if browser don't have half float extension - if (glType === 36193) { - var halfFloatExt = renderer.getGLExtension('OES_texture_half_float'); - if (!halfFloatExt) { - glType = glenum.FLOAT; - } - } - - if (this.mipmaps.length) { - var width = this.width; - var height = this.height; - for (var i = 0; i < this.mipmaps.length; i++) { - var mipmap = this.mipmaps[i]; - this._updateTextureData(_gl, mipmap, i, width, height, glFormat, glType); - width /= 2; - height /= 2; - } - } - else { - this._updateTextureData(_gl, this, 0, this.width, this.height, glFormat, glType); - - if (!this.NPOT && this.useMipmap) { - _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); - } - } - - _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, null); - }, - - _updateTextureData: function (_gl, data, level, width, height, glFormat, glType) { - for (var i = 0; i < 6; i++) { - var target = targetList[i]; - var img = data.image && data.image[target]; - if (img) { - _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, glFormat, glType, img); - } - else { - _gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, glFormat, width, height, 0, glFormat, glType, data.pixels && data.pixels[target]); - } - } - }, - - /** - * @param {clay.Renderer} renderer - * @memberOf clay.TextureCube.prototype - */ - generateMipmap: function (renderer) { - var _gl = renderer.gl; - if (this.useMipmap && !this.NPOT) { - _gl.bindTexture(_gl.TEXTURE_CUBE_MAP, this._cache.get('webgl_texture')); - _gl.generateMipmap(_gl.TEXTURE_CUBE_MAP); - } - }, - - bind: function (renderer) { - renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, this.getWebGLTexture(renderer)); - }, - - unbind: function (renderer) { - renderer.gl.bindTexture(renderer.gl.TEXTURE_CUBE_MAP, null); - }, - - // Overwrite the isPowerOfTwo method - isPowerOfTwo: function () { - if (this.image.px) { - return isPowerOfTwo$1(this.image.px.width) - && isPowerOfTwo$1(this.image.px.height); - } - else { - return isPowerOfTwo$1(this.width) - && isPowerOfTwo$1(this.height); - } - }, - - isRenderable: function () { - if (this.image.px) { - return isImageRenderable(this.image.px) - && isImageRenderable(this.image.nx) - && isImageRenderable(this.image.py) - && isImageRenderable(this.image.ny) - && isImageRenderable(this.image.pz) - && isImageRenderable(this.image.nz); - } - else { - return !!(this.width && this.height); - } - }, - - load: function (imageList, crossOrigin) { - var loading = 0; - var self = this; - util$1.each(imageList, function (src, target){ - var image = new Image(); - if (crossOrigin) { - image.crossOrigin = crossOrigin; - } - image.onload = function () { - loading --; - if (loading === 0){ - self.dirty(); - self.trigger('success', self); - } - image.onload = null; - }; - image.onerror = function () { - loading --; - image.onerror = null; - }; - - loading++; - image.src = src; - self.image[target] = image; - }); - - return this; - } -}); - -Object.defineProperty(TextureCube.prototype, 'width', { - get: function () { - if (this.image && this.image.px) { - return this.image.px.width; - } - return this._width; - }, - set: function (value) { - if (this.image && this.image.px) { - console.warn('Texture from image can\'t set width'); - } - else { - if (this._width !== value) { - this.dirty(); - } - this._width = value; - } - } -}); -Object.defineProperty(TextureCube.prototype, 'height', { - get: function () { - if (this.image && this.image.px) { - return this.image.px.height; - } - return this._height; - }, - set: function (value) { - if (this.image && this.image.px) { - console.warn('Texture from image can\'t set height'); - } - else { - if (this._height !== value) { - this.dirty(); - } - this._height = value; - } - } -}); -function isImageRenderable(image) { - return image.nodeName === 'CANVAS' || - image.nodeName === 'VIDEO' || - image.complete; -} - var KEY_FRAMEBUFFER = 'framebuffer'; var KEY_RENDERBUFFER = 'renderbuffer'; var KEY_RENDERBUFFER_WIDTH = KEY_RENDERBUFFER + '_width'; @@ -23025,6 +23181,8 @@ var Skybox = Mesh.extend(function () { if (this.scene) { this.detachScene(); } + scene.skybox = this; + this.scene = scene; scene.on('beforerender', this._beforeRenderScene, this); }, @@ -23034,6 +23192,7 @@ var Skybox = Mesh.extend(function () { detachScene: function () { if (this.scene) { this.scene.off('beforerender', this._beforeRenderScene); + this.scene.skybox = null; } this.scene = null; }, @@ -23070,6 +23229,12 @@ var Skybox = Mesh.extend(function () { this.update(); // Don't remember to disable blend renderer.gl.disable(renderer.gl.BLEND); + if (this.material.get('lod') > 0) { + this.material.define('fragment', 'LOD'); + } + else { + this.material.undefine('fragment', 'LOD'); + } renderer.renderPass([this], camera); } }); @@ -23271,6 +23436,8 @@ var Skydome = Mesh.extend(function () { if (this.scene) { this.detachScene(); } + scene.skydome = this; + this.scene = scene; scene.on('beforerender', this._beforeRenderScene, this); }, @@ -23281,6 +23448,7 @@ var Skydome = Mesh.extend(function () { detachScene: function () { if (this.scene) { this.scene.off('beforerender', this._beforeRenderScene); + this.scene.skydome = null; } this.scene = null; }, @@ -23616,7 +23784,8 @@ var textureUtil = { if (path.match(/.hdr$/) || option.fileType === 'hdr') { texture = new Texture2D({ width: 0, - height: 0 + height: 0, + sRGB: false }); textureUtil._fetchTexture( path, @@ -23712,6 +23881,9 @@ var textureUtil = { skydome.material.define('fragment', 'RGBM_ENCODE'); } + // Share sRGB + cubeMap.sRGB = panoramaMap.sRGB; + environmentMapPass.texture = cubeMap; environmentMapPass.render(renderer, skydome.scene); environmentMapPass.texture = null; @@ -25430,4499 +25602,4694 @@ RayPicking.Intersection = function (point, pointWorld, target, triangle, triangl this.distance = distance; }; -// Spherical Harmonic Helpers var vec3$15 = glmatrix.vec3; -var sh = {}; - -var targets$3 = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; +var vec2$1 = glmatrix.vec2; -function harmonics(normal, index){ - var x = normal[0]; - var y = normal[1]; - var z = normal[2]; +/** + * @constructor clay.geometry.Cone + * @extends clay.Geometry + * @param {Object} [opt] + * @param {number} [opt.topRadius] + * @param {number} [opt.bottomRadius] + * @param {number} [opt.height] + * @param {number} [opt.capSegments] + * @param {number} [opt.heightSegments] + */ +var Cone$1 = Geometry.extend( +/** @lends clay.geometry.Cone# */ +{ + dynamic: false, + /** + * @type {number} + */ + topRadius: 0, - if (index === 0) { - return 1.0; - } - else if (index === 1) { - return x; - } - else if (index === 2) { - return y; - } - else if (index === 3) { - return z; - } - else if (index === 4) { - return x * z; - } - else if (index === 5) { - return y * z; - } - else if (index === 6) { - return x * y; - } - else if (index === 7) { - return 3.0 * z * z - 1.0; - } - else { - return x * x - y * y; - } -} + /** + * @type {number} + */ + bottomRadius: 1, -var normalTransform = { - px: [2, 1, 0, -1, -1, 1], - nx: [2, 1, 0, 1, -1, -1], - py: [0, 2, 1, 1, -1, -1], - ny: [0, 2, 1, 1, 1, 1], - pz: [0, 1, 2, -1, -1, -1], - nz: [0, 1, 2, 1, -1, 1] -}; + /** + * @type {number} + */ + height: 2, -// Project on cpu. -function projectEnvironmentMapCPU(renderer, cubePixels, width, height) { - var coeff = new vendor.Float32Array(9 * 3); - var normal = vec3$15.create(); - var texel = vec3$15.create(); - var fetchNormal = vec3$15.create(); - for (var m = 0; m < 9; m++) { - var result = vec3$15.create(); - for (var k = 0; k < targets$3.length; k++) { - var pixels = cubePixels[targets$3[k]]; + /** + * @type {number} + */ + capSegments: 20, - var sideResult = vec3$15.create(); - var divider = 0; - var i = 0; - var transform = normalTransform[targets$3[k]]; - for (var y = 0; y < height; y++) { - for (var x = 0; x < width; x++) { + /** + * @type {number} + */ + heightSegments: 1 +}, function() { + this.build(); +}, +/** @lends clay.geometry.Cone.prototype */ +{ + /** + * Build cone geometry + */ + build: function() { + var positions = []; + var texcoords = []; + var faces = []; + positions.length = 0; + texcoords.length = 0; + faces.length = 0; + // Top cap + var capSegRadial = Math.PI * 2 / this.capSegments; - normal[0] = x / (width - 1.0) * 2.0 - 1.0; - // TODO Flip y? - normal[1] = y / (height - 1.0) * 2.0 - 1.0; - normal[2] = -1.0; - vec3$15.normalize(normal, normal); + var topCap = []; + var bottomCap = []; - fetchNormal[0] = normal[transform[0]] * transform[3]; - fetchNormal[1] = normal[transform[1]] * transform[4]; - fetchNormal[2] = normal[transform[2]] * transform[5]; + var r1 = this.topRadius; + var r2 = this.bottomRadius; + var y = this.height / 2; - texel[0] = pixels[i++] / 255; - texel[1] = pixels[i++] / 255; - texel[2] = pixels[i++] / 255; - // RGBM Decode - var scale = pixels[i++] / 255 * 51.5; - texel[0] *= scale; - texel[1] *= scale; - texel[2] *= scale; + var c1 = vec3$15.fromValues(0, y, 0); + var c2 = vec3$15.fromValues(0, -y, 0); + for (var i = 0; i < this.capSegments; i++) { + var theta = i * capSegRadial; + var x = r1 * Math.sin(theta); + var z = r1 * Math.cos(theta); + topCap.push(vec3$15.fromValues(x, y, z)); - vec3$15.scaleAndAdd(sideResult, sideResult, texel, harmonics(fetchNormal, m) * -normal[2]); - // -normal.z equals cos(theta) of Lambertian - divider += -normal[2]; - } - } - vec3$15.scaleAndAdd(result, result, sideResult, 1 / divider); + x = r2 * Math.sin(theta); + z = r2 * Math.cos(theta); + bottomCap.push(vec3$15.fromValues(x, -y, z)); } - coeff[m * 3] = result[0] / 6.0; - coeff[m * 3 + 1] = result[1] / 6.0; - coeff[m * 3 + 2] = result[2] / 6.0; - } - return coeff; -} + // Build top cap + positions.push(c1); + // FIXME + texcoords.push(vec2$1.fromValues(0, 1)); + var n = this.capSegments; + for (var i = 0; i < n; i++) { + positions.push(topCap[i]); + // FIXME + texcoords.push(vec2$1.fromValues(i / n, 0)); + faces.push([0, i+1, (i+1) % n + 1]); + } -/** - * @param {clay.Renderer} renderer - * @param {clay.Texture} envMap - * @param {Object} [textureOpts] - * @param {Object} [textureOpts.lod] - * @param {boolean} [textureOpts.decodeRGBM] - */ -sh.projectEnvironmentMap = function (renderer, envMap, opts) { + // Build bottom cap + var offset = positions.length; + positions.push(c2); + texcoords.push(vec2$1.fromValues(0, 1)); + for (var i = 0; i < n; i++) { + positions.push(bottomCap[i]); + // FIXME + texcoords.push(vec2$1.fromValues(i / n, 0)); + faces.push([offset, offset+((i+1) % n + 1), offset+i+1]); + } - // TODO sRGB + // Build side + offset = positions.length; + var n2 = this.heightSegments; + for (var i = 0; i < n; i++) { + for (var j = 0; j < n2+1; j++) { + var v = j / n2; + positions.push(vec3$15.lerp(vec3$15.create(), topCap[i], bottomCap[i], v)); + texcoords.push(vec2$1.fromValues(i / n, v)); + } + } + for (var i = 0; i < n; i++) { + for (var j = 0; j < n2; j++) { + var i1 = i * (n2 + 1) + j; + var i2 = ((i + 1) % n) * (n2 + 1) + j; + var i3 = ((i + 1) % n) * (n2 + 1) + j + 1; + var i4 = i * (n2 + 1) + j + 1; + faces.push([offset+i2, offset+i1, offset+i4]); + faces.push([offset+i4, offset+i3, offset+i2]); + } + } - opts = opts || {}; - opts.lod = opts.lod || 0; + this.attributes.position.fromArray(positions); + this.attributes.texcoord0.fromArray(texcoords); - var skybox; - var dummyScene = new Scene(); - var size = 64; - if (envMap instanceof Texture2D) { - skybox = new Skydome({ - scene: dummyScene, - environmentMap: envMap - }); - } - else { - size = (envMap.image && envMap.image.px) ? envMap.image.px.width : envMap.width; - skybox = new Skybox({ - scene: dummyScene, - environmentMap: envMap - }); - } - // Convert to rgbm - var width = Math.ceil(size / Math.pow(2, opts.lod)); - var height = Math.ceil(size / Math.pow(2, opts.lod)); - var rgbmTexture = new Texture2D({ - width: width, - height: height - }); - var framebuffer = new FrameBuffer(); - skybox.material.define('fragment', 'RGBM_ENCODE'); - if (opts.decodeRGBM) { - skybox.material.define('fragment', 'RGBM_DECODE'); - } - skybox.material.set('lod', opts.lod); - var envMapPass = new EnvironmentMapPass({ - texture: rgbmTexture - }); - var cubePixels = {}; - for (var i = 0; i < targets$3.length; i++) { - cubePixels[targets$3[i]] = new Uint8Array(width * height * 4); - var camera = envMapPass.getCamera(targets$3[i]); - camera.fov = 90; - framebuffer.attach(rgbmTexture); - framebuffer.bind(renderer); - renderer.render(dummyScene, camera); - renderer.gl.readPixels( - 0, 0, width, height, - Texture.RGBA, Texture.UNSIGNED_BYTE, cubePixels[targets$3[i]] - ); - framebuffer.unbind(renderer); - } + this.initIndicesFromArray(faces); - skybox.dispose(renderer); - framebuffer.dispose(renderer); - rgbmTexture.dispose(renderer); + this.generateVertexNormals(); - return projectEnvironmentMapCPU(renderer, cubePixels, width, height); -}; + this.boundingBox = new BoundingBox(); + var r = Math.max(this.topRadius, this.bottomRadius); + this.boundingBox.min.set(-r, -this.height/2, -r); + this.boundingBox.max.set(r, this.height/2, r); + } +}); /** - * Helpers for creating a common 3d application. - * @namespace clay.application + * @constructor clay.geometry.Cylinder + * @extends clay.Geometry + * @param {Object} [opt] + * @param {number} [opt.radius] + * @param {number} [opt.height] + * @param {number} [opt.capSegments] + * @param {number} [opt.heightSegments] */ +var Cylinder$1 = Geometry.extend( +/** @lends clay.geometry.Cylinder# */ +{ + dynamic: false, + /** + * @type {number} + */ + radius: 1, - // TODO createCompositor - // TODO mobile. scroll events. - // TODO Dispose test. geoCache test. - // TODO fitModel, normal generation. - // TODO Skybox, Skydome. - // TODO Particle ? -var parseColor = colorUtil.parseToFloat; + /** + * @type {number} + */ + height: 2, -/** - * @typedef {string|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} ImageLike - */ -/** - * @typedef {string|Array.} Color - */ -/** - * @typedef {HTMLDomElement|string} DomQuery - */ + /** + * @type {number} + */ + capSegments: 50, -/** - * @constructor - * @alias clay.application.App3D - * @param {DomQuery} dom Container dom element or a selector string that can be used in `querySelector` - * @param {Object} appNS - * @param {Function} appNS.init Initialization callback that will be called when initing app. - * You can return a promise in init to start the loop asynchronously when the promise is resolved. - * @param {Function} appNS.loop Loop callback that will be called each frame. - * @param {Function} appNS.beforeRender - * @param {Function} appNS.afterRender - * @param {number} [appNS.width] Container width. - * @param {number} [appNS.height] Container height. - * @param {number} [appNS.devicePixelRatio] - * @param {Object} [appNS.graphic] Graphic configuration including shadow, postEffect - * @param {boolean} [appNS.graphic.shadow=false] If enable shadow - * @param {boolean} [appNS.graphic.linear=false] If use linear space - * @param {boolean} [appNS.graphic.tonemapping=false] If enable ACES tone mapping. - * @param {boolean} [appNS.event=false] If enable mouse/touch event. It will slow down the system if geometries are complex. - */ -function App3D(dom, appNS) { + /** + * @type {number} + */ + heightSegments: 1 +}, function() { + this.build(); +}, +/** @lends clay.geometry.Cylinder.prototype */ +{ + /** + * Build cylinder geometry + */ + build: function() { + var cone = new Cone$1({ + topRadius: this.radius, + bottomRadius: this.radius, + capSegments: this.capSegments, + heightSegments: this.heightSegments, + height: this.height + }); - appNS = appNS || {}; - appNS.graphic = appNS.graphic || {}; + this.attributes.position.value = cone.attributes.position.value; + this.attributes.normal.value = cone.attributes.normal.value; + this.attributes.texcoord0.value = cone.attributes.texcoord0.value; + this.indices = cone.indices; - if (typeof dom === 'string') { - dom = document.querySelector(dom); + this.boundingBox = cone.boundingBox; } +}); - if (!dom) { throw new Error('Invalid dom'); } +var gbufferEssl = "@export clay.deferred.gbuffer.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat;\nuniform vec2 uvOffset;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#ifdef FIRST_PASS\nattribute vec3 normal : NORMAL;\n#endif\n@import clay.chunk.skinning_header\n#ifdef FIRST_PASS\nvarying vec3 v_Normal;\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nvarying vec3 v_WorldPosition;\n#endif\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef FIRST_PASS\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n bool hasTangent = dot(tangent, tangent) > 0.0;\n#endif\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n #ifdef FIRST_PASS\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n if (hasTangent) {\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n }\n #endif\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n#ifdef FIRST_PASS\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n if (hasTangent) {\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n#endif\n}\n@end\n@export clay.deferred.gbuffer1.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform float glossiness;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nuniform sampler2D roughGlossMap;\nuniform bool useRoughGlossMap;\nuniform bool useRoughness;\nuniform bool doubleSided;\nuniform int roughGlossChannel: 0;\nfloat indexingTexel(in vec4 texel, in int idx) {\n if (idx == 3) return texel.a;\n else if (idx == 1) return texel.g;\n else if (idx == 2) return texel.b;\n else return texel.r;\n}\nvoid main()\n{\n vec3 N = v_Normal;\n if (doubleSided) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = eyePos - v_WorldPosition;\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n }\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_Texcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n gl_FragColor.rgb = (N + 1.0) * 0.5;\n float g = glossiness;\n if (useRoughGlossMap) {\n float g2 = indexingTexel(texture2D(roughGlossMap, v_Texcoord), roughGlossChannel);\n if (useRoughness) {\n g2 = 1.0 - g2;\n }\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n gl_FragColor.a = g + 0.005;\n}\n@end\n@export clay.deferred.gbuffer2.fragment\nuniform sampler2D diffuseMap;\nuniform sampler2D metalnessMap;\nuniform vec3 color;\nuniform float metalness;\nuniform bool useMetalnessMap;\nuniform bool linear;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvoid main ()\n{\n float m = metalness;\n if (useMetalnessMap) {\n vec4 metalnessTexel = texture2D(metalnessMap, v_Texcoord);\n m = clamp(metalnessTexel.r + (m * 2.0 - 1.0), 0.0, 1.0);\n }\n vec4 texel = texture2D(diffuseMap, v_Texcoord);\n if (linear) {\n texel = sRGBToLinear(texel);\n }\n gl_FragColor.rgb = texel.rgb * color;\n gl_FragColor.a = m + 0.005;\n}\n@end\n@export clay.deferred.gbuffer.debug\n@import clay.deferred.chunk.light_head\nuniform int debug: 0;\nvoid main ()\n{\n @import clay.deferred.chunk.gbuffer_read\n if (debug == 0) {\n gl_FragColor = vec4(N, 1.0);\n }\n else if (debug == 1) {\n gl_FragColor = vec4(vec3(z), 1.0);\n }\n else if (debug == 2) {\n gl_FragColor = vec4(position, 1.0);\n }\n else if (debug == 3) {\n gl_FragColor = vec4(vec3(glossiness), 1.0);\n }\n else if (debug == 4) {\n gl_FragColor = vec4(vec3(metalness), 1.0);\n }\n else {\n gl_FragColor = vec4(albedo, 1.0);\n }\n}\n@end"; - var isDomCanvas = dom.nodeName.toUpperCase() === 'CANVAS'; - var rendererOpts = {}; - isDomCanvas && (rendererOpts.canvas = dom); - appNS.devicePixelRatio && (rendererOpts.devicePixelRatio = appNS.devicePixelRatio); +var chunkEssl = "@export clay.deferred.chunk.light_head\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform vec2 windowSize: WINDOW_SIZE;\nuniform vec4 viewport: VIEWPORT;\nuniform mat4 viewProjectionInv;\n#ifdef DEPTH_ENCODED\n@import clay.util.decode_float\n#endif\n@end\n@export clay.deferred.chunk.gbuffer_read\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec2 uv2 = (gl_FragCoord.xy - viewport.xy) / viewport.zw;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n vec4 texel3 = texture2D(gBufferTexture3, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n float glossiness = texel1.a;\n float metalness = texel3.a;\n vec3 N = texel1.rgb * 2.0 - 1.0;\n float z = texture2D(gBufferTexture2, uv).r * 2.0 - 1.0;\n vec2 xy = uv2 * 2.0 - 1.0;\n vec4 projectedPos = vec4(xy, z, 1.0);\n vec4 p4 = viewProjectionInv * projectedPos;\n vec3 position = p4.xyz / p4.w;\n vec3 albedo = texel3.rgb;\n vec3 diffuseColor = albedo * (1.0 - metalness);\n vec3 specularColor = mix(vec3(0.04), albedo, metalness);\n@end\n@export clay.deferred.chunk.light_equation\nfloat D_Phong(in float g, in float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(in float g, in float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (3.1415926 * tmp * tmp);\n}\nvec3 F_Schlick(in float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nvec3 lightEquation(\n in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n in float ndl, in float ndh, in float ndv, in float g\n)\n{\n return ndl * lightColor\n * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n}\n@end"; - var gRenderer = new Renderer(rendererOpts); - var gWidth = appNS.width || dom.clientWidth; - var gHeight = appNS.height || dom.clientHeight; +Shader.import(gbufferEssl); +Shader.import(chunkEssl); - var gScene = new Scene(); - var gTimeline = new Timeline(); - var gShadowPass = appNS.graphic.shadow && new ShadowMapPass(); - var gRayPicking = appNS.event && new RayPicking({ - scene: gScene, - renderer: gRenderer - }); +function createFillCanvas(color) { + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + var ctx = canvas.getContext('2d'); + ctx.fillStyle = color || '#000'; + ctx.fillRect(0, 0, 1, 1); - !isDomCanvas && dom.appendChild(gRenderer.canvas); + return canvas; +} - gRenderer.resize(gWidth, gHeight); +function attachTextureToSlot(renderer, program, symbol, texture, slot) { + var gl = renderer.gl; + program.setUniform(gl, '1i', symbol, slot); - var gFrameTime = 0; - var gElapsedTime = 0; + gl.activeTexture(gl.TEXTURE0 + slot); + // Maybe texture is not loaded yet; + if (texture.isRenderable()) { + texture.bind(renderer); + } + else { + // Bind texture to null + texture.unbind(renderer); + } +} - gTimeline.start(); +// TODO Use globalShader insteadof globalMaterial? +function getBeforeRenderHook1 (gl, defaultNormalMap, defaultRoughnessMap) { - Object.defineProperties(this, { - /** - * Container dom element - * @name clay.application.App3D#container - * @type {HTMLDomElement} - */ - container: { get: function () { return dom; } }, - /** - * @name clay.application.App3D#renderer - * @type {clay.Renderer} - */ - renderer: { get: function () { return gRenderer; }}, - /** - * @name clay.application.App3D#scene - * @type {clay.Renderer} - */ - scene: { get: function () { return gScene; }}, - /** - * @name clay.application.App3D#timeline - * @type {clay.Renderer} - */ - timeline: { get: function () { return gTimeline; }}, - /** - * Time elapsed since last frame. Can be used in loop to calculate the movement. - * @name clay.application.App3D#frameTime - * @type {number} - */ - frameTime: { get: function () { return gFrameTime; }}, - /** - * Time elapsed since application created. - * @name clay.application.App3D#elapsedTime - * @type {number} - */ - elapsedTime: { get: function () { return gElapsedTime; }} - }); + var previousNormalMap; + var previousRougGlossMap; + var previousRenderable; - /** - * Resize the application. Will use the container clientWidth/clientHeight if width/height in parameters are not given. - * @function - * @memberOf {clay.application.App3D} - * @param {number} [width] - * @param {number} [height] - */ - this.resize = function (width, height) { - gWidth = width || appNS.width || dom.clientWidth; - gHeight = height || dom.height || dom.clientHeight; - gRenderer.resize(gWidth, gHeight); - }; + return function (renderable, gBufferMat, prevMaterial) { + // Material not change + if (previousRenderable && previousRenderable.material === renderable.material) { + return; + } - /** - * Dispose the application - * @function - */ - this.dispose = function () { - this._disposed = true; + var standardMaterial = renderable.material; + var program = renderable.__program; - if (appNS.dispose) { - appNS.dispose(this); + var glossiness; + var roughGlossMap; + var useRoughnessWorkflow = standardMaterial.isDefined('fragment', 'USE_ROUGHNESS'); + var doubleSided = standardMaterial.isDefined('fragment', 'DOUBLE_SIDED'); + var roughGlossChannel; + if (useRoughnessWorkflow) { + glossiness = 1.0 - standardMaterial.get('roughness'); + roughGlossMap = standardMaterial.get('roughnessMap'); + roughGlossChannel = standardMaterial.getDefine('fragment', 'ROUGHNESS_CHANNEL'); } - gTimeline.stop(); - gRenderer.disposeScene(gScene); - gShadowPass && gShadowPass.dispose(gRenderer); - - dom.innerHTML = ''; - ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove'].forEach(function (eveType) { - this[makeHandlerName(eveType)] && dom.removeEventListener(makeHandlerName(eveType)); - }); - }; + else { + glossiness = standardMaterial.get('glossiness'); + roughGlossMap = standardMaterial.get('glossinessMap'); + roughGlossChannel = standardMaterial.getDefine('fragment', 'GLOSSINESS_CHANNEL'); + } + var useRoughGlossMap = !!roughGlossMap; - gRayPicking && this._initMouseEvents(gRayPicking); + var normalMap = standardMaterial.get('normalMap') || defaultNormalMap; + var uvRepeat = standardMaterial.get('uvRepeat'); + var uvOffset = standardMaterial.get('uvOffset'); - this._geoCache = new LRU$1(20); - this._texCache = new LRU$1(20); + roughGlossMap = roughGlossMap || defaultRoughnessMap; - // Do init the application. - var initPromise = Promise.resolve(appNS.init && appNS.init(this)); - // Use the inited camera. - gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); + if (prevMaterial !== gBufferMat) { + gBufferMat.set('glossiness', glossiness); + gBufferMat.set('normalMap', normalMap); + gBufferMat.set('roughGlossMap', roughGlossMap); + gBufferMat.set('useRoughGlossMap', +useRoughGlossMap); + gBufferMat.set('useRoughness', +useRoughnessWorkflow); + gBufferMat.set('doubleSided', +doubleSided); + gBufferMat.set('roughGlossChannel', +roughGlossChannel || 0); + gBufferMat.set('uvRepeat', uvRepeat); + gBufferMat.set('uvOffset', uvOffset); + } + else { + program.setUniform( + gl, '1f', 'glossiness', glossiness + ); - var gTexturesList = {}; - var gGeometriesList = {}; + if (previousNormalMap !== normalMap) { + attachTextureToSlot(this, program, 'normalMap', normalMap, 0); + } + if (previousRougGlossMap !== roughGlossMap) { + attachTextureToSlot(this, program, 'roughGlossMap', roughGlossMap, 1); + } + program.setUniform(gl, '1i', 'useRoughGlossMap', +useRoughGlossMap); + program.setUniform(gl, '1i', 'useRoughness', +useRoughnessWorkflow); + program.setUniform(gl, '1i', 'doubleSided', +doubleSided); + program.setUniform(gl, '1i', 'roughGlossChannel', +roughGlossChannel || 0); + if (uvRepeat != null) { + program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); + } + if (uvOffset != null) { + program.setUniform(gl, '2f', 'uvOffset', uvOffset); + } + } - if (!appNS.loop) { - console.warn('Miss loop method.'); - } + previousNormalMap = normalMap; + previousRougGlossMap = roughGlossMap; - var self = this; - initPromise.then(function () { - appNS.loop && gTimeline.on('frame', function (frameTime) { - gFrameTime = frameTime; - gElapsedTime += frameTime; - appNS.loop(self); + previousRenderable = renderable; + }; +} - gScene.update(); - self._updateGraphicOptions(appNS.graphic, gScene.opaqueList); - self._updateGraphicOptions(appNS.graphic, gScene.transparentList); +function getBeforeRenderHook2(gl, defaultDiffuseMap, defaultMetalnessMap) { + var previousDiffuseMap; + var previousRenderable; + var previousMetalnessMap; - gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); - // Render shadow pass - gShadowPass && gShadowPass.render(gRenderer, gScene, null, true); + return function (renderable, gBufferMat, prevMaterial) { + // Material not change + if (previousRenderable && previousRenderable.material === renderable.material) { + return; + } - appNS.beforeRender && appNS.beforeRender(self); - self._doRender(gRenderer, gScene, true); - appNS.afterRender && appNS.afterRender(self); + var program = renderable.__program; + var standardMaterial = renderable.material; - // Mark all resources unused; - markUnused(gTexturesList); - markUnused(gGeometriesList); + var color = standardMaterial.get('color'); + var metalness = standardMaterial.get('metalness'); - // Collect resources used in this frame. - var newTexturesList = []; - var newGeometriesList = []; - collectResources(gScene, newTexturesList, newGeometriesList); + var diffuseMap = standardMaterial.get('diffuseMap'); + var metalnessMap = standardMaterial.get('metalnessMap'); - // Dispose those unsed resources. - checkAndDispose(gRenderer, gTexturesList); - checkAndDispose(gRenderer, gGeometriesList); + var uvRepeat = standardMaterial.get('uvRepeat'); + var uvOffset = standardMaterial.get('uvOffset'); - gTexturesList = newTexturesList; - gGeometriesList = newGeometriesList; - }); - }); -} + var useMetalnessMap = !!metalnessMap; -function isImageLikeElement(val) { - return val instanceof Image - || val instanceof HTMLCanvasElement - || val instanceof HTMLVideoElement; -} + diffuseMap = diffuseMap || defaultDiffuseMap; + metalnessMap = metalnessMap || defaultMetalnessMap; -function getKeyFromImageLike(val) { - typeof val === 'string' - ? val : (val.__key__ || (val.__key__ = util$1.genGUID())); -} + if (prevMaterial !== gBufferMat) { + gBufferMat.set('color', color); + gBufferMat.set('metalness', metalness); + gBufferMat.set('diffuseMap', diffuseMap); + gBufferMat.set('metalnessMap', metalnessMap); + gBufferMat.set('useMetalnessMap', +useMetalnessMap); + gBufferMat.set('uvRepeat', uvRepeat); + gBufferMat.set('uvOffset', uvOffset); -function makeHandlerName(eveType) { - return '_' + eveType + 'Handler'; -} + gBufferMat.set('linear', +standardMaterial.linear); + } + else { + program.setUniform(gl, '1f', 'metalness', metalness); -function packageEvent(eventType, pickResult, offsetX, offsetY) { - var event = util$1.clone(pickResult); - event.type = eventType; - event.offsetX = offsetX; - event.offsetY = offsetY; - return event; -} + program.setUniform(gl, '3f', 'color', color); + if (previousDiffuseMap !== diffuseMap) { + attachTextureToSlot(this, program, 'diffuseMap', diffuseMap, 0); + } + if (previousMetalnessMap !== metalnessMap) { + attachTextureToSlot(this, program, 'metalnessMap', metalnessMap, 1); + } + program.setUniform(gl, '1i', 'useMetalnessMap', +useMetalnessMap); + program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); + program.setUniform(gl, '2f', 'uvOffset', uvOffset); -function bubblingEvent(target, event) { - while (target && !event.cancelBubble) { - target.trigger(event.type, event); - target = target.getParent(); - } + program.setUniform(gl, '1i', 'linear', +standardMaterial.linear); + } + + previousDiffuseMap = diffuseMap; + previousMetalnessMap = metalnessMap; + + previousRenderable = renderable; + }; } -App3D.prototype._initMouseEvents = function (rayPicking) { - var dom = this.container; +/** + * GBuffer is provided for deferred rendering and SSAO, SSR pass. + * It will do two passes rendering to three target textures. See + * + {@link clay.deferred.GBuffer#getTargetTexture1} + * + {@link clay.deferred.GBuffer#getTargetTexture2} + * + {@link clay.deferred.GBuffer#getTargetTexture3} + * @constructor + * @alias clay.deferred.GBuffer + * @extends clay.core.Base + */ +var GBuffer = Base.extend(function () { - var oldTarget = null; - ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove'].forEach(function (eveType) { - dom.addEventListener(eveType, this[makeHandlerName(eveType)] = function (e) { - if (!rayPicking.camera) { // Not have camera yet. - return; - } + return { - var box = dom.getBoundingClientRect(); - var offsetX = e.clientX - box.left; - var offsetY = e.clientY - box.top; + enableTargetTexture1: true, - var pickResult = rayPicking.pick(offsetX, offsetY); + enableTargetTexture2: true, - if (pickResult) { - // Just ignore silent element. - if (pickResult.target.silent) { - return; - } + enableTargetTexture3: true, - if (eveType === 'mousemove') { - var targetChanged = pickResult.target !== oldTarget; - if (targetChanged) { - oldTarget && bubblingEvent(oldTarget, packageEvent('mouseout', { - target: oldTarget - }, offsetX, offsetY)); - } - bubblingEvent(pickResult.target, packageEvent('mousemove', pickResult, offsetX, offsetY)); - if (targetChanged) { - bubblingEvent(pickResult.target, packageEvent('mouseover', pickResult, offsetX, offsetY)); - } - } - else { - bubblingEvent(pickResult.target, packageEvent(eveType, pickResult, offsetX, offsetY)); - } - oldTarget = pickResult.target; - } - else if (oldTarget) { - bubblingEvent(oldTarget, packageEvent('mouseout', { - target: oldTarget - }, offsetX, offsetY)); - oldTarget = null; + renderTransparent: false, + + _renderList: [], + // - R: normal.x + // - G: normal.y + // - B: normal.z + // - A: glossiness + _gBufferTex1: new Texture2D({ + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST, + // PENDING + type: Texture.HALF_FLOAT + }), + + // - R: depth + _gBufferTex2: new Texture2D({ + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST, + // format: Texture.DEPTH_COMPONENT, + // type: Texture.UNSIGNED_INT + + format: Texture.DEPTH_STENCIL, + type: Texture.UNSIGNED_INT_24_8_WEBGL + }), + + // - R: albedo.r + // - G: albedo.g + // - B: albedo.b + // - A: metalness + _gBufferTex3: new Texture2D({ + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST + }), + + _defaultNormalMap: new Texture2D({ + image: createFillCanvas('#000') + }), + _defaultRoughnessMap: new Texture2D({ + image: createFillCanvas('#fff') + }), + _defaultMetalnessMap: new Texture2D({ + image: createFillCanvas('#fff') + }), + _defaultDiffuseMap: new Texture2D({ + image: createFillCanvas('#fff') + }), + + _frameBuffer: new FrameBuffer(), + + _gBufferMaterial1: new Material({ + shader: new Shader( + Shader.source('clay.deferred.gbuffer.vertex'), + Shader.source('clay.deferred.gbuffer1.fragment') + ), + vertexDefines: { + FIRST_PASS: null + }, + fragmentDefines: { + FIRST_PASS: null } - }); - }, this); -}; + }), + _gBufferMaterial2: new Material({ + shader: new Shader( + Shader.source('clay.deferred.gbuffer.vertex'), + Shader.source('clay.deferred.gbuffer2.fragment') + ) + }), -App3D.prototype._updateGraphicOptions = function (graphicOpts, list) { - var enableTonemapping = !!graphicOpts.tonemapping; - var isLinearSpace = !!graphicOpts.linear; + _debugPass: new Pass({ + fragment: Shader.source('clay.deferred.gbuffer.debug') + }) + }; +}, /** @lends clay.deferred.GBuffer# */{ - var prevMaterial; + /** + * Set G Buffer size. + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + if (this._gBufferTex1.width === width + && this._gBufferTex1.height === height + ) { + return; + } + this._gBufferTex1.width = width; + this._gBufferTex1.height = height; - for (var i = 0; i < list.length; i++) { - var mat = list[i].material; - if (mat === prevMaterial) { - continue; + this._gBufferTex2.width = width; + this._gBufferTex2.height = height; + + this._gBufferTex3.width = width; + this._gBufferTex3.height = height; + }, + + // TODO is dpr needed? + setViewport: function (x, y, width, height, dpr) { + var viewport; + if (typeof x === 'object') { + viewport = x; + } + else { + viewport = { + x: x, y: y, + width: width, height: height, + devicePixelRatio: dpr || 1 + }; } + this._frameBuffer.viewport = viewport; + }, - enableTonemapping ? mat.define('fragment', 'TONEMAPPING') : mat.undefine('fragment', 'TONEMAPPING'); - if (isLinearSpace) { - mat.define('fragment', 'SRGB_ENCODE'); - mat.define('fragment', 'SRGB_DECODE'); + getViewport: function () { + if (this._frameBuffer.viewport) { + return this._frameBuffer.viewport; } else { - mat.undefine('fragment', 'SRGB_ENCODE'); - mat.undefine('fragment', 'SRGB_DECODE'); + return { + x: 0, y: 0, + width: this._gBufferTex1.width, + height: this._gBufferTex1.height, + devicePixelRatio: 1 + }; } + }, - prevMaterial = mat; - } -}; + /** + * Update G Buffer + * @param {clay.Renderer} renderer + * @param {clay.Scene} scene + * @param {clay.camera.Perspective} camera + */ + update: function (renderer, scene, camera) { -App3D.prototype._doRender = function (renderer, scene) { - var camera = scene.getMainCamera(); - camera.aspect = renderer.getViewportAspect(); - renderer.render(scene); -}; + var gl = renderer.gl; + var frameBuffer = this._frameBuffer; + var viewport = frameBuffer.viewport; + var opaqueList = scene.opaqueList; + var transparentList = scene.transparentList; -function markUnused(resourceList) { - for (var i = 0; i < resourceList.length; i++) { - resourceList[i].__used__ = 0; - } -} + var offset = 0; + var renderList = this._renderList; + for (var i = 0; i < opaqueList.length; i++) { + if (!opaqueList[i].ignoreGBuffer) { + renderList[offset++] = opaqueList[i]; + } + } + if (this.renderTransparent) { + for (var i = 0; i < transparentList.length; i++) { + if (!transparentList[i].ignoreGBuffer) { + renderList[offset++] = transparentList[i]; + } + } + } + renderList.length = offset; -function checkAndDispose(renderer, resourceList) { - for (var i = 0; i < resourceList.length; i++) { - if (!resourceList[i].__used__) { - resourceList[i].dispose(renderer); + gl.clearColor(0, 0, 0, 0); + gl.depthMask(true); + gl.colorMask(true, true, true, true); + gl.disable(gl.BLEND); + + var enableTargetTexture1 = this.enableTargetTexture1; + var enableTargetTexture2 = this.enableTargetTexture2; + var enableTargetTexture3 = this.enableTargetTexture3; + if (!enableTargetTexture1 && !enableTargetTexture3) { + console.warn('Can\'t disable targetTexture1 targetTexture3 both'); + enableTargetTexture1 = true; } - } -} -function updateUsed(resource, list) { - resource.__used__ = resource.__used__ || 0; - resource.__used__++; - if (resource.__used__ === 1) { - // Don't push to the list twice. - list.push(resource); - } -} -function collectResources(scene, textureResourceList, geometryResourceList) { - function trackQueue(queue) { - var prevMaterial; - var prevGeometry; - for (var i = 0; i < queue.length; i++) { - var renderable = queue[i]; - var geometry = renderable.geometry; - var material = renderable.material; + if (enableTargetTexture2) { + frameBuffer.attach(this._gBufferTex2, renderer.gl.DEPTH_STENCIL_ATTACHMENT); + } - // TODO optimize!! - if (material !== prevMaterial) { - var textureUniforms = material.getTextureUniforms(); - for (var u = 0; u < textureUniforms.length; u++) { - var uniformName = textureUniforms[u]; - var val = material.uniforms[uniformName].value; - if (!val) { - continue; - } - if (val instanceof Texture) { - updateUsed(val, textureResourceList); - } - else if (val instanceof Array) { - for (var k = 0; k < val.length; k++) { - if (val[k] instanceof Texture) { - updateUsed(val[k], textureResourceList); - } - } - } - } + // PENDING, scene.boundingBoxLastFrame needs be updated if have shadow + renderer.bindSceneRendering(scene); + if (enableTargetTexture1) { + // Pass 1 + frameBuffer.attach(this._gBufferTex1); + frameBuffer.bind(renderer); + + if (viewport) { + var dpr = viewport.devicePixelRatio; + // use scissor to make sure only clear the viewport + gl.enable(gl.SCISSOR_TEST); + gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); } - if (geometry !== prevGeometry) { - updateUsed(geometry, geometryResourceList); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + if (viewport) { + gl.disable(gl.SCISSOR_TEST); } + var gBufferMaterial1 = this._gBufferMaterial1; + var passConfig = { + getMaterial: function () { + return gBufferMaterial1; + }, + beforeRender: getBeforeRenderHook1(gl, this._defaultNormalMap, this._defaultRoughnessMap), + sortCompare: renderer.opaqueSortCompare + }; + // FIXME Use MRT if possible + renderer.renderPass(renderList, camera, passConfig); - prevMaterial = material; - prevGeometry = geometry; } - } + if (enableTargetTexture3) { - trackQueue(scene.opaqueList); - trackQueue(scene.transparentList); + // Pass 2 + frameBuffer.attach(this._gBufferTex3); + frameBuffer.bind(renderer); - for (var k = 0; k < scene.lights.length; k++) { - // Track AmbientCubemap - if (scene.lights[k].cubemap) { - updateUsed(scene.lights[k].cubemap, textureResourceList); + if (viewport) { + var dpr = viewport.devicePixelRatio; + // use scissor to make sure only clear the viewport + gl.enable(gl.SCISSOR_TEST); + gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); + } + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + if (viewport) { + gl.disable(gl.SCISSOR_TEST); + } + + var gBufferMaterial2 = this._gBufferMaterial2; + var passConfig = { + getMaterial: function () { + return gBufferMaterial2; + }, + beforeRender: getBeforeRenderHook2(gl, this._defaultDiffuseMap, this._defaultMetalnessMap), + sortCompare: renderer.opaqueSortCompare + }; + renderer.renderPass(renderList, camera, passConfig); } - } -} -/** - * Load a texture from image or string. - * @param {ImageLike} img - * @param {Object} [opts] Texture options. - * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} - * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} - * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} - * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} - * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} - * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} - * @param {number} [opts.exposure] Only be used when source is a HDR image. - * @param {boolean} [useCache] If use cache. - * @return {Promise} - * @example - * app.loadTexture('diffuseMap.jpg') - * .then(function (texture) { - * material.set('diffuseMap', texture); - * }); - */ -App3D.prototype.loadTexture = function (urlOrImg, opts, useCache) { - var self = this; - var key = getKeyFromImageLike(urlOrImg); - if (useCache) { - if (this._texCache.get(key)) { - return this._texCache.get(key); + + renderer.bindSceneRendering(null); + frameBuffer.unbind(renderer); + }, + + renderDebug: function (renderer, camera, type, viewport) { + var debugTypes = { + normal: 0, + depth: 1, + position: 2, + glossiness: 3, + metalness: 4, + albedo: 5 + }; + if (debugTypes[type] == null) { + console.warn('Unkown type "' + type + '"'); + // Default use normal + type = 'normal'; } - } - // TODO Promise ? - var promise = new Promise(function (resolve, reject) { - var texture = self.loadTextureSync(urlOrImg, opts); - if (!texture.isRenderable()) { - texture.success(function () { - if (self._disposed) { - return; - } - resolve(texture); - }); - texture.error(function () { - if (self._disposed) { - return; - } - reject(); - }); - } - else { - resolve(texture); - } - }); - if (useCache) { - this._texCache.put(key, promise); - } - return promise; -}; -/** - * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. - * @param {ImageLike} img - * @param {Object} [opts] Texture options. - * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} - * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} - * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} - * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} - * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} - * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} - * @param {number} [opts.exposure] Only be used when source is a HDR image. - * @return {Promise} - * @example - * var texture = app.loadTexture('diffuseMap.jpg', { - * anisotropic: 8, - * flipY: false - * }); - * material.set('diffuseMap', texture); - */ -App3D.prototype.loadTextureSync = function (urlOrImg, opts) { - var texture = new Texture2D(opts); - if (typeof urlOrImg === 'string') { - if (urlOrImg.match(/.hdr$|^data:application\/octet-stream/)) { - texture = textureUtil.loadTexture(urlOrImg, { - exposure: opts && opts.exposure, - fileType: 'hdr' - }, function () { - texture.dirty(); - texture.trigger('success'); - }); - } - else { - texture.load(urlOrImg); - } - } - else if (isImageLikeElement(urlOrImg)) { - texture.image = urlOrImg; - texture.dynamic = urlOrImg instanceof HTMLVideoElement; - } - return texture; -}; + renderer.saveClear(); + renderer.saveViewport(); + renderer.clearBit = renderer.gl.DEPTH_BUFFER_BIT; -/** - * Create a material. - * @param {Object} materialConfig. materialConfig contains `shader`, `transparent` and uniforms that used in corresponding uniforms. - * Uniforms can be `color`, `alpha` `diffuseMap` etc. - * @param {string|clay.Shader} [shader='clay.standardMR'] Default to be standard shader with metalness and roughness workflow. - * @param {boolean} [transparent=false] If material is transparent. - * @return {clay.Material} - */ -App3D.prototype.createMaterial = function (matConfig) { - matConfig = matConfig || {}; - matConfig.shader = matConfig.shader || 'clay.standardMR'; - var shader = matConfig.shader instanceof Shader ? matConfig.shader : library.get(matConfig.shader); - var material = new Material({ - shader: shader - }); - function makeTextureSetter(key) { - return function (texture) { - material.setUniform(key, texture); - }; - } - for (var key in matConfig) { - if (material.uniforms[key]) { - var val = matConfig[key]; - if (material.uniforms[key].type === 't' || isImageLikeElement(val)) { - // Try to load a texture. - this.loadTexture(val).then(makeTextureSetter(key)); - } - else { - material.setUniform(key, val); - } + if (viewport) { + renderer.setViewport(viewport); } - } + var viewProjectionInv = new Matrix4(); + Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); - if (matConfig.transparent) { - matConfig.depthMask = false; - matConfig.transparent = true; - } - return material; -}; + var debugPass = this._debugPass; + debugPass.setUniform('viewportSize', [renderer.getWidth(), renderer.getHeight()]); + debugPass.setUniform('gBufferTexture1', this._gBufferTex1); + debugPass.setUniform('gBufferTexture2', this._gBufferTex2); + debugPass.setUniform('gBufferTexture3', this._gBufferTex3); + debugPass.setUniform('debug', debugTypes[type]); + debugPass.setUniform('viewProjectionInv', viewProjectionInv.array); + debugPass.render(renderer); -/** - * Create a cube mesh and add it to the scene or the given parent node. - * @function - * @param {Array.|number} [subdivision=1] Subdivision of cube. - * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a white cube. - * app.createCube() - */ -App3D.prototype.createCube = function (subdiv, material, parentNode) { - if (subdiv == null) { - subdiv = 1; - } - if (typeof subdiv === 'number') { - subdiv = [subdiv, subdiv, subdiv]; - } + renderer.restoreViewport(); + renderer.restoreClear(); + }, - var geoKey = 'cube-' + subdiv.join('-'); - var cube = this._geoCache.get(geoKey); - if (!cube) { - cube = new Cube$1({ - widthSegments: subdiv[0], - heightSegments: subdiv[1], - depthSegments: subdiv[2] - }); - this._geoCache.put(geoKey, cube); - } - return this.createMesh(cube, material, parentNode); -}; + /** + * Get first target texture. + * Channel storage: + * + R: normal.x * 0.5 + 0.5 + * + G: normal.y * 0.5 + 0.5 + * + B: normal.z * 0.5 + 0.5 + * + A: glossiness + * @return {clay.Texture2D} + */ + getTargetTexture1: function () { + return this._gBufferTex1; + }, -/** - * Create a cube mesh that camera is inside the cube. - * @function - * @param {Array.|number} [subdivision=1] Subdivision of cube. - * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a white cube inside. - * app.createCubeInside() - */ -App3D.prototype.createCubeInside = function (subdiv, material, parentNode) { - if (subdiv == null) { - subdiv = 1; - } - if (typeof subdiv === 'number') { - subdiv = [subdiv, subdiv, subdiv]; - } - var geoKey = 'cubeInside-' + subdiv.join('-'); - var cube = this._geoCache.get(geoKey); - if (!cube) { - cube = new Cube$1({ - inside: true, - widthSegments: subdiv[0], - heightSegments: subdiv[1], - depthSegments: subdiv[2] - }); - this._geoCache.put(geoKey, cube); - } + /** + * Get second target texture. + * Channel storage: + * + R: depth + * @return {clay.Texture2D} + */ + getTargetTexture2: function () { + return this._gBufferTex2; + }, - return this.createMesh(cube, material, parentNode); -}; + /** + * Get third target texture. + * Channel storage: + * + R: albedo.r + * + G: albedo.g + * + B: albedo.b + * + A: metalness + * @return {clay.Texture2D} + */ + getTargetTexture3: function () { + return this._gBufferTex3; + }, -/** - * Create a sphere mesh and add it to the scene or the given parent node. - * @function - * @param {number} [subdivision=20] Subdivision of sphere. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a semi-transparent sphere. - * app.createSphere(20, { - * color: [0, 0, 1], - * transparent: true, - * alpha: 0.5 - * }) - */ -App3D.prototype.createSphere = function (subdivision, material, parentNode) { - if (subdivision == null) { - subdivision = 20; - } - var geoKey = 'sphere-' + subdivision; - var sphere = this._geoCache.get(geoKey); - if (!sphere) { - sphere = new Sphere$1({ - widthSegments: subdivision * 2, - heightSegments: subdivision - }); - this._geoCache.put(geoKey, sphere); - } - return this.createMesh(sphere, material, parentNode); -}; -/** - * Create a plane mesh and add it to the scene or the given parent node. - * @function - * @param {Array.|number} [subdivision=1] Subdivision of plane. - * Can be a number to represent both width and height dimensions. Or an array to represent them respectively. - * @param {Object|clay.Material} [material] - * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. - * @return {clay.Mesh} - * @example - * // Create a red color plane. - * app.createPlane(1, { - * color: [1, 0, 0] - * }) - */ -App3D.prototype.createPlane = function (subdiv, material, parentNode) { - if (subdiv == null) { - subdiv = 1; - } - if (typeof subdiv === 'number') { - subdiv = [subdiv, subdiv]; - } - var geoKey = 'plane-' + subdiv.join('-'); - var planeGeo = this._geoCache.get(geoKey); - if (!planeGeo) { - planeGeo = new Plane$3({ - widthSegments: subdiv[0], - heightSegments: subdiv[1] - }); - this._geoCache.put(geoKey, planeGeo); + /** + * @param {clay.Renderer} renderer + */ + dispose: function (renderer) { } - return this.createMesh(planeGeo, material, parentNode); -}; - -/** - * Create a general mesh with given geometry instance and material config. - * @param {*} geometry - */ -App3D.prototype.createMesh = function (geometry, mat, parentNode) { - var mesh = new Mesh({ - geometry: geometry, - material: mat instanceof Material ? mat : this.createMaterial(mat) - }); - parentNode = parentNode || this.scene; - parentNode.add(mesh); - return mesh; -}; +}); -/** - * Create a perspective or orthographic camera and add it to the scene. - * @param {Array.|clay.math.Vector3} position - * @param {Array.|clay.math.Vector3} target - * @param {string} [type="perspective"] Can be 'perspective' or 'orthographic'(in short 'ortho') - * @return {clay.camera.Perspective} - */ -App3D.prototype.createCamera = function (position, target, type) { - var CameraCtor; - if (type === 'ortho' || type === 'orthographic') { - CameraCtor = Orthographic$1; - } - else { - if (type && type !== 'perspective') { - console.error('Unkown camera type ' + type + '. Use default perspective camera'); - } - CameraCtor = Perspective$1; - } +var lightvolumeGlsl = "@export clay.deferred.light_volume.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_Position;\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, 1.0);\n v_Position = position;\n}\n@end"; - var camera = new CameraCtor(); - if (position instanceof Vector3) { - camera.position.copy(position); - } - else if (position instanceof Array) { - camera.position.setArray(position); - } +var spotGlsl = "@export clay.deferred.spot_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\n@import clay.util.calculate_attenuation\nuniform vec3 lightPosition;\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform float umbraAngleCosine;\nuniform float penumbraAngleCosine;\nuniform float lightRange;\nuniform float falloffFactor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform mat4 lightMatrix;\nuniform float lightShadowMapSize;\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n float attenuation = lightAttenuation(dist, lightRange);\n float c = dot(-normalize(lightDirection), L);\n float falloff = clamp((c - umbraAngleCosine) / (penumbraAngleCosine - umbraAngleCosine), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = (1.0 - falloff) * attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrix, position, lightShadowMapSize\n );\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; - if (target instanceof Array) { - target = new Vector3(target[0], target[1], target[2]); - } - if (target instanceof Vector3) { - camera.lookAt(target); - } +var directionalGlsl = "@export clay.deferred.directional_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform float lightShadowMapSize;\nuniform mat4 lightMatrices[SHADOW_CASCADE];\nuniform float shadowCascadeClipsNear[SHADOW_CASCADE];\nuniform float shadowCascadeClipsFar[SHADOW_CASCADE];\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = -normalize(lightDirection);\n vec3 V = normalize(eyePosition - position);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = 1.0;\n for (int _idx_ = 0; _idx_ < SHADOW_CASCADE; _idx_++) {{\n if (\n z >= shadowCascadeClipsNear[_idx_] &&\n z <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrices[_idx_], position, lightShadowMapSize,\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n }\n }}\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; - this.scene.add(camera); +var ambientGlsl = "@export clay.deferred.ambient_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec2 windowSize: WINDOW_SIZE;\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo;\n gl_FragColor.a = 1.0;\n}\n@end"; - return camera; -}; +var ambientshGlsl = "@export clay.deferred.ambient_sh_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec3 lightCoefficients[9];\nuniform vec2 windowSize: WINDOW_SIZE;\nvec3 calcAmbientSHLight(vec3 N) {\n return lightCoefficients[0]\n + lightCoefficients[1] * N.x\n + lightCoefficients[2] * N.y\n + lightCoefficients[3] * N.z\n + lightCoefficients[4] * N.x * N.z\n + lightCoefficients[5] * N.z * N.y\n + lightCoefficients[6] * N.y * N.x\n + lightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + lightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 N = texel1.rgb * 2.0 - 1.0;\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo * calcAmbientSHLight(N);\n gl_FragColor.a = 1.0;\n}\n@end"; -/** - * Create a directional light and add it to the scene. - * @param {Array.|clay.math.Vector3} dir A Vector3 or array to represent the direction. - * @param {Color} [color='#fff'] Color of directional light, default to be white. - * @param {number} [intensity] Intensity of directional light, default to be 1. - * - * @example - * app.createDirectionalLight([-1, -1, -1], '#fff', 2); - */ -App3D.prototype.createDirectionalLight = function (dir, color, intensity) { - var light = new DirectionalLight(); - if (dir instanceof Vector3) { - dir = dir.array; - } - light.position.setArray(dir).negate(); - light.lookAt(Vector3.ZERO); - if (typeof color === 'string') { - color = parseColor(color); - } - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); +var ambientcubemapGlsl = "@export clay.deferred.ambient_cubemap_light\n@import clay.deferred.chunk.light_head\nuniform vec3 lightColor;\nuniform samplerCube lightCubemap;\nuniform sampler2D brdfLookup;\nuniform vec3 eyePosition;\n@import clay.util.rgbm\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 V = normalize(eyePosition - position);\n vec3 L = reflect(-V, N);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float rough = clamp(1.0 - glossiness, 0.0, 1.0);\n float bias = rough * 5.0;\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n vec3 envWeight = specularColor * brdfParam.x + brdfParam.y;\n vec3 envTexel = RGBMDecode(textureCubeLodEXT(lightCubemap, L, bias), 51.5);\n gl_FragColor.rgb = lightColor * envTexel * envWeight;\n gl_FragColor.a = 1.0;\n}\n@end"; - this.scene.add(light); - return light; -}; +var pointGlsl = "@export clay.deferred.point_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform samplerCube lightShadowMap;\nuniform float lightShadowMapSize;\n#endif\nvarying vec3 v_Position;\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContribOmni(\n lightShadowMap, -L * dist, lightRange\n );\n gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n#endif\n gl_FragColor.a = 1.0;\n}\n@end"; -/** - * Create a spot light and add it to the scene. - * @param {Array.|clay.math.Vector3} position Position of the spot light. - * @param {Array.|clay.math.Vector3} [target] Target position where spot light points to. - * @param {number} [range=20] Falloff range of spot light. Default to be 20. - * @param {Color} [color='#fff'] Color of spot light, default to be white. - * @param {number} [intensity=1] Intensity of spot light, default to be 1. - * @param {number} [umbraAngle=30] Umbra angle of spot light. Default to be 30 degree from the middle line. - * @param {number} [penumbraAngle=45] Penumbra angle of spot light. Default to be 45 degree from the middle line. - * - * @example - * app.createSpotLight([5, 5, 5], [0, 0, 0], 20, #900); - */ -App3D.prototype.createSpotLight = function (position, target, range, color, intensity, umbraAngle, penumbraAngle) { - var light = new SpotLight(); - light.position.setArray(position instanceof Vector3 ? position.array : position); +var sphereGlsl = "@export clay.deferred.sphere_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform float lightRadius;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n vec3 R = reflect(V, N);\n float tmp = dot(L, R);\n vec3 cToR = tmp * R - L;\n float d = length(cToR);\n L = L + cToR * clamp(lightRadius / d, 0.0, 1.0);\n L = normalize(L);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = lightColor * ndl * attenuation;\n glossiness = clamp(glossiness - lightRadius / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n gl_FragColor.a = 1.0;\n}\n@end"; - if (target instanceof Array) { - target = new Vector3(target[0], target[1], target[2]); - } - if (target instanceof Vector3) { - light.lookAt(target); - } +var tubeGlsl = "@export clay.deferred.tube_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 lightExtend;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n vec3 R = reflect(V, N);\n vec3 L0 = lightPosition - lightExtend - position;\n vec3 L1 = lightPosition + lightExtend - position;\n vec3 LD = L1 - L0;\n float len0 = length(L0);\n float len1 = length(L1);\n float irra = 2.0 * clamp(dot(N, L0) / (2.0 * len0) + dot(N, L1) / (2.0 * len1), 0.0, 1.0);\n float LDDotR = dot(R, LD);\n float t = (LDDotR * dot(R, L0) - dot(L0, LD)) / (dot(LD, LD) - LDDotR * LDDotR);\n t = clamp(t, 0.0, 1.0);\n L = L0 + t * LD;\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n glossiness = clamp(glossiness - 0.0 / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = lightColor * irra * lightAttenuation(dist, lightRange)\n * (diffuseColor + D_Phong(glossiness, ndh) * F_Schlick(ndv, specularColor));\n gl_FragColor.a = 1.0;\n}\n@end"; - if (typeof color === 'string') { - color = parseColor(color); - } - range != null && (light.range = range); - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); - umbraAngle != null && (light.umbraAngle = umbraAngle); - penumbraAngle != null && (light.penumbraAngle = penumbraAngle); +// Light-pre pass deferred rendering +// http://www.realtimerendering.com/blog/deferred-lighting-approaches/ +// Light shaders +Shader.import(prezGlsl); +Shader.import(utilGlsl); +Shader.import(lightvolumeGlsl); - this.scene.add(light); +// Light shaders +Shader.import(spotGlsl); +Shader.import(directionalGlsl); +Shader.import(ambientGlsl); +Shader.import(ambientshGlsl); +Shader.import(ambientcubemapGlsl); +Shader.import(pointGlsl); +Shader.import(sphereGlsl); +Shader.import(tubeGlsl); - return light; -}; +Shader.import(prezGlsl); /** - * Create a point light. - * @param {Array.|clay.math.Vector3} position Position of point light.. - * @param {number} [range=100] Falloff range of point light. - * @param {Color} [color='#fff'] Color of point light. - * @param {number} [intensity=1] Intensity of point light. + * Deferred renderer + * @constructor + * @alias clay.deferred.Renderer + * @extends clay.core.Base */ -App3D.prototype.createPointLight = function (position, range, color, intensity) { - var light = new PointLight(); - light.position.setArray(position instanceof Vector3 ? position.array : position); +var DeferredRenderer = Base.extend(function () { - if (typeof color === 'string') { - color = parseColor(color); - } - range != null && (light.range = range); - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); + var fullQuadVertex = Shader.source('clay.compositor.vertex'); + var lightVolumeVertex = Shader.source('clay.deferred.light_volume.vertex'); - this.scene.add(light); + var directionalLightShader = new Shader(fullQuadVertex, Shader.source('clay.deferred.directional_light')); - return light; -}; + var lightAccumulateBlendFunc = function (gl) { + gl.blendEquation(gl.FUNC_ADD); + gl.blendFunc(gl.ONE, gl.ONE); + }; -/** - * Create a ambient light. - * @param {Color} [color='#fff'] Color of ambient light. - * @param {number} [intensity=1] Intensity of ambient light. - */ -App3D.prototype.createAmbientLight = function (color, intensity) { - var light = new AmbientLight(); + var createLightPassMat = function (shader) { + return new Material({ + shader: shader, + blend: lightAccumulateBlendFunc, + transparent: true, + depthMask: false + }); + }; - if (typeof color === 'string') { - color = parseColor(color); - } - color != null && (light.color = color); - intensity != null && (light.intensity = intensity); + var createVolumeShader = function (name) { + return new Shader(lightVolumeVertex, Shader.source('clay.deferred.' + name)); + }; - this.scene.add(light); + // Rotate and positioning to fit the spot light + // Which the cusp of cone pointing to the positive z + // and positioned on the origin + var coneGeo = new Cone$1({ + capSegments: 10 + }); + var mat = new Matrix4(); + mat.rotateX(Math.PI / 2) + .translate(new Vector3(0, -1, 0)); - return light; -}; + coneGeo.applyTransform(mat); -/** - * Create an cubemap ambient light and an spherical harmonic ambient light - * for specular and diffuse lighting in PBR rendering - * @param {ImageLike} [envImage] Panorama environment image, HDR format is better. - * @param {number} [specularIntenstity=0.7] Intensity of specular light. - * @param {number} [diffuseIntenstity=0.7] Intensity of diffuse light. - * @param {number} [exposure=1] Exposure of HDR image. Only if image in first paramter is HDR. - * @param {number} [prefilteredCubemapSize=32] The size of prefilerted cubemap. Larger value will take more time to do expensive prefiltering. - */ -App3D.prototype.createAmbientCubemapLight = function (envImage, specIntensity, diffIntensity, exposure, prefilteredCubemapSize) { - var self = this; - if (exposure == null) { - exposure = 1; - } - if (prefilteredCubemapSize == null) { - prefilteredCubemapSize = 32; - } + var cylinderGeo = new Cylinder$1({ + capSegments: 10 + }); + // Align with x axis + mat.identity().rotateZ(Math.PI / 2); + cylinderGeo.applyTransform(mat); - var scene = this.scene; + return /** @lends clay.deferred.Renderer# */ { - return this.loadTexture(envImage, { - exposure: exposure - }).then(function (envTexture) { - var specLight = new AmbientCubemapLight({ - intensity: specIntensity != null ? specIntensity : 0.7 - }); - specLight.cubemap = envTexture; - envTexture.flipY = false; - // TODO Cache prefilter ? - specLight.prefilter(self.renderer, 32); + /** + * Provide ShadowMapPass for shadow rendering. + * @type {clay.prePass.ShadowMap} + */ + shadowMapPass: null, + /** + * If enable auto resizing from given defualt renderer size. + * @type {boolean} + */ + autoResize: true, - var diffLight = new AmbientSHLight({ - intensity: diffIntensity != null ? diffIntensity : 0.7, - coefficients: sh.projectEnvironmentMap( - self.renderer, specLight.cubemap, { - lod: 1 - } - ) - }); - scene.add(specLight); - scene.add(diffLight); + _createLightPassMat: createLightPassMat, - return { - specular: specLight, - diffuse: diffLight, - // Original environment map - environmentMap: envTexture - }; - }); -}; + _gBuffer: new GBuffer(), -/** - * Load a [glTF](https://github.com/KhronosGroup/glTF) format model. - * You can convert FBX/DAE/OBJ format models to [glTF](https://github.com/KhronosGroup/glTF) with [fbx2gltf](https://github.com/pissang/claygl#fbx-to-gltf20-converter) python script, - * or simply using the [Clay Viewer](https://github.com/pissang/clay-viewer) client application. - * @param {string} url - * @param {Object} opts - * @param {string|clay.Shader} [opts.shader='clay.standard'] 'basic'|'lambert'|'standard'. - * @param {boolean} [opts.waitTextureLoaded=false] If add to scene util textures are all loaded. - * @param {boolean} [opts.autoPlayAnimation=true] If autoplay the animation of model. - * @param {boolean} [opts.upAxis='y'] Change model to y up if upAxis is 'z' - * @param {boolean} [opts.textureFlipY=false] - * @param {string} [opts.textureRootPath] Root path of texture. Default to be relative with glTF file. - * @return {Promise} - */ -App3D.prototype.loadModel = function (url, opts) { - if (typeof url !== 'string') { - throw new Error('Invalid URL.'); - } + _lightAccumFrameBuffer: new FrameBuffer({ + depthBuffer: false + }), - opts = opts || {}; - if (opts.autoPlayAnimation == null) { - opts.autoPlayAnimation = true; - } - var shader = opts.shader || 'clay.standard'; + _lightAccumTex: new Texture2D({ + // FIXME Device not support float texture + type: Texture.HALF_FLOAT, + minFilter: Texture.NEAREST, + magFilter: Texture.NEAREST + }), - var loaderOpts = { - rootNode: new Node(), - shader: shader, - textureRootPath: opts.textureRootPath, - crossOrigin: 'Anonymous', - textureFlipY: opts.textureFlipY - }; - if (opts.upAxis && opts.upAxis.toLowerCase() === 'z') { - loaderOpts.rootNode.rotation.identity().rotateX(-Math.PI / 2); - } + _fullQuadPass: new Pass({ + blendWithPrevious: true + }), - var loader = new GLTFLoader(loaderOpts); + _directionalLightMat: createLightPassMat(directionalLightShader), - var scene = this.scene; - var timeline = this.timeline; - var self = this; + _ambientMat: createLightPassMat(new Shader( + fullQuadVertex, Shader.source('clay.deferred.ambient_light') + )), + _ambientSHMat: createLightPassMat(new Shader( + fullQuadVertex, Shader.source('clay.deferred.ambient_sh_light') + )), + _ambientCubemapMat: createLightPassMat(new Shader( + fullQuadVertex, Shader.source('clay.deferred.ambient_cubemap_light') + )), - return new Promise(function (resolve, reject) { - function afterLoad(result) { - if (self._disposed) { - return; - } + _spotLightShader: createVolumeShader('spot_light'), + _pointLightShader: createVolumeShader('point_light'), - scene.add(result.rootNode); - if (opts.autoPlayAnimation) { - result.clips.forEach(function (clip) { - timeline.addClip(clip); - }); - } - resolve(result); - } - loader.success(function (result) { - if (self._disposed) { - return; - } + _sphereLightShader: createVolumeShader('sphere_light'), + _tubeLightShader: createVolumeShader('tube_light'), - if (!opts.waitTextureLoaded) { - afterLoad(result); - } - else { - Promise.all(result.textures.map(function (texture) { - if (texture.isRenderable()) { - return Promise.resolve(texture); - } - return new Promise(function (resolve) { - texture.success(resolve); - texture.error(resolve); - }); - })).then(function () { - afterLoad(result); - }).catch(function () { - afterLoad(result); - }); - } - }); - loader.error(function () { - reject(); - }); - loader.load(url); - }); -}; + _lightSphereGeo: new Sphere$1({ + widthSegments: 10, + heightSegements: 10 + }), + _lightConeGeo: coneGeo, -var application = { - App3D: App3D, + _lightCylinderGeo: cylinderGeo, + + _outputPass: new Pass({ + fragment: Shader.source('clay.compositor.output') + }) + }; +}, /** @lends clay.deferred.Renderer# */ { /** - * Create a 3D application that will manage the app initialization and loop. - * @name clay.application.create - * @param {HTMLDomElement|string} dom Container dom element or a selector string that can be used in `querySelector` - * @param {Object} appNS - * @param {Function} init Initialization callback that will be called when initing app. - * @param {Function} loop Loop callback that will be called each frame. - * @param {number} [width] Container width. - * @param {number} [height] Container height. - * @param {number} [devicePixelRatio] - * @return {clay.application.App3D} - * - * @example - * clay.application.create('#app', { - * init: function (app) { - * app.createCube(); - * var camera = app.createCamera(); - * camera.position.set(0, 0, 2); - * }, - * loop: function () { // noop } - * }) + * Do render + * @param {clay.Renderer} renderer + * @param {clay.Scene} scene + * @param {clay.Camera} camera + * @param {Object} [opts] + * @param {boolean} [opts.renderToTarget = false] If not ouput and render to the target texture + * @param {boolean} [opts.notUpdateShadow = true] If not update the shadow. + * @param {boolean} [opts.notUpdateScene = true] If not update the scene. */ - create: function (dom, appNS) { - return new App3D(dom, appNS); - } -}; - -/** - * @constructor - * @alias clay.async.Task - * @mixes clay.core.mixin.notifier - */ -var Task = function() { - this._fullfilled = false; - this._rejected = false; -}; -/** - * Task successed - * @param {} data - */ -Task.prototype.resolve = function(data) { - this._fullfilled = true; - this._rejected = false; - this.trigger('success', data); -}; -/** - * Task failed - * @param {} err - */ -Task.prototype.reject = function(err) { - this._rejected = true; - this._fullfilled = false; - this.trigger('error', err); -}; -/** - * If task successed - * @return {boolean} - */ -Task.prototype.isFullfilled = function() { - return this._fullfilled; -}; -/** - * If task failed - * @return {boolean} - */ -Task.prototype.isRejected = function() { - return this._rejected; -}; -/** - * If task finished, either successed or failed - * @return {boolean} - */ -Task.prototype.isSettled = function() { - return this._fullfilled || this._rejected; -}; + render: function (renderer, scene, camera, opts) { -util$1.extend(Task.prototype, notifier); + opts = opts || {}; + opts.renderToTarget = opts.renderToTarget || false; + opts.notUpdateShadow = opts.notUpdateShadow || false; + opts.notUpdateScene = opts.notUpdateScene || false; -function makeRequestTask(url, responseType) { - var task = new Task(); - request.get({ - url: url, - responseType: responseType, - onload: function(res) { - task.resolve(res); - }, - onerror: function(error) { - task.reject(error); + if (!opts.notUpdateScene) { + scene.update(false, true); } - }); - return task; -} -/** - * Make a request task - * @param {string|object|object[]|string[]} url - * @param {string} [responseType] - * @example - * var task = Task.makeRequestTask('./a.json'); - * var task = Task.makeRequestTask({ - * url: 'b.bin', - * responseType: 'arraybuffer' - * }); - * var tasks = Task.makeRequestTask(['./a.json', './b.json']); - * var tasks = Task.makeRequestTask([ - * {url: 'a.json'}, - * {url: 'b.bin', responseType: 'arraybuffer'} - * ]); - * @return {clay.async.Task|clay.async.Task[]} - */ -Task.makeRequestTask = function(url, responseType) { - if (typeof url === 'string') { - return makeRequestTask(url, responseType); - } else if (url.url) { // Configure object - var obj = url; - return makeRequestTask(obj.url, obj.responseType); - } else if (Array.isArray(url)) { // Url list - var urlList = url; - var tasks = []; - urlList.forEach(function(obj) { - var url, responseType; - if (typeof obj === 'string') { - url = obj; - } else if (Object(obj) === obj) { - url = obj.url; - responseType = obj.responseType; - } - tasks.push(makeRequestTask(url, responseType)); - }); - return tasks; - } -}; -/** - * @return {clay.async.Task} - */ -Task.makeTask = function() { - return new Task(); -}; -util$1.extend(Task.prototype, notifier); + camera.update(true); -/** - * @constructor - * @alias clay.async.TaskGroup - * @extends clay.async.Task - */ -var TaskGroup = function () { + // PENDING For stereo rendering + var dpr = renderer.getDevicePixelRatio(); + if (this.autoResize + && (renderer.getWidth() * dpr !== this._lightAccumTex.width + || renderer.getHeight() * dpr !== this._lightAccumTex.height) + ) { + this.resize(renderer.getWidth() * dpr, renderer.getHeight() * dpr); + } - Task.apply(this, arguments); + this._gBuffer.update(renderer, scene, camera); - this._tasks = []; + // Accumulate light buffer + this._accumulateLightBuffer(renderer, scene, camera, !opts.notUpdateShadow); - this._fulfilledNumber = 0; + if (!opts.renderToTarget) { + this._outputPass.setUniform('texture', this._lightAccumTex); - this._rejectedNumber = 0; -}; + this._outputPass.render(renderer); + // this._gBuffer.renderDebug(renderer, camera, 'normal'); + } + }, -var Ctor = function (){}; -Ctor.prototype = Task.prototype; -TaskGroup.prototype = new Ctor(); + /** + * @return {clay.Texture2D} + */ + getTargetTexture: function () { + return this._lightAccumTex; + }, -TaskGroup.prototype.constructor = TaskGroup; + /** + * @return {clay.FrameBuffer} + */ + getTargetFrameBuffer: function () { + return this._lightAccumFrameBuffer; + }, -/** - * Wait for all given tasks successed, task can also be any notifier object which will trigger success and error events. Like {@link clay.Texture2D}, {@link clay.TextureCube}, {@link clay.loader.GLTF}. - * @param {Array.} tasks - * @chainable - * @example - * // Load texture list - * var list = ['a.jpg', 'b.jpg', 'c.jpg'] - * var textures = list.map(function (src) { - * var texture = new clay.Texture2D(); - * texture.load(src); - * return texture; - * }); - * var taskGroup = new clay.async.TaskGroup(); - * taskGroup.all(textures).success(function () { - * // Do some thing after all textures loaded - * }); - */ -TaskGroup.prototype.all = function (tasks) { - var count = 0; - var self = this; - var data = []; - this._tasks = tasks; - this._fulfilledNumber = 0; - this._rejectedNumber = 0; + /** + * @return {clay.deferred.GBuffer} + */ + getGBuffer: function () { + return this._gBuffer; + }, - util$1.each(tasks, function (task, idx) { - if (!task || !task.once) { - return; - } - count++; - task.once('success', function (res) { - count--; + // TODO is dpr needed? + setViewport: function (x, y, width, height, dpr) { + this._gBuffer.setViewport(x, y, width, height, dpr); + this._lightAccumFrameBuffer.viewport = this._gBuffer.getViewport(); + }, - self._fulfilledNumber++; - // TODO - // Some tasks like texture, loader are not inherited from task - // We need to set the states here - task._fulfilled = true; - task._rejected = false; + // getFullQuadLightPass: function () { + // return this._fullQuadPass; + // }, - data[idx] = res; - if (count === 0) { - self.resolve(data); - } - }); - task.once('error', function () { + /** + * Set renderer size. + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + this._lightAccumTex.width = width; + this._lightAccumTex.height = height; - self._rejectedNumber ++; + // PENDING viewport ? + this._gBuffer.resize(width, height); + }, - task._fulfilled = false; - task._rejected = true; + _accumulateLightBuffer: function (renderer, scene, camera, updateShadow) { + var gl = renderer.gl; + var lightAccumTex = this._lightAccumTex; + var lightAccumFrameBuffer = this._lightAccumFrameBuffer; - self.reject(task); - }); - }); - if (count === 0) { - setTimeout(function () { - self.resolve(data); - }); - return this; - } - return this; -}; -/** - * Wait for all given tasks finished, either successed or failed - * @param {Array.} tasks - * @return {clay.async.TaskGroup} - */ -TaskGroup.prototype.allSettled = function (tasks) { - var count = 0; - var self = this; - var data = []; - if (tasks.length === 0) { - setTimeout(function () { - self.trigger('success', data); - }); - return this; - } - this._tasks = tasks; + var eyePosition = camera.getWorldPosition().array; - util$1.each(tasks, function (task, idx) { - if (!task || !task.once) { - return; + // Update volume meshes + for (var i = 0; i < scene.lights.length; i++) { + this._updateLightProxy(scene.lights[i]); } - count++; - task.once('success', function (res) { - count--; - self._fulfilledNumber++; + var shadowMapPass = this.shadowMapPass; + if (shadowMapPass && updateShadow) { + gl.clearColor(1, 1, 1, 1); + this._prepareLightShadow(renderer, scene, camera); + } - task._fulfilled = true; - task._rejected = false; + this.trigger('beforelightaccumulate', renderer, scene, camera, updateShadow); - data[idx] = res; - if (count === 0) { - self.resolve(data); - } - }); - task.once('error', function (err) { - count--; + lightAccumFrameBuffer.attach(lightAccumTex); + lightAccumFrameBuffer.bind(renderer); + var clearColor = renderer.clearColor; - self._rejectedNumber++; + var viewport = lightAccumFrameBuffer.viewport; + if (viewport) { + var dpr = viewport.devicePixelRatio; + // use scissor to make sure only clear the viewport + gl.enable(gl.SCISSOR_TEST); + gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); + } + gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.enable(gl.BLEND); + if (viewport) { + gl.disable(gl.SCISSOR_TEST); + } - task._fulfilled = false; - task._rejected = true; + this.trigger('startlightaccumulate', renderer, scene, camera); - // TODO - data[idx] = null; - if (count === 0) { - self.resolve(data); - } - }); - }); - return this; -}; -/** - * Get successed sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getFulfilledNumber = function (recursive) { - if (recursive) { - var nFulfilled = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nFulfilled += task.getFulfilledNumber(recursive); - } else if(task._fulfilled) { - nFulfilled += 1; - } - } - return nFulfilled; - } else { - return this._fulfilledNumber; - } -}; + var viewProjectionInv = new Matrix4(); + Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); -/** - * Get failed sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getRejectedNumber = function (recursive) { - if (recursive) { - var nRejected = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nRejected += task.getRejectedNumber(recursive); - } else if(task._rejected) { - nRejected += 1; - } - } - return nRejected; - } else { - return this._rejectedNumber; - } -}; + var volumeMeshList = []; -/** - * Get finished sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getSettledNumber = function (recursive) { + for (var i = 0; i < scene.lights.length; i++) { + var light = scene.lights[i]; + var uTpl = light.uniformTemplates; - if (recursive) { - var nSettled = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nSettled += task.getSettledNumber(recursive); - } else if(task._rejected || task._fulfilled) { - nSettled += 1; - } - } - return nSettled; - } else { - return this._fulfilledNumber + this._rejectedNumber; - } -}; + var volumeMesh = light.volumeMesh || light.__volumeMesh; -/** - * Get all sub tasks number, recursive can be true if sub task is also a TaskGroup. - * @param {boolean} [recursive] - * @return {number} - */ -TaskGroup.prototype.getTaskNumber = function (recursive) { - if (recursive) { - var nTask = 0; - for (var i = 0; i < this._tasks.length; i++) { - var task = this._tasks[i]; - if (task instanceof TaskGroup) { - nTask += task.getTaskNumber(recursive); - } else { - nTask += 1; - } - } - return nTask; - } else { - return this._tasks.length; - } -}; + if (volumeMesh) { + var material = volumeMesh.material; + // Volume mesh will affect the scene bounding box when rendering + // if castShadow is true + volumeMesh.castShadow = false; -var CanvasMaterial = Base.extend({ + var unknownLightType = false; + switch (light.type) { + case 'POINT_LIGHT': + material.setUniform('lightColor', uTpl.pointLightColor.value(light)); + material.setUniform('lightRange', uTpl.pointLightRange.value(light)); + material.setUniform('lightPosition', uTpl.pointLightPosition.value(light)); + break; + case 'SPOT_LIGHT': + material.setUniform('lightPosition', uTpl.spotLightPosition.value(light)); + material.setUniform('lightColor', uTpl.spotLightColor.value(light)); + material.setUniform('lightRange', uTpl.spotLightRange.value(light)); + material.setUniform('lightDirection', uTpl.spotLightDirection.value(light)); + material.setUniform('umbraAngleCosine', uTpl.spotLightUmbraAngleCosine.value(light)); + material.setUniform('penumbraAngleCosine', uTpl.spotLightPenumbraAngleCosine.value(light)); + material.setUniform('falloffFactor', uTpl.spotLightFalloffFactor.value(light)); + break; + case 'SPHERE_LIGHT': + material.setUniform('lightColor', uTpl.sphereLightColor.value(light)); + material.setUniform('lightRange', uTpl.sphereLightRange.value(light)); + material.setUniform('lightRadius', uTpl.sphereLightRadius.value(light)); + material.setUniform('lightPosition', uTpl.sphereLightPosition.value(light)); + break; + case 'TUBE_LIGHT': + material.setUniform('lightColor', uTpl.tubeLightColor.value(light)); + material.setUniform('lightRange', uTpl.tubeLightRange.value(light)); + material.setUniform('lightExtend', uTpl.tubeLightExtend.value(light)); + material.setUniform('lightPosition', uTpl.tubeLightPosition.value(light)); + break; + default: + unknownLightType = true; + } - color: [1, 1, 1, 1], + if (unknownLightType) { + continue; + } - opacity: 1, + material.setUniform('eyePosition', eyePosition); + material.setUniform('viewProjectionInv', viewProjectionInv.array); + material.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); + material.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); + material.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); - pointSize: 0, + volumeMeshList.push(volumeMesh); - pointShape: 'rectangle' -}); + } + else { + var pass = this._fullQuadPass; + var unknownLightType = false; + // Full quad light + switch (light.type) { + case 'AMBIENT_LIGHT': + pass.material = this._ambientMat; + pass.material.setUniform('lightColor', uTpl.ambientLightColor.value(light)); + break; + case 'AMBIENT_SH_LIGHT': + pass.material = this._ambientSHMat; + pass.material.setUniform('lightColor', uTpl.ambientSHLightColor.value(light)); + pass.material.setUniform('lightCoefficients', uTpl.ambientSHLightCoefficients.value(light)); + break; + case 'AMBIENT_CUBEMAP_LIGHT': + pass.material = this._ambientCubemapMat; + pass.material.setUniform('lightColor', uTpl.ambientCubemapLightColor.value(light)); + pass.material.setUniform('lightCubemap', uTpl.ambientCubemapLightCubemap.value(light)); + pass.material.setUniform('brdfLookup', uTpl.ambientCubemapLightBRDFLookup.value(light)); + break; + case 'DIRECTIONAL_LIGHT': + var hasShadow = shadowMapPass && light.castShadow; + pass.material = this._directionalLightMat; + pass.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); + if (hasShadow) { + pass.material.define('fragment', 'SHADOW_CASCADE', light.shadowCascade); + } + pass.material.setUniform('lightColor', uTpl.directionalLightColor.value(light)); + pass.material.setUniform('lightDirection', uTpl.directionalLightDirection.value(light)); + break; + default: + // Unkonw light type + unknownLightType = true; + } + if (unknownLightType) { + continue; + } -var mat4$8 = glmatrix.mat4; -var vec3$16 = glmatrix.vec3; -var vec4$2 = glmatrix.vec4; + var passMaterial = pass.material; + passMaterial.setUniform('eyePosition', eyePosition); + passMaterial.setUniform('viewProjectionInv', viewProjectionInv.array); + passMaterial.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); + passMaterial.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); + passMaterial.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); -var vec4Create = vec4$2.create; + // TODO + if (shadowMapPass && light.castShadow) { + passMaterial.setUniform('lightShadowMap', light.__shadowMap); + passMaterial.setUniform('lightMatrices', light.__lightMatrices); + passMaterial.setUniform('shadowCascadeClipsNear', light.__cascadeClipsNear); + passMaterial.setUniform('shadowCascadeClipsFar', light.__cascadeClipsFar); -var round = Math.round; + passMaterial.setUniform('lightShadowMapSize', light.shadowResolution); + } -var PRIMITIVE_TRIANGLE = 1; -var PRIMITIVE_LINE = 2; -var PRIMITIVE_POINT = 3; + pass.renderQuad(renderer); + } + } -function PrimitivePool(constructor) { - this.ctor = constructor; + this._renderVolumeMeshList(renderer, camera, volumeMeshList); - this._data = []; + this.trigger('lightaccumulate', renderer, scene, camera); - this._size = 0; -} + lightAccumFrameBuffer.unbind(renderer); -PrimitivePool.prototype = { - pick: function () { - var data = this._data; - var size = this._size; - var obj = data[size]; - if (! obj) { - // Constructor must have no parameters - obj = new this.ctor(); - data[size] = obj; - } - this._size++; - return obj; - }, + this.trigger('afterlightaccumulate', renderer, scene, camera); - reset: function () { - this._size = 0; }, - shrink: function () { - this._data.length = this._size; - }, + _prepareLightShadow: (function () { + var worldView = new Matrix4(); + return function (renderer, scene, camera) { + var shadowCasters; - clear: function () { - this._data = []; - this._size = 0; - } -}; + shadowCasters = this._shadowCasters || (this._shadowCasters = []); + var count = 0; + var list = scene.opaqueList; + for (var i = 0; i < list.length; i++) { + if (list[i].castShadow) { + shadowCasters[count++] = list[i]; + } + } + shadowCasters.length = count; -function Triangle() { - this.vertices = [vec4Create(), vec4Create(), vec4Create()]; - this.color = vec4Create(); + for (var i = 0; i < scene.lights.length; i++) { + var light = scene.lights[i]; + var volumeMesh = light.volumeMesh || light.__volumeMesh; + if (!light.castShadow) { + continue; + } - this.depth = 0; -} + switch (light.type) { + case 'POINT_LIGHT': + case 'SPOT_LIGHT': + // Frustum culling + Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); + if (renderer.isFrustumCulled( + volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array + )) { + continue; + } -Triangle.prototype.type = PRIMITIVE_TRIANGLE; + this._prepareSingleLightShadow( + renderer, scene, camera, light, shadowCasters, volumeMesh.material + ); + break; + case 'DIRECTIONAL_LIGHT': + this._prepareSingleLightShadow( + renderer, scene, camera, light, shadowCasters, null + ); + } + } + }; + })(), -function Point() { - // Here use an array to make it more convinient to proccessing in _setPrimitive method - this.vertices = [vec4Create()]; + _prepareSingleLightShadow: function (renderer, scene, camera, light, casters, material) { + switch (light.type) { + case 'POINT_LIGHT': + var shadowMaps = []; + this.shadowMapPass.renderPointLightShadow( + renderer, scene, light, casters, shadowMaps + ); + material.setUniform('lightShadowMap', shadowMaps[0]); + material.setUniform('lightShadowMapSize', light.shadowResolution); + break; + case 'SPOT_LIGHT': + var shadowMaps = []; + var lightMatrices = []; + this.shadowMapPass.renderSpotLightShadow( + renderer, scene, light, casters, lightMatrices, shadowMaps + ); + material.setUniform('lightShadowMap', shadowMaps[0]); + material.setUniform('lightMatrix', lightMatrices[0]); + material.setUniform('lightShadowMapSize', light.shadowResolution); + break; + case 'DIRECTIONAL_LIGHT': + var shadowMaps = []; + var lightMatrices = []; + var cascadeClips = []; + this.shadowMapPass.renderDirectionalLightShadow( + renderer, scene, camera, light, casters, cascadeClips, lightMatrices, shadowMaps + ); + var cascadeClipsNear = cascadeClips.slice(); + var cascadeClipsFar = cascadeClips.slice(); + cascadeClipsNear.pop(); + cascadeClipsFar.shift(); - this.color = vec4Create(); + // Iterate from far to near + cascadeClipsNear.reverse(); + cascadeClipsFar.reverse(); + lightMatrices.reverse(); - this.depth = 0; -} + light.__cascadeClipsNear = cascadeClipsNear; + light.__cascadeClipsFar = cascadeClipsFar; + light.__shadowMap = shadowMaps[0]; + light.__lightMatrices = lightMatrices; + break; + } + }, -Point.prototype.type = PRIMITIVE_POINT; + // Update light volume mesh + // Light volume mesh is rendered in light accumulate pass instead of full quad. + // It will reduce pixels significantly when local light is relatively small. + // And we can use custom volume mesh to shape the light. + // + // See "Deferred Shading Optimizations" in GDC2011 + _updateLightProxy: function (light) { + var volumeMesh; + if (light.volumeMesh) { + volumeMesh = light.volumeMesh; + } + else { + switch (light.type) { + // Only local light (point and spot) needs volume mesh. + // Directional and ambient light renders in full quad + case 'POINT_LIGHT': + case 'SPHERE_LIGHT': + var shader = light.type === 'SPHERE_LIGHT' + ? this._sphereLightShader : this._pointLightShader; + // Volume mesh created automatically + if (!light.__volumeMesh) { + light.__volumeMesh = new Mesh({ + material: this._createLightPassMat(shader), + geometry: this._lightSphereGeo, + // Disable culling + // if light volume mesh intersect camera near plane + // We need mesh inside can still be rendered + culling: false + }); + } + volumeMesh = light.__volumeMesh; + var r = light.range + (light.radius || 0); + volumeMesh.scale.set(r, r, r); + break; + case 'SPOT_LIGHT': + light.__volumeMesh = light.__volumeMesh || new Mesh({ + material: this._createLightPassMat(this._spotLightShader), + geometry: this._lightConeGeo, + culling: false + }); + volumeMesh = light.__volumeMesh; + var aspect = Math.tan(light.penumbraAngle * Math.PI / 180); + var range = light.range; + volumeMesh.scale.set(aspect * range, aspect * range, range / 2); + break; + case 'TUBE_LIGHT': + light.__volumeMesh = light.__volumeMesh || new Mesh({ + material: this._createLightPassMat(this._tubeLightShader), + geometry: this._lightCylinderGeo, + culling: false + }); + volumeMesh = light.__volumeMesh; + var range = light.range; + volumeMesh.scale.set(light.length / 2 + range, range, range); + break; + } + } + if (volumeMesh) { + volumeMesh.update(); + // Apply light transform + Matrix4.multiply(volumeMesh.worldTransform, light.worldTransform, volumeMesh.worldTransform); + var hasShadow = this.shadowMapPass && light.castShadow; + volumeMesh.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); + } + }, -function Line() { - this.vertices = [vec4Create(), vec4Create()]; - this.color = vec4Create(); + _renderVolumeMeshList: (function () { + var worldViewProjection = new Matrix4(); + var worldView = new Matrix4(); + var preZMaterial = new Material({ + shader: new Shader(Shader.source('clay.prez.vertex'), Shader.source('clay.prez.fragment')) + }); + return function (renderer, camera, volumeMeshList) { + var gl = renderer.gl; - this.depth = 0; + gl.enable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); + gl.blendEquation(gl.FUNC_ADD); + gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE); + gl.depthFunc(gl.LEQUAL); - this.lineWidth = 1; -} + gl.clear(gl.DEPTH_BUFFER_BIT); -Line.prototype.type = PRIMITIVE_LINE; + var viewport = renderer.viewport; + var dpr = viewport.devicePixelRatio; + var viewportUniform = [ + viewport.x * dpr, viewport.y * dpr, + viewport.width * dpr, viewport.height * dpr + ]; -function depthSortFunc(x, y) { - // Sort from far to near, which in depth of projection space is from larger to smaller - return y.depth - x.depth; -} + var windowSizeUniform = [ + this._lightAccumTex.width, + this._lightAccumTex.height + ]; -function vec3ToColorStr(v3) { - return 'rgb(' + round(v3[0] * 255) + ',' + round(v3[1] * 255) + ',' + round(v3[2] * 255) + ')'; -} + for (var i = 0; i < volumeMeshList.length; i++) { + var volumeMesh = volumeMeshList[i]; -function vec4ToColorStr(v4) { - return 'rgba(' + round(v4[0] * 255) + ',' + round(v4[1] * 255) + ',' + round(v4[2] * 255) + ',' + v4[3] + ')'; -} + // Frustum culling + Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); + if (renderer.isFrustumCulled( + volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array + )) { + continue; + } -var CanvasRenderer = Base.extend({ + // Use prez to avoid one pixel rendered twice + gl.colorMask(false, false, false, false); + gl.depthMask(true); + // depthMask must be enabled before clear DEPTH_BUFFER + gl.clear(gl.DEPTH_BUFFER_BIT); - canvas: null, + Matrix4.multiply(worldViewProjection, camera.projectionMatrix, worldView); - _width: 100, + var preZProgram = renderer.getProgram(volumeMesh, preZMaterial); + volumeMesh.__program = preZProgram; + renderer.validateProgram(preZProgram); + preZProgram.bind(renderer); - _height: 100, + var semanticInfo = preZMaterial.shader.matrixSemantics.WORLDVIEWPROJECTION; + preZProgram.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); + volumeMesh.render(renderer, preZMaterial, preZProgram); - devicePixelRatio: window.devicePixelRatio || 1.0, + // Render light + gl.colorMask(true, true, true, true); + gl.depthMask(false); + var program = renderer.getProgram(volumeMesh, volumeMesh.material); + volumeMesh.__program = program; + renderer.validateProgram(program); + program.bind(renderer); - color: [0.0, 0.0, 0.0, 0.0], + var semanticInfo = volumeMesh.material.shader.matrixSemantics.WORLDVIEWPROJECTION; + // Set some common uniforms + program.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); + program.setUniformOfSemantic(gl, 'WINDOW_SIZE', windowSizeUniform); + program.setUniformOfSemantic(gl, 'VIEWPORT', viewportUniform); - clear: true, + volumeMesh.material.bind(renderer, program); + volumeMesh.render(renderer, volumeMesh.material, program); + } - ctx: null, + gl.depthFunc(gl.LESS); + }; + })(), - // Cached primitive list, including triangle, line, point - _primitives: [], + /** + * @param {clay.Renderer} renderer + */ + dispose: function (renderer) { + this._gBuffer.dispose(renderer); - // Triangle pool - _triangles: new PrimitivePool(Triangle), + this._lightAccumFrameBuffer.dispose(renderer); + this._lightAccumTex.dispose(renderer); - // Line pool - _lines: new PrimitivePool(Line), + this._lightConeGeo.dispose(renderer); + this._lightCylinderGeo.dispose(renderer); + this._lightSphereGeo.dispose(renderer); - // Point pool - _points: new PrimitivePool(Point) -}, function () { - if (! this.canvas) { - this.canvas = document.createElement('canvas'); - } - var canvas = this.canvas; + this._fullQuadPass.dispose(renderer); + this._outputPass.dispose(renderer); - try { - this.ctx = canvas.getContext('2d'); - var ctx = this.ctx; - if (!ctx) { - throw new Error(); - } - } - catch (e) { - throw 'Error creating WebGL Context ' + e; + this._directionalLightMat.dispose(renderer); + + this.shadowMapPass.dispose(renderer); } +}); - this.resize(); -}, { +// Spherical Harmonic Helpers +var vec3$16 = glmatrix.vec3; +var sh = {}; - resize: function (width, height) { - var dpr = this.devicePixelRatio; - var canvas = this.canvas; - if (width != null) { - canvas.style.width = width + 'px'; - canvas.style.height = height + 'px'; - canvas.width = width * dpr; - canvas.height = height * dpr; +var targets$3 = ['px', 'nx', 'py', 'ny', 'pz', 'nz']; - this._width = width; - this._height = height; - } - else { - this._width = canvas.width / dpr; - this._height = canvas.height / dpr; - } - }, +function harmonics(normal, index){ + var x = normal[0]; + var y = normal[1]; + var z = normal[2]; - getWidth: function () { - return this._width; - }, + if (index === 0) { + return 1.0; + } + else if (index === 1) { + return x; + } + else if (index === 2) { + return y; + } + else if (index === 3) { + return z; + } + else if (index === 4) { + return x * z; + } + else if (index === 5) { + return y * z; + } + else if (index === 6) { + return x * y; + } + else if (index === 7) { + return 3.0 * z * z - 1.0; + } + else { + return x * x - y * y; + } +} - getHeight: function () { - return this._height; - }, +var normalTransform = { + px: [2, 1, 0, -1, -1, 1], + nx: [2, 1, 0, 1, -1, -1], + py: [0, 2, 1, 1, -1, -1], + ny: [0, 2, 1, 1, 1, 1], + pz: [0, 1, 2, -1, -1, -1], + nz: [0, 1, 2, 1, -1, 1] +}; - getViewportAspect: function () { - return this._width / this._height; - }, +// Project on cpu. +function projectEnvironmentMapCPU(renderer, cubePixels, width, height) { + var coeff = new vendor.Float32Array(9 * 3); + var normal = vec3$16.create(); + var texel = vec3$16.create(); + var fetchNormal = vec3$16.create(); + for (var m = 0; m < 9; m++) { + var result = vec3$16.create(); + for (var k = 0; k < targets$3.length; k++) { + var pixels = cubePixels[targets$3[k]]; - render: function (scene, camera) { + var sideResult = vec3$16.create(); + var divider = 0; + var i = 0; + var transform = normalTransform[targets$3[k]]; + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { - if (this.clear) { - var color = this.color; - var ctx = this.ctx; - var dpr = this.devicePixelRatio; - var w = this._width * dpr; - var h = this._height * dpr; - if (color && color[3] === 0) { - ctx.clearRect(0, 0, w, h); - } - else { - // Has transparency - if (color[3] < 1) { - ctx.clearRect(0, 0, w, h); + normal[0] = x / (width - 1.0) * 2.0 - 1.0; + // TODO Flip y? + normal[1] = y / (height - 1.0) * 2.0 - 1.0; + normal[2] = -1.0; + vec3$16.normalize(normal, normal); + + fetchNormal[0] = normal[transform[0]] * transform[3]; + fetchNormal[1] = normal[transform[1]] * transform[4]; + fetchNormal[2] = normal[transform[2]] * transform[5]; + + texel[0] = pixels[i++] / 255; + texel[1] = pixels[i++] / 255; + texel[2] = pixels[i++] / 255; + // RGBM Decode + var scale = pixels[i++] / 255 * 51.5; + texel[0] *= scale; + texel[1] *= scale; + texel[2] *= scale; + + vec3$16.scaleAndAdd(sideResult, sideResult, texel, harmonics(fetchNormal, m) * -normal[2]); + // -normal.z equals cos(theta) of Lambertian + divider += -normal[2]; } - ctx.fillStyle = color.length === 4 ? vec4ToColorStr(color) : vec3ToColorStr(color); - ctx.fillRect(0, 0, w, h); } + vec3$16.scaleAndAdd(result, result, sideResult, 1 / divider); } - scene.update(); - camera.update(); + coeff[m * 3] = result[0] / 6.0; + coeff[m * 3 + 1] = result[1] / 6.0; + coeff[m * 3 + 2] = result[2] / 6.0; + } + return coeff; +} - var opaqueList = scene.opaqueList; - var transparentList = scene.transparentList; - var list = opaqueList.concat(transparentList); +/** + * @param {clay.Renderer} renderer + * @param {clay.Texture} envMap + * @param {Object} [textureOpts] + * @param {Object} [textureOpts.lod] + * @param {boolean} [textureOpts.decodeRGBM] + */ +sh.projectEnvironmentMap = function (renderer, envMap, opts) { - this.renderPass(list, camera); - }, + // TODO sRGB - renderPass: function (list, camera) { - var viewProj = mat4$8.create(); - mat4$8.multiply(viewProj, camera.projectionMatrix.array, camera.viewMatrix.array); - var worldViewProjMat = mat4$8.create(); - var posViewSpace = vec3$16.create(); + opts = opts || {}; + opts.lod = opts.lod || 0; - var primitives = this._primitives; - var trianglesPool = this._triangles; - var linesPool = this._lines; - var pointsPool = this._points; + var skybox; + var dummyScene = new Scene(); + var size = 64; + if (envMap instanceof Texture2D) { + skybox = new Skydome({ + scene: dummyScene, + environmentMap: envMap + }); + } + else { + size = (envMap.image && envMap.image.px) ? envMap.image.px.width : envMap.width; + skybox = new Skybox({ + scene: dummyScene, + environmentMap: envMap + }); + } + // Convert to rgbm + var width = Math.ceil(size / Math.pow(2, opts.lod)); + var height = Math.ceil(size / Math.pow(2, opts.lod)); + var rgbmTexture = new Texture2D({ + width: width, + height: height + }); + var framebuffer = new FrameBuffer(); + skybox.material.define('fragment', 'RGBM_ENCODE'); + if (opts.decodeRGBM) { + skybox.material.define('fragment', 'RGBM_DECODE'); + } + skybox.material.set('lod', opts.lod); + var envMapPass = new EnvironmentMapPass({ + texture: rgbmTexture + }); + var cubePixels = {}; + for (var i = 0; i < targets$3.length; i++) { + cubePixels[targets$3[i]] = new Uint8Array(width * height * 4); + var camera = envMapPass.getCamera(targets$3[i]); + camera.fov = 90; + framebuffer.attach(rgbmTexture); + framebuffer.bind(renderer); + renderer.render(dummyScene, camera); + renderer.gl.readPixels( + 0, 0, width, height, + Texture.RGBA, Texture.UNSIGNED_BYTE, cubePixels[targets$3[i]] + ); + framebuffer.unbind(renderer); + } - trianglesPool.reset(); - linesPool.reset(); - pointsPool.reset(); + skybox.dispose(renderer); + framebuffer.dispose(renderer); + rgbmTexture.dispose(renderer); - var nPrimitive = 0; + return projectEnvironmentMapCPU(renderer, cubePixels, width, height); +}; - var indices = [0, 0, 0]; - var matColor = []; - for (var i = 0; i < list.length; i++) { - var renderable = list[i]; +/** + * Helpers for creating a common 3d application. + * @namespace clay.application + */ - mat4$8.multiply(worldViewProjMat, viewProj, renderable.worldTransform.array); + // TODO createCompositor + // TODO Dispose test. geoCache test. + // TODO Tonemapping exposure + // TODO fitModel. + // TODO Particle ? +var parseColor = colorUtil.parseToFloat; - var geometry = renderable.geometry; - var material = renderable.material; - var attributes = geometry.attributes; +var EVE_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', + 'touchstart', 'touchend', 'touchmove', + 'mousewheel', 'DOMMouseScroll' +]; - // alpha is default 1 - if (material.color.length == 3) { - vec3$16.copy(matColor, material.color); - matColor[3] = 1; - } - else { - vec4$2.copy(matColor, material.color); - } +/** + * @typedef {string|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} ImageLike + */ +/** + * @typedef {string|Array.} Color + */ +/** + * @typedef {HTMLDomElement|string} DomQuery + */ - var nVertex = geometry.vertexCount; - // Only support TRIANGLES, LINES, POINTS draw modes - switch (renderable.mode) { - case glenum.TRIANGLES: - if (geometry.isUseIndices()) { - var nFace = geometry.triangleCount; - for (var j = 0; j < nFace; j++) { - geometry.getFace(j, indices); +/** + * @constructor + * @alias clay.application.App3D + * @param {DomQuery} dom Container dom element or a selector string that can be used in `querySelector` + * @param {Object} appNS + * @param {Function} appNS.init Initialization callback that will be called when initing app. + * You can return a promise in init to start the loop asynchronously when the promise is resolved. + * @param {Function} appNS.loop Loop callback that will be called each frame. + * @param {Function} appNS.beforeRender + * @param {Function} appNS.afterRender + * @param {number} [appNS.width] Container width. + * @param {number} [appNS.height] Container height. + * @param {number} [appNS.devicePixelRatio] + * @param {Object} [appNS.graphic] Graphic configuration including shadow, postEffect + * @param {boolean} [appNS.graphic.shadow=false] If enable shadow + * @param {boolean} [appNS.graphic.linear=false] If use linear space + * @param {boolean} [appNS.graphic.tonemapping=false] If enable ACES tone mapping. + * @param {boolean} [appNS.event=false] If enable mouse/touch event. It will slow down the system if geometries are complex. + */ +function App3D(dom, appNS) { - var triangle = trianglesPool.pick(); - triangle.material = material; + appNS = appNS || {}; + appNS.graphic = appNS.graphic || {}; - var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); + if (typeof dom === 'string') { + dom = document.querySelector(dom); + } - if (! clipped) { - primitives[nPrimitive++] = triangle; - } - } - } - else { - for (var j = 0; j < nVertex;) { - indices[0] = j++; - indices[1] = j++; - indices[2] = j++; + if (!dom) { throw new Error('Invalid dom'); } - var triangle = trianglesPool.pick(); - triangle.material = material; + var isDomCanvas = dom.nodeName.toUpperCase() === 'CANVAS'; + var rendererOpts = {}; + isDomCanvas && (rendererOpts.canvas = dom); + appNS.devicePixelRatio && (rendererOpts.devicePixelRatio = appNS.devicePixelRatio); - var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); + var gRenderer = new Renderer(rendererOpts); + var gWidth = appNS.width || dom.clientWidth; + var gHeight = appNS.height || dom.clientHeight; - if (! clipped) { - primitives[nPrimitive++] = triangle; - } - } - } - break; - case glenum.LINES: - // LINES mode can't use face - for (var j = 0; j < nVertex;) { - indices[0] = j++; - indices[1] = j++; - var line = linesPool.pick(); - line.material = material; - line.lineWidth = renderable.lineWidth; + var gScene = new Scene(); + var gTimeline = new Timeline(); + var gShadowPass = appNS.graphic.shadow && new ShadowMapPass(); + var gRayPicking = appNS.event && new RayPicking({ + scene: gScene, + renderer: gRenderer + }); - var clipped = this._setPrimitive(line, indices, 2, attributes, worldViewProjMat, matColor); + !isDomCanvas && dom.appendChild(gRenderer.canvas); - if (! clipped) { - primitives[nPrimitive++] = line; - } - } - break; - case glenum.POINTS: - for (var j = 0; j < nVertex; j++) { - indices[0] = j; - var point = pointsPool.pick(); - point.material = material; + gRenderer.resize(gWidth, gHeight); - var clipped = this._setPrimitive(point, indices, 1, attributes, worldViewProjMat, matColor); + var gFrameTime = 0; + var gElapsedTime = 0; - if (! clipped) { - primitives[nPrimitive++] = point; - } - } - // POINTS mode can't use face - break; - } - } + gTimeline.start(); - trianglesPool.shrink(); - linesPool.shrink(); - pointsPool.shrink(); + Object.defineProperties(this, { + /** + * Container dom element + * @name clay.application.App3D#container + * @type {HTMLDomElement} + */ + container: { get: function () { return dom; } }, + /** + * @name clay.application.App3D#renderer + * @type {clay.Renderer} + */ + renderer: { get: function () { return gRenderer; }}, + /** + * @name clay.application.App3D#scene + * @type {clay.Renderer} + */ + scene: { get: function () { return gScene; }}, + /** + * @name clay.application.App3D#timeline + * @type {clay.Renderer} + */ + timeline: { get: function () { return gTimeline; }}, + /** + * Time elapsed since last frame. Can be used in loop to calculate the movement. + * @name clay.application.App3D#frameTime + * @type {number} + */ + frameTime: { get: function () { return gFrameTime; }}, + /** + * Time elapsed since application created. + * @name clay.application.App3D#elapsedTime + * @type {number} + */ + elapsedTime: { get: function () { return gElapsedTime; }} + }); - primitives.length = nPrimitive; + /** + * Resize the application. Will use the container clientWidth/clientHeight if width/height in parameters are not given. + * @function + * @memberOf {clay.application.App3D} + * @param {number} [width] + * @param {number} [height] + */ + this.resize = function (width, height) { + gWidth = width || appNS.width || dom.clientWidth; + gHeight = height || dom.height || dom.clientHeight; + gRenderer.resize(gWidth, gHeight); + }; - primitives.sort(depthSortFunc); - this._drawPrimitives(primitives); - }, + /** + * Dispose the application + * @function + */ + this.dispose = function () { + this._disposed = true; - _setPrimitive: (function () { - var vertexColor = vec4Create(); - return function (primitive, indices, size, attributes, worldViewProjMat, matColor) { - var colorAttrib = attributes.color; - var useVertexColor = colorAttrib.value && colorAttrib.value.length > 0; - var priColor = primitive.color; + if (appNS.dispose) { + appNS.dispose(this); + } + gTimeline.stop(); + gRenderer.disposeScene(gScene); + gShadowPass && gShadowPass.dispose(gRenderer); - primitive.depth = 0; - if (useVertexColor) { - vec4$2.set(priColor, 0, 0, 0, 0); - } + dom.innerHTML = ''; + EVE_NAMES.forEach(function (eveType) { + this[makeHandlerName(eveType)] && dom.removeEventListener(makeHandlerName(eveType)); + }); + }; - var clipped = true; + gRayPicking && this._initMouseEvents(gRayPicking); - var percent = 1 / size; - for (var i = 0; i < size; i++) { - var coord = primitive.vertices[i]; - attributes.position.get(indices[i], coord); - coord[3] = 1; - vec4$2.transformMat4(coord, coord, worldViewProjMat); - if (useVertexColor) { - colorAttrib.get(indices[i], vertexColor); - // Average vertex color - // Each primitive only call fill or stroke once - // So color must be the same - vec4$2.scaleAndAdd(priColor, priColor, vertexColor, percent); - } + this._geoCache = new LRU$1(20); + this._texCache = new LRU$1(20); - // Clipping - var x = coord[0]; - var y = coord[1]; - var z = coord[2]; - var w = coord[3]; + // Do init the application. + var initPromise = Promise.resolve(appNS.init && appNS.init(this)); + // Use the inited camera. + gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); - // TODO Point clipping - if (x > -w && x < w && y > -w && y < w && z > -w && z < w) { - clipped = false; - } + var gTexturesList = {}; + var gGeometriesList = {}; - var invW = 1 / w; - coord[0] = x * invW; - coord[1] = y * invW; - coord[2] = z * invW; - // Use primitive average depth; - primitive.depth += coord[2]; - } + if (!appNS.loop) { + console.warn('Miss loop method.'); + } - if (! clipped) { - primitive.depth /= size; + var self = this; + initPromise.then(function () { + appNS.loop && gTimeline.on('frame', function (frameTime) { + gFrameTime = frameTime; + gElapsedTime += frameTime; + appNS.loop(self); - if (useVertexColor) { - vec4$2.mul(priColor, priColor, matColor); - } - else { - vec4$2.copy(priColor, matColor); - } - } + gScene.update(); - return clipped; - } - })(), + self._updateGraphicOptions(appNS.graphic, gScene.opaqueList, false); + self._updateGraphicOptions(appNS.graphic, gScene.transparentList, false); + var skyboxList = []; + gScene.skybox && skyboxList.push(gScene.skybox); + gScene.skydome && skyboxList.push(gScene.skydome); + self._updateGraphicOptions(appNS.graphic, skyboxList, true); - _drawPrimitives: function (primitives) { - var ctx = this.ctx; - ctx.save(); + gRayPicking && (gRayPicking.camera = gScene.getMainCamera()); + // Render shadow pass + gShadowPass && gShadowPass.render(gRenderer, gScene, null, true); - var prevMaterial; + appNS.beforeRender && appNS.beforeRender(self); + self._doRender(gRenderer, gScene, true); + appNS.afterRender && appNS.afterRender(self); - var dpr = this.devicePixelRatio; - var width = this._width * dpr; - var height = this._height * dpr; - var halfWidth = width / 2; - var halfHeight = height / 2; + // Mark all resources unused; + markUnused(gTexturesList); + markUnused(gGeometriesList); - var prevLineWidth; - var prevStrokeColor; + // Collect resources used in this frame. + var newTexturesList = []; + var newGeometriesList = []; + collectResources(gScene, newTexturesList, newGeometriesList); - for (var i = 0; i < primitives.length; i++) { - var primitive = primitives[i]; - var vertices = primitive.vertices; + // Dispose those unsed resources. + checkAndDispose(gRenderer, gTexturesList); + checkAndDispose(gRenderer, gGeometriesList); - var primitiveType = primitive.type; - var material = primitive.material; - if (material !== prevMaterial) { - // Set material - ctx.globalAlpha = material.opacity; - prevMaterial = material; - } + gTexturesList = newTexturesList; + gGeometriesList = newGeometriesList; + }); + }); +} - var colorStr = vec4ToColorStr(primitive.color); - switch (primitiveType) { - case PRIMITIVE_TRIANGLE: - var v0 = vertices[0]; - var v1 = vertices[1]; - var v2 = vertices[2]; - ctx.fillStyle = colorStr; - ctx.beginPath(); - ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); - ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); - ctx.lineTo((v2[0] + 1) * halfWidth, (-v2[1] + 1) * halfHeight); - ctx.closePath(); - ctx.fill(); - break; - case PRIMITIVE_LINE: - var v0 = vertices[0]; - var v1 = vertices[1]; - var lineWidth = primitive.lineWidth; - if (prevStrokeColor !== colorStr) { - prevStrokeColor = ctx.strokeStyle = colorStr; - } - if (lineWidth !== prevLineWidth) { - ctx.lineWidth = prevLineWidth = lineWidth; - } - ctx.beginPath(); - ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); - ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); - ctx.stroke(); - break; - case PRIMITIVE_POINT: - var pointSize = material.pointSize; - var pointShape = material.pointShape; - var halfSize = pointSize / 2; - if (pointSize > 0) { - var v0 = vertices[0]; - var cx = (v0[0] + 1) * halfWidth; - var cy = (-v0[1] + 1) * halfHeight; +function isImageLikeElement(val) { + return val instanceof Image + || val instanceof HTMLCanvasElement + || val instanceof HTMLVideoElement; +} - ctx.fillStyle = colorStr; - if (pointShape === 'rectangle') { - ctx.fillRect(cx - halfSize, cy - halfSize, pointSize, pointSize); - } - else if (pointShape === 'circle') { - ctx.beginPath(); - ctx.arc(cx, cy, halfSize, 0, Math.PI * 2); - ctx.fill(); - } - } - break; - } - } +function getKeyFromImageLike(val) { + typeof val === 'string' + ? val : (val.__key__ || (val.__key__ = util$1.genGUID())); +} - ctx.restore(); - }, +function makeHandlerName(eveType) { + return '_' + eveType + 'Handler'; +} - dispose: function () { - this._triangles.clear(); - this._lines.clear(); - this._points.clear(); - this._primitives = []; +function packageEvent(eventType, pickResult, offsetX, offsetY, wheelDelta) { + var event = util$1.clone(pickResult); + event.type = eventType; + event.offsetX = offsetX; + event.offsetY = offsetY; + if (wheelDelta !== null) { + event.wheelDelta = wheelDelta; + } + return event; +} - this.ctx = null; - this.canvas = null; +function bubblingEvent(target, event) { + while (target && !event.cancelBubble) { + target.trigger(event.type, event); + target = target.getParent(); } -}); +} -// PENDING -// Use topological sort ? +App3D.prototype._initMouseEvents = function (rayPicking) { + var dom = this.container; -/** - * Node of graph based post processing. - * - * @constructor clay.compositor.Node - * @extends clay.core.Base - * - */ -var Node$1 = Base.extend(function () { - return /** @lends clay.compositor.Node# */ { - /** - * @type {string} - */ - name: '', + var oldTarget = null; + EVE_NAMES.forEach(function (_eveType) { + dom.addEventListener(_eveType, this[makeHandlerName(_eveType)] = function (e) { + if (!rayPicking.camera) { // Not have camera yet. + return; + } + e.preventDefault(); - /** - * Input links, will be updated by the graph - * @example: - * inputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - inputLinks: {}, + var box = dom.getBoundingClientRect(); + var offsetX, offsetY; + var eveType = _eveType; + + if (eveType.indexOf('touch') >= 0) { + var touch = eveType != 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + if (eveType === 'touchstart') { + eveType = 'mousedown'; + } + else if (eveType === 'touchend') { + eveType = 'mouseup'; + } + else if (eveType === 'touchmove') { + eveType = 'mousemove'; + } + offsetX = touch.clientX - box.left; + offsetY = touch.clientY - box.top; + } + else { + offsetX = e.clientX - box.left; + offsetY = e.clientY - box.top; + } - /** - * Output links, will be updated by the graph - * @example: - * outputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - outputLinks: {}, + var pickResult = rayPicking.pick(offsetX, offsetY); - // Save the output texture of previous frame - // Will be used when there exist a circular reference - _prevOutputTextures: {}, - _outputTextures: {}, + var delta; + if (eveType === 'DOMMouseScroll' || eveType === 'mousewheel') { + delta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; + } - // Example: { name: 2 } - _outputReferences: {}, + if (pickResult) { + // Just ignore silent element. + if (pickResult.target.silent) { + return; + } - _rendering: false, - // If rendered in this frame - _rendered: false, + if (eveType === 'mousemove') { + // PENDING touchdown should trigger mouseover event ? + var targetChanged = pickResult.target !== oldTarget; + if (targetChanged) { + oldTarget && bubblingEvent(oldTarget, packageEvent('mouseout', { + target: oldTarget + }, offsetX, offsetY)); + } + bubblingEvent(pickResult.target, packageEvent('mousemove', pickResult, offsetX, offsetY)); + if (targetChanged) { + bubblingEvent(pickResult.target, packageEvent('mouseover', pickResult, offsetX, offsetY)); + } + } + else { + bubblingEvent(pickResult.target, packageEvent(eveType, pickResult, offsetX, offsetY, delta)); + } + oldTarget = pickResult.target; + } + else if (oldTarget) { + bubblingEvent(oldTarget, packageEvent('mouseout', { + target: oldTarget + }, offsetX, offsetY)); + oldTarget = null; + } + }); + }, this); +}; - _compositor: null - }; -}, -/** @lends clay.compositor.Node.prototype */ -{ +App3D.prototype._updateGraphicOptions = function (graphicOpts, list, isSkybox) { + var enableTonemapping = !!graphicOpts.tonemapping; + var isLinearSpace = !!graphicOpts.linear; - // TODO Remove parameter function callback - updateParameter: function (outputName, renderer) { - var outputInfo = this.outputs[outputName]; - var parameters = outputInfo.parameters; - var parametersCopy = outputInfo._parametersCopy; - if (!parametersCopy) { - parametersCopy = outputInfo._parametersCopy = {}; + var prevMaterial; + + for (var i = 0; i < list.length; i++) { + var mat = list[i].material; + if (mat === prevMaterial) { + continue; } - if (parameters) { - for (var key in parameters) { - if (key !== 'width' && key !== 'height') { - parametersCopy[key] = parameters[key]; - } + + enableTonemapping ? mat.define('fragment', 'TONEMAPPING') : mat.undefine('fragment', 'TONEMAPPING'); + if (isLinearSpace) { + var decodeSRGB = true; + if (isSkybox && mat.get('environmentMap') && !mat.get('environmentMap').sRGB) { + decodeSRGB = false; } - } - var width, height; - if (parameters.width instanceof Function) { - width = parameters.width.call(this, renderer); - } - else { - width = parameters.width; - } - if (parameters.height instanceof Function) { - height = parameters.height.call(this, renderer); + decodeSRGB && mat.define('fragment', 'SRGB_DECODE'); + mat.define('fragment', 'SRGB_ENCODE'); } else { - height = parameters.height; - } - if ( - parametersCopy.width !== width - || parametersCopy.height !== height - ) { - if (this._outputTextures[outputName]) { - this._outputTextures[outputName].dispose(renderer.gl); - } + mat.undefine('fragment', 'SRGB_DECODE'); + mat.undefine('fragment', 'SRGB_ENCODE'); } - parametersCopy.width = width; - parametersCopy.height = height; - return parametersCopy; - }, + prevMaterial = mat; + } +}; - /** - * Set parameter - * @param {string} name - * @param {} value - */ - setParameter: function (name, value) {}, - /** - * Get parameter value - * @param {string} name - * @return {} - */ - getParameter: function (name) {}, - /** - * Set parameters - * @param {Object} obj - */ - setParameters: function (obj) { - for (var name in obj) { - this.setParameter(name, obj[name]); - } - }, +App3D.prototype._doRender = function (renderer, scene) { + var camera = scene.getMainCamera(); + camera.aspect = renderer.getViewportAspect(); + renderer.render(scene); +}; - render: function () {}, - getOutput: function (renderer /*optional*/, name) { - if (name == null) { - // Return the output texture without rendering - name = renderer; - return this._outputTextures[name]; - } - var outputInfo = this.outputs[name]; - if (!outputInfo) { - return ; - } +function markUnused(resourceList) { + for (var i = 0; i < resourceList.length; i++) { + resourceList[i].__used__ = 0; + } +} - // Already been rendered in this frame - if (this._rendered) { - // Force return texture in last frame - if (outputInfo.outputLastFrame) { - return this._prevOutputTextures[name]; - } - else { - return this._outputTextures[name]; - } - } - else if ( - // TODO - this._rendering // Solve Circular Reference - ) { - if (!this._prevOutputTextures[name]) { - // Create a blank texture at first pass - this._prevOutputTextures[name] = this._compositor.allocateTexture(outputInfo.parameters || {}); - } - return this._prevOutputTextures[name]; +function checkAndDispose(renderer, resourceList) { + for (var i = 0; i < resourceList.length; i++) { + if (!resourceList[i].__used__) { + resourceList[i].dispose(renderer); } + } +} - this.render(renderer); - - return this._outputTextures[name]; - }, +function updateUsed(resource, list) { + resource.__used__ = resource.__used__ || 0; + resource.__used__++; + if (resource.__used__ === 1) { + // Don't push to the list twice. + list.push(resource); + } +} +function collectResources(scene, textureResourceList, geometryResourceList) { + function trackQueue(queue) { + var prevMaterial; + var prevGeometry; + for (var i = 0; i < queue.length; i++) { + var renderable = queue[i]; + var geometry = renderable.geometry; + var material = renderable.material; - removeReference: function (outputName) { - this._outputReferences[outputName]--; - if (this._outputReferences[outputName] === 0) { - var outputInfo = this.outputs[outputName]; - if (outputInfo.keepLastFrame) { - if (this._prevOutputTextures[outputName]) { - this._compositor.releaseTexture(this._prevOutputTextures[outputName]); + // TODO optimize!! + if (material !== prevMaterial) { + var textureUniforms = material.getTextureUniforms(); + for (var u = 0; u < textureUniforms.length; u++) { + var uniformName = textureUniforms[u]; + var val = material.uniforms[uniformName].value; + if (!val) { + continue; + } + if (val instanceof Texture) { + updateUsed(val, textureResourceList); + } + else if (val instanceof Array) { + for (var k = 0; k < val.length; k++) { + if (val[k] instanceof Texture) { + updateUsed(val[k], textureResourceList); + } + } + } } - this._prevOutputTextures[outputName] = this._outputTextures[outputName]; } - else { - // Output of this node have alreay been used by all other nodes - // Put the texture back to the pool. - this._compositor.releaseTexture(this._outputTextures[outputName]); + if (geometry !== prevGeometry) { + updateUsed(geometry, geometryResourceList); } - } - }, - - link: function (inputPinName, fromNode, fromPinName) { - // The relationship from output pin to input pin is one-on-multiple - this.inputLinks[inputPinName] = { - node: fromNode, - pin: fromPinName - }; - if (!fromNode.outputLinks[fromPinName]) { - fromNode.outputLinks[fromPinName] = []; + prevMaterial = material; + prevGeometry = geometry; } - fromNode.outputLinks[fromPinName].push({ - node: this, - pin: inputPinName - }); - - // Enabled the pin texture in shader - this.pass.material.enableTexture(inputPinName); - }, + } - clear: function () { - this.inputLinks = {}; - this.outputLinks = {}; - }, + trackQueue(scene.opaqueList); + trackQueue(scene.transparentList); - updateReference: function (outputName) { - if (!this._rendering) { - this._rendering = true; - for (var inputName in this.inputLinks) { - var link = this.inputLinks[inputName]; - link.node.updateReference(link.pin); - } - this._rendering = false; + for (var k = 0; k < scene.lights.length; k++) { + // Track AmbientCubemap + if (scene.lights[k].cubemap) { + updateUsed(scene.lights[k].cubemap, textureResourceList); } - if (outputName) { - this._outputReferences[outputName] ++; + } +} +/** + * Load a texture from image or string. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} + * @param {boolean} [opts.convertToPOT=false] Force convert None Power of Two texture to Power of two so it can be tiled. + * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} + * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} + * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} + * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} + * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} + * @param {number} [opts.exposure] Only be used when source is a HDR image. + * @param {boolean} [useCache] If use cache. + * @return {Promise} + * @example + * app.loadTexture('diffuseMap.jpg') + * .then(function (texture) { + * material.set('diffuseMap', texture); + * }); + */ +App3D.prototype.loadTexture = function (urlOrImg, opts, useCache) { + var self = this; + var key = getKeyFromImageLike(urlOrImg); + if (useCache) { + if (this._texCache.get(key)) { + return this._texCache.get(key); } - }, - - beforeFrame: function () { - this._rendered = false; + } + // TODO Promise ? + var promise = new Promise(function (resolve, reject) { + var texture = self.loadTextureSync(urlOrImg, opts); + if (!texture.isRenderable()) { + texture.success(function () { + if (self._disposed) { + return; + } + resolve(texture); + }); + texture.error(function () { + if (self._disposed) { + return; + } + reject(); + }); + } + else { + resolve(texture); + } + }); + if (useCache) { + this._texCache.put(key, promise); + } + return promise; +}; - for (var name in this.outputLinks) { - this._outputReferences[name] = 0; +function nearestPowerOfTwo(val) { + return Math.pow(2, Math.round(Math.log(val) / Math.LN2)); +} +function convertTextureToPowerOfTwo(texture) { + if ((texture.wrapS === Texture.REPEAT || texture.wrapT === Texture.REPEAT) + && texture.image + ) { + // var canvas = document.createElement('canvas'); + var width = nearestPowerOfTwo(texture.width); + var height = nearestPowerOfTwo(texture.height); + if (width !== texture.width || height !== texture.height) { + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + var ctx = canvas.getContext('2d'); + ctx.drawImage(texture.image, 0, 0, width, height); + canvas.srcImage = texture.image; + texture.image = canvas; + texture.dirty(); } - }, + } +} - afterFrame: function () { - // Put back all the textures to pool - for (var name in this.outputLinks) { - if (this._outputReferences[name] > 0) { - var outputInfo = this.outputs[name]; - if (outputInfo.keepLastFrame) { - if (this._prevOutputTextures[name]) { - this._compositor.releaseTexture(this._prevOutputTextures[name]); - } - this._prevOutputTextures[name] = this._outputTextures[name]; - } - else { - this._compositor.releaseTexture(this._outputTextures[name]); - } +/** + * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=true] If flipY. See {@link clay.Texture.flipY} + * @param {boolean} [opts.convertToPOT=false] Force convert None Power of Two texture to Power of two so it can be tiled. + * @param {number} [opts.anisotropic] Anisotropic filtering. See {@link clay.Texture.anisotropic} + * @param {number} [opts.wrapS=clay.Texture.REPEAT] See {@link clay.Texture.wrapS} + * @param {number} [opts.wrapT=clay.Texture.REPEAT] See {@link clay.Texture.wrapT} + * @param {number} [opts.minFilter=clay.Texture.LINEAR_MIPMAP_LINEAR] See {@link clay.Texture.minFilter} + * @param {number} [opts.magFilter=clay.Texture.LINEAR] See {@link clay.Texture.magFilter} + * @param {number} [opts.exposure] Only be used when source is a HDR image. + * @return {clay.Texture2D} + * @example + * var texture = app.loadTexture('diffuseMap.jpg', { + * anisotropic: 8, + * flipY: false + * }); + * material.set('diffuseMap', texture); + */ +App3D.prototype.loadTextureSync = function (urlOrImg, opts) { + var texture = new Texture2D(opts); + if (typeof urlOrImg === 'string') { + if (urlOrImg.match(/.hdr$|^data:application\/octet-stream/)) { + texture = textureUtil.loadTexture(urlOrImg, { + exposure: opts && opts.exposure, + fileType: 'hdr' + }, function () { + texture.dirty(); + texture.trigger('success'); + }); + for (var key in opts) { + texture[key] = opts[key]; + } + } + else { + texture.load(urlOrImg); + if (opts && opts.convertToPOT) { + texture.success(function () { + convertTextureToPowerOfTwo(texture); + }); } } } -}); + else if (isImageLikeElement(urlOrImg)) { + texture.image = urlOrImg; + texture.dynamic = urlOrImg instanceof HTMLVideoElement; + } + return texture; +}; /** - * @constructor clay.compositor.Graph - * @extends clay.core.Base - */ -var Graph = Base.extend(function () { - return /** @lends clay.compositor.Graph# */ { - /** - * @type {Array.} - */ - nodes: [] - }; -}, -/** @lends clay.compositor.Graph.prototype */ -{ - - /** - * Mark to update - */ - dirty: function () { - this._dirty = true; - }, - /** - * @param {clay.compositor.Node} node - */ - addNode: function (node) { - - if (this.nodes.indexOf(node) >= 0) { - return; + * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=false] If flipY. See {@link clay.Texture.flipY} + * @return {Promise} + * @example + * app.loadTextureCube({ + * px: 'skybox/px.jpg', py: 'skybox/py.jpg', pz: 'skybox/pz.jpg', + * nx: 'skybox/nx.jpg', ny: 'skybox/ny.jpg', nz: 'skybox/nz.jpg' + * }).then(function (texture) { + * skybox.setEnvironmentMap(texture); + * }) + */ +App3D.prototype.loadTextureCube = function (imgList, opts) { + var textureCube = this.loadTextureCubeSync(imgList, opts); + return new Promise(function (resolve, reject) { + if (textureCube.isRenderable()) { + resolve(textureCube); } + else { + textureCube.success(function () { + resolve(textureCube); + }).error(function () { + reject(); + }); + } + }); +}; - this.nodes.push(node); +/** + * Create a texture from image or string synchronously. Texture can be use directly and don't have to wait for it's loaded. + * @param {ImageLike} img + * @param {Object} [opts] Texture options. + * @param {boolean} [opts.flipY=false] If flipY. See {@link clay.Texture.flipY} + * @return {clay.TextureCube} + * @example + * var texture = app.loadTextureCubeSync({ + * px: 'skybox/px.jpg', py: 'skybox/py.jpg', pz: 'skybox/pz.jpg', + * nx: 'skybox/nx.jpg', ny: 'skybox/ny.jpg', nz: 'skybox/nz.jpg' + * }); + * skybox.setEnvironmentMap(texture); + */ +App3D.prototype.loadTextureCubeSync = function (imgList, opts) { + opts = opts || {}; + opts.flipY = opts.flipY || false; + var textureCube = new TextureCube(opts); + if (!imgList || !imgList.px || !imgList.nx || !imgList.py || !imgList.ny || !imgList.pz || !imgList.nz) { + throw new Error('Invalid cubemap format. Should be an object including px,nx,py,ny,pz,nz'); + } + if (typeof imgList.px === 'string') { + textureCube.load(imgList); + } + else { + textureCube.image = util$1.clone(imgList); + } + return textureCube; +}; - this._dirty = true; - }, - /** - * @param {clay.compositor.Node|string} node - */ - removeNode: function (node) { - if (typeof node === 'string') { - node = this.getNodeByName(node); - } - var idx = this.nodes.indexOf(node); - if (idx >= 0) { - this.nodes.splice(idx, 1); - this._dirty = true; - } - }, - /** - * @param {string} name - * @return {clay.compositor.Node} - */ - getNodeByName: function (name) { - for (var i = 0; i < this.nodes.length; i++) { - if (this.nodes[i].name === name) { - return this.nodes[i]; +/** + * Create a material. + * @param {Object} materialConfig. materialConfig contains `shader`, `transparent` and uniforms that used in corresponding uniforms. + * Uniforms can be `color`, `alpha` `diffuseMap` etc. + * @param {string|clay.Shader} [shader='clay.standardMR'] Default to be standard shader with metalness and roughness workflow. + * @param {boolean} [transparent=false] If material is transparent. + * @param {boolean} [convertTextureToPOT=false] Force convert None Power of Two texture to Power of two so it can be tiled. + * @return {clay.Material} + */ +App3D.prototype.createMaterial = function (matConfig) { + matConfig = matConfig || {}; + matConfig.shader = matConfig.shader || 'clay.standardMR'; + var shader = matConfig.shader instanceof Shader ? matConfig.shader : library.get(matConfig.shader); + var material = new Material({ + shader: shader + }); + function makeTextureSetter(key) { + return function (texture) { + material.setUniform(key, texture); + }; + } + for (var key in matConfig) { + if (material.uniforms[key]) { + var val = matConfig[key]; + if ((material.uniforms[key].type === 't' || isImageLikeElement(val)) + && !(val instanceof Texture) + ) { + // Try to load a texture. + this.loadTexture(val, { + convertToPOT: matConfig.convertTextureToPOT + }).then(makeTextureSetter(key)); + } + else { + material.setUniform(key, val); } } - }, - /** - * Update links of graph - */ - update: function () { - for (var i = 0; i < this.nodes.length; i++) { - this.nodes[i].clear(); - } - // Traverse all the nodes and build the graph - for (var i = 0; i < this.nodes.length; i++) { - var node = this.nodes[i]; + } - if (!node.inputs) { - continue; - } - for (var inputName in node.inputs) { - if (!node.inputs[inputName]) { - continue; - } - if (node.pass && !node.pass.material.isUniformEnabled(inputName)) { - console.warn('Pin ' + node.name + '.' + inputName + ' not used.'); - continue; - } - var fromPinInfo = node.inputs[inputName]; + if (matConfig.transparent) { + matConfig.depthMask = false; + matConfig.transparent = true; + } + return material; +}; - var fromPin = this.findPin(fromPinInfo); - if (fromPin) { - node.link(inputName, fromPin.node, fromPin.pin); - } - else { - if (typeof fromPinInfo === 'string') { - console.warn('Node ' + fromPinInfo + ' not exist'); - } - else { - console.warn('Pin of ' + fromPinInfo.node + '.' + fromPinInfo.pin + ' not exist'); - } - } - } - } - }, +/** + * Create a cube mesh and add it to the scene or the given parent node. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Array.|number} [subdivision=1] Subdivision of cube. + * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. + * @return {clay.Mesh} + * @example + * // Create a white cube. + * app.createCube() + */ +App3D.prototype.createCube = function (material, parentNode, subdiv) { + if (subdiv == null) { + subdiv = 1; + } + if (typeof subdiv === 'number') { + subdiv = [subdiv, subdiv, subdiv]; + } - findPin: function (input) { - var node; - // Try to take input as a directly a node - if (typeof input === 'string' || input instanceof Node$1) { - input = { - node: input - }; - } + var geoKey = 'cube-' + subdiv.join('-'); + var cube = this._geoCache.get(geoKey); + if (!cube) { + cube = new Cube$1({ + widthSegments: subdiv[0], + heightSegments: subdiv[1], + depthSegments: subdiv[2] + }); + cube.generateTangents(); + this._geoCache.put(geoKey, cube); + } + return this.createMesh(cube, material, parentNode); +}; - if (typeof input.node === 'string') { - for (var i = 0; i < this.nodes.length; i++) { - var tmp = this.nodes[i]; - if (tmp.name === input.node) { - node = tmp; - } - } - } - else { - node = input.node; - } - if (node) { - var inputPin = input.pin; - if (!inputPin) { - // Use first pin defaultly - if (node.outputs) { - inputPin = Object.keys(node.outputs)[0]; - } - } - if (node.outputs[inputPin]) { - return { - node: node, - pin: inputPin - }; - } - } +/** + * Create a cube mesh that camera is inside the cube. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Array.|number} [subdivision=1] Subdivision of cube. + * Can be a number to represent both width, height and depth dimensions. Or an array to represent them respectively. + * @return {clay.Mesh} + * @example + * // Create a white cube inside. + * app.createCubeInside() + */ +App3D.prototype.createCubeInside = function (material, parentNode, subdiv) { + if (subdiv == null) { + subdiv = 1; } -}); + if (typeof subdiv === 'number') { + subdiv = [subdiv, subdiv, subdiv]; + } + var geoKey = 'cubeInside-' + subdiv.join('-'); + var cube = this._geoCache.get(geoKey); + if (!cube) { + cube = new Cube$1({ + inside: true, + widthSegments: subdiv[0], + heightSegments: subdiv[1], + depthSegments: subdiv[2] + }); + cube.generateTangents(); + this._geoCache.put(geoKey, cube); + } + + return this.createMesh(cube, material, parentNode); +}; /** - * Compositor provide graph based post processing - * - * @constructor clay.compositor.Compositor - * @extends clay.compositor.Graph - * + * Create a sphere mesh and add it to the scene or the given parent node. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {number} [subdivision=20] Subdivision of sphere. + * @return {clay.Mesh} + * @example + * // Create a semi-transparent sphere. + * app.createSphere({ + * color: [0, 0, 1], + * transparent: true, + * alpha: 0.5 + * }) */ -var Compositor = Graph.extend(function() { - return { - // Output node - _outputs: [], +App3D.prototype.createSphere = function (material, parentNode, subdivision) { + if (subdivision == null) { + subdivision = 20; + } + var geoKey = 'sphere-' + subdivision; + var sphere = this._geoCache.get(geoKey); + if (!sphere) { + sphere = new Sphere$1({ + widthSegments: subdivision * 2, + heightSegments: subdivision + }); + sphere.generateTangents(); + this._geoCache.put(geoKey, sphere); + } + return this.createMesh(sphere, material, parentNode); +}; - _texturePool: new TexturePool(), +/** + * Create a plane mesh and add it to the scene or the given parent node. + * @function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Array.|number} [subdivision=1] Subdivision of plane. + * Can be a number to represent both width and height dimensions. Or an array to represent them respectively. + * @return {clay.Mesh} + * @example + * // Create a red color plane. + * app.createPlane({ + * color: [1, 0, 0] + * }) + */ +App3D.prototype.createPlane = function (material, parentNode, subdiv) { + if (subdiv == null) { + subdiv = 1; + } + if (typeof subdiv === 'number') { + subdiv = [subdiv, subdiv]; + } + var geoKey = 'plane-' + subdiv.join('-'); + var planeGeo = this._geoCache.get(geoKey); + if (!planeGeo) { + planeGeo = new Plane$3({ + widthSegments: subdiv[0], + heightSegments: subdiv[1] + }); + planeGeo.generateTangents(); + this._geoCache.put(geoKey, planeGeo); + } + return this.createMesh(planeGeo, material, parentNode); +}; - _frameBuffer: new FrameBuffer({ - depthBuffer: false - }) - }; -}, -/** @lends clay.compositor.Compositor.prototype */ -{ - addNode: function(node) { - Graph.prototype.addNode.call(this, node); - node._compositor = this; - }, - /** - * @param {clay.Renderer} renderer - */ - render: function(renderer, frameBuffer) { - if (this._dirty) { - this.update(); - this._dirty = false; +/** + * Create mesh with parametric surface function + * @param {Object|clay.Material} [material] + * @param {clay.Node} [parentNode] Parent node to append. Default to be scene. + * @param {Object} generator + * @param {Function} generator.x + * @param {Function} generator.y + * @param {Function} generator.z + * @param {Array} [generator.u=[0, 1, 0.05]] + * @param {Array} [generator.v=[0, 1, 0.05]] + * @return {clay.Mesh} + */ +App3D.prototype.createParametricSurface = function (material, parentNode, generator) { + var geo = new ParametricSurface$1({ + generator: generator + }); + geo.generateTangents(); + return this.createMesh(geo, material, parentNode); +}; - this._outputs.length = 0; - for (var i = 0; i < this.nodes.length; i++) { - if (!this.nodes[i].outputs) { - this._outputs.push(this.nodes[i]); - } - } - } - for (var i = 0; i < this.nodes.length; i++) { - // Update the reference number of each output texture - this.nodes[i].beforeFrame(); - } +/** + * Create a general mesh with given geometry instance and material config. + * @param {clay.Geometry} geometry + * @return {clay.Mesh} + */ +App3D.prototype.createMesh = function (geometry, mat, parentNode) { + var mesh = new Mesh({ + geometry: geometry, + material: mat instanceof Material ? mat : this.createMaterial(mat) + }); + parentNode = parentNode || this.scene; + parentNode.add(mesh); + return mesh; +}; - for (var i = 0; i < this._outputs.length; i++) { - this._outputs[i].updateReference(); - } +/** + * Create an empty node + * @param {clay.Node} parentNode + * @return {clay.Node} + */ +App3D.prototype.createNode = function (parentNode) { + var node = new Node(); + parentNode = parentNode || this.scene; + parentNode.add(node); + return node; +}; - for (var i = 0; i < this._outputs.length; i++) { - this._outputs[i].render(renderer, frameBuffer); +/** + * Create a perspective or orthographic camera and add it to the scene. + * @param {Array.|clay.math.Vector3} position + * @param {Array.|clay.math.Vector3} target + * @param {string} [type="perspective"] Can be 'perspective' or 'orthographic'(in short 'ortho') + * @return {clay.camera.Perspective} + */ +App3D.prototype.createCamera = function (position, target, type) { + var CameraCtor; + if (type === 'ortho' || type === 'orthographic') { + CameraCtor = Orthographic$1; + } + else { + if (type && type !== 'perspective') { + console.error('Unkown camera type ' + type + '. Use default perspective camera'); } + CameraCtor = Perspective$1; + } - for (var i = 0; i < this.nodes.length; i++) { - // Clear up - this.nodes[i].afterFrame(); - } - }, + var camera = new CameraCtor(); + if (position instanceof Vector3) { + camera.position.copy(position); + } + else if (position instanceof Array) { + camera.position.setArray(position); + } - allocateTexture: function (parameters) { - return this._texturePool.get(parameters); - }, + if (target instanceof Array) { + target = new Vector3(target[0], target[1], target[2]); + } + if (target instanceof Vector3) { + camera.lookAt(target); + } - releaseTexture: function (parameters) { - this._texturePool.put(parameters); - }, + this.scene.add(camera); - getFrameBuffer: function () { - return this._frameBuffer; - }, + return camera; +}; - /** - * Dispose compositor - * @param {clay.Renderer} renderer - */ - dispose: function (renderer) { - this._texturePool.clear(renderer); +/** + * Create a directional light and add it to the scene. + * @param {Array.|clay.math.Vector3} dir A Vector3 or array to represent the direction. + * @param {Color} [color='#fff'] Color of directional light, default to be white. + * @param {number} [intensity] Intensity of directional light, default to be 1. + * + * @example + * app.createDirectionalLight([-1, -1, -1], '#fff', 2); + */ +App3D.prototype.createDirectionalLight = function (dir, color, intensity) { + var light = new DirectionalLight(); + if (dir instanceof Vector3) { + dir = dir.array; } -}); + light.position.setArray(dir).negate(); + light.lookAt(Vector3.ZERO); + if (typeof color === 'string') { + color = parseColor(color); + } + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); + + this.scene.add(light); + return light; +}; /** - * @constructor clay.compositor.SceneNode - * @extends clay.compositor.Node + * Create a spot light and add it to the scene. + * @param {Array.|clay.math.Vector3} position Position of the spot light. + * @param {Array.|clay.math.Vector3} [target] Target position where spot light points to. + * @param {number} [range=20] Falloff range of spot light. Default to be 20. + * @param {Color} [color='#fff'] Color of spot light, default to be white. + * @param {number} [intensity=1] Intensity of spot light, default to be 1. + * @param {number} [umbraAngle=30] Umbra angle of spot light. Default to be 30 degree from the middle line. + * @param {number} [penumbraAngle=45] Penumbra angle of spot light. Default to be 45 degree from the middle line. + * + * @example + * app.createSpotLight([5, 5, 5], [0, 0, 0], 20, #900); */ -var SceneNode$1 = Node$1.extend( -/** @lends clay.compositor.SceneNode# */ -{ - name: 'scene', - /** - * @type {clay.Scene} - */ - scene: null, - /** - * @type {clay.Camera} - */ - camera: null, - /** - * @type {boolean} - */ - autoUpdateScene: true, - /** - * @type {boolean} - */ - preZ: false +App3D.prototype.createSpotLight = function (position, target, range, color, intensity, umbraAngle, penumbraAngle) { + var light = new SpotLight(); + light.position.setArray(position instanceof Vector3 ? position.array : position); -}, function() { - this.frameBuffer = new FrameBuffer(); -}, { - render: function(renderer) { + if (target instanceof Array) { + target = new Vector3(target[0], target[1], target[2]); + } + if (target instanceof Vector3) { + light.lookAt(target); + } - this._rendering = true; - var _gl = renderer.gl; + if (typeof color === 'string') { + color = parseColor(color); + } + range != null && (light.range = range); + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); + umbraAngle != null && (light.umbraAngle = umbraAngle); + penumbraAngle != null && (light.penumbraAngle = penumbraAngle); - this.trigger('beforerender'); + this.scene.add(light); - var renderInfo; + return light; +}; - if (!this.outputs) { +/** + * Create a point light. + * @param {Array.|clay.math.Vector3} position Position of point light.. + * @param {number} [range=100] Falloff range of point light. + * @param {Color} [color='#fff'] Color of point light. + * @param {number} [intensity=1] Intensity of point light. + */ +App3D.prototype.createPointLight = function (position, range, color, intensity) { + var light = new PointLight(); + light.position.setArray(position instanceof Vector3 ? position.array : position); - renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); + if (typeof color === 'string') { + color = parseColor(color); + } + range != null && (light.range = range); + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); - } - else { + this.scene.add(light); - var frameBuffer = this.frameBuffer; - for (var name in this.outputs) { - var parameters = this.updateParameter(name, renderer); - var outputInfo = this.outputs[name]; - var texture = this._compositor.allocateTexture(parameters); - this._outputTextures[name] = texture; + return light; +}; - var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; - if (typeof(attachment) == 'string') { - attachment = _gl[attachment]; - } - frameBuffer.attach(texture, attachment); - } - frameBuffer.bind(renderer); +/** + * Create a ambient light. + * @param {Color} [color='#fff'] Color of ambient light. + * @param {number} [intensity=1] Intensity of ambient light. + */ +App3D.prototype.createAmbientLight = function (color, intensity) { + var light = new AmbientLight(); - // MRT Support in chrome - // https://www.khronos.org/registry/webgl/sdk/tests/conformance/extensions/ext-draw-buffers.html - var ext = renderer.getGLExtension('EXT_draw_buffers'); - if (ext) { - var bufs = []; - for (var attachment in this.outputs) { - attachment = parseInt(attachment); - if (attachment >= _gl.COLOR_ATTACHMENT0 && attachment <= _gl.COLOR_ATTACHMENT0 + 8) { - bufs.push(attachment); - } - } - ext.drawBuffersEXT(bufs); - } + if (typeof color === 'string') { + color = parseColor(color); + } + color != null && (light.color = color); + intensity != null && (light.intensity = intensity); - // Always clear - // PENDING - renderer.saveClear(); - renderer.clearBit = glenum.DEPTH_BUFFER_BIT | glenum.COLOR_BUFFER_BIT; - renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); - renderer.restoreClear(); + this.scene.add(light); - frameBuffer.unbind(renderer); - } + return light; +}; - this.trigger('afterrender', renderInfo); +/** + * Create an cubemap ambient light and an spherical harmonic ambient light + * for specular and diffuse lighting in PBR rendering + * @param {ImageLike|TextureCube} [envImage] Panorama environment image, HDR format is better. Or a pre loaded texture cube + * @param {number} [specularIntenstity=0.7] Intensity of specular light. + * @param {number} [diffuseIntenstity=0.7] Intensity of diffuse light. + * @param {number} [exposure=1] Exposure of HDR image. Only if image in first paramter is HDR. + * @param {number} [prefilteredCubemapSize=32] The size of prefilerted cubemap. Larger value will take more time to do expensive prefiltering. + */ +App3D.prototype.createAmbientCubemapLight = function (envImage, specIntensity, diffIntensity, exposure, prefilteredCubemapSize) { + var self = this; + if (exposure == null) { + exposure = 1; + } + if (prefilteredCubemapSize == null) { + prefilteredCubemapSize = 32; + } - this._rendering = false; - this._rendered = true; + var scene = this.scene; + + var loadPromise; + if (envImage instanceof TextureCube) { + loadPromise = envImage.isRenderable() + ? Promise.resolve(envImage) + : new Promise(function (resolve, reject) { + envImage.success(function () { + resolve(envImage); + }); + }); } -}); + else { + loadPromise = this.loadTexture(envImage, { + exposure: exposure + }); + } + + return loadPromise.then(function (envTexture) { + var specLight = new AmbientCubemapLight({ + intensity: specIntensity != null ? specIntensity : 0.7 + }); + specLight.cubemap = envTexture; + envTexture.flipY = false; + // TODO Cache prefilter ? + specLight.prefilter(self.renderer, 32); + + var diffLight = new AmbientSHLight({ + intensity: diffIntensity != null ? diffIntensity : 0.7, + coefficients: sh.projectEnvironmentMap( + self.renderer, specLight.cubemap, { + lod: 1 + } + ) + }); + scene.add(specLight); + scene.add(diffLight); + + return { + specular: specLight, + diffuse: diffLight, + // Original environment map + environmentMap: envTexture + }; + }); +}; /** - * @constructor clay.compositor.TextureNode - * @extends clay.compositor.Node + * Load a [glTF](https://github.com/KhronosGroup/glTF) format model. + * You can convert FBX/DAE/OBJ format models to [glTF](https://github.com/KhronosGroup/glTF) with [fbx2gltf](https://github.com/pissang/claygl#fbx-to-gltf20-converter) python script, + * or simply using the [Clay Viewer](https://github.com/pissang/clay-viewer) client application. + * @param {string} url + * @param {Object} opts + * @param {string|clay.Shader} [opts.shader='clay.standard'] 'basic'|'lambert'|'standard'. + * @param {boolean} [opts.waitTextureLoaded=false] If add to scene util textures are all loaded. + * @param {boolean} [opts.autoPlayAnimation=true] If autoplay the animation of model. + * @param {boolean} [opts.upAxis='y'] Change model to y up if upAxis is 'z' + * @param {boolean} [opts.textureFlipY=false] + * @param {string} [opts.textureRootPath] Root path of texture. Default to be relative with glTF file. + * @return {Promise} */ -var TextureNode$1 = Node$1.extend(function() { - return /** @lends clay.compositor.TextureNode# */ { - /** - * @type {clay.Texture2D} - */ - texture: null, +App3D.prototype.loadModel = function (url, opts) { + if (typeof url !== 'string') { + throw new Error('Invalid URL.'); + } - // Texture node must have output without parameters - outputs: { - color: {} - } + opts = opts || {}; + if (opts.autoPlayAnimation == null) { + opts.autoPlayAnimation = true; + } + var shader = opts.shader || 'clay.standard'; + + var loaderOpts = { + rootNode: new Node(), + shader: shader, + textureRootPath: opts.textureRootPath, + crossOrigin: 'Anonymous', + textureFlipY: opts.textureFlipY }; -}, function () { -}, { + if (opts.upAxis && opts.upAxis.toLowerCase() === 'z') { + loaderOpts.rootNode.rotation.identity().rotateX(-Math.PI / 2); + } - getOutput: function (renderer, name) { - return this.texture; - }, + var loader = new GLTFLoader(loaderOpts); - // Do nothing - beforeFrame: function () {}, - afterFrame: function () {} -}); + var scene = this.scene; + var timeline = this.timeline; + var self = this; -// TODO Shader library -// TODO curlnoise demo wrong + return new Promise(function (resolve, reject) { + function afterLoad(result) { + if (self._disposed) { + return; + } -// PENDING -// Use topological sort ? + scene.add(result.rootNode); + if (opts.autoPlayAnimation) { + result.clips.forEach(function (clip) { + timeline.addClip(clip); + }); + } + resolve(result); + } + loader.success(function (result) { + if (self._disposed) { + return; + } -/** - * Filter node - * - * @constructor clay.compositor.FilterNode - * @extends clay.compositor.Node - * - * @example - var node = new clay.compositor.Node({ - name: 'fxaa', - shader: clay.Shader.source('clay.compositor.fxaa'), - inputs: { - texture: { - node: 'scene', - pin: 'color' + if (!opts.waitTextureLoaded) { + afterLoad(result); } - }, - // Multiple outputs is preserved for MRT support in WebGL2.0 - outputs: { - color: { - attachment: clay.FrameBuffer.COLOR_ATTACHMENT0 - parameters: { - format: clay.Texture.RGBA, - width: 512, - height: 512 - }, - // Node will keep the RTT rendered in last frame - keepLastFrame: true, - // Force the node output the RTT rendered in last frame - outputLastFrame: true + else { + Promise.all(result.textures.map(function (texture) { + if (texture.isRenderable()) { + return Promise.resolve(texture); + } + return new Promise(function (resolve) { + texture.success(resolve); + texture.error(resolve); + }); + })).then(function () { + afterLoad(result); + }).catch(function () { + afterLoad(result); + }); } - } + }); + loader.error(function () { + reject(); + }); + loader.load(url); }); - * - */ -var FilterNode$1 = Node$1.extend(function () { - return /** @lends clay.compositor.Node# */ { - /** - * @type {string} - */ - name: '', - - /** - * @type {Object} - */ - inputs: {}, - - /** - * @type {Object} - */ - outputs: null, +}; - /** - * @type {string} - */ - shader: '', - /** - * Input links, will be updated by the graph - * @example: - * inputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - inputLinks: {}, +var application = { + App3D: App3D, + /** + * Create a 3D application that will manage the app initialization and loop. + * @name clay.application.create + * @param {HTMLDomElement|string} dom Container dom element or a selector string that can be used in `querySelector` + * @param {Object} appNS + * @param {Function} init Initialization callback that will be called when initing app. + * @param {Function} loop Loop callback that will be called each frame. + * @param {number} [width] Container width. + * @param {number} [height] Container height. + * @param {number} [devicePixelRatio] + * @return {clay.application.App3D} + * + * @example + * clay.application.create('#app', { + * init: function (app) { + * app.createCube(); + * var camera = app.createCamera(); + * camera.position.set(0, 0, 2); + * }, + * loop: function () { // noop } + * }) + */ + create: function (dom, appNS) { + return new App3D(dom, appNS); + } +}; - /** - * Output links, will be updated by the graph - * @example: - * outputName: { - * node: someNode, - * pin: 'xxxx' - * } - * @type {Object} - */ - outputLinks: {}, +/** + * @constructor + * @alias clay.async.Task + * @mixes clay.core.mixin.notifier + */ +var Task = function() { + this._fullfilled = false; + this._rejected = false; +}; +/** + * Task successed + * @param {} data + */ +Task.prototype.resolve = function(data) { + this._fullfilled = true; + this._rejected = false; + this.trigger('success', data); +}; +/** + * Task failed + * @param {} err + */ +Task.prototype.reject = function(err) { + this._rejected = true; + this._fullfilled = false; + this.trigger('error', err); +}; +/** + * If task successed + * @return {boolean} + */ +Task.prototype.isFullfilled = function() { + return this._fullfilled; +}; +/** + * If task failed + * @return {boolean} + */ +Task.prototype.isRejected = function() { + return this._rejected; +}; +/** + * If task finished, either successed or failed + * @return {boolean} + */ +Task.prototype.isSettled = function() { + return this._fullfilled || this._rejected; +}; - /** - * @type {clay.compositor.Pass} - */ - pass: null, +util$1.extend(Task.prototype, notifier); - // Save the output texture of previous frame - // Will be used when there exist a circular reference - _prevOutputTextures: {}, - _outputTextures: {}, +function makeRequestTask(url, responseType) { + var task = new Task(); + request.get({ + url: url, + responseType: responseType, + onload: function(res) { + task.resolve(res); + }, + onerror: function(error) { + task.reject(error); + } + }); + return task; +} +/** + * Make a request task + * @param {string|object|object[]|string[]} url + * @param {string} [responseType] + * @example + * var task = Task.makeRequestTask('./a.json'); + * var task = Task.makeRequestTask({ + * url: 'b.bin', + * responseType: 'arraybuffer' + * }); + * var tasks = Task.makeRequestTask(['./a.json', './b.json']); + * var tasks = Task.makeRequestTask([ + * {url: 'a.json'}, + * {url: 'b.bin', responseType: 'arraybuffer'} + * ]); + * @return {clay.async.Task|clay.async.Task[]} + */ +Task.makeRequestTask = function(url, responseType) { + if (typeof url === 'string') { + return makeRequestTask(url, responseType); + } else if (url.url) { // Configure object + var obj = url; + return makeRequestTask(obj.url, obj.responseType); + } else if (Array.isArray(url)) { // Url list + var urlList = url; + var tasks = []; + urlList.forEach(function(obj) { + var url, responseType; + if (typeof obj === 'string') { + url = obj; + } else if (Object(obj) === obj) { + url = obj.url; + responseType = obj.responseType; + } + tasks.push(makeRequestTask(url, responseType)); + }); + return tasks; + } +}; +/** + * @return {clay.async.Task} + */ +Task.makeTask = function() { + return new Task(); +}; - // Example: { name: 2 } - _outputReferences: {}, +util$1.extend(Task.prototype, notifier); - _rendering: false, - // If rendered in this frame - _rendered: false, +/** + * @constructor + * @alias clay.async.TaskGroup + * @extends clay.async.Task + */ +var TaskGroup = function () { - _compositor: null - }; -}, function () { + Task.apply(this, arguments); - var pass = new Pass({ - fragment: this.shader - }); - this.pass = pass; -}, -/** @lends clay.compositor.Node.prototype */ -{ - /** - * @param {clay.Renderer} renderer - */ - render: function (renderer, frameBuffer) { - this.trigger('beforerender', renderer); + this._tasks = []; - this._rendering = true; + this._fulfilledNumber = 0; - var _gl = renderer.gl; + this._rejectedNumber = 0; +}; - for (var inputName in this.inputLinks) { - var link = this.inputLinks[inputName]; - var inputTexture = link.node.getOutput(renderer, link.pin); - this.pass.setUniform(inputName, inputTexture); - } - // Output - if (!this.outputs) { - this.pass.outputs = null; +var Ctor = function (){}; +Ctor.prototype = Task.prototype; +TaskGroup.prototype = new Ctor(); - this._compositor.getFrameBuffer().unbind(renderer); +TaskGroup.prototype.constructor = TaskGroup; - this.pass.render(renderer, frameBuffer); +/** + * Wait for all given tasks successed, task can also be any notifier object which will trigger success and error events. Like {@link clay.Texture2D}, {@link clay.TextureCube}, {@link clay.loader.GLTF}. + * @param {Array.} tasks + * @chainable + * @example + * // Load texture list + * var list = ['a.jpg', 'b.jpg', 'c.jpg'] + * var textures = list.map(function (src) { + * var texture = new clay.Texture2D(); + * texture.load(src); + * return texture; + * }); + * var taskGroup = new clay.async.TaskGroup(); + * taskGroup.all(textures).success(function () { + * // Do some thing after all textures loaded + * }); + */ +TaskGroup.prototype.all = function (tasks) { + var count = 0; + var self = this; + var data = []; + this._tasks = tasks; + this._fulfilledNumber = 0; + this._rejectedNumber = 0; + + util$1.each(tasks, function (task, idx) { + if (!task || !task.once) { + return; } - else { - this.pass.outputs = {}; + count++; + task.once('success', function (res) { + count--; - var attachedTextures = {}; - for (var name in this.outputs) { - var parameters = this.updateParameter(name, renderer); - if (isNaN(parameters.width)) { - this.updateParameter(name, renderer); - } - var outputInfo = this.outputs[name]; - var texture = this._compositor.allocateTexture(parameters); - this._outputTextures[name] = texture; - var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; - if (typeof(attachment) == 'string') { - attachment = _gl[attachment]; - } - attachedTextures[attachment] = texture; - } - this._compositor.getFrameBuffer().bind(renderer); + self._fulfilledNumber++; + // TODO + // Some tasks like texture, loader are not inherited from task + // We need to set the states here + task._fulfilled = true; + task._rejected = false; - for (var attachment in attachedTextures) { - // FIXME attachment changes in different nodes - this._compositor.getFrameBuffer().attach( - attachedTextures[attachment], attachment - ); + data[idx] = res; + if (count === 0) { + self.resolve(data); } + }); + task.once('error', function () { - this.pass.render(renderer); + self._rejectedNumber ++; - // Because the data of texture is changed over time, - // Here update the mipmaps of texture each time after rendered; - this._compositor.getFrameBuffer().updateMipmap(renderer.gl); - } + task._fulfilled = false; + task._rejected = true; - for (var inputName in this.inputLinks) { - var link = this.inputLinks[inputName]; - link.node.removeReference(link.pin); + self.reject(task); + }); + }); + if (count === 0) { + setTimeout(function () { + self.resolve(data); + }); + return this; + } + return this; +}; +/** + * Wait for all given tasks finished, either successed or failed + * @param {Array.} tasks + * @return {clay.async.TaskGroup} + */ +TaskGroup.prototype.allSettled = function (tasks) { + var count = 0; + var self = this; + var data = []; + if (tasks.length === 0) { + setTimeout(function () { + self.trigger('success', data); + }); + return this; + } + this._tasks = tasks; + + util$1.each(tasks, function (task, idx) { + if (!task || !task.once) { + return; } + count++; + task.once('success', function (res) { + count--; - this._rendering = false; - this._rendered = true; + self._fulfilledNumber++; - this.trigger('afterrender', renderer); - }, + task._fulfilled = true; + task._rejected = false; - // TODO Remove parameter function callback - updateParameter: function (outputName, renderer) { - var outputInfo = this.outputs[outputName]; - var parameters = outputInfo.parameters; - var parametersCopy = outputInfo._parametersCopy; - if (!parametersCopy) { - parametersCopy = outputInfo._parametersCopy = {}; - } - if (parameters) { - for (var key in parameters) { - if (key !== 'width' && key !== 'height') { - parametersCopy[key] = parameters[key]; - } - } - } - var width, height; - if (parameters.width instanceof Function) { - width = parameters.width.call(this, renderer); - } - else { - width = parameters.width; - } - if (parameters.height instanceof Function) { - height = parameters.height.call(this, renderer); - } - else { - height = parameters.height; - } - if ( - parametersCopy.width !== width - || parametersCopy.height !== height - ) { - if (this._outputTextures[outputName]) { - this._outputTextures[outputName].dispose(renderer); + data[idx] = res; + if (count === 0) { + self.resolve(data); } - } - parametersCopy.width = width; - parametersCopy.height = height; - - return parametersCopy; - }, + }); + task.once('error', function (err) { + count--; - /** - * Set parameter - * @param {string} name - * @param {} value - */ - setParameter: function (name, value) { - this.pass.setUniform(name, value); - }, - /** - * Get parameter value - * @param {string} name - * @return {} - */ - getParameter: function (name) { - return this.pass.getUniform(name); - }, - /** - * Set parameters - * @param {Object} obj - */ - setParameters: function (obj) { - for (var name in obj) { - this.setParameter(name, obj[name]); - } - }, - // /** - // * Set shader code - // * @param {string} shaderStr - // */ - // setShader: function (shaderStr) { - // var material = this.pass.material; - // material.shader.setFragment(shaderStr); - // material.attachShader(material.shader, true); - // }, - /** - * Proxy of pass.material.define('fragment', xxx); - * @param {string} symbol - * @param {number} [val] - */ - define: function (symbol, val) { - this.pass.material.define('fragment', symbol, val); - }, + self._rejectedNumber++; - /** - * Proxy of pass.material.undefine('fragment', xxx) - * @param {string} symbol - */ - undefine: function (symbol) { - this.pass.material.undefine('fragment', symbol); - }, + task._fulfilled = false; + task._rejected = true; - removeReference: function (outputName) { - this._outputReferences[outputName]--; - if (this._outputReferences[outputName] === 0) { - var outputInfo = this.outputs[outputName]; - if (outputInfo.keepLastFrame) { - if (this._prevOutputTextures[outputName]) { - this._compositor.releaseTexture(this._prevOutputTextures[outputName]); - } - this._prevOutputTextures[outputName] = this._outputTextures[outputName]; + // TODO + data[idx] = null; + if (count === 0) { + self.resolve(data); } - else { - // Output of this node have alreay been used by all other nodes - // Put the texture back to the pool. - this._compositor.releaseTexture(this._outputTextures[outputName]); + }); + }); + return this; +}; +/** + * Get successed sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} + */ +TaskGroup.prototype.getFulfilledNumber = function (recursive) { + if (recursive) { + var nFulfilled = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nFulfilled += task.getFulfilledNumber(recursive); + } else if(task._fulfilled) { + nFulfilled += 1; } } - }, - - clear: function () { - Node$1.prototype.clear.call(this); - - // Default disable all texture - this.pass.material.disableTexturesAll(); + return nFulfilled; + } else { + return this._fulfilledNumber; } -}); - -var shaderSourceReg = /^#source\((.*?)\)/; +}; /** - * @param {Object} json - * @param {Object} [opts] - * @return {clay.compositor.Compositor} + * Get failed sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} */ -function createCompositor(json, opts) { - var compositor = new Compositor(); - opts = opts || {}; - - var lib = { - textures: {}, - parameters: {} - }; - var afterLoad = function(shaderLib, textureLib) { - for (var i = 0; i < json.nodes.length; i++) { - var nodeInfo = json.nodes[i]; - var node = createNode(nodeInfo, lib, opts); - if (node) { - compositor.addNode(node); +TaskGroup.prototype.getRejectedNumber = function (recursive) { + if (recursive) { + var nRejected = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nRejected += task.getRejectedNumber(recursive); + } else if(task._rejected) { + nRejected += 1; } } - }; - - for (var name in json.parameters) { - var paramInfo = json.parameters[name]; - lib.parameters[name] = convertParameter(paramInfo); + return nRejected; + } else { + return this._rejectedNumber; } - // TODO load texture asynchronous - loadTextures(json, lib, opts, function(textureLib) { - lib.textures = textureLib; - afterLoad(); - }); - - return compositor; -} - -function createNode(nodeInfo, lib, opts) { - var type = nodeInfo.type || 'filter'; - var shaderSource; - var inputs; - var outputs; +}; - if (type === 'filter') { - var shaderExp = nodeInfo.shader.trim(); - var res = shaderSourceReg.exec(shaderExp); - if (res) { - shaderSource = Shader.source(res[1].trim()); - } - else if (shaderExp.charAt(0) === '#') { - shaderSource = lib.shaders[shaderExp.substr(1)]; - } - if (!shaderSource) { - shaderSource = shaderExp; - } - if (!shaderSource) { - return; - } - } +/** + * Get finished sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} + */ +TaskGroup.prototype.getSettledNumber = function (recursive) { - if (nodeInfo.inputs) { - inputs = {}; - for (var name in nodeInfo.inputs) { - if (typeof nodeInfo.inputs[name] === 'string') { - inputs[name] = nodeInfo.inputs[name]; - } - else { - inputs[name] = { - node: nodeInfo.inputs[name].node, - pin: nodeInfo.inputs[name].pin - }; + if (recursive) { + var nSettled = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nSettled += task.getSettledNumber(recursive); + } else if(task._rejected || task._fulfilled) { + nSettled += 1; } } + return nSettled; + } else { + return this._fulfilledNumber + this._rejectedNumber; } - if (nodeInfo.outputs) { - outputs = {}; - for (var name in nodeInfo.outputs) { - var outputInfo = nodeInfo.outputs[name]; - outputs[name] = {}; - if (outputInfo.attachment != null) { - outputs[name].attachment = outputInfo.attachment; - } - if (outputInfo.keepLastFrame != null) { - outputs[name].keepLastFrame = outputInfo.keepLastFrame; - } - if (outputInfo.outputLastFrame != null) { - outputs[name].outputLastFrame = outputInfo.outputLastFrame; - } - if (outputInfo.parameters) { - outputs[name].parameters = convertParameter(outputInfo.parameters); +}; + +/** + * Get all sub tasks number, recursive can be true if sub task is also a TaskGroup. + * @param {boolean} [recursive] + * @return {number} + */ +TaskGroup.prototype.getTaskNumber = function (recursive) { + if (recursive) { + var nTask = 0; + for (var i = 0; i < this._tasks.length; i++) { + var task = this._tasks[i]; + if (task instanceof TaskGroup) { + nTask += task.getTaskNumber(recursive); + } else { + nTask += 1; } } + return nTask; + } else { + return this._tasks.length; } - var node; - if (type === 'scene') { - node = new SceneNode$1({ - name: nodeInfo.name, - scene: opts.scene, - camera: opts.camera, - outputs: outputs - }); - } - else if (type === 'texture') { - node = new TextureNode$1({ - name: nodeInfo.name, - outputs: outputs - }); - } - // Default is filter - else { - node = new FilterNode$1({ - name: nodeInfo.name, - shader: shaderSource, - inputs: inputs, - outputs: outputs - }); - } - if (node) { - if (nodeInfo.parameters) { - for (var name in nodeInfo.parameters) { - var val = nodeInfo.parameters[name]; - if (typeof(val) === 'string') { - val = val.trim(); - if (val.charAt(0) === '#') { - val = lib.textures[val.substr(1)]; - } - else { - node.on( - 'beforerender', createSizeSetHandler( - name, tryConvertExpr(val) - ) - ); - } - } - node.setParameter(name, val); - } - } - if (nodeInfo.defines && node.pass) { - for (var name in nodeInfo.defines) { - var val = nodeInfo.defines[name]; - node.pass.material.define('fragment', name, val); - } +}; + +var CanvasMaterial = Base.extend({ + + color: [1, 1, 1, 1], + + opacity: 1, + + pointSize: 0, + + pointShape: 'rectangle' +}); + +var mat4$8 = glmatrix.mat4; +var vec3$17 = glmatrix.vec3; +var vec4$2 = glmatrix.vec4; + +var vec4Create = vec4$2.create; + +var round = Math.round; + +var PRIMITIVE_TRIANGLE = 1; +var PRIMITIVE_LINE = 2; +var PRIMITIVE_POINT = 3; + +function PrimitivePool(constructor) { + this.ctor = constructor; + + this._data = []; + + this._size = 0; +} + +PrimitivePool.prototype = { + pick: function () { + var data = this._data; + var size = this._size; + var obj = data[size]; + if (! obj) { + // Constructor must have no parameters + obj = new this.ctor(); + data[size] = obj; } - } - return node; -} + this._size++; + return obj; + }, -function convertParameter(paramInfo) { - var param = {}; - if (!paramInfo) { - return param; - } - ['type', 'minFilter', 'magFilter', 'wrapS', 'wrapT', 'flipY', 'useMipmap'] - .forEach(function(name) { - var val = paramInfo[name]; - if (val != null) { - // Convert string to enum - if (typeof val === 'string') { - val = Texture[val]; - } - param[name] = val; - } - }); - ['width', 'height'] - .forEach(function(name) { - if (paramInfo[name] != null) { - var val = paramInfo[name]; - if (typeof val === 'string') { - val = val.trim(); - param[name] = createSizeParser( - name, tryConvertExpr(val) - ); - } - else { - param[name] = val; - } - } - }); - if (paramInfo.useMipmap != null) { - param.useMipmap = paramInfo.useMipmap; + reset: function () { + this._size = 0; + }, + + shrink: function () { + this._data.length = this._size; + }, + + clear: function () { + this._data = []; + this._size = 0; } - return param; +}; + +function Triangle() { + this.vertices = [vec4Create(), vec4Create(), vec4Create()]; + this.color = vec4Create(); + + this.depth = 0; } -function loadTextures(json, lib, opts, callback) { - if (!json.textures) { - callback({}); - return; - } - var textures = {}; - var loading = 0; +Triangle.prototype.type = PRIMITIVE_TRIANGLE; - var cbd = false; - var textureRootPath = opts.textureRootPath; - util$1.each(json.textures, function(textureInfo, name) { - var texture; - var path = textureInfo.path; - var parameters = convertParameter(textureInfo.parameters); - if (Array.isArray(path) && path.length === 6) { - if (textureRootPath) { - path = path.map(function(item) { - return util$1.relative2absolute(item, textureRootPath); - }); - } - texture = new TextureCube(parameters); - } - else if(typeof path === 'string') { - if (textureRootPath) { - path = util$1.relative2absolute(path, textureRootPath); - } - texture = new Texture2D(parameters); - } - else { - return; - } +function Point() { + // Here use an array to make it more convinient to proccessing in _setPrimitive method + this.vertices = [vec4Create()]; - texture.load(path); - loading++; - texture.once('success', function() { - textures[name] = texture; - loading--; - if (loading === 0) { - callback(textures); - cbd = true; - } - }); - }); + this.color = vec4Create(); - if (loading === 0 && !cbd) { - callback(textures); - } + this.depth = 0; } -function createSizeSetHandler(name, exprFunc) { - return function (renderer) { - // PENDING viewport size or window size - var dpr = renderer.getDevicePixelRatio(); - // PENDING If multiply dpr ? - var width = renderer.getWidth(); - var height = renderer.getHeight(); - var result = exprFunc(width, height, dpr); - this.setParameter(name, result); - }; +Point.prototype.type = PRIMITIVE_POINT; + +function Line() { + this.vertices = [vec4Create(), vec4Create()]; + this.color = vec4Create(); + + this.depth = 0; + + this.lineWidth = 1; } -function createSizeParser(name, exprFunc) { - return function (renderer) { - var dpr = renderer.getDevicePixelRatio(); - var width = renderer.getWidth(); - var height = renderer.getHeight(); - return exprFunc(width, height, dpr); - }; +Line.prototype.type = PRIMITIVE_LINE; + +function depthSortFunc(x, y) { + // Sort from far to near, which in depth of projection space is from larger to smaller + return y.depth - x.depth; } -function tryConvertExpr(string) { - // PENDING - var exprRes = /^expr\((.*)\)$/.exec(string); - if (exprRes) { - try { - var func = new Function('width', 'height', 'dpr', 'return ' + exprRes[1]); - // Try run t - func(1, 1); +function vec3ToColorStr(v3) { + return 'rgb(' + round(v3[0] * 255) + ',' + round(v3[1] * 255) + ',' + round(v3[2] * 255) + ')'; +} - return func; - } - catch (e) { - throw new Error('Invalid expression.'); - } - } +function vec4ToColorStr(v4) { + return 'rgba(' + round(v4[0] * 255) + ',' + round(v4[1] * 255) + ',' + round(v4[2] * 255) + ',' + v4[3] + ')'; } -var gbufferEssl = "@export clay.deferred.gbuffer.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat;\nuniform vec2 uvOffset;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#ifdef FIRST_PASS\nattribute vec3 normal : NORMAL;\n#endif\n@import clay.chunk.skinning_header\n#ifdef FIRST_PASS\nvarying vec3 v_Normal;\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nvarying vec3 v_WorldPosition;\n#endif\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef FIRST_PASS\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n bool hasTangent = dot(tangent, tangent) > 0.0;\n#endif\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n #ifdef FIRST_PASS\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n if (hasTangent) {\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n }\n #endif\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n#ifdef FIRST_PASS\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n if (hasTangent) {\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n#endif\n}\n@end\n@export clay.deferred.gbuffer1.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform float glossiness;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nuniform sampler2D roughGlossMap;\nuniform bool useRoughGlossMap;\nuniform bool useRoughness;\nuniform bool doubleSided;\nuniform int roughGlossChannel: 0;\nfloat indexingTexel(in vec4 texel, in int idx) {\n if (idx == 3) return texel.a;\n else if (idx == 1) return texel.g;\n else if (idx == 2) return texel.b;\n else return texel.r;\n}\nvoid main()\n{\n vec3 N = v_Normal;\n if (doubleSided) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = eyePos - v_WorldPosition;\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n }\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_Texcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n gl_FragColor.rgb = (N + 1.0) * 0.5;\n float g = glossiness;\n if (useRoughGlossMap) {\n float g2 = indexingTexel(texture2D(roughGlossMap, v_Texcoord), roughGlossChannel);\n if (useRoughness) {\n g2 = 1.0 - g2;\n }\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n gl_FragColor.a = g + 0.005;\n}\n@end\n@export clay.deferred.gbuffer2.fragment\nuniform sampler2D diffuseMap;\nuniform sampler2D metalnessMap;\nuniform vec3 color;\nuniform float metalness;\nuniform bool useMetalnessMap;\nuniform bool linear;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvoid main ()\n{\n float m = metalness;\n if (useMetalnessMap) {\n vec4 metalnessTexel = texture2D(metalnessMap, v_Texcoord);\n m = clamp(metalnessTexel.r + (m * 2.0 - 1.0), 0.0, 1.0);\n }\n vec4 texel = texture2D(diffuseMap, v_Texcoord);\n if (linear) {\n texel = sRGBToLinear(texel);\n }\n gl_FragColor.rgb = texel.rgb * color;\n gl_FragColor.a = m + 0.005;\n}\n@end\n@export clay.deferred.gbuffer.debug\n@import clay.deferred.chunk.light_head\nuniform int debug: 0;\nvoid main ()\n{\n @import clay.deferred.chunk.gbuffer_read\n if (debug == 0) {\n gl_FragColor = vec4(N, 1.0);\n }\n else if (debug == 1) {\n gl_FragColor = vec4(vec3(z), 1.0);\n }\n else if (debug == 2) {\n gl_FragColor = vec4(position, 1.0);\n }\n else if (debug == 3) {\n gl_FragColor = vec4(vec3(glossiness), 1.0);\n }\n else if (debug == 4) {\n gl_FragColor = vec4(vec3(metalness), 1.0);\n }\n else {\n gl_FragColor = vec4(albedo, 1.0);\n }\n}\n@end"; +var CanvasRenderer = Base.extend({ -var chunkEssl = "@export clay.deferred.chunk.light_head\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform vec2 windowSize: WINDOW_SIZE;\nuniform vec4 viewport: VIEWPORT;\nuniform mat4 viewProjectionInv;\n#ifdef DEPTH_ENCODED\n@import clay.util.decode_float\n#endif\n@end\n@export clay.deferred.chunk.gbuffer_read\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec2 uv2 = (gl_FragCoord.xy - viewport.xy) / viewport.zw;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n vec4 texel3 = texture2D(gBufferTexture3, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n float glossiness = texel1.a;\n float metalness = texel3.a;\n vec3 N = texel1.rgb * 2.0 - 1.0;\n float z = texture2D(gBufferTexture2, uv).r * 2.0 - 1.0;\n vec2 xy = uv2 * 2.0 - 1.0;\n vec4 projectedPos = vec4(xy, z, 1.0);\n vec4 p4 = viewProjectionInv * projectedPos;\n vec3 position = p4.xyz / p4.w;\n vec3 albedo = texel3.rgb;\n vec3 diffuseColor = albedo * (1.0 - metalness);\n vec3 specularColor = mix(vec3(0.04), albedo, metalness);\n@end\n@export clay.deferred.chunk.light_equation\nfloat D_Phong(in float g, in float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(in float g, in float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (3.1415926 * tmp * tmp);\n}\nvec3 F_Schlick(in float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nvec3 lightEquation(\n in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n in float ndl, in float ndh, in float ndv, in float g\n)\n{\n return ndl * lightColor\n * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n}\n@end"; + canvas: null, -Shader.import(gbufferEssl); -Shader.import(chunkEssl); + _width: 100, -function createFillCanvas(color) { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - ctx.fillStyle = color || '#000'; - ctx.fillRect(0, 0, 1, 1); + _height: 100, - return canvas; -} + devicePixelRatio: window.devicePixelRatio || 1.0, -function attachTextureToSlot(renderer, program, symbol, texture, slot) { - var gl = renderer.gl; - program.setUniform(gl, '1i', symbol, slot); + color: [0.0, 0.0, 0.0, 0.0], - gl.activeTexture(gl.TEXTURE0 + slot); - // Maybe texture is not loaded yet; - if (texture.isRenderable()) { - texture.bind(renderer); - } - else { - // Bind texture to null - texture.unbind(renderer); - } -} + clear: true, -// TODO Use globalShader insteadof globalMaterial? -function getBeforeRenderHook1 (gl, defaultNormalMap, defaultRoughnessMap) { + ctx: null, - var previousNormalMap; - var previousRougGlossMap; - var previousRenderable; + // Cached primitive list, including triangle, line, point + _primitives: [], - return function (renderable, gBufferMat, prevMaterial) { - // Material not change - if (previousRenderable && previousRenderable.material === renderable.material) { - return; + // Triangle pool + _triangles: new PrimitivePool(Triangle), + + // Line pool + _lines: new PrimitivePool(Line), + + // Point pool + _points: new PrimitivePool(Point) +}, function () { + if (! this.canvas) { + this.canvas = document.createElement('canvas'); + } + var canvas = this.canvas; + + try { + this.ctx = canvas.getContext('2d'); + var ctx = this.ctx; + if (!ctx) { + throw new Error(); } + } + catch (e) { + throw 'Error creating WebGL Context ' + e; + } - var standardMaterial = renderable.material; - var program = renderable.__program; + this.resize(); +}, { - var glossiness; - var roughGlossMap; - var useRoughnessWorkflow = standardMaterial.isDefined('fragment', 'USE_ROUGHNESS'); - var doubleSided = standardMaterial.isDefined('fragment', 'DOUBLE_SIDED'); - var roughGlossChannel; - if (useRoughnessWorkflow) { - glossiness = 1.0 - standardMaterial.get('roughness'); - roughGlossMap = standardMaterial.get('roughnessMap'); - roughGlossChannel = standardMaterial.getDefine('fragment', 'ROUGHNESS_CHANNEL'); + resize: function (width, height) { + var dpr = this.devicePixelRatio; + var canvas = this.canvas; + if (width != null) { + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + canvas.width = width * dpr; + canvas.height = height * dpr; + + this._width = width; + this._height = height; } else { - glossiness = standardMaterial.get('glossiness'); - roughGlossMap = standardMaterial.get('glossinessMap'); - roughGlossChannel = standardMaterial.getDefine('fragment', 'GLOSSINESS_CHANNEL'); + this._width = canvas.width / dpr; + this._height = canvas.height / dpr; } - var useRoughGlossMap = !!roughGlossMap; + }, - var normalMap = standardMaterial.get('normalMap') || defaultNormalMap; - var uvRepeat = standardMaterial.get('uvRepeat'); - var uvOffset = standardMaterial.get('uvOffset'); + getWidth: function () { + return this._width; + }, - roughGlossMap = roughGlossMap || defaultRoughnessMap; + getHeight: function () { + return this._height; + }, - if (prevMaterial !== gBufferMat) { - gBufferMat.set('glossiness', glossiness); - gBufferMat.set('normalMap', normalMap); - gBufferMat.set('roughGlossMap', roughGlossMap); - gBufferMat.set('useRoughGlossMap', +useRoughGlossMap); - gBufferMat.set('useRoughness', +useRoughnessWorkflow); - gBufferMat.set('doubleSided', +doubleSided); - gBufferMat.set('roughGlossChannel', +roughGlossChannel || 0); - gBufferMat.set('uvRepeat', uvRepeat); - gBufferMat.set('uvOffset', uvOffset); - } - else { - program.setUniform( - gl, '1f', 'glossiness', glossiness - ); + getViewportAspect: function () { + return this._width / this._height; + }, - if (previousNormalMap !== normalMap) { - attachTextureToSlot(this, program, 'normalMap', normalMap, 0); + render: function (scene, camera) { + + if (this.clear) { + var color = this.color; + var ctx = this.ctx; + var dpr = this.devicePixelRatio; + var w = this._width * dpr; + var h = this._height * dpr; + if (color && color[3] === 0) { + ctx.clearRect(0, 0, w, h); } - if (previousRougGlossMap !== roughGlossMap) { - attachTextureToSlot(this, program, 'roughGlossMap', roughGlossMap, 1); + else { + // Has transparency + if (color[3] < 1) { + ctx.clearRect(0, 0, w, h); + } + ctx.fillStyle = color.length === 4 ? vec4ToColorStr(color) : vec3ToColorStr(color); + ctx.fillRect(0, 0, w, h); } - program.setUniform(gl, '1i', 'useRoughGlossMap', +useRoughGlossMap); - program.setUniform(gl, '1i', 'useRoughness', +useRoughnessWorkflow); - program.setUniform(gl, '1i', 'doubleSided', +doubleSided); - program.setUniform(gl, '1i', 'roughGlossChannel', +roughGlossChannel || 0); - if (uvRepeat != null) { - program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); + } + + scene.update(); + camera.update(); + + var opaqueList = scene.opaqueList; + var transparentList = scene.transparentList; + var list = opaqueList.concat(transparentList); + + this.renderPass(list, camera); + }, + + renderPass: function (list, camera) { + var viewProj = mat4$8.create(); + mat4$8.multiply(viewProj, camera.projectionMatrix.array, camera.viewMatrix.array); + var worldViewProjMat = mat4$8.create(); + var posViewSpace = vec3$17.create(); + + var primitives = this._primitives; + var trianglesPool = this._triangles; + var linesPool = this._lines; + var pointsPool = this._points; + + trianglesPool.reset(); + linesPool.reset(); + pointsPool.reset(); + + var nPrimitive = 0; + + var indices = [0, 0, 0]; + var matColor = []; + for (var i = 0; i < list.length; i++) { + var renderable = list[i]; + + mat4$8.multiply(worldViewProjMat, viewProj, renderable.worldTransform.array); + + var geometry = renderable.geometry; + var material = renderable.material; + var attributes = geometry.attributes; + + // alpha is default 1 + if (material.color.length == 3) { + vec3$17.copy(matColor, material.color); + matColor[3] = 1; } - if (uvOffset != null) { - program.setUniform(gl, '2f', 'uvOffset', uvOffset); + else { + vec4$2.copy(matColor, material.color); } - } - previousNormalMap = normalMap; - previousRougGlossMap = roughGlossMap; + var nVertex = geometry.vertexCount; + // Only support TRIANGLES, LINES, POINTS draw modes + switch (renderable.mode) { + case glenum.TRIANGLES: + if (geometry.isUseIndices()) { + var nFace = geometry.triangleCount; + for (var j = 0; j < nFace; j++) { + geometry.getFace(j, indices); - previousRenderable = renderable; - }; -} + var triangle = trianglesPool.pick(); + triangle.material = material; -function getBeforeRenderHook2(gl, defaultDiffuseMap, defaultMetalnessMap) { - var previousDiffuseMap; - var previousRenderable; - var previousMetalnessMap; + var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); - return function (renderable, gBufferMat, prevMaterial) { - // Material not change - if (previousRenderable && previousRenderable.material === renderable.material) { - return; + if (! clipped) { + primitives[nPrimitive++] = triangle; + } + } + } + else { + for (var j = 0; j < nVertex;) { + indices[0] = j++; + indices[1] = j++; + indices[2] = j++; + + var triangle = trianglesPool.pick(); + triangle.material = material; + + var clipped = this._setPrimitive(triangle, indices, 3, attributes, worldViewProjMat, matColor); + + if (! clipped) { + primitives[nPrimitive++] = triangle; + } + } + } + break; + case glenum.LINES: + // LINES mode can't use face + for (var j = 0; j < nVertex;) { + indices[0] = j++; + indices[1] = j++; + var line = linesPool.pick(); + line.material = material; + line.lineWidth = renderable.lineWidth; + + var clipped = this._setPrimitive(line, indices, 2, attributes, worldViewProjMat, matColor); + + if (! clipped) { + primitives[nPrimitive++] = line; + } + } + break; + case glenum.POINTS: + for (var j = 0; j < nVertex; j++) { + indices[0] = j; + var point = pointsPool.pick(); + point.material = material; + + var clipped = this._setPrimitive(point, indices, 1, attributes, worldViewProjMat, matColor); + + if (! clipped) { + primitives[nPrimitive++] = point; + } + } + // POINTS mode can't use face + break; + } } - var program = renderable.__program; - var standardMaterial = renderable.material; + trianglesPool.shrink(); + linesPool.shrink(); + pointsPool.shrink(); - var color = standardMaterial.get('color'); - var metalness = standardMaterial.get('metalness'); + primitives.length = nPrimitive; - var diffuseMap = standardMaterial.get('diffuseMap'); - var metalnessMap = standardMaterial.get('metalnessMap'); + primitives.sort(depthSortFunc); + this._drawPrimitives(primitives); + }, - var uvRepeat = standardMaterial.get('uvRepeat'); - var uvOffset = standardMaterial.get('uvOffset'); + _setPrimitive: (function () { + var vertexColor = vec4Create(); + return function (primitive, indices, size, attributes, worldViewProjMat, matColor) { + var colorAttrib = attributes.color; + var useVertexColor = colorAttrib.value && colorAttrib.value.length > 0; + var priColor = primitive.color; - var useMetalnessMap = !!metalnessMap; + primitive.depth = 0; + if (useVertexColor) { + vec4$2.set(priColor, 0, 0, 0, 0); + } - diffuseMap = diffuseMap || defaultDiffuseMap; - metalnessMap = metalnessMap || defaultMetalnessMap; + var clipped = true; - if (prevMaterial !== gBufferMat) { - gBufferMat.set('color', color); - gBufferMat.set('metalness', metalness); - gBufferMat.set('diffuseMap', diffuseMap); - gBufferMat.set('metalnessMap', metalnessMap); - gBufferMat.set('useMetalnessMap', +useMetalnessMap); - gBufferMat.set('uvRepeat', uvRepeat); - gBufferMat.set('uvOffset', uvOffset); + var percent = 1 / size; + for (var i = 0; i < size; i++) { + var coord = primitive.vertices[i]; + attributes.position.get(indices[i], coord); + coord[3] = 1; + vec4$2.transformMat4(coord, coord, worldViewProjMat); + if (useVertexColor) { + colorAttrib.get(indices[i], vertexColor); + // Average vertex color + // Each primitive only call fill or stroke once + // So color must be the same + vec4$2.scaleAndAdd(priColor, priColor, vertexColor, percent); + } - gBufferMat.set('linear', +standardMaterial.linear); - } - else { - program.setUniform(gl, '1f', 'metalness', metalness); + // Clipping + var x = coord[0]; + var y = coord[1]; + var z = coord[2]; + var w = coord[3]; - program.setUniform(gl, '3f', 'color', color); - if (previousDiffuseMap !== diffuseMap) { - attachTextureToSlot(this, program, 'diffuseMap', diffuseMap, 0); + // TODO Point clipping + if (x > -w && x < w && y > -w && y < w && z > -w && z < w) { + clipped = false; + } + + var invW = 1 / w; + coord[0] = x * invW; + coord[1] = y * invW; + coord[2] = z * invW; + // Use primitive average depth; + primitive.depth += coord[2]; } - if (previousMetalnessMap !== metalnessMap) { - attachTextureToSlot(this, program, 'metalnessMap', metalnessMap, 1); + + if (! clipped) { + primitive.depth /= size; + + if (useVertexColor) { + vec4$2.mul(priColor, priColor, matColor); + } + else { + vec4$2.copy(priColor, matColor); + } } - program.setUniform(gl, '1i', 'useMetalnessMap', +useMetalnessMap); - program.setUniform(gl, '2f', 'uvRepeat', uvRepeat); - program.setUniform(gl, '2f', 'uvOffset', uvOffset); - program.setUniform(gl, '1i', 'linear', +standardMaterial.linear); + return clipped; } + })(), - previousDiffuseMap = diffuseMap; - previousMetalnessMap = metalnessMap; + _drawPrimitives: function (primitives) { + var ctx = this.ctx; + ctx.save(); - previousRenderable = renderable; - }; -} + var prevMaterial; -/** - * GBuffer is provided for deferred rendering and SSAO, SSR pass. - * It will do two passes rendering to three target textures. See - * + {@link clay.deferred.GBuffer#getTargetTexture1} - * + {@link clay.deferred.GBuffer#getTargetTexture2} - * + {@link clay.deferred.GBuffer#getTargetTexture3} - * @constructor - * @alias clay.deferred.GBuffer - * @extends clay.core.Base - */ -var GBuffer = Base.extend(function () { + var dpr = this.devicePixelRatio; + var width = this._width * dpr; + var height = this._height * dpr; + var halfWidth = width / 2; + var halfHeight = height / 2; - return { + var prevLineWidth; + var prevStrokeColor; - enableTargetTexture1: true, + for (var i = 0; i < primitives.length; i++) { + var primitive = primitives[i]; + var vertices = primitive.vertices; - enableTargetTexture2: true, + var primitiveType = primitive.type; + var material = primitive.material; + if (material !== prevMaterial) { + // Set material + ctx.globalAlpha = material.opacity; + prevMaterial = material; + } - enableTargetTexture3: true, + var colorStr = vec4ToColorStr(primitive.color); + switch (primitiveType) { + case PRIMITIVE_TRIANGLE: + var v0 = vertices[0]; + var v1 = vertices[1]; + var v2 = vertices[2]; + ctx.fillStyle = colorStr; + ctx.beginPath(); + ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); + ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); + ctx.lineTo((v2[0] + 1) * halfWidth, (-v2[1] + 1) * halfHeight); + ctx.closePath(); + ctx.fill(); + break; + case PRIMITIVE_LINE: + var v0 = vertices[0]; + var v1 = vertices[1]; + var lineWidth = primitive.lineWidth; + if (prevStrokeColor !== colorStr) { + prevStrokeColor = ctx.strokeStyle = colorStr; + } + if (lineWidth !== prevLineWidth) { + ctx.lineWidth = prevLineWidth = lineWidth; + } + ctx.beginPath(); + ctx.moveTo((v0[0] + 1) * halfWidth, (-v0[1] + 1) * halfHeight); + ctx.lineTo((v1[0] + 1) * halfWidth, (-v1[1] + 1) * halfHeight); + ctx.stroke(); + break; + case PRIMITIVE_POINT: + var pointSize = material.pointSize; + var pointShape = material.pointShape; + var halfSize = pointSize / 2; + if (pointSize > 0) { + var v0 = vertices[0]; + var cx = (v0[0] + 1) * halfWidth; + var cy = (-v0[1] + 1) * halfHeight; - renderTransparent: false, + ctx.fillStyle = colorStr; + if (pointShape === 'rectangle') { + ctx.fillRect(cx - halfSize, cy - halfSize, pointSize, pointSize); + } + else if (pointShape === 'circle') { + ctx.beginPath(); + ctx.arc(cx, cy, halfSize, 0, Math.PI * 2); + ctx.fill(); + } + } + break; + } + } - _renderList: [], - // - R: normal.x - // - G: normal.y - // - B: normal.z - // - A: glossiness - _gBufferTex1: new Texture2D({ - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST, - // PENDING - type: Texture.HALF_FLOAT - }), + ctx.restore(); + }, - // - R: depth - _gBufferTex2: new Texture2D({ - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST, - // format: Texture.DEPTH_COMPONENT, - // type: Texture.UNSIGNED_INT + dispose: function () { + this._triangles.clear(); + this._lines.clear(); + this._points.clear(); + this._primitives = []; - format: Texture.DEPTH_STENCIL, - type: Texture.UNSIGNED_INT_24_8_WEBGL - }), + this.ctx = null; + this.canvas = null; + } +}); - // - R: albedo.r - // - G: albedo.g - // - B: albedo.b - // - A: metalness - _gBufferTex3: new Texture2D({ - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST - }), +// PENDING +// Use topological sort ? - _defaultNormalMap: new Texture2D({ - image: createFillCanvas('#000') - }), - _defaultRoughnessMap: new Texture2D({ - image: createFillCanvas('#fff') - }), - _defaultMetalnessMap: new Texture2D({ - image: createFillCanvas('#fff') - }), - _defaultDiffuseMap: new Texture2D({ - image: createFillCanvas('#fff') - }), +/** + * Node of graph based post processing. + * + * @constructor clay.compositor.Node + * @extends clay.core.Base + * + */ +var Node$1 = Base.extend(function () { + return /** @lends clay.compositor.Node# */ { + /** + * @type {string} + */ + name: '', - _frameBuffer: new FrameBuffer(), + /** + * Input links, will be updated by the graph + * @example: + * inputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + inputLinks: {}, - _gBufferMaterial1: new Material({ - shader: new Shader( - Shader.source('clay.deferred.gbuffer.vertex'), - Shader.source('clay.deferred.gbuffer1.fragment') - ), - vertexDefines: { - FIRST_PASS: null - }, - fragmentDefines: { - FIRST_PASS: null - } - }), - _gBufferMaterial2: new Material({ - shader: new Shader( - Shader.source('clay.deferred.gbuffer.vertex'), - Shader.source('clay.deferred.gbuffer2.fragment') - ) - }), + /** + * Output links, will be updated by the graph + * @example: + * outputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + outputLinks: {}, - _debugPass: new Pass({ - fragment: Shader.source('clay.deferred.gbuffer.debug') - }) - }; -}, /** @lends clay.deferred.GBuffer# */{ + // Save the output texture of previous frame + // Will be used when there exist a circular reference + _prevOutputTextures: {}, + _outputTextures: {}, - /** - * Set G Buffer size. - * @param {number} width - * @param {number} height - */ - resize: function (width, height) { - if (this._gBufferTex1.width === width - && this._gBufferTex1.height === height - ) { - return; - } - this._gBufferTex1.width = width; - this._gBufferTex1.height = height; + // Example: { name: 2 } + _outputReferences: {}, - this._gBufferTex2.width = width; - this._gBufferTex2.height = height; + _rendering: false, + // If rendered in this frame + _rendered: false, - this._gBufferTex3.width = width; - this._gBufferTex3.height = height; - }, + _compositor: null + }; +}, +/** @lends clay.compositor.Node.prototype */ +{ - // TODO is dpr needed? - setViewport: function (x, y, width, height, dpr) { - var viewport; - if (typeof x === 'object') { - viewport = x; + // TODO Remove parameter function callback + updateParameter: function (outputName, renderer) { + var outputInfo = this.outputs[outputName]; + var parameters = outputInfo.parameters; + var parametersCopy = outputInfo._parametersCopy; + if (!parametersCopy) { + parametersCopy = outputInfo._parametersCopy = {}; + } + if (parameters) { + for (var key in parameters) { + if (key !== 'width' && key !== 'height') { + parametersCopy[key] = parameters[key]; + } + } + } + var width, height; + if (parameters.width instanceof Function) { + width = parameters.width.call(this, renderer); } else { - viewport = { - x: x, y: y, - width: width, height: height, - devicePixelRatio: dpr || 1 - }; + width = parameters.width; } - this._frameBuffer.viewport = viewport; - }, - - getViewport: function () { - if (this._frameBuffer.viewport) { - return this._frameBuffer.viewport; + if (parameters.height instanceof Function) { + height = parameters.height.call(this, renderer); } else { - return { - x: 0, y: 0, - width: this._gBufferTex1.width, - height: this._gBufferTex1.height, - devicePixelRatio: 1 - }; + height = parameters.height; + } + if ( + parametersCopy.width !== width + || parametersCopy.height !== height + ) { + if (this._outputTextures[outputName]) { + this._outputTextures[outputName].dispose(renderer.gl); + } } + parametersCopy.width = width; + parametersCopy.height = height; + + return parametersCopy; }, /** - * Update G Buffer - * @param {clay.Renderer} renderer - * @param {clay.Scene} scene - * @param {clay.camera.Perspective} camera + * Set parameter + * @param {string} name + * @param {} value */ - update: function (renderer, scene, camera) { + setParameter: function (name, value) {}, + /** + * Get parameter value + * @param {string} name + * @return {} + */ + getParameter: function (name) {}, + /** + * Set parameters + * @param {Object} obj + */ + setParameters: function (obj) { + for (var name in obj) { + this.setParameter(name, obj[name]); + } + }, - var gl = renderer.gl; + render: function () {}, - var frameBuffer = this._frameBuffer; - var viewport = frameBuffer.viewport; - var opaqueList = scene.opaqueList; - var transparentList = scene.transparentList; + getOutput: function (renderer /*optional*/, name) { + if (name == null) { + // Return the output texture without rendering + name = renderer; + return this._outputTextures[name]; + } + var outputInfo = this.outputs[name]; + if (!outputInfo) { + return ; + } - var offset = 0; - var renderList = this._renderList; - for (var i = 0; i < opaqueList.length; i++) { - if (!opaqueList[i].ignoreGBuffer) { - renderList[offset++] = opaqueList[i]; + // Already been rendered in this frame + if (this._rendered) { + // Force return texture in last frame + if (outputInfo.outputLastFrame) { + return this._prevOutputTextures[name]; } - } - if (this.renderTransparent) { - for (var i = 0; i < transparentList.length; i++) { - if (!transparentList[i].ignoreGBuffer) { - renderList[offset++] = transparentList[i]; - } + else { + return this._outputTextures[name]; } } - renderList.length = offset; - - gl.clearColor(0, 0, 0, 0); - gl.depthMask(true); - gl.colorMask(true, true, true, true); - gl.disable(gl.BLEND); - - var enableTargetTexture1 = this.enableTargetTexture1; - var enableTargetTexture2 = this.enableTargetTexture2; - var enableTargetTexture3 = this.enableTargetTexture3; - if (!enableTargetTexture1 && !enableTargetTexture3) { - console.warn('Can\'t disable targetTexture1 targetTexture3 both'); - enableTargetTexture1 = true; + else if ( + // TODO + this._rendering // Solve Circular Reference + ) { + if (!this._prevOutputTextures[name]) { + // Create a blank texture at first pass + this._prevOutputTextures[name] = this._compositor.allocateTexture(outputInfo.parameters || {}); + } + return this._prevOutputTextures[name]; } - if (enableTargetTexture2) { - frameBuffer.attach(this._gBufferTex2, renderer.gl.DEPTH_STENCIL_ATTACHMENT); - } + this.render(renderer); - // PENDING, scene.boundingBoxLastFrame needs be updated if have shadow - renderer.bindSceneRendering(scene); - if (enableTargetTexture1) { - // Pass 1 - frameBuffer.attach(this._gBufferTex1); - frameBuffer.bind(renderer); + return this._outputTextures[name]; + }, - if (viewport) { - var dpr = viewport.devicePixelRatio; - // use scissor to make sure only clear the viewport - gl.enable(gl.SCISSOR_TEST); - gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); + removeReference: function (outputName) { + this._outputReferences[outputName]--; + if (this._outputReferences[outputName] === 0) { + var outputInfo = this.outputs[outputName]; + if (outputInfo.keepLastFrame) { + if (this._prevOutputTextures[outputName]) { + this._compositor.releaseTexture(this._prevOutputTextures[outputName]); + } + this._prevOutputTextures[outputName] = this._outputTextures[outputName]; } - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - if (viewport) { - gl.disable(gl.SCISSOR_TEST); + else { + // Output of this node have alreay been used by all other nodes + // Put the texture back to the pool. + this._compositor.releaseTexture(this._outputTextures[outputName]); } - var gBufferMaterial1 = this._gBufferMaterial1; - var passConfig = { - getMaterial: function () { - return gBufferMaterial1; - }, - beforeRender: getBeforeRenderHook1(gl, this._defaultNormalMap, this._defaultRoughnessMap), - sortCompare: renderer.opaqueSortCompare - }; - // FIXME Use MRT if possible - renderer.renderPass(renderList, camera, passConfig); + } + }, + link: function (inputPinName, fromNode, fromPinName) { + + // The relationship from output pin to input pin is one-on-multiple + this.inputLinks[inputPinName] = { + node: fromNode, + pin: fromPinName + }; + if (!fromNode.outputLinks[fromPinName]) { + fromNode.outputLinks[fromPinName] = []; } - if (enableTargetTexture3) { + fromNode.outputLinks[fromPinName].push({ + node: this, + pin: inputPinName + }); - // Pass 2 - frameBuffer.attach(this._gBufferTex3); - frameBuffer.bind(renderer); + // Enabled the pin texture in shader + this.pass.material.enableTexture(inputPinName); + }, - if (viewport) { - var dpr = viewport.devicePixelRatio; - // use scissor to make sure only clear the viewport - gl.enable(gl.SCISSOR_TEST); - gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); - } - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - if (viewport) { - gl.disable(gl.SCISSOR_TEST); - } + clear: function () { + this.inputLinks = {}; + this.outputLinks = {}; + }, - var gBufferMaterial2 = this._gBufferMaterial2; - var passConfig = { - getMaterial: function () { - return gBufferMaterial2; - }, - beforeRender: getBeforeRenderHook2(gl, this._defaultDiffuseMap, this._defaultMetalnessMap), - sortCompare: renderer.opaqueSortCompare - }; - renderer.renderPass(renderList, camera, passConfig); + updateReference: function (outputName) { + if (!this._rendering) { + this._rendering = true; + for (var inputName in this.inputLinks) { + var link = this.inputLinks[inputName]; + link.node.updateReference(link.pin); + } + this._rendering = false; + } + if (outputName) { + this._outputReferences[outputName] ++; } + }, - renderer.bindSceneRendering(null); - frameBuffer.unbind(renderer); + beforeFrame: function () { + this._rendered = false; + + for (var name in this.outputLinks) { + this._outputReferences[name] = 0; + } }, - renderDebug: function (renderer, camera, type, viewport) { - var debugTypes = { - normal: 0, - depth: 1, - position: 2, - glossiness: 3, - metalness: 4, - albedo: 5 - }; - if (debugTypes[type] == null) { - console.warn('Unkown type "' + type + '"'); - // Default use normal - type = 'normal'; + afterFrame: function () { + // Put back all the textures to pool + for (var name in this.outputLinks) { + if (this._outputReferences[name] > 0) { + var outputInfo = this.outputs[name]; + if (outputInfo.keepLastFrame) { + if (this._prevOutputTextures[name]) { + this._compositor.releaseTexture(this._prevOutputTextures[name]); + } + this._prevOutputTextures[name] = this._outputTextures[name]; + } + else { + this._compositor.releaseTexture(this._outputTextures[name]); + } + } } + } +}); - renderer.saveClear(); - renderer.saveViewport(); - renderer.clearBit = renderer.gl.DEPTH_BUFFER_BIT; +/** + * @constructor clay.compositor.Graph + * @extends clay.core.Base + */ +var Graph = Base.extend(function () { + return /** @lends clay.compositor.Graph# */ { + /** + * @type {Array.} + */ + nodes: [] + }; +}, +/** @lends clay.compositor.Graph.prototype */ +{ - if (viewport) { - renderer.setViewport(viewport); + /** + * Mark to update + */ + dirty: function () { + this._dirty = true; + }, + /** + * @param {clay.compositor.Node} node + */ + addNode: function (node) { + + if (this.nodes.indexOf(node) >= 0) { + return; } - var viewProjectionInv = new Matrix4(); - Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); - var debugPass = this._debugPass; - debugPass.setUniform('viewportSize', [renderer.getWidth(), renderer.getHeight()]); - debugPass.setUniform('gBufferTexture1', this._gBufferTex1); - debugPass.setUniform('gBufferTexture2', this._gBufferTex2); - debugPass.setUniform('gBufferTexture3', this._gBufferTex3); - debugPass.setUniform('debug', debugTypes[type]); - debugPass.setUniform('viewProjectionInv', viewProjectionInv.array); - debugPass.render(renderer); + this.nodes.push(node); - renderer.restoreViewport(); - renderer.restoreClear(); + this._dirty = true; }, - /** - * Get first target texture. - * Channel storage: - * + R: normal.x * 0.5 + 0.5 - * + G: normal.y * 0.5 + 0.5 - * + B: normal.z * 0.5 + 0.5 - * + A: glossiness - * @return {clay.Texture2D} + * @param {clay.compositor.Node|string} node */ - getTargetTexture1: function () { - return this._gBufferTex1; + removeNode: function (node) { + if (typeof node === 'string') { + node = this.getNodeByName(node); + } + var idx = this.nodes.indexOf(node); + if (idx >= 0) { + this.nodes.splice(idx, 1); + this._dirty = true; + } }, - /** - * Get second target texture. - * Channel storage: - * + R: depth - * @return {clay.Texture2D} + * @param {string} name + * @return {clay.compositor.Node} */ - getTargetTexture2: function () { - return this._gBufferTex2; + getNodeByName: function (name) { + for (var i = 0; i < this.nodes.length; i++) { + if (this.nodes[i].name === name) { + return this.nodes[i]; + } + } }, - /** - * Get third target texture. - * Channel storage: - * + R: albedo.r - * + G: albedo.g - * + B: albedo.b - * + A: metalness - * @return {clay.Texture2D} + * Update links of graph */ - getTargetTexture3: function () { - return this._gBufferTex3; + update: function () { + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].clear(); + } + // Traverse all the nodes and build the graph + for (var i = 0; i < this.nodes.length; i++) { + var node = this.nodes[i]; + + if (!node.inputs) { + continue; + } + for (var inputName in node.inputs) { + if (!node.inputs[inputName]) { + continue; + } + if (node.pass && !node.pass.material.isUniformEnabled(inputName)) { + console.warn('Pin ' + node.name + '.' + inputName + ' not used.'); + continue; + } + var fromPinInfo = node.inputs[inputName]; + + var fromPin = this.findPin(fromPinInfo); + if (fromPin) { + node.link(inputName, fromPin.node, fromPin.pin); + } + else { + if (typeof fromPinInfo === 'string') { + console.warn('Node ' + fromPinInfo + ' not exist'); + } + else { + console.warn('Pin of ' + fromPinInfo.node + '.' + fromPinInfo.pin + ' not exist'); + } + } + } + } }, + findPin: function (input) { + var node; + // Try to take input as a directly a node + if (typeof input === 'string' || input instanceof Node$1) { + input = { + node: input + }; + } - /** - * @param {clay.Renderer} renderer - */ - dispose: function (renderer) { + if (typeof input.node === 'string') { + for (var i = 0; i < this.nodes.length; i++) { + var tmp = this.nodes[i]; + if (tmp.name === input.node) { + node = tmp; + } + } + } + else { + node = input.node; + } + if (node) { + var inputPin = input.pin; + if (!inputPin) { + // Use first pin defaultly + if (node.outputs) { + inputPin = Object.keys(node.outputs)[0]; + } + } + if (node.outputs[inputPin]) { + return { + node: node, + pin: inputPin + }; + } + } } }); -var vec3$17 = glmatrix.vec3; -var vec2$1 = glmatrix.vec2; - /** - * @constructor clay.geometry.Cone - * @extends clay.Geometry - * @param {Object} [opt] - * @param {number} [opt.topRadius] - * @param {number} [opt.bottomRadius] - * @param {number} [opt.height] - * @param {number} [opt.capSegments] - * @param {number} [opt.heightSegments] + * Compositor provide graph based post processing + * + * @constructor clay.compositor.Compositor + * @extends clay.compositor.Graph + * */ -var Cone$1 = Geometry.extend( -/** @lends clay.geometry.Cone# */ -{ - dynamic: false, - /** - * @type {number} - */ - topRadius: 0, - - /** - * @type {number} - */ - bottomRadius: 1, - - /** - * @type {number} - */ - height: 2, +var Compositor = Graph.extend(function() { + return { + // Output node + _outputs: [], - /** - * @type {number} - */ - capSegments: 20, + _texturePool: new TexturePool(), - /** - * @type {number} - */ - heightSegments: 1 -}, function() { - this.build(); + _frameBuffer: new FrameBuffer({ + depthBuffer: false + }) + }; }, -/** @lends clay.geometry.Cone.prototype */ +/** @lends clay.compositor.Compositor.prototype */ { + addNode: function(node) { + Graph.prototype.addNode.call(this, node); + node._compositor = this; + }, /** - * Build cone geometry + * @param {clay.Renderer} renderer */ - build: function() { - var positions = []; - var texcoords = []; - var faces = []; - positions.length = 0; - texcoords.length = 0; - faces.length = 0; - // Top cap - var capSegRadial = Math.PI * 2 / this.capSegments; - - var topCap = []; - var bottomCap = []; - - var r1 = this.topRadius; - var r2 = this.bottomRadius; - var y = this.height / 2; - - var c1 = vec3$17.fromValues(0, y, 0); - var c2 = vec3$17.fromValues(0, -y, 0); - for (var i = 0; i < this.capSegments; i++) { - var theta = i * capSegRadial; - var x = r1 * Math.sin(theta); - var z = r1 * Math.cos(theta); - topCap.push(vec3$17.fromValues(x, y, z)); + render: function(renderer, frameBuffer) { + if (this._dirty) { + this.update(); + this._dirty = false; - x = r2 * Math.sin(theta); - z = r2 * Math.cos(theta); - bottomCap.push(vec3$17.fromValues(x, -y, z)); + this._outputs.length = 0; + for (var i = 0; i < this.nodes.length; i++) { + if (!this.nodes[i].outputs) { + this._outputs.push(this.nodes[i]); + } + } } - // Build top cap - positions.push(c1); - // FIXME - texcoords.push(vec2$1.fromValues(0, 1)); - var n = this.capSegments; - for (var i = 0; i < n; i++) { - positions.push(topCap[i]); - // FIXME - texcoords.push(vec2$1.fromValues(i / n, 0)); - faces.push([0, i+1, (i+1) % n + 1]); + for (var i = 0; i < this.nodes.length; i++) { + // Update the reference number of each output texture + this.nodes[i].beforeFrame(); } - // Build bottom cap - var offset = positions.length; - positions.push(c2); - texcoords.push(vec2$1.fromValues(0, 1)); - for (var i = 0; i < n; i++) { - positions.push(bottomCap[i]); - // FIXME - texcoords.push(vec2$1.fromValues(i / n, 0)); - faces.push([offset, offset+((i+1) % n + 1), offset+i+1]); + for (var i = 0; i < this._outputs.length; i++) { + this._outputs[i].updateReference(); } - // Build side - offset = positions.length; - var n2 = this.heightSegments; - for (var i = 0; i < n; i++) { - for (var j = 0; j < n2+1; j++) { - var v = j / n2; - positions.push(vec3$17.lerp(vec3$17.create(), topCap[i], bottomCap[i], v)); - texcoords.push(vec2$1.fromValues(i / n, v)); - } + for (var i = 0; i < this._outputs.length; i++) { + this._outputs[i].render(renderer, frameBuffer); } - for (var i = 0; i < n; i++) { - for (var j = 0; j < n2; j++) { - var i1 = i * (n2 + 1) + j; - var i2 = ((i + 1) % n) * (n2 + 1) + j; - var i3 = ((i + 1) % n) * (n2 + 1) + j + 1; - var i4 = i * (n2 + 1) + j + 1; - faces.push([offset+i2, offset+i1, offset+i4]); - faces.push([offset+i4, offset+i3, offset+i2]); - } + + for (var i = 0; i < this.nodes.length; i++) { + // Clear up + this.nodes[i].afterFrame(); } + }, - this.attributes.position.fromArray(positions); - this.attributes.texcoord0.fromArray(texcoords); + allocateTexture: function (parameters) { + return this._texturePool.get(parameters); + }, - this.initIndicesFromArray(faces); + releaseTexture: function (parameters) { + this._texturePool.put(parameters); + }, - this.generateVertexNormals(); + getFrameBuffer: function () { + return this._frameBuffer; + }, - this.boundingBox = new BoundingBox(); - var r = Math.max(this.topRadius, this.bottomRadius); - this.boundingBox.min.set(-r, -this.height/2, -r); - this.boundingBox.max.set(r, this.height/2, r); + /** + * Dispose compositor + * @param {clay.Renderer} renderer + */ + dispose: function (renderer) { + this._texturePool.clear(renderer); } }); /** - * @constructor clay.geometry.Cylinder - * @extends clay.Geometry - * @param {Object} [opt] - * @param {number} [opt.radius] - * @param {number} [opt.height] - * @param {number} [opt.capSegments] - * @param {number} [opt.heightSegments] + * @constructor clay.compositor.SceneNode + * @extends clay.compositor.Node */ -var Cylinder$1 = Geometry.extend( -/** @lends clay.geometry.Cylinder# */ +var SceneNode$1 = Node$1.extend( +/** @lends clay.compositor.SceneNode# */ { - dynamic: false, - /** - * @type {number} - */ - radius: 1, - + name: 'scene', /** - * @type {number} + * @type {clay.Scene} */ - height: 2, - + scene: null, /** - * @type {number} + * @type {clay.Camera} */ - capSegments: 50, - + camera: null, /** - * @type {number} + * @type {boolean} */ - heightSegments: 1 -}, function() { - this.build(); -}, -/** @lends clay.geometry.Cylinder.prototype */ -{ + autoUpdateScene: true, /** - * Build cylinder geometry + * @type {boolean} */ - build: function() { - var cone = new Cone$1({ - topRadius: this.radius, - bottomRadius: this.radius, - capSegments: this.capSegments, - heightSegments: this.heightSegments, - height: this.height - }); + preZ: false - this.attributes.position.value = cone.attributes.position.value; - this.attributes.normal.value = cone.attributes.normal.value; - this.attributes.texcoord0.value = cone.attributes.texcoord0.value; - this.indices = cone.indices; +}, function() { + this.frameBuffer = new FrameBuffer(); +}, { + render: function(renderer) { - this.boundingBox = cone.boundingBox; - } -}); + this._rendering = true; + var _gl = renderer.gl; -var lightvolumeGlsl = "@export clay.deferred.light_volume.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_Position;\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, 1.0);\n v_Position = position;\n}\n@end"; + this.trigger('beforerender'); -var spotGlsl = "@export clay.deferred.spot_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\n@import clay.util.calculate_attenuation\nuniform vec3 lightPosition;\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform float umbraAngleCosine;\nuniform float penumbraAngleCosine;\nuniform float lightRange;\nuniform float falloffFactor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform mat4 lightMatrix;\nuniform float lightShadowMapSize;\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n float attenuation = lightAttenuation(dist, lightRange);\n float c = dot(-normalize(lightDirection), L);\n float falloff = clamp((c - umbraAngleCosine) / (penumbraAngleCosine - umbraAngleCosine), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = (1.0 - falloff) * attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrix, position, lightShadowMapSize\n );\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; + var renderInfo; -var directionalGlsl = "@export clay.deferred.directional_light\n@import clay.deferred.chunk.light_head\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform sampler2D lightShadowMap;\nuniform float lightShadowMapSize;\nuniform mat4 lightMatrices[SHADOW_CASCADE];\nuniform float shadowCascadeClipsNear[SHADOW_CASCADE];\nuniform float shadowCascadeClipsFar[SHADOW_CASCADE];\n#endif\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = -normalize(lightDirection);\n vec3 V = normalize(eyePosition - position);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n gl_FragColor.rgb = lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = 1.0;\n for (int _idx_ = 0; _idx_ < SHADOW_CASCADE; _idx_++) {{\n if (\n z >= shadowCascadeClipsNear[_idx_] &&\n z <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrices[_idx_], position, lightShadowMapSize,\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n }\n }}\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"; + if (!this.outputs) { -var ambientGlsl = "@export clay.deferred.ambient_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec2 windowSize: WINDOW_SIZE;\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo;\n gl_FragColor.a = 1.0;\n}\n@end"; + renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); -var ambientshGlsl = "@export clay.deferred.ambient_sh_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec3 lightCoefficients[9];\nuniform vec2 windowSize: WINDOW_SIZE;\nvec3 calcAmbientSHLight(vec3 N) {\n return lightCoefficients[0]\n + lightCoefficients[1] * N.x\n + lightCoefficients[2] * N.y\n + lightCoefficients[3] * N.z\n + lightCoefficients[4] * N.x * N.z\n + lightCoefficients[5] * N.z * N.y\n + lightCoefficients[6] * N.y * N.x\n + lightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + lightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 N = texel1.rgb * 2.0 - 1.0;\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo * calcAmbientSHLight(N);\n gl_FragColor.a = 1.0;\n}\n@end"; + } + else { -var ambientcubemapGlsl = "@export clay.deferred.ambient_cubemap_light\n@import clay.deferred.chunk.light_head\nuniform vec3 lightColor;\nuniform samplerCube lightCubemap;\nuniform sampler2D brdfLookup;\nuniform vec3 eyePosition;\n@import clay.util.rgbm\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 V = normalize(eyePosition - position);\n vec3 L = reflect(-V, N);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float rough = clamp(1.0 - glossiness, 0.0, 1.0);\n float bias = rough * 5.0;\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n vec3 envWeight = specularColor * brdfParam.x + brdfParam.y;\n vec3 envTexel = RGBMDecode(textureCubeLodEXT(lightCubemap, L, bias), 51.5);\n gl_FragColor.rgb = lightColor * envTexel * envWeight;\n gl_FragColor.a = 1.0;\n}\n@end"; + var frameBuffer = this.frameBuffer; + for (var name in this.outputs) { + var parameters = this.updateParameter(name, renderer); + var outputInfo = this.outputs[name]; + var texture = this._compositor.allocateTexture(parameters); + this._outputTextures[name] = texture; -var pointGlsl = "@export clay.deferred.point_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform samplerCube lightShadowMap;\nuniform float lightShadowMapSize;\n#endif\nvarying vec3 v_Position;\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContribOmni(\n lightShadowMap, -L * dist, lightRange\n );\n gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n#endif\n gl_FragColor.a = 1.0;\n}\n@end"; + var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; + if (typeof(attachment) == 'string') { + attachment = _gl[attachment]; + } + frameBuffer.attach(texture, attachment); + } + frameBuffer.bind(renderer); -var sphereGlsl = "@export clay.deferred.sphere_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform float lightRadius;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n vec3 R = reflect(V, N);\n float tmp = dot(L, R);\n vec3 cToR = tmp * R - L;\n float d = length(cToR);\n L = L + cToR * clamp(lightRadius / d, 0.0, 1.0);\n L = normalize(L);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = lightColor * ndl * attenuation;\n glossiness = clamp(glossiness - lightRadius / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n gl_FragColor.a = 1.0;\n}\n@end"; + // MRT Support in chrome + // https://www.khronos.org/registry/webgl/sdk/tests/conformance/extensions/ext-draw-buffers.html + var ext = renderer.getGLExtension('EXT_draw_buffers'); + if (ext) { + var bufs = []; + for (var attachment in this.outputs) { + attachment = parseInt(attachment); + if (attachment >= _gl.COLOR_ATTACHMENT0 && attachment <= _gl.COLOR_ATTACHMENT0 + 8) { + bufs.push(attachment); + } + } + ext.drawBuffersEXT(bufs); + } -var tubeGlsl = "@export clay.deferred.tube_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 lightExtend;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n vec3 R = reflect(V, N);\n vec3 L0 = lightPosition - lightExtend - position;\n vec3 L1 = lightPosition + lightExtend - position;\n vec3 LD = L1 - L0;\n float len0 = length(L0);\n float len1 = length(L1);\n float irra = 2.0 * clamp(dot(N, L0) / (2.0 * len0) + dot(N, L1) / (2.0 * len1), 0.0, 1.0);\n float LDDotR = dot(R, LD);\n float t = (LDDotR * dot(R, L0) - dot(L0, LD)) / (dot(LD, LD) - LDDotR * LDDotR);\n t = clamp(t, 0.0, 1.0);\n L = L0 + t * LD;\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n glossiness = clamp(glossiness - 0.0 / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = lightColor * irra * lightAttenuation(dist, lightRange)\n * (diffuseColor + D_Phong(glossiness, ndh) * F_Schlick(ndv, specularColor));\n gl_FragColor.a = 1.0;\n}\n@end"; + // Always clear + // PENDING + renderer.saveClear(); + renderer.clearBit = glenum.DEPTH_BUFFER_BIT | glenum.COLOR_BUFFER_BIT; + renderInfo = renderer.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ); + renderer.restoreClear(); -// Light-pre pass deferred rendering -// http://www.realtimerendering.com/blog/deferred-lighting-approaches/ -// Light shaders -Shader.import(prezGlsl); -Shader.import(utilGlsl); -Shader.import(lightvolumeGlsl); + frameBuffer.unbind(renderer); + } -// Light shaders -Shader.import(spotGlsl); -Shader.import(directionalGlsl); -Shader.import(ambientGlsl); -Shader.import(ambientshGlsl); -Shader.import(ambientcubemapGlsl); -Shader.import(pointGlsl); -Shader.import(sphereGlsl); -Shader.import(tubeGlsl); + this.trigger('afterrender', renderInfo); -Shader.import(prezGlsl); + this._rendering = false; + this._rendered = true; + } +}); /** - * Deferred renderer - * @constructor - * @alias clay.deferred.Renderer - * @extends clay.core.Base + * @constructor clay.compositor.TextureNode + * @extends clay.compositor.Node */ -var DeferredRenderer = Base.extend(function () { - - var fullQuadVertex = Shader.source('clay.compositor.vertex'); - var lightVolumeVertex = Shader.source('clay.deferred.light_volume.vertex'); - - var directionalLightShader = new Shader(fullQuadVertex, Shader.source('clay.deferred.directional_light')); - - var lightAccumulateBlendFunc = function (gl) { - gl.blendEquation(gl.FUNC_ADD); - gl.blendFunc(gl.ONE, gl.ONE); - }; - - var createLightPassMat = function (shader) { - return new Material({ - shader: shader, - blend: lightAccumulateBlendFunc, - transparent: true, - depthMask: false - }); - }; +var TextureNode$1 = Node$1.extend(function() { + return /** @lends clay.compositor.TextureNode# */ { + /** + * @type {clay.Texture2D} + */ + texture: null, - var createVolumeShader = function (name) { - return new Shader(lightVolumeVertex, Shader.source('clay.deferred.' + name)); + // Texture node must have output without parameters + outputs: { + color: {} + } }; +}, function () { +}, { - // Rotate and positioning to fit the spot light - // Which the cusp of cone pointing to the positive z - // and positioned on the origin - var coneGeo = new Cone$1({ - capSegments: 10 - }); - var mat = new Matrix4(); - mat.rotateX(Math.PI / 2) - .translate(new Vector3(0, -1, 0)); + getOutput: function (renderer, name) { + return this.texture; + }, - coneGeo.applyTransform(mat); + // Do nothing + beforeFrame: function () {}, + afterFrame: function () {} +}); - var cylinderGeo = new Cylinder$1({ - capSegments: 10 - }); - // Align with x axis - mat.identity().rotateZ(Math.PI / 2); - cylinderGeo.applyTransform(mat); +// TODO Shader library +// TODO curlnoise demo wrong - return /** @lends clay.deferred.Renderer# */ { +// PENDING +// Use topological sort ? +/** + * Filter node + * + * @constructor clay.compositor.FilterNode + * @extends clay.compositor.Node + * + * @example + var node = new clay.compositor.Node({ + name: 'fxaa', + shader: clay.Shader.source('clay.compositor.fxaa'), + inputs: { + texture: { + node: 'scene', + pin: 'color' + } + }, + // Multiple outputs is preserved for MRT support in WebGL2.0 + outputs: { + color: { + attachment: clay.FrameBuffer.COLOR_ATTACHMENT0 + parameters: { + format: clay.Texture.RGBA, + width: 512, + height: 512 + }, + // Node will keep the RTT rendered in last frame + keepLastFrame: true, + // Force the node output the RTT rendered in last frame + outputLastFrame: true + } + } + }); + * + */ +var FilterNode$1 = Node$1.extend(function () { + return /** @lends clay.compositor.Node# */ { /** - * Provide ShadowMapPass for shadow rendering. - * @type {clay.prePass.ShadowMap} + * @type {string} */ - shadowMapPass: null, + name: '', + /** - * If enable auto resizing from given defualt renderer size. - * @type {boolean} + * @type {Object} */ - autoResize: true, + inputs: {}, - _createLightPassMat: createLightPassMat, + /** + * @type {Object} + */ + outputs: null, - _gBuffer: new GBuffer(), + /** + * @type {string} + */ + shader: '', - _lightAccumFrameBuffer: new FrameBuffer({ - depthBuffer: false - }), + /** + * Input links, will be updated by the graph + * @example: + * inputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + inputLinks: {}, - _lightAccumTex: new Texture2D({ - // FIXME Device not support float texture - type: Texture.HALF_FLOAT, - minFilter: Texture.NEAREST, - magFilter: Texture.NEAREST - }), + /** + * Output links, will be updated by the graph + * @example: + * outputName: { + * node: someNode, + * pin: 'xxxx' + * } + * @type {Object} + */ + outputLinks: {}, - _fullQuadPass: new Pass({ - blendWithPrevious: true - }), + /** + * @type {clay.compositor.Pass} + */ + pass: null, - _directionalLightMat: createLightPassMat(directionalLightShader), + // Save the output texture of previous frame + // Will be used when there exist a circular reference + _prevOutputTextures: {}, + _outputTextures: {}, - _ambientMat: createLightPassMat(new Shader( - fullQuadVertex, Shader.source('clay.deferred.ambient_light') - )), - _ambientSHMat: createLightPassMat(new Shader( - fullQuadVertex, Shader.source('clay.deferred.ambient_sh_light') - )), - _ambientCubemapMat: createLightPassMat(new Shader( - fullQuadVertex, Shader.source('clay.deferred.ambient_cubemap_light') - )), + // Example: { name: 2 } + _outputReferences: {}, - _spotLightShader: createVolumeShader('spot_light'), - _pointLightShader: createVolumeShader('point_light'), + _rendering: false, + // If rendered in this frame + _rendered: false, - _sphereLightShader: createVolumeShader('sphere_light'), - _tubeLightShader: createVolumeShader('tube_light'), + _compositor: null + }; +}, function () { - _lightSphereGeo: new Sphere$1({ - widthSegments: 10, - heightSegements: 10 - }), + var pass = new Pass({ + fragment: this.shader + }); + this.pass = pass; +}, +/** @lends clay.compositor.Node.prototype */ +{ + /** + * @param {clay.Renderer} renderer + */ + render: function (renderer, frameBuffer) { + this.trigger('beforerender', renderer); - _lightConeGeo: coneGeo, + this._rendering = true; - _lightCylinderGeo: cylinderGeo, + var _gl = renderer.gl; - _outputPass: new Pass({ - fragment: Shader.source('clay.compositor.output') - }) - }; -}, /** @lends clay.deferred.Renderer# */ { - /** - * Do render - * @param {clay.Renderer} renderer - * @param {clay.Scene} scene - * @param {clay.Camera} camera - * @param {Object} [opts] - * @param {boolean} [opts.renderToTarget = false] If not ouput and render to the target texture - * @param {boolean} [opts.notUpdateShadow = true] If not update the shadow. - * @param {boolean} [opts.notUpdateScene = true] If not update the scene. - */ - render: function (renderer, scene, camera, opts) { + for (var inputName in this.inputLinks) { + var link = this.inputLinks[inputName]; + var inputTexture = link.node.getOutput(renderer, link.pin); + this.pass.setUniform(inputName, inputTexture); + } + // Output + if (!this.outputs) { + this.pass.outputs = null; - opts = opts || {}; - opts.renderToTarget = opts.renderToTarget || false; - opts.notUpdateShadow = opts.notUpdateShadow || false; - opts.notUpdateScene = opts.notUpdateScene || false; + this._compositor.getFrameBuffer().unbind(renderer); - if (!opts.notUpdateScene) { - scene.update(false, true); + this.pass.render(renderer, frameBuffer); } + else { + this.pass.outputs = {}; - camera.update(true); + var attachedTextures = {}; + for (var name in this.outputs) { + var parameters = this.updateParameter(name, renderer); + if (isNaN(parameters.width)) { + this.updateParameter(name, renderer); + } + var outputInfo = this.outputs[name]; + var texture = this._compositor.allocateTexture(parameters); + this._outputTextures[name] = texture; + var attachment = outputInfo.attachment || _gl.COLOR_ATTACHMENT0; + if (typeof(attachment) == 'string') { + attachment = _gl[attachment]; + } + attachedTextures[attachment] = texture; + } + this._compositor.getFrameBuffer().bind(renderer); - // PENDING For stereo rendering - var dpr = renderer.getDevicePixelRatio(); - if (this.autoResize - && (renderer.getWidth() * dpr !== this._lightAccumTex.width - || renderer.getHeight() * dpr !== this._lightAccumTex.height) - ) { - this.resize(renderer.getWidth() * dpr, renderer.getHeight() * dpr); + for (var attachment in attachedTextures) { + // FIXME attachment changes in different nodes + this._compositor.getFrameBuffer().attach( + attachedTextures[attachment], attachment + ); + } + + this.pass.render(renderer); + + // Because the data of texture is changed over time, + // Here update the mipmaps of texture each time after rendered; + this._compositor.getFrameBuffer().updateMipmap(renderer.gl); } - this._gBuffer.update(renderer, scene, camera); + for (var inputName in this.inputLinks) { + var link = this.inputLinks[inputName]; + link.node.removeReference(link.pin); + } - // Accumulate light buffer - this._accumulateLightBuffer(renderer, scene, camera, !opts.notUpdateShadow); + this._rendering = false; + this._rendered = true; - if (!opts.renderToTarget) { - this._outputPass.setUniform('texture', this._lightAccumTex); + this.trigger('afterrender', renderer); + }, - this._outputPass.render(renderer); - // this._gBuffer.renderDebug(renderer, camera, 'normal'); + // TODO Remove parameter function callback + updateParameter: function (outputName, renderer) { + var outputInfo = this.outputs[outputName]; + var parameters = outputInfo.parameters; + var parametersCopy = outputInfo._parametersCopy; + if (!parametersCopy) { + parametersCopy = outputInfo._parametersCopy = {}; + } + if (parameters) { + for (var key in parameters) { + if (key !== 'width' && key !== 'height') { + parametersCopy[key] = parameters[key]; + } + } + } + var width, height; + if (parameters.width instanceof Function) { + width = parameters.width.call(this, renderer); + } + else { + width = parameters.width; + } + if (parameters.height instanceof Function) { + height = parameters.height.call(this, renderer); + } + else { + height = parameters.height; + } + if ( + parametersCopy.width !== width + || parametersCopy.height !== height + ) { + if (this._outputTextures[outputName]) { + this._outputTextures[outputName].dispose(renderer); + } } + parametersCopy.width = width; + parametersCopy.height = height; + + return parametersCopy; }, /** - * @return {clay.Texture2D} + * Set parameter + * @param {string} name + * @param {} value */ - getTargetTexture: function () { - return this._lightAccumTex; + setParameter: function (name, value) { + this.pass.setUniform(name, value); }, - /** - * @return {clay.FrameBuffer} + * Get parameter value + * @param {string} name + * @return {} */ - getTargetFrameBuffer: function () { - return this._lightAccumFrameBuffer; + getParameter: function (name) { + return this.pass.getUniform(name); }, - /** - * @return {clay.deferred.GBuffer} + * Set parameters + * @param {Object} obj */ - getGBuffer: function () { - return this._gBuffer; - }, - - // TODO is dpr needed? - setViewport: function (x, y, width, height, dpr) { - this._gBuffer.setViewport(x, y, width, height, dpr); - this._lightAccumFrameBuffer.viewport = this._gBuffer.getViewport(); + setParameters: function (obj) { + for (var name in obj) { + this.setParameter(name, obj[name]); + } }, - - // getFullQuadLightPass: function () { - // return this._fullQuadPass; + // /** + // * Set shader code + // * @param {string} shaderStr + // */ + // setShader: function (shaderStr) { + // var material = this.pass.material; + // material.shader.setFragment(shaderStr); + // material.attachShader(material.shader, true); // }, - /** - * Set renderer size. - * @param {number} width - * @param {number} height + * Proxy of pass.material.define('fragment', xxx); + * @param {string} symbol + * @param {number} [val] */ - resize: function (width, height) { - this._lightAccumTex.width = width; - this._lightAccumTex.height = height; - - // PENDING viewport ? - this._gBuffer.resize(width, height); + define: function (symbol, val) { + this.pass.material.define('fragment', symbol, val); }, - _accumulateLightBuffer: function (renderer, scene, camera, updateShadow) { - var gl = renderer.gl; - var lightAccumTex = this._lightAccumTex; - var lightAccumFrameBuffer = this._lightAccumFrameBuffer; - - var eyePosition = camera.getWorldPosition().array; - - // Update volume meshes - for (var i = 0; i < scene.lights.length; i++) { - this._updateLightProxy(scene.lights[i]); - } - - var shadowMapPass = this.shadowMapPass; - if (shadowMapPass && updateShadow) { - gl.clearColor(1, 1, 1, 1); - this._prepareLightShadow(renderer, scene, camera); - } - - this.trigger('beforelightaccumulate', renderer, scene, camera, updateShadow); - - lightAccumFrameBuffer.attach(lightAccumTex); - lightAccumFrameBuffer.bind(renderer); - var clearColor = renderer.clearColor; - - var viewport = lightAccumFrameBuffer.viewport; - if (viewport) { - var dpr = viewport.devicePixelRatio; - // use scissor to make sure only clear the viewport - gl.enable(gl.SCISSOR_TEST); - gl.scissor(viewport.x * dpr, viewport.y * dpr, viewport.width * dpr, viewport.height * dpr); - } - gl.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); - gl.clear(gl.COLOR_BUFFER_BIT); - gl.enable(gl.BLEND); - if (viewport) { - gl.disable(gl.SCISSOR_TEST); - } - - this.trigger('startlightaccumulate', renderer, scene, camera); - - var viewProjectionInv = new Matrix4(); - Matrix4.multiply(viewProjectionInv, camera.worldTransform, camera.invProjectionMatrix); - - var volumeMeshList = []; - - for (var i = 0; i < scene.lights.length; i++) { - var light = scene.lights[i]; - var uTpl = light.uniformTemplates; - - var volumeMesh = light.volumeMesh || light.__volumeMesh; - - if (volumeMesh) { - var material = volumeMesh.material; - // Volume mesh will affect the scene bounding box when rendering - // if castShadow is true - volumeMesh.castShadow = false; - - var unknownLightType = false; - switch (light.type) { - case 'POINT_LIGHT': - material.setUniform('lightColor', uTpl.pointLightColor.value(light)); - material.setUniform('lightRange', uTpl.pointLightRange.value(light)); - material.setUniform('lightPosition', uTpl.pointLightPosition.value(light)); - break; - case 'SPOT_LIGHT': - material.setUniform('lightPosition', uTpl.spotLightPosition.value(light)); - material.setUniform('lightColor', uTpl.spotLightColor.value(light)); - material.setUniform('lightRange', uTpl.spotLightRange.value(light)); - material.setUniform('lightDirection', uTpl.spotLightDirection.value(light)); - material.setUniform('umbraAngleCosine', uTpl.spotLightUmbraAngleCosine.value(light)); - material.setUniform('penumbraAngleCosine', uTpl.spotLightPenumbraAngleCosine.value(light)); - material.setUniform('falloffFactor', uTpl.spotLightFalloffFactor.value(light)); - break; - case 'SPHERE_LIGHT': - material.setUniform('lightColor', uTpl.sphereLightColor.value(light)); - material.setUniform('lightRange', uTpl.sphereLightRange.value(light)); - material.setUniform('lightRadius', uTpl.sphereLightRadius.value(light)); - material.setUniform('lightPosition', uTpl.sphereLightPosition.value(light)); - break; - case 'TUBE_LIGHT': - material.setUniform('lightColor', uTpl.tubeLightColor.value(light)); - material.setUniform('lightRange', uTpl.tubeLightRange.value(light)); - material.setUniform('lightExtend', uTpl.tubeLightExtend.value(light)); - material.setUniform('lightPosition', uTpl.tubeLightPosition.value(light)); - break; - default: - unknownLightType = true; - } - - if (unknownLightType) { - continue; - } - - material.setUniform('eyePosition', eyePosition); - material.setUniform('viewProjectionInv', viewProjectionInv.array); - material.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); - material.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); - material.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); - - volumeMeshList.push(volumeMesh); - - } - else { - var pass = this._fullQuadPass; - var unknownLightType = false; - // Full quad light - switch (light.type) { - case 'AMBIENT_LIGHT': - pass.material = this._ambientMat; - pass.material.setUniform('lightColor', uTpl.ambientLightColor.value(light)); - break; - case 'AMBIENT_SH_LIGHT': - pass.material = this._ambientSHMat; - pass.material.setUniform('lightColor', uTpl.ambientSHLightColor.value(light)); - pass.material.setUniform('lightCoefficients', uTpl.ambientSHLightCoefficients.value(light)); - break; - case 'AMBIENT_CUBEMAP_LIGHT': - pass.material = this._ambientCubemapMat; - pass.material.setUniform('lightColor', uTpl.ambientCubemapLightColor.value(light)); - pass.material.setUniform('lightCubemap', uTpl.ambientCubemapLightCubemap.value(light)); - pass.material.setUniform('brdfLookup', uTpl.ambientCubemapLightBRDFLookup.value(light)); - break; - case 'DIRECTIONAL_LIGHT': - var hasShadow = shadowMapPass && light.castShadow; - pass.material = this._directionalLightMat; - pass.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); - if (hasShadow) { - pass.material.define('fragment', 'SHADOW_CASCADE', light.shadowCascade); - } - pass.material.setUniform('lightColor', uTpl.directionalLightColor.value(light)); - pass.material.setUniform('lightDirection', uTpl.directionalLightDirection.value(light)); - break; - default: - // Unkonw light type - unknownLightType = true; - } - if (unknownLightType) { - continue; - } - - var passMaterial = pass.material; - passMaterial.setUniform('eyePosition', eyePosition); - passMaterial.setUniform('viewProjectionInv', viewProjectionInv.array); - passMaterial.setUniform('gBufferTexture1', this._gBuffer.getTargetTexture1()); - passMaterial.setUniform('gBufferTexture2', this._gBuffer.getTargetTexture2()); - passMaterial.setUniform('gBufferTexture3', this._gBuffer.getTargetTexture3()); - - // TODO - if (shadowMapPass && light.castShadow) { - passMaterial.setUniform('lightShadowMap', light.__shadowMap); - passMaterial.setUniform('lightMatrices', light.__lightMatrices); - passMaterial.setUniform('shadowCascadeClipsNear', light.__cascadeClipsNear); - passMaterial.setUniform('shadowCascadeClipsFar', light.__cascadeClipsFar); + /** + * Proxy of pass.material.undefine('fragment', xxx) + * @param {string} symbol + */ + undefine: function (symbol) { + this.pass.material.undefine('fragment', symbol); + }, - passMaterial.setUniform('lightShadowMapSize', light.shadowResolution); + removeReference: function (outputName) { + this._outputReferences[outputName]--; + if (this._outputReferences[outputName] === 0) { + var outputInfo = this.outputs[outputName]; + if (outputInfo.keepLastFrame) { + if (this._prevOutputTextures[outputName]) { + this._compositor.releaseTexture(this._prevOutputTextures[outputName]); } - - pass.renderQuad(renderer); + this._prevOutputTextures[outputName] = this._outputTextures[outputName]; + } + else { + // Output of this node have alreay been used by all other nodes + // Put the texture back to the pool. + this._compositor.releaseTexture(this._outputTextures[outputName]); } } - - this._renderVolumeMeshList(renderer, camera, volumeMeshList); - - this.trigger('lightaccumulate', renderer, scene, camera); - - lightAccumFrameBuffer.unbind(renderer); - - this.trigger('afterlightaccumulate', renderer, scene, camera); - }, - _prepareLightShadow: (function () { - var worldView = new Matrix4(); - return function (renderer, scene, camera) { - var shadowCasters; + clear: function () { + Node$1.prototype.clear.call(this); - shadowCasters = this._shadowCasters || (this._shadowCasters = []); - var count = 0; - var list = scene.opaqueList; - for (var i = 0; i < list.length; i++) { - if (list[i].castShadow) { - shadowCasters[count++] = list[i]; - } - } - shadowCasters.length = count; + // Default disable all texture + this.pass.material.disableTexturesAll(); + } +}); - for (var i = 0; i < scene.lights.length; i++) { - var light = scene.lights[i]; - var volumeMesh = light.volumeMesh || light.__volumeMesh; - if (!light.castShadow) { - continue; - } +var shaderSourceReg = /^#source\((.*?)\)/; - switch (light.type) { - case 'POINT_LIGHT': - case 'SPOT_LIGHT': - // Frustum culling - Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); - if (renderer.isFrustumCulled( - volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array - )) { - continue; - } +/** + * @name clay.compositor.createCompositor + * @function + * @param {Object} json + * @param {Object} [opts] + * @return {clay.compositor.Compositor} + */ +function createCompositor(json, opts) { + var compositor = new Compositor(); + opts = opts || {}; - this._prepareSingleLightShadow( - renderer, scene, camera, light, shadowCasters, volumeMesh.material - ); - break; - case 'DIRECTIONAL_LIGHT': - this._prepareSingleLightShadow( - renderer, scene, camera, light, shadowCasters, null - ); - } + var lib = { + textures: {}, + parameters: {} + }; + var afterLoad = function(shaderLib, textureLib) { + for (var i = 0; i < json.nodes.length; i++) { + var nodeInfo = json.nodes[i]; + var node = createNode(nodeInfo, lib, opts); + if (node) { + compositor.addNode(node); } - }; - })(), + } + }; - _prepareSingleLightShadow: function (renderer, scene, camera, light, casters, material) { - switch (light.type) { - case 'POINT_LIGHT': - var shadowMaps = []; - this.shadowMapPass.renderPointLightShadow( - renderer, scene, light, casters, shadowMaps - ); - material.setUniform('lightShadowMap', shadowMaps[0]); - material.setUniform('lightShadowMapSize', light.shadowResolution); - break; - case 'SPOT_LIGHT': - var shadowMaps = []; - var lightMatrices = []; - this.shadowMapPass.renderSpotLightShadow( - renderer, scene, light, casters, lightMatrices, shadowMaps - ); - material.setUniform('lightShadowMap', shadowMaps[0]); - material.setUniform('lightMatrix', lightMatrices[0]); - material.setUniform('lightShadowMapSize', light.shadowResolution); - break; - case 'DIRECTIONAL_LIGHT': - var shadowMaps = []; - var lightMatrices = []; - var cascadeClips = []; - this.shadowMapPass.renderDirectionalLightShadow( - renderer, scene, camera, light, casters, cascadeClips, lightMatrices, shadowMaps - ); - var cascadeClipsNear = cascadeClips.slice(); - var cascadeClipsFar = cascadeClips.slice(); - cascadeClipsNear.pop(); - cascadeClipsFar.shift(); + for (var name in json.parameters) { + var paramInfo = json.parameters[name]; + lib.parameters[name] = convertParameter(paramInfo); + } + // TODO load texture asynchronous + loadTextures(json, lib, opts, function(textureLib) { + lib.textures = textureLib; + afterLoad(); + }); - // Iterate from far to near - cascadeClipsNear.reverse(); - cascadeClipsFar.reverse(); - lightMatrices.reverse(); + return compositor; +} - light.__cascadeClipsNear = cascadeClipsNear; - light.__cascadeClipsFar = cascadeClipsFar; - light.__shadowMap = shadowMaps[0]; - light.__lightMatrices = lightMatrices; - break; +function createNode(nodeInfo, lib, opts) { + var type = nodeInfo.type || 'filter'; + var shaderSource; + var inputs; + var outputs; + + if (type === 'filter') { + var shaderExp = nodeInfo.shader.trim(); + var res = shaderSourceReg.exec(shaderExp); + if (res) { + shaderSource = Shader.source(res[1].trim()); } - }, + else if (shaderExp.charAt(0) === '#') { + shaderSource = lib.shaders[shaderExp.substr(1)]; + } + if (!shaderSource) { + shaderSource = shaderExp; + } + if (!shaderSource) { + return; + } + } - // Update light volume mesh - // Light volume mesh is rendered in light accumulate pass instead of full quad. - // It will reduce pixels significantly when local light is relatively small. - // And we can use custom volume mesh to shape the light. - // - // See "Deferred Shading Optimizations" in GDC2011 - _updateLightProxy: function (light) { - var volumeMesh; - if (light.volumeMesh) { - volumeMesh = light.volumeMesh; + if (nodeInfo.inputs) { + inputs = {}; + for (var name in nodeInfo.inputs) { + if (typeof nodeInfo.inputs[name] === 'string') { + inputs[name] = nodeInfo.inputs[name]; + } + else { + inputs[name] = { + node: nodeInfo.inputs[name].node, + pin: nodeInfo.inputs[name].pin + }; + } } - else { - switch (light.type) { - // Only local light (point and spot) needs volume mesh. - // Directional and ambient light renders in full quad - case 'POINT_LIGHT': - case 'SPHERE_LIGHT': - var shader = light.type === 'SPHERE_LIGHT' - ? this._sphereLightShader : this._pointLightShader; - // Volume mesh created automatically - if (!light.__volumeMesh) { - light.__volumeMesh = new Mesh({ - material: this._createLightPassMat(shader), - geometry: this._lightSphereGeo, - // Disable culling - // if light volume mesh intersect camera near plane - // We need mesh inside can still be rendered - culling: false - }); + } + if (nodeInfo.outputs) { + outputs = {}; + for (var name in nodeInfo.outputs) { + var outputInfo = nodeInfo.outputs[name]; + outputs[name] = {}; + if (outputInfo.attachment != null) { + outputs[name].attachment = outputInfo.attachment; + } + if (outputInfo.keepLastFrame != null) { + outputs[name].keepLastFrame = outputInfo.keepLastFrame; + } + if (outputInfo.outputLastFrame != null) { + outputs[name].outputLastFrame = outputInfo.outputLastFrame; + } + if (outputInfo.parameters) { + outputs[name].parameters = convertParameter(outputInfo.parameters); + } + } + } + var node; + if (type === 'scene') { + node = new SceneNode$1({ + name: nodeInfo.name, + scene: opts.scene, + camera: opts.camera, + outputs: outputs + }); + } + else if (type === 'texture') { + node = new TextureNode$1({ + name: nodeInfo.name, + outputs: outputs + }); + } + // Default is filter + else { + node = new FilterNode$1({ + name: nodeInfo.name, + shader: shaderSource, + inputs: inputs, + outputs: outputs + }); + } + if (node) { + if (nodeInfo.parameters) { + for (var name in nodeInfo.parameters) { + var val = nodeInfo.parameters[name]; + if (typeof(val) === 'string') { + val = val.trim(); + if (val.charAt(0) === '#') { + val = lib.textures[val.substr(1)]; } - volumeMesh = light.__volumeMesh; - var r = light.range + (light.radius || 0); - volumeMesh.scale.set(r, r, r); - break; - case 'SPOT_LIGHT': - light.__volumeMesh = light.__volumeMesh || new Mesh({ - material: this._createLightPassMat(this._spotLightShader), - geometry: this._lightConeGeo, - culling: false - }); - volumeMesh = light.__volumeMesh; - var aspect = Math.tan(light.penumbraAngle * Math.PI / 180); - var range = light.range; - volumeMesh.scale.set(aspect * range, aspect * range, range / 2); - break; - case 'TUBE_LIGHT': - light.__volumeMesh = light.__volumeMesh || new Mesh({ - material: this._createLightPassMat(this._tubeLightShader), - geometry: this._lightCylinderGeo, - culling: false - }); - volumeMesh = light.__volumeMesh; - var range = light.range; - volumeMesh.scale.set(light.length / 2 + range, range, range); - break; + else { + node.on( + 'beforerender', createSizeSetHandler( + name, tryConvertExpr(val) + ) + ); + } + } + node.setParameter(name, val); } } - if (volumeMesh) { - volumeMesh.update(); - // Apply light transform - Matrix4.multiply(volumeMesh.worldTransform, light.worldTransform, volumeMesh.worldTransform); - var hasShadow = this.shadowMapPass && light.castShadow; - volumeMesh.material[hasShadow ? 'define' : 'undefine']('fragment', 'SHADOWMAP_ENABLED'); + if (nodeInfo.defines && node.pass) { + for (var name in nodeInfo.defines) { + var val = nodeInfo.defines[name]; + node.pass.material.define('fragment', name, val); + } } - }, + } + return node; +} - _renderVolumeMeshList: (function () { - var worldViewProjection = new Matrix4(); - var worldView = new Matrix4(); - var preZMaterial = new Material({ - shader: new Shader(Shader.source('clay.prez.vertex'), Shader.source('clay.prez.fragment')) +function convertParameter(paramInfo) { + var param = {}; + if (!paramInfo) { + return param; + } + ['type', 'minFilter', 'magFilter', 'wrapS', 'wrapT', 'flipY', 'useMipmap'] + .forEach(function(name) { + var val = paramInfo[name]; + if (val != null) { + // Convert string to enum + if (typeof val === 'string') { + val = Texture[val]; + } + param[name] = val; + } }); - return function (renderer, camera, volumeMeshList) { - var gl = renderer.gl; - - gl.enable(gl.DEPTH_TEST); - gl.disable(gl.CULL_FACE); - gl.blendEquation(gl.FUNC_ADD); - gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE); - gl.depthFunc(gl.LEQUAL); - - gl.clear(gl.DEPTH_BUFFER_BIT); - - var viewport = renderer.viewport; - var dpr = viewport.devicePixelRatio; - var viewportUniform = [ - viewport.x * dpr, viewport.y * dpr, - viewport.width * dpr, viewport.height * dpr - ]; - - var windowSizeUniform = [ - this._lightAccumTex.width, - this._lightAccumTex.height - ]; - - for (var i = 0; i < volumeMeshList.length; i++) { - var volumeMesh = volumeMeshList[i]; - - // Frustum culling - Matrix4.multiply(worldView, camera.viewMatrix, volumeMesh.worldTransform); - if (renderer.isFrustumCulled( - volumeMesh, null, camera, worldView.array, camera.projectionMatrix.array - )) { - continue; + ['width', 'height'] + .forEach(function(name) { + if (paramInfo[name] != null) { + var val = paramInfo[name]; + if (typeof val === 'string') { + val = val.trim(); + param[name] = createSizeParser( + name, tryConvertExpr(val) + ); } + else { + param[name] = val; + } + } + }); + if (paramInfo.useMipmap != null) { + param.useMipmap = paramInfo.useMipmap; + } + return param; +} - // Use prez to avoid one pixel rendered twice - gl.colorMask(false, false, false, false); - gl.depthMask(true); - // depthMask must be enabled before clear DEPTH_BUFFER - gl.clear(gl.DEPTH_BUFFER_BIT); - - Matrix4.multiply(worldViewProjection, camera.projectionMatrix, worldView); - - var preZProgram = renderer.getProgram(volumeMesh, preZMaterial); - volumeMesh.__program = preZProgram; - renderer.validateProgram(preZProgram); - preZProgram.bind(renderer); - - var semanticInfo = preZMaterial.shader.matrixSemantics.WORLDVIEWPROJECTION; - preZProgram.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); - volumeMesh.render(renderer, preZMaterial, preZProgram); - - // Render light - gl.colorMask(true, true, true, true); - gl.depthMask(false); - var program = renderer.getProgram(volumeMesh, volumeMesh.material); - volumeMesh.__program = program; - renderer.validateProgram(program); - program.bind(renderer); - - var semanticInfo = volumeMesh.material.shader.matrixSemantics.WORLDVIEWPROJECTION; - // Set some common uniforms - program.setUniform(gl, semanticInfo.type, semanticInfo.symbol, worldViewProjection.array); - program.setUniformOfSemantic(gl, 'WINDOW_SIZE', windowSizeUniform); - program.setUniformOfSemantic(gl, 'VIEWPORT', viewportUniform); +function loadTextures(json, lib, opts, callback) { + if (!json.textures) { + callback({}); + return; + } + var textures = {}; + var loading = 0; - volumeMesh.material.bind(renderer, program); - volumeMesh.render(renderer, volumeMesh.material, program); + var cbd = false; + var textureRootPath = opts.textureRootPath; + util$1.each(json.textures, function(textureInfo, name) { + var texture; + var path = textureInfo.path; + var parameters = convertParameter(textureInfo.parameters); + if (Array.isArray(path) && path.length === 6) { + if (textureRootPath) { + path = path.map(function(item) { + return util$1.relative2absolute(item, textureRootPath); + }); } + texture = new TextureCube(parameters); + } + else if(typeof path === 'string') { + if (textureRootPath) { + path = util$1.relative2absolute(path, textureRootPath); + } + texture = new Texture2D(parameters); + } + else { + return; + } - gl.depthFunc(gl.LESS); - }; - })(), - - /** - * @param {clay.Renderer} renderer - */ - dispose: function (renderer) { - this._gBuffer.dispose(renderer); + texture.load(path); + loading++; + texture.once('success', function() { + textures[name] = texture; + loading--; + if (loading === 0) { + callback(textures); + cbd = true; + } + }); + }); - this._lightAccumFrameBuffer.dispose(renderer); - this._lightAccumTex.dispose(renderer); + if (loading === 0 && !cbd) { + callback(textures); + } +} - this._lightConeGeo.dispose(renderer); - this._lightCylinderGeo.dispose(renderer); - this._lightSphereGeo.dispose(renderer); +function createSizeSetHandler(name, exprFunc) { + return function (renderer) { + // PENDING viewport size or window size + var dpr = renderer.getDevicePixelRatio(); + // PENDING If multiply dpr ? + var width = renderer.getWidth(); + var height = renderer.getHeight(); + var result = exprFunc(width, height, dpr); + this.setParameter(name, result); + }; +} - this._fullQuadPass.dispose(renderer); - this._outputPass.dispose(renderer); +function createSizeParser(name, exprFunc) { + return function (renderer) { + var dpr = renderer.getDevicePixelRatio(); + var width = renderer.getWidth(); + var height = renderer.getHeight(); + return exprFunc(width, height, dpr); + }; +} - this._directionalLightMat.dispose(renderer); +function tryConvertExpr(string) { + // PENDING + var exprRes = /^expr\((.*)\)$/.exec(string); + if (exprRes) { + try { + var func = new Function('width', 'height', 'dpr', 'return ' + exprRes[1]); + // Try run t + func(1, 1); - this.shadowMapPass.dispose(renderer); + return func; + } + catch (e) { + throw new Error('Invalid expression.'); + } } -}); +} /** * @constructor clay.light.Sphere @@ -34281,7 +34648,7 @@ function copyIfNecessary(arr, shallow) { /** * @name clay.version */ -var version = '1.0.0-rc.1'; +var version = '1.0.0'; var outputEssl$1 = "@export clay.vr.disorter.output.vertex\nattribute vec2 texcoord: TEXCOORD_0;\nattribute vec3 position: POSITION;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n v_Texcoord = texcoord;\n gl_Position = vec4(position.xy, 0.5, 1.0);\n}\n@end\n@export clay.vr.disorter.output.fragment\nuniform sampler2D texture;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n gl_FragColor = texture2D(texture, v_Texcoord);\n}\n@end"; @@ -34655,6 +35022,7 @@ var geometry = { Cone : Cone$1, Cube : Cube$1, Cylinder : Cylinder$1, + ParametricSurface : ParametricSurface$1, Plane : Plane$3, Sphere : Sphere$1 }; @@ -34782,4 +35150,3 @@ exports.vr = vr; Object.defineProperty(exports, '__esModule', { value: true }); }))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xheWdsLmpzIiwic291cmNlcyI6WyIuLi9zcmMvYW5pbWF0aW9uL2Vhc2luZy5qcyIsIi4uL3NyYy9hbmltYXRpb24vQ2xpcC5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0b3IuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0JsZW5kMURDbGlwLmpzIiwiLi4vc3JjL3V0aWwvZGVsYXVuYXkuanMiLCIuLi9zcmMvZGVwL2dsbWF0cml4LmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMi5qcyIsIi4uL3NyYy9hbmltYXRpb24vQmxlbmQyRENsaXAuanMiLCIuLi9zcmMvYW5pbWF0aW9uL1RyYW5zZm9ybVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9TYW1wbGVyVHJhY2suanMiLCIuLi9zcmMvY29yZS9taXhpbi9leHRlbmQuanMiLCIuLi9zcmMvY29yZS9taXhpbi9ub3RpZmllci5qcyIsIi4uL3NyYy9jb3JlL3V0aWwuanMiLCIuLi9zcmMvY29yZS9CYXNlLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9UaW1lbGluZS5qcyIsIi4uL3NyYy9hbmltYXRpb24vVHJhY2tDbGlwLmpzIiwiLi4vc3JjL2NvcmUvR0xJbmZvLmpzIiwiLi4vc3JjL2NvcmUvZ2xlbnVtLmpzIiwiLi4vc3JjL2NvcmUvdmVuZG9yLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMy5qcyIsIi4uL3NyYy9tYXRoL0JvdW5kaW5nQm94LmpzIiwiLi4vc3JjL21hdGgvTWF0cml4NC5qcyIsIi4uL3NyYy9jb3JlL0NhY2hlLmpzIiwiLi4vc3JjL1RleHR1cmUuanMiLCIuLi9zcmMvY29yZS9MaW5rZWRMaXN0LmpzIiwiLi4vc3JjL2NvcmUvTFJVLmpzIiwiLi4vc3JjL2NvcmUvY29sb3IuanMiLCIuLi9zcmMvTWF0ZXJpYWwuanMiLCIuLi9zcmMvZ3B1L0dMUHJvZ3JhbS5qcyIsIi4uL3NyYy9ncHUvUHJvZ3JhbU1hbmFnZXIuanMiLCIuLi9zcmMvU2hhZGVyLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvaGVhZGVyL2NhbGNBbWJpZW50U0hMaWdodC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvaGVhZGVyL2xpZ2h0LmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvcHJlei5nbHNsLmpzIiwiLi4vc3JjL1JlbmRlcmVyLmpzIiwiLi4vc3JjL21hdGgvUXVhdGVybmlvbi5qcyIsIi4uL3NyYy9Ob2RlLmpzIiwiLi4vc3JjL0xpZ2h0LmpzIiwiLi4vc3JjL21hdGgvUGxhbmUuanMiLCIuLi9zcmMvbWF0aC9GcnVzdHVtLmpzIiwiLi4vc3JjL21hdGgvUmF5LmpzIiwiLi4vc3JjL0NhbWVyYS5qcyIsIi4uL3NyYy9TY2VuZS5qcyIsIi4uL3NyYy9HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyeS9QbGFuZS5qcyIsIi4uL3NyYy9nZW9tZXRyeS9DdWJlLmpzIiwiLi4vc3JjL2dlb21ldHJ5L1NwaGVyZS5qcyIsIi4uL3NyYy9tYXRoL3V0aWwuanMiLCIuLi9zcmMvVGV4dHVyZTJELmpzIiwiLi4vc3JjL3NoYWRlci9saWJyYXJ5LmpzIiwiLi4vc3JjL1JlbmRlcmFibGUuanMiLCIuLi9zcmMvTWVzaC5qcyIsIi4uL3NyYy9jYW1lcmEvUGVyc3BlY3RpdmUuanMiLCIuLi9zcmMvY2FtZXJhL09ydGhvZ3JhcGhpYy5qcyIsIi4uL3NyYy9jb3JlL3JlcXVlc3QuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9zdGFuZGFyZC5nbHNsLmpzIiwiLi4vc3JjL1N0YW5kYXJkTWF0ZXJpYWwuanMiLCIuLi9zcmMvSm9pbnQuanMiLCIuLi9zcmMvU2tlbGV0b24uanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS91dGlsLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9iYXNpYy5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvbGFtYmVydC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2Uvd2lyZWZyYW1lLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9za3lib3guZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvY29sb3JhZGp1c3QuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvYmx1ci5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9sdW0uZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvbHV0Lmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL3ZpZ25ldHRlLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL291dHB1dC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9icmlnaHQuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvZG93bnNhbXBsZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci91cHNhbXBsZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9oZHIuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2NvbXBvc2l0b3IvZG9mLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL2xlbnNmbGFyZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9ibGVuZC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci9meGFhLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL2Z4YWEzLmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL2J1aWx0aW4uanMiLCIuLi9zcmMvbG9hZGVyL0dMVEYuanMiLCIuLi9zcmMvbGlnaHQvRGlyZWN0aW9uYWwuanMiLCIuLi9zcmMvbGlnaHQvUG9pbnQuanMiLCIuLi9zcmMvbGlnaHQvU3BvdC5qcyIsIi4uL3NyYy9saWdodC9BbWJpZW50LmpzIiwiLi4vc3JjL1RleHR1cmVDdWJlLmpzIiwiLi4vc3JjL0ZyYW1lQnVmZmVyLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvY29tcG9zaXRvci92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL1Bhc3MuanMiLCIuLi9zcmMvcGx1Z2luL1NreWJveC5qcyIsIi4uL3NyYy9wcmVQYXNzL0Vudmlyb25tZW50TWFwLmpzIiwiLi4vc3JjL3BsdWdpbi9Ta3lkb21lLmpzIiwiLi4vc3JjL3V0aWwvZGRzLmpzIiwiLi4vc3JjL3V0aWwvaGRyLmpzIiwiLi4vc3JjL3V0aWwvdGV4dHVyZS5qcyIsIi4uL3NyYy91dGlsL3NoYWRlci9pbnRlZ3JhdGVCUkRGLmdsc2wuanMiLCIuLi9zcmMvdXRpbC9zaGFkZXIvcHJlZmlsdGVyLmdsc2wuanMiLCIuLi9zcmMvdXRpbC9jdWJlbWFwLmpzIiwiLi4vc3JjL2xpZ2h0L0FtYmllbnRDdWJlbWFwLmpzIiwiLi4vc3JjL2xpZ2h0L0FtYmllbnRTSC5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL1RleHR1cmVQb29sLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2Uvc2hhZG93bWFwLmdsc2wuanMiLCIuLi9zcmMvcHJlUGFzcy9TaGFkb3dNYXAuanMiLCIuLi9zcmMvcGlja2luZy9SYXlQaWNraW5nLmpzIiwiLi4vc3JjL3V0aWwvc2guanMiLCIuLi9zcmMvYXBwbGljYXRpb24uanMiLCIuLi9zcmMvYXN5bmMvVGFzay5qcyIsIi4uL3NyYy9hc3luYy9UYXNrR3JvdXAuanMiLCIuLi9zcmMvY2FudmFzL01hdGVyaWFsLmpzIiwiLi4vc3JjL2NhbnZhcy9SZW5kZXJlci5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL05vZGUuanMiLCIuLi9zcmMvY29tcG9zaXRvci9HcmFwaC5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL0NvbXBvc2l0b3IuanMiLCIuLi9zcmMvY29tcG9zaXRvci9TY2VuZU5vZGUuanMiLCIuLi9zcmMvY29tcG9zaXRvci9UZXh0dXJlTm9kZS5qcyIsIi4uL3NyYy9jb21wb3NpdG9yL0ZpbHRlck5vZGUuanMiLCIuLi9zcmMvY29tcG9zaXRvci9jcmVhdGVDb21wb3NpdG9yLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvZ2J1ZmZlci5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvY2h1bmsuZ2xzbC5qcyIsIi4uL3NyYy9kZWZlcnJlZC9HQnVmZmVyLmpzIiwiLi4vc3JjL2dlb21ldHJ5L0NvbmUuanMiLCIuLi9zcmMvZ2VvbWV0cnkvQ3lsaW5kZXIuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9saWdodHZvbHVtZS5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvc3BvdC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvZGlyZWN0aW9uYWwuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnQuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnRzaC5nbHNsLmpzIiwiLi4vc3JjL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvYW1iaWVudGN1YmVtYXAuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL3BvaW50Lmdsc2wuanMiLCIuLi9zcmMvc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9zcGhlcmUuZ2xzbC5qcyIsIi4uL3NyYy9zaGFkZXIvc291cmNlL2RlZmVycmVkL3R1YmUuZ2xzbC5qcyIsIi4uL3NyYy9kZWZlcnJlZC9SZW5kZXJlci5qcyIsIi4uL3NyYy9saWdodC9TcGhlcmUuanMiLCIuLi9zcmMvbGlnaHQvVHViZS5qcyIsIi4uL3NyYy9sb2FkZXIvRlguanMiLCIuLi9zcmMvbWF0aC9NYXRyaXgyLmpzIiwiLi4vc3JjL21hdGgvTWF0cml4MmQuanMiLCIuLi9zcmMvbWF0aC9NYXRyaXgzLmpzIiwiLi4vc3JjL21hdGgvVmFsdWUuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3I0LmpzIiwiLi4vc3JjL3BhcnRpY2xlL1BhcnRpY2xlLmpzIiwiLi4vc3JjL3BhcnRpY2xlL0VtaXR0ZXIuanMiLCIuLi9zcmMvcGFydGljbGUvRmllbGQuanMiLCIuLi9zcmMvcGFydGljbGUvRm9yY2VGaWVsZC5qcyIsIi4uL3NyYy9wYXJ0aWNsZS9wYXJ0aWNsZS5nbHNsLmpzIiwiLi4vc3JjL3BhcnRpY2xlL1BhcnRpY2xlUmVuZGVyYWJsZS5qcyIsIi4uL3NyYy9waWNraW5nL2NvbG9yLmdsc2wuanMiLCIuLi9zcmMvcGlja2luZy9QaXhlbFBpY2tpbmcuanMiLCIuLi9zcmMvcGx1Z2luL0ZyZWVDb250cm9sLmpzIiwiLi4vc3JjL3BsdWdpbi9HZXN0dXJlTWdyLmpzIiwiLi4vc3JjL3BsdWdpbi9JbmZpbml0ZVBsYW5lLmpzIiwiLi4vc3JjL3BsdWdpbi9PcmJpdENvbnRyb2wuanMiLCIuLi9zcmMvU3RhdGljR2VvbWV0cnkuanMiLCIuLi9zcmMvdXRpbC9tZXNoLmpzIiwiLi4vc3JjL3V0aWwvdHJhbnNmZXJhYmxlLmpzIiwiLi4vc3JjL3ZlcnNpb24uanMiLCIuLi9zcmMvdnIvb3V0cHV0Lmdsc2wuanMiLCIuLi9zcmMvdnIvQ2FyZGJvYXJkRGlzdG9ydGVyLmpzIiwiLi4vc3JjL3ZyL1N0ZXJlb0NhbWVyYS5qcyIsIi4uL3NyYy9jbGF5Z2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8g57yT5Yqo5Ye95pWw5p2l6IeqIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xlL3R3ZWVuLmpzL2Jsb2IvbWFzdGVyL3NyYy9Ud2Vlbi5qc1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgY2xheS5hbmltYXRpb24uZWFzaW5nXG4gKi9cbnZhciBlYXNpbmcgPSB7XG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5saW5lYXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsaW5lYXI6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGs7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnF1YWRyYXRpY0luXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgcXVhZHJhdGljSW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgKiBrO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWFkcmF0aWNPdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBxdWFkcmF0aWNPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgKiAoMiAtIGspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWFkcmF0aWNJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1YWRyYXRpY0luT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiBrICogaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLSAwLjUgKiAoLS1rICogKGsgLSAyKSAtIDEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5jdWJpY0luXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgY3ViaWNJbjogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gayAqIGsgKiBrO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5jdWJpY091dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGN1YmljT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHJldHVybiAtLWsgKiBrICogayArIDE7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmN1YmljSW5PdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBjdWJpY0luT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiBrICogayAqIGs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgoayAtPSAyKSAqIGsgKiBrICsgMik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnF1YXJ0aWNJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1YXJ0aWNJbjogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gayAqIGsgKiBrICogaztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcucXVhcnRpY091dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1YXJ0aWNPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIDEgLSAoLS1rICogayAqIGsgKiBrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcucXVhcnRpY0luT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgcXVhcnRpY0luT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiBrICogayAqIGsgKiBrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtIDAuNSAqICgoayAtPSAyKSAqIGsgKiBrICogayAtIDIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWludGljSW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBxdWludGljSW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgKiBrICogayAqIGsgKiBrO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5xdWludGljT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgcXVpbnRpY091dDogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gLS1rICogayAqIGsgKiBrICogayArIDE7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnF1aW50aWNJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHF1aW50aWNJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoKGsgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMC41ICogayAqIGsgKiBrICogayAqIGs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgoayAtPSAyKSAqIGsgKiBrICogayAqIGsgKyAyKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuc2ludXNvaWRhbEluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2ludXNvaWRhbEluOiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHJldHVybiAxIC0gTWF0aC5jb3MoayAqIE1hdGguUEkgLyAyKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuc2ludXNvaWRhbE91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNpbnVzb2lkYWxPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc2luKGsgKiBNYXRoLlBJIC8gMik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLnNpbnVzb2lkYWxJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNpbnVzb2lkYWxJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gMC41ICogKDEgLSBNYXRoLmNvcyhNYXRoLlBJICogaykpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5leHBvbmVudGlhbEluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZXhwb25lbnRpYWxJbjogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gayA9PT0gMCA/IDAgOiBNYXRoLnBvdygxMDI0LCBrIC0gMSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmV4cG9uZW50aWFsT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZXhwb25lbnRpYWxPdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIGsgPT09IDEgPyAxIDogMSAtIE1hdGgucG93KDIsIC0gMTAgKiBrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuZXhwb25lbnRpYWxJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGV4cG9uZW50aWFsSW5PdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKGsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGsgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMC41ICogTWF0aC5wb3coMTAyNCwgayAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwLjUgKiAoLSBNYXRoLnBvdygyLCAtIDEwICogKGsgLSAxKSkgKyAyKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuY2lyY3VsYXJJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNpcmN1bGFySW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnNxcnQoMSAtIGsgKiBrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5lYXNpbmcuY2lyY3VsYXJPdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBjaXJjdWxhck91dDogZnVuY3Rpb24oaykge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KDEgLSAoLS1rICogaykpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5jaXJjdWxhckluT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgY2lyY3VsYXJJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoKGsgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gLSAwLjUgKiAoTWF0aC5zcXJ0KDEgLSBrICogaykgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMC41ICogKE1hdGguc3FydCgxIC0gKGsgLT0gMikgKiBrKSArIDEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5lbGFzdGljSW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBlbGFzdGljSW46IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdmFyIHMsIGEgPSAwLjEsIHAgPSAwLjQ7XG4gICAgICAgIGlmIChrID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoayA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhIHx8IGEgPCAxKSB7XG4gICAgICAgICAgICBhID0gMTsgcyA9IHAgLyA0O1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHMgPSBwICogTWF0aC5hc2luKDEgLyBhKSAvICgyICogTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0gKGEgKiBNYXRoLnBvdygyLCAxMCAqIChrIC09IDEpKSAqXG4gICAgICAgICAgICAgICAgICAgIE1hdGguc2luKChrIC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5lbGFzdGljT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZWxhc3RpY091dDogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcywgYSA9IDAuMSwgcCA9IDAuNDtcbiAgICAgICAgaWYgKGsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWEgfHwgYSA8IDEpIHtcbiAgICAgICAgICAgIGEgPSAxOyBzID0gcCAvIDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHMgPSBwICogTWF0aC5hc2luKDEgLyBhKSAvICgyICogTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhICogTWF0aC5wb3coMiwgLSAxMCAqIGspICpcbiAgICAgICAgICAgICAgICBNYXRoLnNpbigoayAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApICsgMSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmVsYXN0aWNJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGVsYXN0aWNJbk91dDogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcywgYSA9IDAuMSwgcCA9IDAuNDtcbiAgICAgICAgaWYgKGsgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWEgfHwgYSA8IDEpIHtcbiAgICAgICAgICAgIGEgPSAxOyBzID0gcCAvIDQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHMgPSBwICogTWF0aC5hc2luKDEgLyBhKSAvICgyICogTWF0aC5QSSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChrICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0gMC41ICogKGEgKiBNYXRoLnBvdygyLCAxMCAqIChrIC09IDEpKVxuICAgICAgICAgICAgICAgICogTWF0aC5zaW4oKGsgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGEgKiBNYXRoLnBvdygyLCAtMTAgKiAoayAtPSAxKSlcbiAgICAgICAgICAgICAgICAqIE1hdGguc2luKChrIC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkgKiAwLjUgKyAxO1xuXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmJhY2tJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJhY2tJbjogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiBrICogayAqICgocyArIDEpICogayAtIHMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5iYWNrT3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGtcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgYmFja091dDogZnVuY3Rpb24oaykge1xuICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgIHJldHVybiAtLWsgKiBrICogKChzICsgMSkgKiBrICsgcykgKyAxO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5iYWNrSW5PdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBiYWNrSW5PdXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdmFyIHMgPSAxLjcwMTU4ICogMS41MjU7XG4gICAgICAgIGlmICgoayAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjUgKiAoayAqIGsgKiAoKHMgKyAxKSAqIGsgLSBzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDAuNSAqICgoayAtPSAyKSAqIGsgKiAoKHMgKyAxKSAqIGsgKyBzKSArIDIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5ib3VuY2VJblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJvdW5jZUluOiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHJldHVybiAxIC0gZWFzaW5nLmJvdW5jZU91dCgxIC0gayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAYWxpYXMgY2xheS5hbmltYXRpb24uZWFzaW5nLmJvdW5jZU91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJvdW5jZU91dDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAoayA8ICgxIC8gMi43NSkpIHtcbiAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiBrICogaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrIDwgKDIgLyAyLjc1KSkge1xuICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChrIC09ICgxLjUgLyAyLjc1KSkgKiBrICsgMC43NTtcbiAgICAgICAgfSBlbHNlIGlmIChrIDwgKDIuNSAvIDIuNzUpKSB7XG4gICAgICAgICAgICByZXR1cm4gNy41NjI1ICogKGsgLT0gKDIuMjUgLyAyLjc1KSkgKiBrICsgMC45Mzc1O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChrIC09ICgyLjYyNSAvIDIuNzUpKSAqIGsgKyAwLjk4NDM3NTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLmVhc2luZy5ib3VuY2VJbk91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGJvdW5jZUluT3V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmIChrIDwgMC41KSB7XG4gICAgICAgICAgICByZXR1cm4gZWFzaW5nLmJvdW5jZUluKGsgKiAyKSAqIDAuNTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWFzaW5nLmJvdW5jZU91dChrICogMiAtIDEpICogMC41ICsgMC41O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGVhc2luZztcbiIsImltcG9ydCBFYXNpbmcgZnJvbSAnLi9lYXNpbmcnO1xuXG5mdW5jdGlvbiBub29wICgpIHt9XG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLkNsaXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMubGlmZV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5kZWxheV1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5nYXBdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucGxheWJhY2tSYXRlXVxuICogQHBhcmFtIHtib29sZWFufG51bWJlcn0gW29wdHMubG9vcF0gSWYgbG9vcCBpcyBhIG51bWJlciwgaXQgaW5kaWNhdGUgdGhlIGxvb3AgY291bnQgb2YgYW5pbWF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gW29wdHMuZWFzaW5nXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25mcmFtZV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLm9uZmluaXNoXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25yZXN0YXJ0XVxuICovXG52YXIgQ2xpcCA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gb3B0cy5uYW1lIHx8ICcnO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IG9wdHMudGFyZ2V0O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmxpZmUgPSBvcHRzLmxpZmUgfHwgMTAwMDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kZWxheSA9IG9wdHMuZGVsYXkgfHwgMDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5nYXAgPSBvcHRzLmdhcCB8fCAwO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBsYXliYWNrUmF0ZSA9IG9wdHMucGxheWJhY2tSYXRlIHx8IDE7XG5cblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9lbGFwc2VkVGltZSA9IDA7XG5cbiAgICB0aGlzLl9sb29wID0gb3B0cy5sb29wID09IG51bGwgPyBmYWxzZSA6IG9wdHMubG9vcDtcbiAgICB0aGlzLnNldExvb3AodGhpcy5fbG9vcCk7XG5cbiAgICBpZiAob3B0cy5lYXNpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldEVhc2luZyhvcHRzLmVhc2luZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMub25mcmFtZSA9IG9wdHMub25mcmFtZSB8fCBub29wO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMub25maW5pc2ggPSBvcHRzLm9uZmluaXNoIHx8IG5vb3A7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICovXG4gICAgdGhpcy5vbnJlc3RhcnQgPSBvcHRzLm9ucmVzdGFydCB8fCBub29wO1xuXG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG59O1xuXG5DbGlwLnByb3RvdHlwZSA9IHtcblxuICAgIGdhcDogMCxcblxuICAgIGxpZmU6IDAsXG5cbiAgICBkZWxheTogMCxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IGxvb3BcbiAgICAgKi9cbiAgICBzZXRMb29wOiBmdW5jdGlvbiAobG9vcCkge1xuICAgICAgICB0aGlzLl9sb29wID0gbG9vcDtcbiAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YobG9vcCkgPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb29wUmVtYWluZWQgPSBsb29wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9vcFJlbWFpbmVkID0gMWU4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBlYXNpbmdcbiAgICAgKi9cbiAgICBzZXRFYXNpbmc6IGZ1bmN0aW9uIChlYXNpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZihlYXNpbmcpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZWFzaW5nID0gRWFzaW5nW2Vhc2luZ107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lYXNpbmcgPSBlYXNpbmc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gdGltZVxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGVwOiBmdW5jdGlvbiAodGltZSwgZGVsdGFUaW1lLCBzaWxlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gdGltZSArIHRoaXMuZGVsYXk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRlbHRhVGltZSA9IHRpbWUgLSB0aGlzLl9jdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdXJyZW50VGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuICdwYXVzZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWUgPCB0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBFTkRJR04gU3luYyA/XG4gICAgICAgIHRoaXMuX2VsYXBzZSh0aW1lLCBkZWx0YVRpbWUpO1xuXG4gICAgICAgIHZhciBwZXJjZW50ID0gTWF0aC5taW4odGhpcy5fZWxhcHNlZFRpbWUgLyB0aGlzLmxpZmUsIDEpO1xuXG4gICAgICAgIGlmIChwZXJjZW50IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNjaGVkdWxlO1xuICAgICAgICBpZiAodGhpcy5lYXNpbmcpIHtcbiAgICAgICAgICAgIHNjaGVkdWxlID0gdGhpcy5lYXNpbmcocGVyY2VudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzY2hlZHVsZSA9IHBlcmNlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdmcmFtZScsIHNjaGVkdWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJjZW50ID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbG9vcCAmJiB0aGlzLl9sb29wUmVtYWluZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzdGFydEluTG9vcCh0aW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb29wUmVtYWluZWQtLTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Jlc3RhcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayB0aGlzIGNsaXAgdG8gYmUgZGVsZXRlZFxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBhbmltYXRpb24udXBkYXRlXG4gICAgICAgICAgICAgICAgdGhpcy5fbmVlZHNSZW1vdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaW5pc2gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB0aW1lXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNldFRpbWU6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXAodGltZSArIHRoaXMuX3N0YXJ0VGltZSk7XG4gICAgfSxcblxuICAgIHJlc3RhcnQ6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIC8vIElmIHVzZXIgbGVhdmUgdGhlIHBhZ2UgZm9yIGEgd2hpbGUsIHdoZW4gaGUgZ2V0cyBiYWNrXG4gICAgICAgIC8vIEFsbCBjbGlwcyBtYXkgYmUgZXhwaXJlZCBhbmQgYWxsIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyB2YWx1ZShwb3NpdGlvbilcbiAgICAgICAgLy8gSXQgaXMgY2xlYXJseSB3cm9uZywgc28gd2UgdXNlIHJlbWFpbmRlciB0byBhZGQgYSBvZmZzZXRcblxuICAgICAgICB2YXIgcmVtYWluZGVyID0gMDtcbiAgICAgICAgLy8gUmVtYWluZGVyIGlnbm9yZWQgaWYgcmVzdGFydCBpcyBpbnZva2VkIG1hbnVhbGx5XG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9lbGFwc2UodGltZSk7XG4gICAgICAgICAgICByZW1haW5kZXIgPSB0aGlzLl9lbGFwc2VkVGltZSAlIHRoaXMubGlmZTtcbiAgICAgICAgfVxuICAgICAgICB0aW1lID0gdGltZSB8fCBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWUgLSByZW1haW5kZXIgKyB0aGlzLmRlbGF5O1xuICAgICAgICB0aGlzLl9lbGFwc2VkVGltZSA9IDA7XG5cbiAgICAgICAgdGhpcy5fbmVlZHNSZW1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGdldEVsYXBzZWRUaW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGFwc2VkVGltZTtcbiAgICB9LFxuXG4gICAgX3Jlc3RhcnRJbkxvb3A6IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWUgKyB0aGlzLmdhcDtcbiAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUgPSAwO1xuICAgIH0sXG5cbiAgICBfZWxhcHNlOiBmdW5jdGlvbiAodGltZSwgZGVsdGFUaW1lKSB7XG4gICAgICAgIHRoaXMuX2VsYXBzZWRUaW1lICs9IGRlbHRhVGltZSAqIHRoaXMucGxheWJhY2tSYXRlO1xuICAgIH0sXG5cbiAgICBmaXJlOiBmdW5jdGlvbiAoZXZlbnRUeXBlLCBhcmcpIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudFR5cGU7XG4gICAgICAgIGlmICh0aGlzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXNbZXZlbnROYW1lXSh0aGlzLnRhcmdldCwgYXJnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xpcCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgIGNsaXAubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgY2xpcC5fbG9vcCA9IHRoaXMuX2xvb3A7XG4gICAgICAgIGNsaXAuX2xvb3BSZW1haW5lZCA9IHRoaXMuX2xvb3BSZW1haW5lZDtcblxuICAgICAgICBjbGlwLmxpZmUgPSB0aGlzLmxpZmU7XG4gICAgICAgIGNsaXAuZ2FwID0gdGhpcy5nYXA7XG4gICAgICAgIGNsaXAuZGVsYXkgPSB0aGlzLmRlbGF5O1xuXG4gICAgICAgIHJldHVybiBjbGlwO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIGNsaXAuXG4gICAgICovXG4gICAgcGF1c2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBjbGlwLlxuICAgICAqL1xuICAgIHJlc3VtZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICB9XG59O1xuQ2xpcC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGlwO1xuXG5leHBvcnQgZGVmYXVsdCBDbGlwO1xuIiwiLyoqXG4gKiBAbW9kdWxlIGVjaGFydHMvYW5pbWF0aW9uL0FuaW1hdG9yXG4gKi9cbmltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5cbnZhciBhcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5mdW5jdGlvbiBkZWZhdWx0R2V0dGVyKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldO1xufVxuZnVuY3Rpb24gZGVmYXVsdFNldHRlcih0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlcihwMCwgcDEsIHBlcmNlbnQpIHtcbiAgICByZXR1cm4gKHAxIC0gcDApICogcGVyY2VudCArIHAwO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5KHAwLCBwMSwgcGVyY2VudCwgb3V0LCBhcnJEaW0pIHtcbiAgICB2YXIgbGVuID0gcDAubGVuZ3RoO1xuICAgIGlmIChhcnJEaW0gPT0gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBpbnRlcnBvbGF0ZU51bWJlcihwMFtpXSwgcDFbaV0sIHBlcmNlbnQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxlbjIgPSBwMFswXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuMjsgaisrKSB7XG4gICAgICAgICAgICAgICAgb3V0W2ldW2pdID0gaW50ZXJwb2xhdGVOdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgIHAwW2ldW2pdLCBwMVtpXVtqXSwgcGVyY2VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mKGRhdGEpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZihkYXRhKSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZihkYXRhLmxlbmd0aCkgPT0gJ251bWJlcic7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICB2YXIgbGVuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWVbMF0pKSB7XG4gICAgICAgICAgICB2YXIgcmV0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmV0LnB1c2goYXJyYXlTbGljZS5jYWxsKHZhbHVlW2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYXRtdWxsUm9tSW50ZXJwb2xhdGVBcnJheShcbiAgICBwMCwgcDEsIHAyLCBwMywgdCwgdDIsIHQzLCBvdXQsIGFyckRpbVxuKSB7XG4gICAgdmFyIGxlbiA9IHAwLmxlbmd0aDtcbiAgICBpZiAoYXJyRGltID09IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gY2F0bXVsbFJvbUludGVycG9sYXRlKFxuICAgICAgICAgICAgICAgIHAwW2ldLCBwMVtpXSwgcDJbaV0sIHAzW2ldLCB0LCB0MiwgdDNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbGVuMiA9IHAwWzBdLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW4yOyBqKyspIHtcbiAgICAgICAgICAgICAgICBvdXRbaV1bal0gPSBjYXRtdWxsUm9tSW50ZXJwb2xhdGUoXG4gICAgICAgICAgICAgICAgICAgIHAwW2ldW2pdLCBwMVtpXVtqXSwgcDJbaV1bal0sIHAzW2ldW2pdLFxuICAgICAgICAgICAgICAgICAgICB0LCB0MiwgdDNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYXRtdWxsUm9tSW50ZXJwb2xhdGUocDAsIHAxLCBwMiwgcDMsIHQsIHQyLCB0Mykge1xuICAgIHZhciB2MCA9IChwMiAtIHAwKSAqIDAuNTtcbiAgICB2YXIgdjEgPSAocDMgLSBwMSkgKiAwLjU7XG4gICAgcmV0dXJuICgyICogKHAxIC0gcDIpICsgdjAgKyB2MSkgKiB0M1xuICAgICAgICAgICAgKyAoLSAzICogKHAxIC0gcDIpIC0gMiAqIHYwIC0gdjEpICogdDJcbiAgICAgICAgICAgICsgdjAgKiB0ICsgcDE7XG59XG5cbi8vIGFycjAgaXMgc291cmNlIGFycmF5LCBhcnIxIGlzIHRhcmdldCBhcnJheS5cbi8vIERvIHNvbWUgcHJlcHJvY2VzcyB0byBhdm9pZCBlcnJvciBoYXBwZW5lZCB3aGVuIGludGVycG9sYXRpbmcgZnJvbSBhcnIwIHRvIGFycjFcbmZ1bmN0aW9uIGZpbGxBcnIoYXJyMCwgYXJyMSwgYXJyRGltKSB7XG4gICAgdmFyIGFycjBMZW4gPSBhcnIwLmxlbmd0aDtcbiAgICB2YXIgYXJyMUxlbiA9IGFycjEubGVuZ3RoO1xuICAgIGlmIChhcnIwTGVuICE9PSBhcnIxTGVuKSB7XG4gICAgICAgIC8vIEZJWE1FIE5vdCB3b3JrIGZvciBUeXBlZEFycmF5XG4gICAgICAgIHZhciBpc1ByZXZpb3VzTGFyZ2VyID0gYXJyMExlbiA+IGFycjFMZW47XG4gICAgICAgIGlmIChpc1ByZXZpb3VzTGFyZ2VyKSB7XG4gICAgICAgICAgICAvLyBDdXQgdGhlIHByZXZpb3VzXG4gICAgICAgICAgICBhcnIwLmxlbmd0aCA9IGFycjFMZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWxsIHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGFycjBMZW47IGkgPCBhcnIxTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcnIwLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGFyckRpbSA9PT0gMSA/IGFycjFbaV0gOiBhcnJheVNsaWNlLmNhbGwoYXJyMVtpXSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhhbmRsaW5nIE5hTiB2YWx1ZVxuICAgIHZhciBsZW4yID0gYXJyMFswXSAmJiBhcnIwWzBdLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycjAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFyckRpbSA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKGFycjBbaV0pKSB7XG4gICAgICAgICAgICAgICAgYXJyMFtpXSA9IGFycjFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihhcnIwW2ldW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBhcnIwW2ldW2pdID0gYXJyMVtpXVtqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlTYW1lKGFycjAsIGFycjEsIGFyckRpbSkge1xuICAgIGlmIChhcnIwID09PSBhcnIxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgbGVuID0gYXJyMC5sZW5ndGg7XG4gICAgaWYgKGxlbiAhPT0gYXJyMS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXJyRGltID09PSAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcnIwW2ldICE9PSBhcnIxW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGVuMiA9IGFycjBbMF0ubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChhcnIwW2ldW2pdICE9PSBhcnIxW2ldW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyYWNrQ2xpcChhbmltYXRvciwgZWFzaW5nLCBvbmVUcmFja0RvbmUsIGtleWZyYW1lcywgcHJvcE5hbWUsIGludGVycG9sYXRlcikge1xuICAgIHZhciBnZXR0ZXIgPSBhbmltYXRvci5fZ2V0dGVyO1xuICAgIHZhciBzZXR0ZXIgPSBhbmltYXRvci5fc2V0dGVyO1xuICAgIHZhciB1c2VTcGxpbmUgPSBlYXNpbmcgPT09ICdzcGxpbmUnO1xuXG4gICAgdmFyIHRyYWNrTGVuID0ga2V5ZnJhbWVzLmxlbmd0aDtcbiAgICBpZiAoIXRyYWNrTGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR3Vlc3MgZGF0YSB0eXBlXG4gICAgdmFyIGZpcnN0VmFsID0ga2V5ZnJhbWVzWzBdLnZhbHVlO1xuICAgIHZhciBpc1ZhbHVlQXJyYXkgPSBpc0FycmF5TGlrZShmaXJzdFZhbCk7XG5cbiAgICAvLyBGb3IgdmVydGljZXMgbW9ycGhpbmdcbiAgICB2YXIgYXJyRGltID0gKFxuICAgICAgICAgICAgaXNWYWx1ZUFycmF5XG4gICAgICAgICAgICAmJiBpc0FycmF5TGlrZShmaXJzdFZhbFswXSlcbiAgICAgICAgKVxuICAgICAgICA/IDIgOiAxO1xuICAgIC8vIFNvcnQga2V5ZnJhbWUgYXMgYXNjZW5kaW5nXG4gICAga2V5ZnJhbWVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgIH0pO1xuXG4gICAgdmFyIHRyYWNrTWF4VGltZSA9IGtleWZyYW1lc1t0cmFja0xlbiAtIDFdLnRpbWU7XG4gICAgLy8gUGVyY2VudHMgb2YgZWFjaCBrZXlmcmFtZVxuICAgIHZhciBrZlBlcmNlbnRzID0gW107XG4gICAgLy8gVmFsdWUgb2YgZWFjaCBrZXlmcmFtZVxuICAgIHZhciBrZlZhbHVlcyA9IFtdO1xuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGtleWZyYW1lc1swXS52YWx1ZTtcbiAgICB2YXIgaXNBbGxWYWx1ZUVxdWFsID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrTGVuOyBpKyspIHtcbiAgICAgICAga2ZQZXJjZW50cy5wdXNoKGtleWZyYW1lc1tpXS50aW1lIC8gdHJhY2tNYXhUaW1lKTtcblxuICAgICAgICAvLyBBc3N1bWUgdmFsdWUgaXMgYSBjb2xvciB3aGVuIGl0IGlzIGEgc3RyaW5nXG4gICAgICAgIHZhciB2YWx1ZSA9IGtleWZyYW1lc1tpXS52YWx1ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB2YWx1ZSBpcyBlcXVhbCwgZGVlcCBjaGVjayBpZiB2YWx1ZSBpcyBhcnJheVxuICAgICAgICBpZiAoISgoaXNWYWx1ZUFycmF5ICYmIGlzQXJyYXlTYW1lKHZhbHVlLCBwcmV2VmFsdWUsIGFyckRpbSkpXG4gICAgICAgICAgICB8fCAoIWlzVmFsdWVBcnJheSAmJiB2YWx1ZSA9PT0gcHJldlZhbHVlKSkpIHtcbiAgICAgICAgICAgIGlzQWxsVmFsdWVFcXVhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGtmVmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNBbGxWYWx1ZUVxdWFsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbGFzdFZhbHVlID0ga2ZWYWx1ZXNbdHJhY2tMZW4gLSAxXTtcbiAgICAvLyBQb2x5ZmlsbCBhcnJheSBhbmQgTmFOIHZhbHVlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFja0xlbiAtIDE7IGkrKykge1xuICAgICAgICBpZiAoaXNWYWx1ZUFycmF5KSB7XG4gICAgICAgICAgICBmaWxsQXJyKGtmVmFsdWVzW2ldLCBsYXN0VmFsdWUsIGFyckRpbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4oa2ZWYWx1ZXNbaV0pICYmICFpc05hTihsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAga2ZWYWx1ZXNbaV0gPSBsYXN0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNWYWx1ZUFycmF5ICYmIGZpbGxBcnIoZ2V0dGVyKGFuaW1hdG9yLl90YXJnZXQsIHByb3BOYW1lKSwgbGFzdFZhbHVlLCBhcnJEaW0pO1xuXG4gICAgLy8gQ2FjaGUgdGhlIGtleSBvZiBsYXN0IGZyYW1lIHRvIHNwZWVkIHVwIHdoZW5cbiAgICAvLyBhbmltYXRpb24gcGxheWJhY2sgaXMgc2VxdWVuY3lcbiAgICB2YXIgY2FjaGVLZXkgPSAwO1xuICAgIHZhciBjYWNoZVBlcmNlbnQgPSAwO1xuICAgIHZhciBzdGFydDtcbiAgICB2YXIgaSwgdztcbiAgICB2YXIgcDAsIHAxLCBwMiwgcDM7XG5cbiAgICB2YXIgb25mcmFtZSA9IGZ1bmN0aW9uKHRhcmdldCwgcGVyY2VudCkge1xuICAgICAgICAvLyBGaW5kIHRoZSByYW5nZSBrZXlmcmFtZXNcbiAgICAgICAgLy8ga2YxLS0tLS1rZjItLS0tLS0tLS1jdXJyZW50LS0tLS0tLS1rZjNcbiAgICAgICAgLy8gZmluZCBrZjIoaSkgYW5kIGtmMyhpKzEpIGFuZCBkbyBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGlmIChwZXJjZW50IDwgY2FjaGVQZXJjZW50KSB7XG4gICAgICAgICAgICAvLyBTdGFydCBmcm9tIG5leHQga2V5XG4gICAgICAgICAgICBzdGFydCA9IE1hdGgubWluKGNhY2hlS2V5ICsgMSwgdHJhY2tMZW4gLSAxKTtcbiAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChrZlBlcmNlbnRzW2ldIDw9IHBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IE1hdGgubWluKGksIHRyYWNrTGVuLTIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChpID0gY2FjaGVLZXk7IGkgPCB0cmFja0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtmUGVyY2VudHNbaV0gPiBwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSBNYXRoLm1pbihpLTEsIHRyYWNrTGVuLTIpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlS2V5ID0gaTtcbiAgICAgICAgY2FjaGVQZXJjZW50ID0gcGVyY2VudDtcblxuICAgICAgICB2YXIgcmFuZ2UgPSAoa2ZQZXJjZW50c1tpKzFdIC0ga2ZQZXJjZW50c1tpXSk7XG4gICAgICAgIGlmIChyYW5nZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdyA9IChwZXJjZW50IC0ga2ZQZXJjZW50c1tpXSkgLyByYW5nZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlU3BsaW5lKSB7XG4gICAgICAgICAgICBwMSA9IGtmVmFsdWVzW2ldO1xuICAgICAgICAgICAgcDAgPSBrZlZhbHVlc1tpID09PSAwID8gaSA6IGkgLSAxXTtcbiAgICAgICAgICAgIHAyID0ga2ZWYWx1ZXNbaSA+IHRyYWNrTGVuIC0gMiA/IHRyYWNrTGVuIC0gMSA6IGkgKyAxXTtcbiAgICAgICAgICAgIHAzID0ga2ZWYWx1ZXNbaSA+IHRyYWNrTGVuIC0gMyA/IHRyYWNrTGVuIC0gMSA6IGkgKyAyXTtcbiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZXIpIHtcbiAgICAgICAgICAgICAgICBzZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcih0YXJnZXQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAwLCBwMSwgcDIsIHAzLCB3XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBjYXRtdWxsUm9tSW50ZXJwb2xhdGVBcnJheShcbiAgICAgICAgICAgICAgICAgICAgcDAsIHAxLCBwMiwgcDMsIHcsIHcqdywgdyp3KncsXG4gICAgICAgICAgICAgICAgICAgIGdldHRlcih0YXJnZXQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgYXJyRGltXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjYXRtdWxsUm9tSW50ZXJwb2xhdGUocDAsIHAxLCBwMiwgcDMsIHcsIHcqdywgdyp3KncpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZXIpIHtcbiAgICAgICAgICAgICAgICBzZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcih0YXJnZXQsIHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtmVmFsdWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAga2ZWYWx1ZXNbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVmFsdWVBcnJheSkge1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRlQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgIGtmVmFsdWVzW2ldLCBrZlZhbHVlc1tpKzFdLCB3LFxuICAgICAgICAgICAgICAgICAgICBnZXR0ZXIodGFyZ2V0LCBwcm9wTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIGFyckRpbVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldHRlcihcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVOdW1iZXIoa2ZWYWx1ZXNbaV0sIGtmVmFsdWVzW2krMV0sIHcpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY2xpcCA9IG5ldyBDbGlwKHtcbiAgICAgICAgdGFyZ2V0OiBhbmltYXRvci5fdGFyZ2V0LFxuICAgICAgICBsaWZlOiB0cmFja01heFRpbWUsXG4gICAgICAgIGxvb3A6IGFuaW1hdG9yLl9sb29wLFxuICAgICAgICBkZWxheTogYW5pbWF0b3IuX2RlbGF5LFxuICAgICAgICBvbmZyYW1lOiBvbmZyYW1lLFxuICAgICAgICBvbmZpbmlzaDogb25lVHJhY2tEb25lXG4gICAgfSk7XG5cbiAgICBpZiAoZWFzaW5nICYmIGVhc2luZyAhPT0gJ3NwbGluZScpIHtcbiAgICAgICAgY2xpcC5zZXRFYXNpbmcoZWFzaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQW5pbWF0b3Igb2JqZWN0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgQW5pbWF0aW9uLnByb3RvdHlwZS5hbmltYXRlIG1ldGhvZC5cbiAqIEFmdGVyIGNyZWF0ZWQsIHdlIGNhbiB1c2Uge0BsaW5rIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yI3doZW59IHRvIGFkZCBhbGwga2V5ZnJhbWVzIGFuZCB7QGxpbmsgY2xheS5hbmltYXRpb24uQW5pbWF0b3Ijc3RhcnR9IGl0LlxuICogQ2xpcHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBhbmltYXRpb24gaW5zdGFuY2Ugd2hpY2ggY3JlYXRlZCB0aGlzIGRlZmVycmVkIG9iamVjdC5cbiAqXG4gKiBAY29uc3RydWN0b3IgY2xheS5hbmltYXRpb24uQW5pbWF0b3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxvb3BcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcnBvbGF0ZXJcbiAqL1xuZnVuY3Rpb24gQW5pbWF0b3IodGFyZ2V0LCBsb29wLCBnZXR0ZXIsIHNldHRlciwgaW50ZXJwb2xhdGVyKSB7XG4gICAgdGhpcy5fdHJhY2tzID0ge307XG4gICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgdGhpcy5fbG9vcCA9IGxvb3AgfHwgZmFsc2U7XG5cbiAgICB0aGlzLl9nZXR0ZXIgPSBnZXR0ZXIgfHwgZGVmYXVsdEdldHRlcjtcbiAgICB0aGlzLl9zZXR0ZXIgPSBzZXR0ZXIgfHwgZGVmYXVsdFNldHRlcjtcblxuICAgIHRoaXMuX2ludGVycG9sYXRlciA9IGludGVycG9sYXRlciB8fCBudWxsO1xuXG4gICAgdGhpcy5fZGVsYXkgPSAwO1xuXG4gICAgdGhpcy5fZG9uZUxpc3QgPSBbXTtcblxuICAgIHRoaXMuX29uZnJhbWVMaXN0ID0gW107XG5cbiAgICB0aGlzLl9jbGlwTGlzdCA9IFtdO1xufVxuXG5BbmltYXRvci5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogQW5pbWF0b3IsXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRpbWUgS2V5ZnJhbWUgdGltZSB1c2luZyBtaWxsaXNlY29uZFxuICAgICAqIEBwYXJhbSAge09iamVjdH0gcHJvcHMgQSBrZXktdmFsdWUgb2JqZWN0LiBWYWx1ZSBjYW4gYmUgbnVtYmVyLCAxZCBhbmQgMmQgYXJyYXlcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5BbmltYXRvcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5hbmltYXRpb24uQW5pbWF0b3IucHJvdG90eXBlXG4gICAgICovXG4gICAgd2hlbjogZnVuY3Rpb24gKHRpbWUsIHByb3BzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RyYWNrc1twcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFja3NbcHJvcE5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgLy8gSWYgdGltZSBpcyAwXG4gICAgICAgICAgICAgICAgLy8gIFRoZW4gcHJvcHMgaXMgZ2l2ZW4gaW5pdGlhbGl6ZSB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vIEVsc2VcbiAgICAgICAgICAgICAgICAvLyAgSW5pdGlhbGl6ZSB2YWx1ZSBmcm9tIGN1cnJlbnQgcHJvcCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmICh0aW1lICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrc1twcm9wTmFtZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNsb25lVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0dGVyKHRoaXMuX3RhcmdldCwgcHJvcE5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RyYWNrc1twcm9wTmFtZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgdGltZTogcGFyc2VJbnQodGltZSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBjYWxsYmFjayB3aGVuIHJ1bm5pbmcgYW5pbWF0aW9uXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxiYWNrIGhhdmUgdHdvIGFyZ3MsIGFuaW1hdGluZyB0YXJnZXQgYW5kIGN1cnJlbnQgcGVyY2VudFxuICAgICAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkFuaW1hdG9yfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmFuaW1hdGlvbi5BbmltYXRvci5wcm90b3R5cGVcbiAgICAgKi9cbiAgICBkdXJpbmc6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbmZyYW1lTGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kb25lQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIHRyYWNrc1xuICAgICAgICB0aGlzLl90cmFja3MgPSB7fTtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGNsaXBzXG4gICAgICAgIHRoaXMuX2NsaXBMaXN0Lmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdmFyIGRvbmVMaXN0ID0gdGhpcy5fZG9uZUxpc3Q7XG4gICAgICAgIHZhciBsZW4gPSBkb25lTGlzdC5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGRvbmVMaXN0W2ldLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSBhbmltYXRpb25cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd8RnVuY3Rpb259IGVhc2luZ1xuICAgICAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkFuaW1hdG9yfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmFuaW1hdGlvbi5BbmltYXRvci5wcm90b3R5cGVcbiAgICAgKi9cbiAgICBzdGFydDogZnVuY3Rpb24gKGVhc2luZykge1xuXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGNsaXBDb3VudCA9IDA7XG5cbiAgICAgICAgdmFyIG9uZVRyYWNrRG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xpcENvdW50LS07XG4gICAgICAgICAgICBpZiAoY2xpcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5fZG9uZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGxhc3RDbGlwO1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB0aGlzLl90cmFja3MpIHtcbiAgICAgICAgICAgIHZhciBjbGlwID0gY3JlYXRlVHJhY2tDbGlwKFxuICAgICAgICAgICAgICAgIHRoaXMsIGVhc2luZywgb25lVHJhY2tEb25lLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrc1twcm9wTmFtZV0sIHByb3BOYW1lLCBzZWxmLl9pbnRlcnBvbGF0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2xpcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NsaXBMaXN0LnB1c2goY2xpcCk7XG4gICAgICAgICAgICAgICAgY2xpcENvdW50Kys7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBzdGFydCBhZnRlciBhZGRlZCB0byBhbmltYXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRpb24uYWRkQ2xpcChjbGlwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXN0Q2xpcCA9IGNsaXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZHVyaW5nIGNhbGxiYWNrIG9uIHRoZSBsYXN0IGNsaXBcbiAgICAgICAgaWYgKGxhc3RDbGlwKSB7XG4gICAgICAgICAgICB2YXIgb2xkT25GcmFtZSA9IGxhc3RDbGlwLm9uZnJhbWU7XG4gICAgICAgICAgICBsYXN0Q2xpcC5vbmZyYW1lID0gZnVuY3Rpb24gKHRhcmdldCwgcGVyY2VudCkge1xuICAgICAgICAgICAgICAgIG9sZE9uRnJhbWUodGFyZ2V0LCBwZXJjZW50KTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5fb25mcmFtZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb25mcmFtZUxpc3RbaV0odGFyZ2V0LCBwZXJjZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjbGlwQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvbmVDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHRoZSBhbmltYXRpb25cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5hbmltYXRpb24uQW5pbWF0b3IucHJvdG90eXBlXG4gICAgICovXG4gICAgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NsaXBMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2xpcCA9IHRoaXMuX2NsaXBMaXN0W2ldO1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb24ucmVtb3ZlQ2xpcChjbGlwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbGlwTGlzdCA9IFtdO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVsYXkgZ2l2ZW4gbWlsbGlzZWNvbmRzXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB0aW1lXG4gICAgICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uQW5pbWF0b3J9XG4gICAgICogQG1lbWJlck9mIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGRlbGF5OiBmdW5jdGlvbiAodGltZSl7XG4gICAgICAgIHRoaXMuX2RlbGF5ID0gdGltZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBhZnRlciBhbmltYXRpb24gZmluaXNoZWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAgICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uQW5pbWF0b3J9XG4gICAgICogQG1lbWJlck9mIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGRvbmU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgIGlmIChmdW5jKSB7XG4gICAgICAgICAgICB0aGlzLl9kb25lTGlzdC5wdXNoKGZ1bmMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBjbGlwcyBjcmVhdGVkIGluIHN0YXJ0IG1ldGhvZC5cbiAgICAgKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5DbGlwW119XG4gICAgICogQG1lbWJlck9mIGNsYXkuYW5pbWF0aW9uLkFuaW1hdG9yLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGdldENsaXBzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGlwTGlzdDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRvcjtcbiIsIi8vIDFEIEJsZW5kIGNsaXAgb2YgYmxlbmQgdHJlZVxuLy8gaHR0cDovL2RvY3MudW5pdHkzZC5jb20vRG9jdW1lbnRhdGlvbi9NYW51YWwvMURCbGVuZGluZy5odG1sXG5cbmltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5cbnZhciBjbGlwU29ydEZ1bmMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhLnBvc2l0aW9uIDwgYi5wb3NpdGlvbjtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gY2xheS5hbmltYXRpb24uQmxlbmQxRENsaXAuSUNsaXBJbnB1dFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGNsaXBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKipcbiAqIDFkIGJsZW5kaW5nIG5vZGUgaW4gYW5pbWF0aW9uIGJsZW5kIHRyZWUuXG4gKiBvdXRwdXQgY2xpcCBtdXN0IGhhdmUgYmxlbmQxRCBhbmQgY29weSBtZXRob2RcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLkJsZW5kMURDbGlwXG4gKiBAZXh0ZW5kcyBjbGF5LmFuaW1hdGlvbi5DbGlwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm5hbWVdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxpZmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZGVsYXldXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZ2FwXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnBsYXliYWNrUmF0aW9dXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbb3B0cy5sb29wXSBJZiBsb29wIGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZSB0aGUgbG9vcCBjb3VudCBvZiBhbmltYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBbb3B0cy5lYXNpbmddXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbmZyYW1lXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25maW5pc2hdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbnJlc3RhcnRdXG4gKiBAcGFyYW0ge29iamVjdFtdfSBbb3B0cy5pbnB1dHNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucG9zaXRpb25dXG4gKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLkNsaXB9IFtvcHRzLm91dHB1dF1cbiAqL1xudmFyIEJsZW5kMURDbGlwID0gZnVuY3Rpb24gKG9wdHMpIHtcblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gICAgQ2xpcC5jYWxsKHRoaXMsIG9wdHMpO1xuICAgIC8qKlxuICAgICAqIE91dHB1dCBjbGlwIG11c3QgaGF2ZSBibGVuZDFEIGFuZCBjb3B5IG1ldGhvZFxuICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5DbGlwfVxuICAgICAqL1xuICAgIHRoaXMub3V0cHV0ID0gb3B0cy5vdXRwdXQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5hbmltYXRpb24uQmxlbmQxRENsaXAuSUNsaXBJbnB1dFtdfVxuICAgICAqL1xuICAgIHRoaXMuaW5wdXRzID0gb3B0cy5pbnB1dHMgfHwgW107XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcblxuICAgIHRoaXMuX2NhY2hlS2V5ID0gMDtcbiAgICB0aGlzLl9jYWNoZVBvc2l0aW9uID0gLUluZmluaXR5O1xuXG4gICAgdGhpcy5pbnB1dHMuc29ydChjbGlwU29ydEZ1bmMpO1xufTtcblxuQmxlbmQxRENsaXAucHJvdG90eXBlID0gbmV3IENsaXAoKTtcbkJsZW5kMURDbGlwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJsZW5kMURDbGlwO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvblxuICogQHBhcmFtIHtjbGF5LmFuaW1hdGlvbi5DbGlwfSBpbnB1dENsaXBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0XVxuICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uQmxlbmQxRENsaXAuSUNsaXBJbnB1dH1cbiAqL1xuQmxlbmQxRENsaXAucHJvdG90eXBlLmFkZElucHV0ID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBpbnB1dENsaXAsIG9mZnNldCkge1xuICAgIHZhciBvYmogPSB7XG4gICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgY2xpcDogaW5wdXRDbGlwLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCB8fCAwXG4gICAgfTtcbiAgICB0aGlzLmxpZmUgPSBNYXRoLm1heChpbnB1dENsaXAubGlmZSwgdGhpcy5saWZlKTtcblxuICAgIGlmICghdGhpcy5pbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRzLnB1c2gob2JqKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgdmFyIGxlbiA9IHRoaXMuaW5wdXRzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pbnB1dHNbMF0ucG9zaXRpb24gPiBwb3NpdGlvbikge1xuICAgICAgICB0aGlzLmlucHV0cy51bnNoaWZ0KG9iaik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0c1tsZW4gLSAxXS5wb3NpdGlvbiA8PSBwb3NpdGlvbikge1xuICAgICAgICB0aGlzLmlucHV0cy5wdXNoKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuX2ZpbmRLZXkocG9zaXRpb24pO1xuICAgICAgICB0aGlzLmlucHV0cy5zcGxpY2Uoa2V5LCBvYmopO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG5CbGVuZDFEQ2xpcC5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICh0aW1lLCBkVGltZSwgc2lsZW50KSB7XG5cbiAgICB2YXIgcmV0ID0gQ2xpcC5wcm90b3R5cGUuc3RlcC5jYWxsKHRoaXMsIHRpbWUpO1xuXG4gICAgaWYgKHJldCAhPT0gJ2ZpbmlzaCcpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSk7XG4gICAgfVxuXG4gICAgLy8gUEVORElORyBTY2hlZHVsZVxuICAgIGlmICghc2lsZW50ICYmIHJldCAhPT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgdGhpcy5maXJlKCdmcmFtZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxuQmxlbmQxRENsaXAucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgdmFyIGlucHV0cyA9IHRoaXMuaW5wdXRzO1xuICAgIHZhciBsZW4gPSBpbnB1dHMubGVuZ3RoO1xuICAgIHZhciBtaW4gPSBpbnB1dHNbMF0ucG9zaXRpb247XG4gICAgdmFyIG1heCA9IGlucHV0c1tsZW4tMV0ucG9zaXRpb247XG5cbiAgICBpZiAocG9zaXRpb24gPD0gbWluIHx8IHBvc2l0aW9uID49IG1heCkge1xuICAgICAgICB2YXIgaW4wID0gcG9zaXRpb24gPD0gbWluID8gaW5wdXRzWzBdIDogaW5wdXRzW2xlbi0xXTtcbiAgICAgICAgdmFyIGNsaXAgPSBpbjAuY2xpcDtcbiAgICAgICAgdmFyIG9mZnNldCA9IGluMC5vZmZzZXQ7XG4gICAgICAgIGNsaXAuc2V0VGltZSgodGltZSArIG9mZnNldCkgJSBjbGlwLmxpZmUpO1xuICAgICAgICAvLyBJbnB1dCBjbGlwIGlzIGEgYmxlbmQgY2xpcFxuICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgIGlmIChjbGlwLm91dHB1dCBpbnN0YW5jZW9mIENsaXApIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0LmNvcHkoY2xpcC5vdXRwdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXQuY29weShjbGlwKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLl9maW5kS2V5KHBvc2l0aW9uKTtcbiAgICAgICAgdmFyIGluMSA9IGlucHV0c1trZXldO1xuICAgICAgICB2YXIgaW4yID0gaW5wdXRzW2tleSArIDFdO1xuICAgICAgICB2YXIgY2xpcDEgPSBpbjEuY2xpcDtcbiAgICAgICAgdmFyIGNsaXAyID0gaW4yLmNsaXA7XG4gICAgICAgIC8vIFNldCB0aW1lIG9uIGlucHV0IGNsaXBzXG4gICAgICAgIGNsaXAxLnNldFRpbWUoKHRpbWUgKyBpbjEub2Zmc2V0KSAlIGNsaXAxLmxpZmUpO1xuICAgICAgICBjbGlwMi5zZXRUaW1lKCh0aW1lICsgaW4yLm9mZnNldCkgJSBjbGlwMi5saWZlKTtcblxuICAgICAgICB2YXIgdyA9ICh0aGlzLnBvc2l0aW9uIC0gaW4xLnBvc2l0aW9uKSAvIChpbjIucG9zaXRpb24gLSBpbjEucG9zaXRpb24pO1xuXG4gICAgICAgIHZhciBjMSA9IGNsaXAxLm91dHB1dCBpbnN0YW5jZW9mIENsaXAgPyBjbGlwMS5vdXRwdXQgOiBjbGlwMTtcbiAgICAgICAgdmFyIGMyID0gY2xpcDIub3V0cHV0IGluc3RhbmNlb2YgQ2xpcCA/IGNsaXAyLm91dHB1dCA6IGNsaXAyO1xuICAgICAgICB0aGlzLm91dHB1dC5ibGVuZDFEKGMxLCBjMiwgdyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbG9uZSBhIG5ldyBCbGVuZDFEIGNsaXBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xvbmVJbnB1dHMgVHJ1ZSBpZiBjbG9uZSB0aGUgaW5wdXQgY2xpcHNcbiAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkJsZW5kMURDbGlwfVxuICovXG5CbGVuZDFEQ2xpcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY2xvbmVJbnB1dHMpIHtcbiAgICB2YXIgY2xpcCA9IENsaXAucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgY2xpcC5vdXRwdXQgPSB0aGlzLm91dHB1dC5jbG9uZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlucHV0Q2xpcCA9IGNsb25lSW5wdXRzID8gdGhpcy5pbnB1dHNbaV0uY2xpcC5jbG9uZSh0cnVlKSA6IHRoaXMuaW5wdXRzW2ldLmNsaXA7XG4gICAgICAgIGNsaXAuYWRkSW5wdXQodGhpcy5pbnB1dHNbaV0ucG9zaXRpb24sIGlucHV0Q2xpcCwgdGhpcy5pbnB1dHNbaV0ub2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaXA7XG59O1xuXG4vLyBGaW5kIHRoZSBrZXkgd2hlcmUgcG9zaXRpb24gaW4gcmFuZ2UgW2lucHV0c1trZXldLnBvc2l0aW9uLCBpbnB1dHNba2V5KzFdLnBvc2l0aW9uKVxuQmxlbmQxRENsaXAucHJvdG90eXBlLl9maW5kS2V5ID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgdmFyIGtleSA9IC0xO1xuICAgIHZhciBpbnB1dHMgPSB0aGlzLmlucHV0cztcbiAgICB2YXIgbGVuID0gaW5wdXRzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5fY2FjaGVQb3NpdGlvbiA8IHBvc2l0aW9uKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9jYWNoZUtleTsgaSA8IGxlbi0xOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBpbnB1dHNbaV0ucG9zaXRpb24gJiYgcG9zaXRpb24gPCBpbnB1dHNbaSsxXS5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIGtleSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcyA9IE1hdGgubWluKGxlbi0yLCB0aGlzLl9jYWNoZUtleSk7XG4gICAgICAgIGZvciAodmFyIGkgPSBzOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IGlucHV0c1tpXS5wb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGlucHV0c1tpKzFdLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID49IDApIHtcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuX2NhY2hlUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmxlbmQxRENsaXA7IiwiLy8gRGVsYXVuYXkgVHJpYW5ndWxhdGlvblxuLy8gTW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vaXJvbndhbGxhYnkvZGVsYXVuYXlcbnZhciBFUFNJTE9OID0gMS4wIC8gMTA0ODU3Ni4wO1xuXG5mdW5jdGlvbiBzdXBlcnRyaWFuZ2xlKHZlcnRpY2VzKSB7XG4gICAgdmFyIHhtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHltaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHhtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHltYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIGksIGR4LCBkeSwgZG1heCwgeG1pZCwgeW1pZDtcblxuICAgIGZvciAoaSA9IHZlcnRpY2VzLmxlbmd0aDsgaS0tOyApIHtcbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzBdIDwgeG1pbikgeyB4bWluID0gdmVydGljZXNbaV1bMF07IH1cbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzBdID4geG1heCkgeyB4bWF4ID0gdmVydGljZXNbaV1bMF07IH1cbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzFdIDwgeW1pbikgeyB5bWluID0gdmVydGljZXNbaV1bMV07IH1cbiAgICAgICAgaWYgKHZlcnRpY2VzW2ldWzFdID4geW1heCkgeyB5bWF4ID0gdmVydGljZXNbaV1bMV07IH1cbiAgICB9XG5cbiAgICBkeCA9IHhtYXggLSB4bWluO1xuICAgIGR5ID0geW1heCAtIHltaW47XG4gICAgZG1heCA9IE1hdGgubWF4KGR4LCBkeSk7XG4gICAgeG1pZCA9IHhtaW4gKyBkeCAqIDAuNTtcbiAgICB5bWlkID0geW1pbiArIGR5ICogMC41O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgW3htaWQgLSAyMCAqIGRtYXgsIHltaWQgLSAgICAgIGRtYXhdLFxuICAgICAgICBbeG1pZCAgICAgICAgICAgICwgeW1pZCArIDIwICogZG1heF0sXG4gICAgICAgIFt4bWlkICsgMjAgKiBkbWF4LCB5bWlkIC0gICAgICBkbWF4XVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNpcmN1bWNpcmNsZSh2ZXJ0aWNlcywgaSwgaiwgaykge1xuICAgIHZhciB4MSA9IHZlcnRpY2VzW2ldWzBdLFxuICAgICAgICAgICAgeTEgPSB2ZXJ0aWNlc1tpXVsxXSxcbiAgICAgICAgICAgIHgyID0gdmVydGljZXNbal1bMF0sXG4gICAgICAgICAgICB5MiA9IHZlcnRpY2VzW2pdWzFdLFxuICAgICAgICAgICAgeDMgPSB2ZXJ0aWNlc1trXVswXSxcbiAgICAgICAgICAgIHkzID0gdmVydGljZXNba11bMV0sXG4gICAgICAgICAgICBmYWJzeTF5MiA9IE1hdGguYWJzKHkxIC0geTIpLFxuICAgICAgICAgICAgZmFic3kyeTMgPSBNYXRoLmFicyh5MiAtIHkzKSxcbiAgICAgICAgICAgIHhjLCB5YywgbTEsIG0yLCBteDEsIG14MiwgbXkxLCBteTIsIGR4LCBkeTtcblxuICAgIC8qIENoZWNrIGZvciBjb2luY2lkZW50IHBvaW50cyAqL1xuICAgIGlmIChmYWJzeTF5MiA8IEVQU0lMT04gJiYgZmFic3kyeTMgPCBFUFNJTE9OKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRWVrISBDb2luY2lkZW50IHBvaW50cyEnKTtcbiAgICB9XG5cbiAgICBpZiAoZmFic3kxeTIgPCBFUFNJTE9OKSB7XG4gICAgICAgIG0yICA9IC0oKHgzIC0geDIpIC8gKHkzIC0geTIpKTtcbiAgICAgICAgbXgyID0gKHgyICsgeDMpIC8gMi4wO1xuICAgICAgICBteTIgPSAoeTIgKyB5MykgLyAyLjA7XG4gICAgICAgIHhjICA9ICh4MiArIHgxKSAvIDIuMDtcbiAgICAgICAgeWMgID0gbTIgKiAoeGMgLSBteDIpICsgbXkyO1xuICAgIH1cblxuICAgIGVsc2UgaWYgKGZhYnN5MnkzIDwgRVBTSUxPTikge1xuICAgICAgICBtMSAgPSAtKCh4MiAtIHgxKSAvICh5MiAtIHkxKSk7XG4gICAgICAgIG14MSA9ICh4MSArIHgyKSAvIDIuMDtcbiAgICAgICAgbXkxID0gKHkxICsgeTIpIC8gMi4wO1xuICAgICAgICB4YyAgPSAoeDMgKyB4MikgLyAyLjA7XG4gICAgICAgIHljICA9IG0xICogKHhjIC0gbXgxKSArIG15MTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgICAgbTEgID0gLSgoeDIgLSB4MSkgLyAoeTIgLSB5MSkpO1xuICAgICAgICBtMiAgPSAtKCh4MyAtIHgyKSAvICh5MyAtIHkyKSk7XG4gICAgICAgIG14MSA9ICh4MSArIHgyKSAvIDIuMDtcbiAgICAgICAgbXgyID0gKHgyICsgeDMpIC8gMi4wO1xuICAgICAgICBteTEgPSAoeTEgKyB5MikgLyAyLjA7XG4gICAgICAgIG15MiA9ICh5MiArIHkzKSAvIDIuMDtcbiAgICAgICAgeGMgID0gKG0xICogbXgxIC0gbTIgKiBteDIgKyBteTIgLSBteTEpIC8gKG0xIC0gbTIpO1xuICAgICAgICB5YyAgPSAoZmFic3kxeTIgPiBmYWJzeTJ5MykgP1xuICAgICAgICAgICAgbTEgKiAoeGMgLSBteDEpICsgbXkxIDpcbiAgICAgICAgICAgIG0yICogKHhjIC0gbXgyKSArIG15MjtcbiAgICB9XG5cbiAgICBkeCA9IHgyIC0geGM7XG4gICAgZHkgPSB5MiAtIHljO1xuICAgIHJldHVybiB7aTogaSwgajogaiwgazogaywgeDogeGMsIHk6IHljLCByOiBkeCAqIGR4ICsgZHkgKiBkeX07XG59XG5cbmZ1bmN0aW9uIGRlZHVwKGVkZ2VzKSB7XG4gICAgdmFyIGksIGosIGEsIGIsIG0sIG47XG5cbiAgICBmb3IgKGogPSBlZGdlcy5sZW5ndGg7IGo7ICkge1xuICAgICAgICBiID0gZWRnZXNbLS1qXTtcbiAgICAgICAgYSA9IGVkZ2VzWy0tal07XG5cbiAgICAgICAgZm9yIChpID0gajsgaTsgKSB7XG4gICAgICAgICAgICBuID0gZWRnZXNbLS1pXTtcbiAgICAgICAgICAgIG0gPSBlZGdlc1stLWldO1xuXG4gICAgICAgICAgICBpZiAoKGEgPT09IG0gJiYgYiA9PT0gbikgfHwgKGEgPT09IG4gJiYgYiA9PT0gbSkpIHtcbiAgICAgICAgICAgICAgICBlZGdlcy5zcGxpY2UoaiwgMik7XG4gICAgICAgICAgICAgICAgZWRnZXMuc3BsaWNlKGksIDIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgZGVsYXVuYXkgPSB7XG4gICAgdHJpYW5ndWxhdGU6IGZ1bmN0aW9uKHZlcnRpY2VzLCBrZXkpIHtcbiAgICAgICAgdmFyIG4gPSB2ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIHZhciBpLCBqLCBpbmRpY2VzLCBzdCwgb3BlbiwgY2xvc2VkLCBlZGdlcywgZHgsIGR5LCBhLCBiLCBjO1xuXG4gICAgICAgIC8qIEJhaWwgaWYgdGhlcmUgYXJlbid0IGVub3VnaCB2ZXJ0aWNlcyB0byBmb3JtIGFueSB0cmlhbmdsZXMuICovXG4gICAgICAgIGlmIChuIDwgMykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2xpY2Ugb3V0IHRoZSBhY3R1YWwgdmVydGljZXMgZnJvbSB0aGUgcGFzc2VkIG9iamVjdHMuIChEdXBsaWNhdGUgdGhlXG4gICAgICAgICAgICAqIGFycmF5IGV2ZW4gaWYgd2UgZG9uJ3QsIHRob3VnaCwgc2luY2Ugd2UgbmVlZCB0byBtYWtlIGEgc3VwZXJ0cmlhbmdsZVxuICAgICAgICAgICAgKiBsYXRlciBvbiEpICovXG4gICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMuc2xpY2UoMCk7XG5cbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgZm9yIChpID0gbjsgaS0tOyApIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHZlcnRpY2VzW2ldW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBNYWtlIGFuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgdmVydGV4IGFycmF5LCBzb3J0ZWQgYnkgdGhlXG4gICAgICAgICAgICAqIHZlcnRpY2VzJyB4LXBvc2l0aW9uLiBGb3JjZSBzdGFibGUgc29ydGluZyBieSBjb21wYXJpbmcgaW5kaWNlcyBpZlxuICAgICAgICAgICAgKiB0aGUgeC1wb3NpdGlvbnMgYXJlIGVxdWFsLiAqL1xuICAgICAgICBpbmRpY2VzID0gbmV3IEFycmF5KG4pO1xuXG4gICAgICAgIGZvciAoaSA9IG47IGktLTsgKSB7XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGljZXMuc29ydChmdW5jdGlvbihpLCBqKSB7XG4gICAgICAgICAgICB2YXIgZGlmZiA9IHZlcnRpY2VzW2pdWzBdIC0gdmVydGljZXNbaV1bMF07XG4gICAgICAgICAgICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBpIC0gajtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTmV4dCwgZmluZCB0aGUgdmVydGljZXMgb2YgdGhlIHN1cGVydHJpYW5nbGUgKHdoaWNoIGNvbnRhaW5zIGFsbCBvdGhlclxuICAgICAgICAgICAgKiB0cmlhbmdsZXMpLCBhbmQgYXBwZW5kIHRoZW0gb250byB0aGUgZW5kIG9mIGEgKGNvcHkgb2YpIHRoZSB2ZXJ0ZXhcbiAgICAgICAgICAgICogYXJyYXkuICovXG4gICAgICAgIHN0ID0gc3VwZXJ0cmlhbmdsZSh2ZXJ0aWNlcyk7XG4gICAgICAgIHZlcnRpY2VzLnB1c2goc3RbMF0sIHN0WzFdLCBzdFsyXSk7XG5cbiAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgb3BlbiBsaXN0IChjb250YWluaW5nIHRoZSBzdXBlcnRyaWFuZ2xlIGFuZCBub3RoaW5nXG4gICAgICAgICAgICAqIGVsc2UpIGFuZCB0aGUgY2xvc2VkIGxpc3QgKHdoaWNoIGlzIGVtcHR5IHNpbmNlIHdlIGhhdm4ndCBwcm9jZXNzZWRcbiAgICAgICAgICAgICogYW55IHRyaWFuZ2xlcyB5ZXQpLiAqL1xuICAgICAgICBvcGVuICAgPSBbY2lyY3VtY2lyY2xlKHZlcnRpY2VzLCBuICsgMCwgbiArIDEsIG4gKyAyKV07XG4gICAgICAgIGNsb3NlZCA9IFtdO1xuICAgICAgICBlZGdlcyAgPSBbXTtcblxuICAgICAgICAvKiBJbmNyZW1lbnRhbGx5IGFkZCBlYWNoIHZlcnRleCB0byB0aGUgbWVzaC4gKi9cbiAgICAgICAgZm9yIChpID0gaW5kaWNlcy5sZW5ndGg7IGktLTsgZWRnZXMubGVuZ3RoID0gMCkge1xuICAgICAgICAgICAgYyA9IGluZGljZXNbaV07XG5cbiAgICAgICAgICAgIC8qIEZvciBlYWNoIG9wZW4gdHJpYW5nbGUsIGNoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCBwb2ludCBpc1xuICAgICAgICAgICAgICAgICogaW5zaWRlIGl0J3MgY2lyY3VtY2lyY2xlLiBJZiBpdCBpcywgcmVtb3ZlIHRoZSB0cmlhbmdsZSBhbmQgYWRkXG4gICAgICAgICAgICAgICAgKiBpdCdzIGVkZ2VzIHRvIGFuIGVkZ2UgbGlzdC4gKi9cbiAgICAgICAgICAgIGZvciAoaiA9IG9wZW4ubGVuZ3RoOyBqLS07ICkge1xuICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgcG9pbnQgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoaXMgdHJpYW5nbGUncyBjaXJjdW1jaXJjbGUsXG4gICAgICAgICAgICAgICAgICAgICogdGhlbiB0aGlzIHRyaWFuZ2xlIHNob3VsZCBuZXZlciBnZXQgY2hlY2tlZCBhZ2Fpbi4gUmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgb3BlbiBsaXN0LCBhZGQgaXQgdG8gdGhlIGNsb3NlZCBsaXN0LCBhbmQgc2tpcC4gKi9cbiAgICAgICAgICAgICAgICBkeCA9IHZlcnRpY2VzW2NdWzBdIC0gb3BlbltqXS54O1xuICAgICAgICAgICAgICAgIGlmIChkeCA+IDAuMCAmJiBkeCAqIGR4ID4gb3BlbltqXS5yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlZC5wdXNoKG9wZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICBvcGVuLnNwbGljZShqLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyogSWYgd2UncmUgb3V0c2lkZSB0aGUgY2lyY3VtY2lyY2xlLCBza2lwIHRoaXMgdHJpYW5nbGUuICovXG4gICAgICAgICAgICAgICAgZHkgPSB2ZXJ0aWNlc1tjXVsxXSAtIG9wZW5bal0ueTtcbiAgICAgICAgICAgICAgICBpZiAoZHggKiBkeCArIGR5ICogZHkgLSBvcGVuW2pdLnIgPiBFUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGUgdHJpYW5nbGUgYW5kIGFkZCBpdCdzIGVkZ2VzIHRvIHRoZSBlZGdlIGxpc3QuICovXG4gICAgICAgICAgICAgICAgZWRnZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgb3BlbltqXS5pLCBvcGVuW2pdLmosXG4gICAgICAgICAgICAgICAgICAgIG9wZW5bal0uaiwgb3BlbltqXS5rLFxuICAgICAgICAgICAgICAgICAgICBvcGVuW2pdLmssIG9wZW5bal0uaVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgb3Blbi5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFJlbW92ZSBhbnkgZG91YmxlZCBlZGdlcy4gKi9cbiAgICAgICAgICAgIGRlZHVwKGVkZ2VzKTtcblxuICAgICAgICAgICAgLyogQWRkIGEgbmV3IHRyaWFuZ2xlIGZvciBlYWNoIGVkZ2UuICovXG4gICAgICAgICAgICBmb3IgKGogPSBlZGdlcy5sZW5ndGg7IGo7ICkge1xuICAgICAgICAgICAgICAgIGIgPSBlZGdlc1stLWpdO1xuICAgICAgICAgICAgICAgIGEgPSBlZGdlc1stLWpdO1xuICAgICAgICAgICAgICAgIG9wZW4ucHVzaChjaXJjdW1jaXJjbGUodmVydGljZXMsIGEsIGIsIGMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIENvcHkgYW55IHJlbWFpbmluZyBvcGVuIHRyaWFuZ2xlcyB0byB0aGUgY2xvc2VkIGxpc3QsIGFuZCB0aGVuXG4gICAgICAgICAgICAqIHJlbW92ZSBhbnkgdHJpYW5nbGVzIHRoYXQgc2hhcmUgYSB2ZXJ0ZXggd2l0aCB0aGUgc3VwZXJ0cmlhbmdsZSxcbiAgICAgICAgICAgICogYnVpbGRpbmcgYSBsaXN0IG9mIHRyaXBsZXRzIHRoYXQgcmVwcmVzZW50IHRyaWFuZ2xlcy4gKi9cbiAgICAgICAgZm9yIChpID0gb3Blbi5sZW5ndGg7IGktLTsgKSB7XG4gICAgICAgICAgICBjbG9zZWQucHVzaChvcGVuW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVuLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgZm9yIChpID0gY2xvc2VkLmxlbmd0aDsgaS0tOyApIHtcbiAgICAgICAgICAgIGlmIChjbG9zZWRbaV0uaSA8IG4gJiYgY2xvc2VkW2ldLmogPCBuICYmIGNsb3NlZFtpXS5rIDwgbikge1xuICAgICAgICAgICAgICAgIG9wZW4ucHVzaChjbG9zZWRbaV0uaSwgY2xvc2VkW2ldLmosIGNsb3NlZFtpXS5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFlheSwgd2UncmUgZG9uZSEgKi9cbiAgICAgICAgcmV0dXJuIG9wZW47XG4gICAgfSxcbiAgICBjb250YWluczogZnVuY3Rpb24odHJpLCBwKSB7XG4gICAgICAgIC8qIEJvdW5kaW5nIGJveCB0ZXN0IGZpcnN0LCBmb3IgcXVpY2sgcmVqZWN0aW9ucy4gKi9cbiAgICAgICAgaWYgKChwWzBdIDwgdHJpWzBdWzBdICYmIHBbMF0gPCB0cmlbMV1bMF0gJiYgcFswXSA8IHRyaVsyXVswXSkgfHxcbiAgICAgICAgICAgICAgICAocFswXSA+IHRyaVswXVswXSAmJiBwWzBdID4gdHJpWzFdWzBdICYmIHBbMF0gPiB0cmlbMl1bMF0pIHx8XG4gICAgICAgICAgICAgICAgKHBbMV0gPCB0cmlbMF1bMV0gJiYgcFsxXSA8IHRyaVsxXVsxXSAmJiBwWzFdIDwgdHJpWzJdWzFdKSB8fFxuICAgICAgICAgICAgICAgIChwWzFdID4gdHJpWzBdWzFdICYmIHBbMV0gPiB0cmlbMV1bMV0gJiYgcFsxXSA+IHRyaVsyXVsxXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGEgPSB0cmlbMV1bMF0gLSB0cmlbMF1bMF07XG4gICAgICAgIHZhciBiID0gdHJpWzJdWzBdIC0gdHJpWzBdWzBdO1xuICAgICAgICB2YXIgYyA9IHRyaVsxXVsxXSAtIHRyaVswXVsxXTtcbiAgICAgICAgdmFyIGQgPSB0cmlbMl1bMV0gLSB0cmlbMF1bMV07XG4gICAgICAgIHZhciBpID0gYSAqIGQgLSBiICogYztcblxuICAgICAgICAvKiBEZWdlbmVyYXRlIHRyaS4gKi9cbiAgICAgICAgaWYgKGkgPT09IDAuMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdSA9IChkICogKHBbMF0gLSB0cmlbMF1bMF0pIC0gYiAqIChwWzFdIC0gdHJpWzBdWzFdKSkgLyBpLFxuICAgICAgICAgICAgICAgIHYgPSAoYSAqIChwWzFdIC0gdHJpWzBdWzFdKSAtIGMgKiAocFswXSAtIHRyaVswXVswXSkpIC8gaTtcblxuICAgICAgICAvKiBJZiB3ZSdyZSBvdXRzaWRlIHRoZSB0cmksIGZhaWwuICovXG4gICAgICAgIGlmICh1IDwgMC4wIHx8IHYgPCAwLjAgfHwgKHUgKyB2KSA+IDEuMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3UsIHZdO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlbGF1bmF5O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGdsLW1hdHJpeCAtIEhpZ2ggcGVyZm9ybWFuY2UgbWF0cml4IGFuZCB2ZWN0b3Igb3BlcmF0aW9uc1xuICogQGF1dGhvciBCcmFuZG9uIEpvbmVzXG4gKiBAYXV0aG9yIENvbGluIE1hY0tlbnppZSBJVlxuICogQHZlcnNpb24gMi4yLjJcbiAqL1xuXG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuXG4oZnVuY3Rpb24oX2dsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgc2hpbSA9IHt9O1xuICBpZiAodHlwZW9mKGV4cG9ydHMpID09PSAndW5kZWZpbmVkJykge1xuICAgIGlmKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICBzaGltLmV4cG9ydHMgPSB7fTtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNoaW0uZXhwb3J0cztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBnbC1tYXRyaXggbGl2ZXMgaW4gYSBicm93c2VyLCBkZWZpbmUgaXRzIG5hbWVzcGFjZXMgaW4gZ2xvYmFsXG4gICAgICBzaGltLmV4cG9ydHMgPSB0eXBlb2Yod2luZG93KSAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBfZ2xvYmFsO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICAvLyBnbC1tYXRyaXggbGl2ZXMgaW4gY29tbW9uanMsIGRlZmluZSBpdHMgbmFtZXNwYWNlcyBpbiBleHBvcnRzXG4gICAgc2hpbS5leHBvcnRzID0gZXhwb3J0cztcbiAgfVxuXG4gIChmdW5jdGlvbihleHBvcnRzKSB7XG4gICAgLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cblxuaWYoIUdMTUFUX0VQU0lMT04pIHtcbiAgICB2YXIgR0xNQVRfRVBTSUxPTiA9IDAuMDAwMDAxO1xufVxuXG5pZighR0xNQVRfQVJSQVlfVFlQRSkge1xuICAgIHZhciBHTE1BVF9BUlJBWV9UWVBFID0gKHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKSA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xufVxuXG5pZighR0xNQVRfUkFORE9NKSB7XG4gICAgdmFyIEdMTUFUX1JBTkRPTSA9IE1hdGgucmFuZG9tO1xufVxuXG4vKipcbiAqIEBjbGFzcyBDb21tb24gdXRpbGl0aWVzXG4gKiBAbmFtZSBnbE1hdHJpeFxuICovXG52YXIgZ2xNYXRyaXggPSB7fTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcbiAqXG4gKiBAcGFyYW0ge1R5cGV9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcbiAqL1xuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlID0gZnVuY3Rpb24odHlwZSkge1xuICAgIEdMTUFUX0FSUkFZX1RZUEUgPSB0eXBlO1xufVxuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5nbE1hdHJpeCA9IGdsTWF0cml4O1xufVxuXG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcblxuLyoqXG4qIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxuKlxuKiBAcGFyYW0ge051bWJlcn0gQW5nbGUgaW4gRGVncmVlc1xuKi9cbmdsTWF0cml4LnRvUmFkaWFuID0gZnVuY3Rpb24oYSl7XG4gICAgIHJldHVybiBhICogZGVncmVlO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDIgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMyXG4gKi9cblxudmFyIHZlYzIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDIpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSkge1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zdWIgPSB2ZWMyLnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLm11bCA9IHZlYzIubXVsdGlwbHk7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmRpdmlkZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5kaXYgPSB2ZWMyLmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgb3V0WzBdID0gYVswXSArIChiWzBdICogc2NhbGUpO1xuICAgIG91dFsxXSA9IGFbMV0gKyAoYlsxXSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjMi5kaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5kaXN0ID0gdmVjMi5kaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuc3F1YXJlZERpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgICByZXR1cm4geCp4ICsgeSp5O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuc3FyRGlzdCA9IHZlYzIuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzIubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLmxlbiA9IHZlYzIubGVuZ3RoO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cbnZlYzIuc3F1YXJlZExlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4geCp4ICsgeSp5O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckxlbiA9IHZlYzIuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IC1hWzBdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuaW52ZXJzZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMyLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59O1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMi5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV07XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICAgIHZhciByID0gR0xNQVRfUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDIgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHk7XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0MmQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDMgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMycy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMyLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjMnMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMi5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoY291bnQpIHtcbiAgICAgICAgICAgIGwgPSBNYXRoLm1pbigoY291bnQgKiBzdHJpZGUpICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICAgICAgICB2ZWNbMF0gPSBhW2ldOyB2ZWNbMV0gPSBhW2krMV07XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnKSc7XG59O1xuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy52ZWMyID0gdmVjMjtcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAzIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjM1xuICovXG5cbnZhciB2ZWMzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3ViID0gdmVjMy5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5tdWwgPSB2ZWMzLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGl2ID0gdmVjMy5kaXZpZGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGlzdCA9IHZlYzMuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyRGlzdCA9IHZlYzMuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzMubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5sZW4gPSB2ZWMzLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMzLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6Kno7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyTGVuID0gdmVjMy5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJhbmRvbSA9IGZ1bmN0aW9uIChvdXQsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG5cbiAgICB2YXIgciA9IEdMTUFUX1JBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICB2YXIgeiA9IChHTE1BVF9SQU5ET00oKSAqIDIuMCkgLSAxLjA7XG4gICAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAteip6KSAqIHNjYWxlO1xuXG4gICAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gICAgb3V0WzJdID0geiAqIHNjYWxlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV07XG4gICAgdyA9IHcgfHwgMS4wO1xuICAgIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3O1xuICAgIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3O1xuICAgIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnRyYW5zZm9ybU1hdDMgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gICAgb3V0WzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIHogKiBtWzddO1xuICAgIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1RdWF0ID0gZnVuY3Rpb24ob3V0LCBhLCBxKSB7XG4gICAgLy8gYmVuY2htYXJrczogaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnNcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM10sXG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcbiAgICAgICAgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHksXG4gICAgICAgIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6LFxuICAgICAgICBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeCxcbiAgICAgICAgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuICAgIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gICAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgICBvdXRbMl0gPSBpeiAqIHF3ICsgaXcgKiAtcXogKyBpeCAqIC1xeSAtIGl5ICogLXF4O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVggPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgdmFyIHAgPSBbXSwgcj1bXTtcbiAgICAgIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgICAgIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgICAgIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICBwWzJdID0gYVsyXSAtIGJbMl07XG5cbiAgICAgIC8vcGVyZm9ybSByb3RhdGlvblxuICAgICAgclswXSA9IHBbMF07XG4gICAgICByWzFdID0gcFsxXSpNYXRoLmNvcyhjKSAtIHBbMl0qTWF0aC5zaW4oYyk7XG4gICAgICByWzJdID0gcFsxXSpNYXRoLnNpbihjKSArIHBbMl0qTWF0aC5jb3MoYyk7XG5cbiAgICAgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgICAgIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICAgICAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gICAgICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgIHZhciBwID0gW10sIHI9W107XG4gICAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICAgIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBwWzFdID0gYVsxXSAtIGJbMV07XG4gICAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gICAgLy9wZXJmb3JtIHJvdGF0aW9uXG4gICAgclswXSA9IHBbMl0qTWF0aC5zaW4oYykgKyBwWzBdKk1hdGguY29zKGMpO1xuICAgIHJbMV0gPSBwWzFdO1xuICAgIHJbMl0gPSBwWzJdKk1hdGguY29zKGMpIC0gcFswXSpNYXRoLnNpbihjKTtcblxuICAgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVogPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICAgIHZhciBwID0gW10sIHI9W107XG4gICAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICAgIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBwWzFdID0gYVsxXSAtIGJbMV07XG4gICAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gICAgLy9wZXJmb3JtIHJvdGF0aW9uXG4gICAgclswXSA9IHBbMF0qTWF0aC5jb3MoYykgLSBwWzFdKk1hdGguc2luKGMpO1xuICAgIHJbMV0gPSBwWzBdKk1hdGguc2luKGMpICsgcFsxXSpNYXRoLmNvcyhjKTtcbiAgICByWzJdID0gcFsyXTtcblxuICAgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDM7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoY291bnQpIHtcbiAgICAgICAgICAgIGwgPSBNYXRoLm1pbigoY291bnQgKiBzdHJpZGUpICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICAgICAgICB2ZWNbMF0gPSBhW2ldOyB2ZWNbMV0gPSBhW2krMV07IHZlY1syXSA9IGFbaSsyXTtcbiAgICAgICAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgICAgICAgYVtpXSA9IHZlY1swXTsgYVtpKzFdID0gdmVjWzFdOyBhW2krMl0gPSB2ZWNbMl07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xudmVjMy5hbmdsZSA9IGZ1bmN0aW9uKGEsIGIpIHtcblxuICAgIHZhciB0ZW1wQSA9IHZlYzMuZnJvbVZhbHVlcyhhWzBdLCBhWzFdLCBhWzJdKTtcbiAgICB2YXIgdGVtcEIgPSB2ZWMzLmZyb21WYWx1ZXMoYlswXSwgYlsxXSwgYlsyXSk7XG5cbiAgICB2ZWMzLm5vcm1hbGl6ZSh0ZW1wQSwgdGVtcEEpO1xuICAgIHZlYzMubm9ybWFsaXplKHRlbXBCLCB0ZW1wQik7XG5cbiAgICB2YXIgY29zaW5lID0gdmVjMy5kb3QodGVtcEEsIHRlbXBCKTtcblxuICAgIGlmKGNvc2luZSA+IDEuMCl7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcpJztcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLnZlYzMgPSB2ZWMzO1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDQgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWM0XG4gKi9cblxudmFyIHZlYzQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XG4gKlxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xudmVjNC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoNCk7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xudmVjNC5mcm9tVmFsdWVzID0gZnVuY3Rpb24oeCwgeSwgeiwgdykge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWM0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6LCB3KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgb3V0WzNdID0gdztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSArIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zdWIgPSB2ZWM0LnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0Lm11bCA9IHZlYzQubXVsdGlwbHk7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmRpdmlkZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLyBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLyBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5kaXYgPSB2ZWM0LmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICAgIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgb3V0WzJdID0gYVsyXSAqIGI7XG4gICAgb3V0WzNdID0gYVszXSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgb3V0WzBdID0gYVswXSArIChiWzBdICogc2NhbGUpO1xuICAgIG91dFsxXSA9IGFbMV0gKyAoYlsxXSAqIHNjYWxlKTtcbiAgICBvdXRbMl0gPSBhWzJdICsgKGJbMl0gKiBzY2FsZSk7XG4gICAgb3V0WzNdID0gYVszXSArIChiWzNdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWM0LmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdLFxuICAgICAgICB3ID0gYlszXSAtIGFbM107XG4gICAgcmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnogKyB3KncpO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5kaXN0ID0gdmVjNC5kaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzQuc3F1YXJlZERpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdLFxuICAgICAgICB3ID0gYlszXSAtIGFbM107XG4gICAgcmV0dXJuIHgqeCArIHkqeSArIHoqeiArIHcqdztcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnNxckRpc3QgPSB2ZWM0LnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWM0Lmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6ICsgdyp3KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmxlbiA9IHZlYzQubGVuZ3RoO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cbnZlYzQuc3F1YXJlZExlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuc3FyTGVuID0gdmVjNC5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgb3V0WzNdID0gLWFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIG91dFszXSA9IDEuMCAvIGFbM107XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgdmFyIGxlbiA9IHgqeCArIHkqeSArIHoqeiArIHcqdztcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW47XG4gICAgICAgIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gICAgICAgIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gICAgICAgIG91dFszXSA9IGFbM10gKiBsZW47XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xudmVjNC5kb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXSxcbiAgICAgICAgYXcgPSBhWzNdO1xuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICAgIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICAgIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQucmFuZG9tID0gZnVuY3Rpb24gKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcblxuICAgIC8vVE9ETzogVGhpcyBpcyBhIHByZXR0eSBhd2Z1bCB3YXkgb2YgZG9pbmcgdGhpcy4gRmluZCBzb21ldGhpbmcgYmV0dGVyLlxuICAgIG91dFswXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIG91dFsxXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIG91dFsyXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIG91dFszXSA9IEdMTUFUX1JBTkRPTSgpO1xuICAgIHZlYzQubm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICB2ZWM0LnNjYWxlKG91dCwgb3V0LCBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLCB3ID0gYVszXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSAqIHc7XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICAgIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gICAgb3V0WzNdID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdICogdztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtxdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC50cmFuc2Zvcm1RdWF0ID0gZnVuY3Rpb24ob3V0LCBhLCBxKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl0sXG4gICAgICAgIHF4ID0gcVswXSwgcXkgPSBxWzFdLCBxeiA9IHFbMl0sIHF3ID0gcVszXSxcblxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY1xuICAgICAgICBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeSxcbiAgICAgICAgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHosXG4gICAgICAgIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4LFxuICAgICAgICBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cbiAgICAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG4gICAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgICBvdXRbMV0gPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6O1xuICAgIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWM0LmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gNDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdOyB2ZWNbM10gPSBhW2krM107XG4gICAgICAgICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgICAgICAgIGFbaV0gPSB2ZWNbMF07IGFbaSsxXSA9IHZlY1sxXTsgYVtpKzJdID0gdmVjWzJdOyBhW2krM10gPSB2ZWNbM107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSB2ZWMgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xudmVjNC5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAndmVjNCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLnZlYzQgPSB2ZWM0O1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIDJ4MiBNYXRyaXhcbiAqIEBuYW1lIG1hdDJcbiAqL1xuXG52YXIgbWF0MiA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxuICpcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xubWF0Mi5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoNCk7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDIgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gICAgaWYgKG91dCA9PT0gYSkge1xuICAgICAgICB2YXIgYTEgPSBhWzFdO1xuICAgICAgICBvdXRbMV0gPSBhWzJdO1xuICAgICAgICBvdXRbMl0gPSBhMTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbMF0gPSBhWzBdO1xuICAgICAgICBvdXRbMV0gPSBhWzJdO1xuICAgICAgICBvdXRbMl0gPSBhWzFdO1xuICAgICAgICBvdXRbM10gPSBhWzNdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSAgYTMgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWExICogZGV0O1xuICAgIG91dFsyXSA9IC1hMiAqIGRldDtcbiAgICBvdXRbM10gPSAgYTAgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgICB2YXIgYTAgPSBhWzBdO1xuICAgIG91dFswXSA9ICBhWzNdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9ICBhMDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM107XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0Mi5tdWwgPSBtYXQyLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cbm1hdDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBtYXQgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xubWF0Mi5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAnbWF0MignICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cbm1hdDIuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSkpXG59O1xuXG4vKipcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gTCB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGlucHV0IG1hdHJpeCB0byBmYWN0b3JpemVcbiAqL1xuXG5tYXQyLkxEVSA9IGZ1bmN0aW9uIChMLCBELCBVLCBhKSB7XG4gICAgTFsyXSA9IGFbMl0vYVswXTtcbiAgICBVWzBdID0gYVswXTtcbiAgICBVWzFdID0gYVsxXTtcbiAgICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdO1xuICAgIHJldHVybiBbTCwgRCwgVV07XG59O1xuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5tYXQyID0gbWF0Mjtcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyAyeDMgTWF0cml4XG4gKiBAbmFtZSBtYXQyZFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHldXG4gKiA8L3ByZT5cbiAqIFRoaXMgaXMgYSBzaG9ydCBmb3JtIGZvciB0aGUgM3gzIG1hdHJpeDpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHksXG4gKiAgMCwgMCwgMV1cbiAqIDwvcHJlPlxuICogVGhlIGxhc3Qgcm93IGlzIGlnbm9yZWQgc28gdGhlIGFycmF5IGlzIHNob3J0ZXIgYW5kIG9wZXJhdGlvbnMgYXJlIGZhc3Rlci5cbiAqL1xuXG52YXIgbWF0MmQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXG4gKlxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cbm1hdDJkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDJkIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5tYXQyZC5jbG9uZSA9IGZ1bmN0aW9uKGEpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDJkIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pZGVudGl0eSA9IGZ1bmN0aW9uKG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGFhID0gYVswXSwgYWIgPSBhWzFdLCBhYyA9IGFbMl0sIGFkID0gYVszXSxcbiAgICAgICAgYXR4ID0gYVs0XSwgYXR5ID0gYVs1XTtcblxuICAgIHZhciBkZXQgPSBhYSAqIGFkIC0gYWIgKiBhYztcbiAgICBpZighZGV0KXtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IGFkICogZGV0O1xuICAgIG91dFsxXSA9IC1hYiAqIGRldDtcbiAgICBvdXRbMl0gPSAtYWMgKiBkZXQ7XG4gICAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGFjICogYXR5IC0gYWQgKiBhdHgpICogZGV0O1xuICAgIG91dFs1XSA9IChhYiAqIGF0eCAtIGFhICogYXR5KSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQyZC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XTtcbiAgICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICAgIG91dFs1XSA9IGExICogYjQgKyBhMyAqIGI1ICsgYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyZC5tdWwgPSBtYXQyZC5tdWx0aXBseTtcblxuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyZCBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5yb3RhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgb3V0WzRdID0gYTQ7XG4gICAgb3V0WzVdID0gYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIG91dFs0XSA9IGE0O1xuICAgIG91dFs1XSA9IGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgICBvdXRbNV0gPSBhMSAqIHYwICsgYTMgKiB2MSArIGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xubWF0MmQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ21hdDJkKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0MmQuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyAxKSlcbn07XG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLm1hdDJkID0gbWF0MmQ7XG59XG47XG4vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcbmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXG5BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbihJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxuQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbihJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG5TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgM3gzIE1hdHJpeFxuICogQG5hbWUgbWF0M1xuICovXG5cbnZhciBtYXQzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQzXG4gKlxuICogQHJldHVybnMge21hdDN9IGEgbmV3IDN4MyBtYXRyaXhcbiAqL1xubWF0My5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEdMTUFUX0FSUkFZX1RZUEUoOSk7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cHBlci1sZWZ0IDN4MyB2YWx1ZXMgaW50byB0aGUgZ2l2ZW4gbWF0My5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIDN4MyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSAgIHRoZSBzb3VyY2UgNHg0IG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmZyb21NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVs0XTtcbiAgICBvdXRbNF0gPSBhWzVdO1xuICAgIG91dFs1XSA9IGFbNl07XG4gICAgb3V0WzZdID0gYVs4XTtcbiAgICBvdXRbN10gPSBhWzldO1xuICAgIG91dFs4XSA9IGFbMTBdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cbm1hdDMuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDE7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMudHJhbnNwb3NlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICAgIGlmIChvdXQgPT09IGEpIHtcbiAgICAgICAgdmFyIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGExMiA9IGFbNV07XG4gICAgICAgIG91dFsxXSA9IGFbM107XG4gICAgICAgIG91dFsyXSA9IGFbNl07XG4gICAgICAgIG91dFszXSA9IGEwMTtcbiAgICAgICAgb3V0WzVdID0gYVs3XTtcbiAgICAgICAgb3V0WzZdID0gYTAyO1xuICAgICAgICBvdXRbN10gPSBhMTI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgICAgb3V0WzFdID0gYVszXTtcbiAgICAgICAgb3V0WzJdID0gYVs2XTtcbiAgICAgICAgb3V0WzNdID0gYVsxXTtcbiAgICAgICAgb3V0WzRdID0gYVs0XTtcbiAgICAgICAgb3V0WzVdID0gYVs3XTtcbiAgICAgICAgb3V0WzZdID0gYVsyXTtcbiAgICAgICAgb3V0WzddID0gYVs1XTtcbiAgICAgICAgb3V0WzhdID0gYVs4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjEsXG4gICAgICAgIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjAsXG4gICAgICAgIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMCxcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMTtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSBiMDEgKiBkZXQ7XG4gICAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICAgIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICAgIG91dFszXSA9IGIxMSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gICAgb3V0WzZdID0gYjIxICogZGV0O1xuICAgIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdO1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGEyMiAtIGExMiAqIGEyMSk7XG4gICAgb3V0WzFdID0gKGEwMiAqIGEyMSAtIGEwMSAqIGEyMik7XG4gICAgb3V0WzJdID0gKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XG4gICAgb3V0WzNdID0gKGExMiAqIGEyMCAtIGExMCAqIGEyMik7XG4gICAgb3V0WzRdID0gKGEwMCAqIGEyMiAtIGEwMiAqIGEyMCk7XG4gICAgb3V0WzVdID0gKGEwMiAqIGExMCAtIGEwMCAqIGExMik7XG4gICAgb3V0WzZdID0gKGExMCAqIGEyMSAtIGExMSAqIGEyMCk7XG4gICAgb3V0WzddID0gKGEwMSAqIGEyMCAtIGEwMCAqIGEyMSk7XG4gICAgb3V0WzhdID0gKGEwMCAqIGExMSAtIGEwMSAqIGExMCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDMuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdO1xuXG4gICAgcmV0dXJuIGEwMCAqIChhMjIgKiBhMTEgLSBhMTIgKiBhMjEpICsgYTAxICogKC1hMjIgKiBhMTAgKyBhMTIgKiBhMjApICsgYTAyICogKGEyMSAqIGExMCAtIGExMSAqIGEyMCk7XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDMnc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBiMDAgPSBiWzBdLCBiMDEgPSBiWzFdLCBiMDIgPSBiWzJdLFxuICAgICAgICBiMTAgPSBiWzNdLCBiMTEgPSBiWzRdLCBiMTIgPSBiWzVdLFxuICAgICAgICBiMjAgPSBiWzZdLCBiMjEgPSBiWzddLCBiMjIgPSBiWzhdO1xuXG4gICAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICAgIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTtcbiAgICBvdXRbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XG5cbiAgICBvdXRbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7XG4gICAgb3V0WzRdID0gYjEwICogYTAxICsgYjExICogYTExICsgYjEyICogYTIxO1xuICAgIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcblxuICAgIG91dFs2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMDtcbiAgICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gICAgb3V0WzhdID0gYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0My5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQzLm11bCA9IG1hdDMubXVsdGlwbHk7XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcbiAgICAgICAgeCA9IHZbMF0sIHkgPSB2WzFdO1xuXG4gICAgb3V0WzBdID0gYTAwO1xuICAgIG91dFsxXSA9IGEwMTtcbiAgICBvdXRbMl0gPSBhMDI7XG5cbiAgICBvdXRbM10gPSBhMTA7XG4gICAgb3V0WzRdID0gYTExO1xuICAgIG91dFs1XSA9IGExMjtcblxuICAgIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICAgIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICAgIG91dFs4XSA9IHggKiBhMDIgKyB5ICogYTEyICsgYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF0sXG5cbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYyAqIGEwMCArIHMgKiBhMTA7XG4gICAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gICAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XG5cbiAgICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTtcbiAgICBvdXRbNV0gPSBjICogYTEyIC0gcyAqIGEwMjtcblxuICAgIG91dFs2XSA9IGEyMDtcbiAgICBvdXRbN10gPSBhMjE7XG4gICAgb3V0WzhdID0gYTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MyBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5tYXQzLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXTtcblxuICAgIG91dFswXSA9IHggKiBhWzBdO1xuICAgIG91dFsxXSA9IHggKiBhWzFdO1xuICAgIG91dFsyXSA9IHggKiBhWzJdO1xuXG4gICAgb3V0WzNdID0geSAqIGFbM107XG4gICAgb3V0WzRdID0geSAqIGFbNF07XG4gICAgb3V0WzVdID0geSAqIGFbNV07XG5cbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGEgbWF0MmQgaW50byBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNvcHlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cbm1hdDMuZnJvbU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSBhWzJdO1xuICAgIG91dFs0XSA9IGFbM107XG4gICAgb3V0WzVdID0gMDtcblxuICAgIG91dFs2XSA9IGFbNF07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7cXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xubWF0My5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFszXSA9IHl4IC0gd3o7XG4gICAgb3V0WzZdID0genggKyB3eTtcblxuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzRdID0gMSAtIHh4IC0geno7XG4gICAgb3V0WzddID0genkgLSB3eDtcblxuICAgIG91dFsyXSA9IHp4IC0gd3k7XG4gICAgb3V0WzVdID0genkgKyB3eDtcbiAgICBvdXRbOF0gPSAxIC0geHggLSB5eTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuKlxuKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4qIEBwYXJhbSB7bWF0NH0gYSBNYXQ0IHRvIGRlcml2ZSB0aGUgbm9ybWFsIG1hdHJpeCBmcm9tXG4qXG4qIEByZXR1cm5zIHttYXQzfSBvdXRcbiovXG5tYXQzLm5vcm1hbEZyb21NYXQ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzIsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgICBpZiAoIWRldCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG5cbiAgICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcblxuICAgIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzNdICsgJywgJyArIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgK1xuICAgICAgICAgICAgICAgICAgICBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICsgYVs4XSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cbm1hdDMuZnJvYiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyBNYXRoLnBvdyhhWzZdLCAyKSArIE1hdGgucG93KGFbN10sIDIpICsgTWF0aC5wb3coYVs4XSwgMikpKVxufTtcblxuXG5pZih0eXBlb2YoZXhwb3J0cykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5tYXQzID0gbWF0Mztcbn1cbjtcbi8qIENvcHlyaWdodCAoYykgMjAxMywgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxuYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG5BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcbkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXG5BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcblNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAqL1xuXG4vKipcbiAqIEBjbGFzcyA0eDQgTWF0cml4XG4gKiBAbmFtZSBtYXQ0XG4gKi9cblxudmFyIG1hdDQgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDRcbiAqXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5tYXQ0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5tYXQ0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgR0xNQVRfQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gICAgaWYgKG91dCA9PT0gYSkge1xuICAgICAgICB2YXIgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgICAgIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgICAgICBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMV0gPSBhWzRdO1xuICAgICAgICBvdXRbMl0gPSBhWzhdO1xuICAgICAgICBvdXRbM10gPSBhWzEyXTtcbiAgICAgICAgb3V0WzRdID0gYTAxO1xuICAgICAgICBvdXRbNl0gPSBhWzldO1xuICAgICAgICBvdXRbN10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzhdID0gYTAyO1xuICAgICAgICBvdXRbOV0gPSBhMTI7XG4gICAgICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzEyXSA9IGEwMztcbiAgICAgICAgb3V0WzEzXSA9IGExMztcbiAgICAgICAgb3V0WzE0XSA9IGEyMztcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbMF0gPSBhWzBdO1xuICAgICAgICBvdXRbMV0gPSBhWzRdO1xuICAgICAgICBvdXRbMl0gPSBhWzhdO1xuICAgICAgICBvdXRbM10gPSBhWzEyXTtcbiAgICAgICAgb3V0WzRdID0gYVsxXTtcbiAgICAgICAgb3V0WzVdID0gYVs1XTtcbiAgICAgICAgb3V0WzZdID0gYVs5XTtcbiAgICAgICAgb3V0WzddID0gYVsxM107XG4gICAgICAgIG91dFs4XSA9IGFbMl07XG4gICAgICAgIG91dFs5XSA9IGFbNl07XG4gICAgICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICAgICAgb3V0WzExXSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTJdID0gYVszXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbN107XG4gICAgICAgIG91dFsxNF0gPSBhWzExXTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuXG4gICAgICAgIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMCxcbiAgICAgICAgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwLFxuICAgICAgICBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTAsXG4gICAgICAgIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMSxcbiAgICAgICAgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExLFxuICAgICAgICBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTIsXG4gICAgICAgIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMCxcbiAgICAgICAgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwLFxuICAgICAgICBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzAsXG4gICAgICAgIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMSxcbiAgICAgICAgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxLFxuICAgICAgICBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzIsXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgICBpZiAoIWRldCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICAgIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xuICAgIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgb3V0WzBdICA9ICAoYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgICBvdXRbMV0gID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICAgIG91dFsyXSAgPSAgKGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzNdICA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbNF0gID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICAgIG91dFs1XSAgPSAgKGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gICAgb3V0WzZdICA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbN10gID0gIChhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICAgIG91dFs4XSAgPSAgKGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSk7XG4gICAgb3V0WzldICA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgICBvdXRbMTBdID0gIChhMDAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICAgIG91dFsxMV0gPSAtKGEwMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKSk7XG4gICAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgICBvdXRbMTNdID0gIChhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkpO1xuICAgIG91dFsxNF0gPSAtKGEwMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gICAgb3V0WzE1XSA9ICAoYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xubWF0NC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV0sXG5cbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICByZXR1cm4gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHkgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG5cbiAgICAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcbiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gYWZmaW5lIG1hdDQnc1xuICogQWRkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9waXNzYW5nXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHlBZmZpbmUgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdO1xuICAgIG91dFswXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMDtcbiAgICBvdXRbMV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjE7XG4gICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyO1xuICAgIC8vIG91dFszXSA9IDA7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdO1xuICAgIG91dFs0XSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMDtcbiAgICBvdXRbNV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjE7XG4gICAgb3V0WzZdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyO1xuICAgIC8vIG91dFs3XSA9IDA7XG5cbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTtcbiAgICBvdXRbOF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjA7XG4gICAgb3V0WzldID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxO1xuICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjI7XG4gICAgLy8gb3V0WzExXSA9IDA7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBhMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYTMyO1xuICAgIC8vIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQ0Lm11bCA9IG1hdDQubXVsdGlwbHk7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm11bHRpcGx5QWZmaW5lfVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDQubXVsQWZmaW5lID0gbWF0NC5tdWx0aXBseUFmZmluZTtcbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC50cmFuc2xhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbm1hdDQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXTtcblxuICAgIG91dFswXSA9IGFbMF0gKiB4O1xuICAgIG91dFsxXSA9IGFbMV0gKiB4O1xuICAgIG91dFsyXSA9IGFbMl0gKiB4O1xuICAgIG91dFszXSA9IGFbM10gKiB4O1xuICAgIG91dFs0XSA9IGFbNF0gKiB5O1xuICAgIG91dFs1XSA9IGFbNV0gKiB5O1xuICAgIG91dFs2XSA9IGFbNl0gKiB5O1xuICAgIG91dFs3XSA9IGFbN10gKiB5O1xuICAgIG91dFs4XSA9IGFbOF0gKiB6O1xuICAgIG91dFs5XSA9IGFbOV0gKiB6O1xuICAgIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gICAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7dmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gICAgdmFyIHggPSBheGlzWzBdLCB5ID0gYXhpc1sxXSwgeiA9IGF4aXNbMl0sXG4gICAgICAgIGxlbiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopLFxuICAgICAgICBzLCBjLCB0LFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzLFxuICAgICAgICBiMDAsIGIwMSwgYjAyLFxuICAgICAgICBiMTAsIGIxMSwgYjEyLFxuICAgICAgICBiMjAsIGIyMSwgYjIyO1xuXG4gICAgaWYgKE1hdGguYWJzKGxlbikgPCBHTE1BVF9FUFNJTE9OKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHggKj0gbGVuO1xuICAgIHkgKj0gbGVuO1xuICAgIHogKj0gbGVuO1xuXG4gICAgcyA9IE1hdGguc2luKHJhZCk7XG4gICAgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgdCA9IDEgLSBjO1xuXG4gICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdOyBhMTEgPSBhWzVdOyBhMTIgPSBhWzZdOyBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZWxlbWVudHMgb2YgdGhlIHJvdGF0aW9uIG1hdHJpeFxuICAgIGIwMCA9IHggKiB4ICogdCArIGM7IGIwMSA9IHkgKiB4ICogdCArIHogKiBzOyBiMDIgPSB6ICogeCAqIHQgLSB5ICogcztcbiAgICBiMTAgPSB4ICogeSAqIHQgLSB6ICogczsgYjExID0geSAqIHkgKiB0ICsgYzsgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gICAgYjIwID0geCAqIHogKiB0ICsgeSAqIHM7IGIyMSA9IHkgKiB6ICogdCAtIHggKiBzOyBiMjIgPSB6ICogeiAqIHQgKyBjO1xuXG4gICAgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gICAgb3V0WzFdID0gYTAxICogYjAwICsgYTExICogYjAxICsgYTIxICogYjAyO1xuICAgIG91dFsyXSA9IGEwMiAqIGIwMCArIGExMiAqIGIwMSArIGEyMiAqIGIwMjtcbiAgICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gICAgb3V0WzRdID0gYTAwICogYjEwICsgYTEwICogYjExICsgYTIwICogYjEyO1xuICAgIG91dFs1XSA9IGEwMSAqIGIxMCArIGExMSAqIGIxMSArIGEyMSAqIGIxMjtcbiAgICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gICAgb3V0WzddID0gYTAzICogYjEwICsgYTEzICogYjExICsgYTIzICogYjEyO1xuICAgIG91dFs4XSA9IGEwMCAqIGIyMCArIGExMCAqIGIyMSArIGEyMCAqIGIyMjtcbiAgICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gICAgb3V0WzEwXSA9IGEwMiAqIGIyMCArIGExMiAqIGIyMSArIGEyMiAqIGIyMjtcbiAgICBvdXRbMTFdID0gYTAzICogYjIwICsgYTEzICogYjIxICsgYTIzICogYjIyO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5yb3RhdGVYID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTEwID0gYVs0XSxcbiAgICAgICAgYTExID0gYVs1XSxcbiAgICAgICAgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSxcbiAgICAgICAgYTIxID0gYVs5XSxcbiAgICAgICAgYTIyID0gYVsxMF0sXG4gICAgICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgICAgIG91dFswXSAgPSBhWzBdO1xuICAgICAgICBvdXRbMV0gID0gYVsxXTtcbiAgICAgICAgb3V0WzJdICA9IGFbMl07XG4gICAgICAgIG91dFszXSAgPSBhWzNdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xuICAgIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICAgIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xuICAgIG91dFs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xuICAgIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICAgIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xuICAgIG91dFsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcbiAgICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMDAgPSBhWzBdLFxuICAgICAgICBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdLFxuICAgICAgICBhMjAgPSBhWzhdLFxuICAgICAgICBhMjEgPSBhWzldLFxuICAgICAgICBhMjIgPSBhWzEwXSxcbiAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICAgICAgb3V0WzRdICA9IGFbNF07XG4gICAgICAgIG91dFs1XSAgPSBhWzVdO1xuICAgICAgICBvdXRbNl0gID0gYVs2XTtcbiAgICAgICAgb3V0WzddICA9IGFbN107XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XG4gICAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gICAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gICAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XG4gICAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gICAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gICAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xuICAgIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucm90YXRlWiA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGEwMCA9IGFbMF0sXG4gICAgICAgIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sXG4gICAgICAgIGExMSA9IGFbNV0sXG4gICAgICAgIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgICAgIG91dFs4XSAgPSBhWzhdO1xuICAgICAgICBvdXRbOV0gID0gYVs5XTtcbiAgICAgICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgICAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gICAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gICAgb3V0WzJdID0gYTAyICogYyArIGExMiAqIHM7XG4gICAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gICAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gICAgb3V0WzVdID0gYTExICogYyAtIGEwMSAqIHM7XG4gICAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gICAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiBhbmQgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIHZhciBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7dmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUm90YXRpb25UcmFuc2xhdGlvbiA9IGZ1bmN0aW9uIChvdXQsIHEsIHYpIHtcbiAgICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHh5ID0geCAqIHkyLFxuICAgICAgICB4eiA9IHggKiB6MixcbiAgICAgICAgeXkgPSB5ICogeTIsXG4gICAgICAgIHl6ID0geSAqIHoyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gICAgb3V0WzFdID0geHkgKyB3ejtcbiAgICBvdXRbMl0gPSB4eiAtIHd5O1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geHkgLSB3ejtcbiAgICBvdXRbNV0gPSAxIC0gKHh4ICsgenopO1xuICAgIG91dFs2XSA9IHl6ICsgd3g7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4eiArIHd5O1xuICAgIG91dFs5XSA9IHl6IC0gd3g7XG4gICAgb3V0WzEwXSA9IDEgLSAoeHggKyB5eSk7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IHZbMF07XG4gICAgb3V0WzEzXSA9IHZbMV07XG4gICAgb3V0WzE0XSA9IHZbMl07XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxubWF0NC5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzJdID0genggLSB3eTtcbiAgICBvdXRbM10gPSAwO1xuXG4gICAgb3V0WzRdID0geXggLSB3ejtcbiAgICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgICBvdXRbNl0gPSB6eSArIHd4O1xuICAgIG91dFs3XSA9IDA7XG5cbiAgICBvdXRbOF0gPSB6eCArIHd5O1xuICAgIG91dFs5XSA9IHp5IC0gd3g7XG4gICAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICAgIG91dFsxMV0gPSAwO1xuXG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcnVzdHVtID0gZnVuY3Rpb24gKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCksXG4gICAgICAgIHRiID0gMSAvICh0b3AgLSBib3R0b20pLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gKG5lYXIgKiAyKSAqIHJsO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gKG5lYXIgKiAyKSAqIHRiO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICAgIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKGZhciAqIG5lYXIgKiAyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucGVyc3BlY3RpdmUgPSBmdW5jdGlvbiAob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGY7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoMiAqIGZhciAqIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5vcnRobyA9IGZ1bmN0aW9uIChvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpLFxuICAgICAgICBidCA9IDEgLyAoYm90dG9tIC0gdG9wKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IC0yICogbHI7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAtMiAqIGJ0O1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gKGxlZnQgKyByaWdodCkgKiBscjtcbiAgICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lmxvb2tBdCA9IGZ1bmN0aW9uIChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW4sXG4gICAgICAgIGV5ZXggPSBleWVbMF0sXG4gICAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgICB1cHkgPSB1cFsxXSxcbiAgICAgICAgdXB6ID0gdXBbMl0sXG4gICAgICAgIGNlbnRlcnggPSBjZW50ZXJbMF0sXG4gICAgICAgIGNlbnRlcnkgPSBjZW50ZXJbMV0sXG4gICAgICAgIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgR0xNQVRfRVBTSUxPTiAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBHTE1BVF9FUFNJTE9OICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IEdMTUFUX0VQU0lMT04pIHtcbiAgICAgICAgcmV0dXJuIG1hdDQuaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQ0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQ0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVs4XSArICcsICcgKyBhWzldICsgJywgJyArIGFbMTBdICsgJywgJyArIGFbMTFdICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIGFbMTJdICsgJywgJyArIGFbMTNdICsgJywgJyArIGFbMTRdICsgJywgJyArIGFbMTVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0NC5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSArIE1hdGgucG93KGFbOV0sIDIpICsgTWF0aC5wb3coYVsxMF0sIDIpICsgTWF0aC5wb3coYVsxMV0sIDIpICsgTWF0aC5wb3coYVsxMl0sIDIpICsgTWF0aC5wb3coYVsxM10sIDIpICsgTWF0aC5wb3coYVsxNF0sIDIpICsgTWF0aC5wb3coYVsxNV0sIDIpICkpXG59O1xuXG5cbmlmKHR5cGVvZihleHBvcnRzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBvcnRzLm1hdDQgPSBtYXQ0O1xufVxuO1xuLyogQ29weXJpZ2h0IChjKSAyMDEzLCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXG5hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG5USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG5XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG5ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxuQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG5MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xuU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovXG5cbi8qKlxuICogQGNsYXNzIFF1YXRlcm5pb25cbiAqIEBuYW1lIHF1YXRcbiAqL1xuXG52YXIgcXVhdCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxuICpcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKi9cbnF1YXQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBHTE1BVF9BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxuICogdmVjdG9yIHRvIGFub3RoZXIuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRpb25UbyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdG1wdmVjMyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLDAsMCk7XG4gICAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLDEsMCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcbiAgICAgICAgaWYgKGRvdCA8IC0wLjk5OTk5OSkge1xuICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB4VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgaWYgKHZlYzMubGVuZ3RoKHRtcHZlYzMpIDwgMC4wMDAwMDEpXG4gICAgICAgICAgICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICAgICAgICBxdWF0LnNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgICAgICAgb3V0WzBdID0gMDtcbiAgICAgICAgICAgIG91dFsxXSA9IDA7XG4gICAgICAgICAgICBvdXRbMl0gPSAwO1xuICAgICAgICAgICAgb3V0WzNdID0gMTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIGEsIGIpO1xuICAgICAgICAgICAgb3V0WzBdID0gdG1wdmVjM1swXTtcbiAgICAgICAgICAgIG91dFsxXSA9IHRtcHZlYzNbMV07XG4gICAgICAgICAgICBvdXRbMl0gPSB0bXB2ZWMzWzJdO1xuICAgICAgICAgICAgb3V0WzNdID0gMSArIGRvdDtcbiAgICAgICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSByaWdodCB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJyaWdodFwiIGRpcmVjdGlvblxuICogQHBhcmFtIHt2ZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnNldEF4ZXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgICAgIG1hdHJbMF0gPSByaWdodFswXTtcbiAgICAgICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgICAgICBtYXRyWzZdID0gcmlnaHRbMl07XG5cbiAgICAgICAgbWF0clsxXSA9IHVwWzBdO1xuICAgICAgICBtYXRyWzRdID0gdXBbMV07XG4gICAgICAgIG1hdHJbN10gPSB1cFsyXTtcblxuICAgICAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICAgICAgbWF0cls4XSA9IC12aWV3WzJdO1xuXG4gICAgICAgIHJldHVybiBxdWF0Lm5vcm1hbGl6ZShvdXQsIHF1YXQuZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY2xvbmUgPSB2ZWM0LmNsb25lO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuY29weSA9IHZlYzQuY29weTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zZXQgPSB2ZWM0LnNldDtcblxuLyoqXG4gKiBTZXQgYSBxdWF0IHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIGFyb3VuZCB3aGljaCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqKi9cbnF1YXQuc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24ob3V0LCBheGlzLCByYWQpIHtcbiAgICByYWQgPSByYWQgKiAwLjU7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICAgIG91dFswXSA9IHMgKiBheGlzWzBdO1xuICAgIG91dFsxXSA9IHMgKiBheGlzWzFdO1xuICAgIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICAgIG91dFszXSA9IE1hdGguY29zKHJhZCk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmFkZCA9IHZlYzQuYWRkO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lm11bCA9IHF1YXQubXVsdGlwbHk7XG5cbi8qKlxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zY2FsZSA9IHZlYzQuc2NhbGU7XG5cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnJvdGF0ZVggPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICByYWQgKj0gMC41O1xuXG4gICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXSxcbiAgICAgICAgYnggPSBNYXRoLnNpbihyYWQpLCBidyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieDtcbiAgICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHJhZCAqPSAwLjU7XG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieSA9IE1hdGguc2luKHJhZCksIGJ3ID0gTWF0aC5jb3MocmFkKTtcblxuICAgIG91dFswXSA9IGF4ICogYncgLSBheiAqIGJ5O1xuICAgIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5O1xuICAgIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICAgIG91dFszXSA9IGF3ICogYncgLSBheSAqIGJ5O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWiBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5yb3RhdGVaID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgcmFkICo9IDAuNTtcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ6ID0gTWF0aC5zaW4ocmFkKSwgYncgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gICAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYno7XG4gICAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXG4gKiBBc3N1bWVzIHRoYXQgcXVhdGVybmlvbiBpcyAxIHVuaXQgaW4gbGVuZ3RoLlxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG5cbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZG90ID0gdmVjNC5kb3Q7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVycCA9IHZlYzQubGVycDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50IGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5zbGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICAvLyBiZW5jaG1hcmtzOlxuICAgIC8vICAgIGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tc2xlcnAtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgYXggPSBhWzBdLCBheSA9IGFbMV0sIGF6ID0gYVsyXSwgYXcgPSBhWzNdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdLCBidyA9IGJbM107XG5cbiAgICB2YXIgICAgICAgIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxO1xuXG4gICAgLy8gY2FsYyBjb3NpbmVcbiAgICBjb3NvbSA9IGF4ICogYnggKyBheSAqIGJ5ICsgYXogKiBieiArIGF3ICogYnc7XG4gICAgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG4gICAgaWYgKCBjb3NvbSA8IDAuMCApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICggKDEuMCAtIGNvc29tKSA+IDAuMDAwMDAxICkge1xuICAgICAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcbiAgICAgICAgb21lZ2EgID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICAgICAgc2lub20gID0gTWF0aC5zaW4ob21lZ2EpO1xuICAgICAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICAgICAgc2NhbGUxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFwiZnJvbVwiIGFuZCBcInRvXCIgcXVhdGVybmlvbnMgYXJlIHZlcnkgY2xvc2VcbiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgICAgICBzY2FsZTEgPSB0O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzXG4gICAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgICBvdXRbMV0gPSBzY2FsZTAgKiBheSArIHNjYWxlMSAqIGJ5O1xuICAgIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7XG4gICAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIGRvdCA9IGEwKmEwICsgYTEqYTEgKyBhMiphMiArIGEzKmEzLFxuICAgICAgICBpbnZEb3QgPSBkb3QgPyAxLjAvZG90IDogMDtcblxuICAgIC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgICBvdXRbMF0gPSAtYTAqaW52RG90O1xuICAgIG91dFsxXSA9IC1hMSppbnZEb3Q7XG4gICAgb3V0WzJdID0gLWEyKmludkRvdDtcbiAgICBvdXRbM10gPSBhMyppbnZEb3Q7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgcXVhdFxuICogSWYgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0LmludmVyc2UgYW5kIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5jb25qdWdhdGUgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubGVuZ3RoID0gdmVjNC5sZW5ndGg7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmxlbiA9IHF1YXQubGVuZ3RoO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5zcXVhcmVkTGVuZ3RoID0gdmVjNC5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuc3FyTGVuID0gcXVhdC5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0ZXJuaW9uIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubm9ybWFsaXplID0gdmVjNC5ub3JtYWxpemU7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gM3gzIHJvdGF0aW9uIG1hdHJpeC5cbiAqXG4gKiBOT1RFOiBUaGUgcmVzdWx0YW50IHF1YXRlcm5pb24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIHlvdSBzaG91bGQgYmUgc3VyZVxuICogdG8gcmVub3JtYWxpemUgdGhlIHF1YXRlcm5pb24geW91cnNlbGYgd2hlcmUgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHttYXQzfSBtIHJvdGF0aW9uIG1hdHJpeFxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZnJvbU1hdDMgPSBmdW5jdGlvbihvdXQsIG0pIHtcbiAgICAvLyBBbGdvcml0aG0gaW4gS2VuIFNob2VtYWtlJ3MgYXJ0aWNsZSBpbiAxOTg3IFNJR0dSQVBIIGNvdXJzZSBub3Rlc1xuICAgIC8vIGFydGljbGUgXCJRdWF0ZXJuaW9uIENhbGN1bHVzIGFuZCBGYXN0IEFuaW1hdGlvblwiLlxuICAgIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gICAgdmFyIGZSb290O1xuXG4gICAgaWYgKCBmVHJhY2UgPiAwLjAgKSB7XG4gICAgICAgIC8vIHx3fCA+IDEvMiwgbWF5IGFzIHdlbGwgY2hvb3NlIHcgPiAxLzJcbiAgICAgICAgZlJvb3QgPSBNYXRoLnNxcnQoZlRyYWNlICsgMS4wKTsgIC8vIDJ3XG4gICAgICAgIG91dFszXSA9IDAuNSAqIGZSb290O1xuICAgICAgICBmUm9vdCA9IDAuNS9mUm9vdDsgIC8vIDEvKDR3KVxuICAgICAgICBvdXRbMF0gPSAobVs1XS1tWzddKSpmUm9vdDtcbiAgICAgICAgb3V0WzFdID0gKG1bNl0tbVsyXSkqZlJvb3Q7XG4gICAgICAgIG91dFsyXSA9IChtWzFdLW1bM10pKmZSb290O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHx3fCA8PSAxLzJcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICBpZiAoIG1bNF0gPiBtWzBdIClcbiAgICAgICAgICBpID0gMTtcbiAgICAgICAgaWYgKCBtWzhdID4gbVtpKjMraV0gKVxuICAgICAgICAgIGkgPSAyO1xuICAgICAgICB2YXIgaiA9IChpKzEpJTM7XG4gICAgICAgIHZhciBrID0gKGkrMiklMztcblxuICAgICAgICBmUm9vdCA9IE1hdGguc3FydChtW2kqMytpXS1tW2oqMytqXS1tW2sqMytrXSArIDEuMCk7XG4gICAgICAgIG91dFtpXSA9IDAuNSAqIGZSb290O1xuICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290O1xuICAgICAgICBvdXRbM10gPSAobVtqKjMra10gLSBtW2sqMytqXSkgKiBmUm9vdDtcbiAgICAgICAgb3V0W2pdID0gKG1baiozK2ldICsgbVtpKjMral0pICogZlJvb3Q7XG4gICAgICAgIG91dFtrXSA9IChtW2sqMytpXSArIG1baSozK2tdKSAqIGZSb290O1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBxdWF0ZW5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5xdWF0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdxdWF0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxuaWYodHlwZW9mKGV4cG9ydHMpICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMucXVhdCA9IHF1YXQ7XG59XG47XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgfSkoc2hpbS5leHBvcnRzKTtcbn0pKHRoaXMpOyIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHZlYzIgPSBnbE1hdHJpeC52ZWMyO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5WZWN0b3IyXG4gKiBAcGFyYW0ge251bWJlcn0geFxuICogQHBhcmFtIHtudW1iZXJ9IHlcbiAqL1xudmFyIFZlY3RvcjIgPSBmdW5jdGlvbih4LCB5KSB7XG5cbiAgICB4ID0geCB8fCAwO1xuICAgIHkgPSB5IHx8IDA7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIFZlY3RvcjIsIHJlYWQgYW5kIHdyaXRlIG9mIHgsIHkgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhcnJheVxuICAgICAqIEFsbCBtZXRob2RzIGFsc28gb3BlcmF0ZSBvbiB0aGUgYXJyYXkgaW5zdGVhZCBvZiB4LCB5IGNvbXBvbmVudHNcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3IyI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSB2ZWMyLmZyb21WYWx1ZXMoeCwgeSk7XG5cbiAgICAvKipcbiAgICAgKiBEaXJ0eSBmbGFnIGlzIHVzZWQgYnkgdGhlIE5vZGUgdG8gZGV0ZXJtaW5lXG4gICAgICogaWYgdGhlIG1hdHJpeCBpcyB1cGRhdGVkIHRvIGxhdGVzdFxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguVmVjdG9yMiNcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG59O1xuXG5WZWN0b3IyLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBWZWN0b3IyLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGIgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIuYWRkKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgeCBhbmQgeSBjb21wb25lbnRzXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgeFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHlcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBzZXQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IHg7XG4gICAgICAgIHRoaXMuYXJyYXlbMV0gPSB5O1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgeCBhbmQgeSBjb21wb25lbnRzIGZyb20gYXJyYXlcbiAgICAgKiBAcGFyYW0gIHtGbG9hdDMyQXJyYXl8bnVtYmVyW119IGFyclxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIHNldEFycmF5OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IGFyclswXTtcbiAgICAgICAgdGhpcy5hcnJheVsxXSA9IGFyclsxXTtcblxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBWZWN0b3IyXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IHgsIHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIuY29weSh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3Jvc3MgcHJvZHVjdCBvZiBzZWxmIGFuZCBiLCB3cml0dGVuIHRvIGEgVmVjdG9yMyBvdXRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBjcm9zczogZnVuY3Rpb24ob3V0LCBiKSB7XG4gICAgICAgIHZlYzIuY3Jvc3Mob3V0LmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGlzdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLmRpc3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3RhbmNlIGJldHdlZW4gc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRpc3RhbmNlOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLmRpc3RhbmNlKHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGl2aWRlXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBkaXY6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjMi5kaXYodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSBzZWxmIGJ5IGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIGRpdmlkZTogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWMyLmRpdmlkZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRG90IHByb2R1Y3Qgb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRvdDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjMi5kb3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmVjMi5sZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLmxlbmd0aCh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBhIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBsZXJwOiBmdW5jdGlvbihhLCBiLCB0KSB7XG4gICAgICAgIHZlYzIubGVycCh0aGlzLmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBtaW46IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjMi5taW4odGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgbWF4OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIubWF4KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgbXVsdGlwbHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIG11bDogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWMyLm11bCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0aXBseSBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICBtdWx0aXBseTogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWMyLm11bHRpcGx5KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGUgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIG5lZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZlYzIubmVnYXRlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZlYzIubm9ybWFsaXplKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSByYW5kb20geCwgeSBjb21wb25lbnRzIHdpdGggYSBnaXZlbiBzY2FsZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAgICAgKi9cbiAgICByYW5kb206IGZ1bmN0aW9uKHNjYWxlKSB7XG4gICAgICAgIHZlYzIucmFuZG9tKHRoaXMuYXJyYXksIHNjYWxlKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgc2VsZlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc2NhbGU6IGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgdmVjMi5zY2FsZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBzKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgYiBhbmQgYWRkIHRvIHNlbGZcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc2NhbGVBbmRBZGQ6IGZ1bmN0aW9uKGIsIHMpIHtcbiAgICAgICAgdmVjMi5zY2FsZUFuZEFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5LCBzKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHNxdWFyZWREaXN0YW5jZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckRpc3Q6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHZlYzIuc3FyRGlzdCh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzcXVhcmVkRGlzdGFuY2U6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHZlYzIuc3F1YXJlZERpc3RhbmNlKHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Igc3F1YXJlZExlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzcXJMZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmVjMi5zcXJMZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgbGVuZ3RoIG9mIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZExlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWMyLnNxdWFyZWRMZW5ndGgodGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzdWJ0cmFjdFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc3ViOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzIuc3ViKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCBiIGZyb20gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgc3VidHJhY3Q6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjMi5zdWJ0cmFjdCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIE1hdHJpeDIgbVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MjogZnVuY3Rpb24obSkge1xuICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDIodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgbS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBzZWxmIHdpdGggYSBNYXRyaXgyZCBtXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MmQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmVjMi50cmFuc2Zvcm1NYXQyZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBtLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIE1hdHJpeDMgbVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MzogZnVuY3Rpb24obSkge1xuICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDModGhpcy5hcnJheSwgdGhpcy5hcnJheSwgbS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBzZWxmIHdpdGggYSBNYXRyaXg0IG1cbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIHRyYW5zZm9ybU1hdDQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmVjMi50cmFuc2Zvcm1NYXQ0KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIG0uYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnWycgKyBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHRoaXMuYXJyYXksICcsJykgKyAnXSc7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpO1xuICAgIH1cbn07XG5cbi8vIEdldHRlciBhbmQgU2V0dGVyXG5pZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG5cbiAgICB2YXIgcHJvdG8gPSBWZWN0b3IyLnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBAbmFtZSB4XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICd4Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzBdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVswXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSB5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICd5Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzFdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVsxXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIFN1cHBseSBtZXRob2RzIHRoYXQgYXJlIG5vdCBpbiBwbGFjZVxuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMi5hZGQob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB5XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHkpIHtcbiAgICB2ZWMyLnNldChvdXQuYXJyYXksIHgsIHkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBiKSB7XG4gICAgdmVjMi5jb3B5KG91dC5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzIuY3Jvc3Mob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjIuZGlzdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gdmVjMi5kaXN0YW5jZShhLmFycmF5LCBiLmFycmF5KTtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjIuZGlzdGFuY2UgPSBWZWN0b3IyLmRpc3Q7XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuZGl2ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMi5kaXZpZGUob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLmRpdmlkZSA9IFZlY3RvcjIuZGl2O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMi5kb3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIHZlYzIuZG90KGEuYXJyYXksIGIuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IyLmxlbiA9IGZ1bmN0aW9uKGIpIHtcbiAgICByZXR1cm4gdmVjMi5sZW5ndGgoYi5hcnJheSk7XG59O1xuXG4vLyBWZWN0b3IyLmxlbmd0aCA9IFZlY3RvcjIubGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIubGVycCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgdCkge1xuICAgIHZlYzIubGVycChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzIubWluKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMyLm1heChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLm11bCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzIubXVsdGlwbHkob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLm11bHRpcGx5ID0gVmVjdG9yMi5tdWw7XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2ZWMyLm5lZ2F0ZShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmVjMi5ub3JtYWxpemUob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICovXG5WZWN0b3IyLnJhbmRvbSA9IGZ1bmN0aW9uKG91dCwgc2NhbGUpIHtcbiAgICB2ZWMyLnJhbmRvbShvdXQuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgc2NhbGUpIHtcbiAgICB2ZWMyLnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgc2NhbGUpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi5zY2FsZUFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICB2ZWMyLnNjYWxlQW5kQWRkKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSwgc2NhbGUpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMi5zcXJEaXN0ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWMyLnNxckRpc3QoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IyLnNxdWFyZWREaXN0YW5jZSA9IFZlY3RvcjIuc3FyRGlzdDtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IyLnNxckxlbiA9IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gdmVjMi5zcXJMZW4oYS5hcnJheSk7XG59O1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjIuc3F1YXJlZExlbmd0aCA9IFZlY3RvcjIuc3FyTGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuc3ViID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMi5zdWJ0cmFjdChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIuc3VidHJhY3QgPSBWZWN0b3IyLnN1Yjtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi50cmFuc2Zvcm1NYXQyID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMi50cmFuc2Zvcm1NYXQyKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gIGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gbVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIudHJhbnNmb3JtTWF0MmQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2ZWMyLnRyYW5zZm9ybU1hdDJkKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtNYXRyaXgzfSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yMn1cbiAqL1xuVmVjdG9yMi50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMi50cmFuc2Zvcm1NYXQzKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gKi9cblZlY3RvcjIudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZlYzIudHJhbnNmb3JtTWF0NChvdXQuYXJyYXksIGEuYXJyYXksIG0uYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWZWN0b3IyO1xuIiwiLy8gMkQgQmxlbmQgY2xpcCBvZiBibGVuZCB0cmVlXG4vLyBodHRwOi8vZG9jcy51bml0eTNkLmNvbS9Eb2N1bWVudGF0aW9uL01hbnVhbC8yREJsZW5kaW5nLmh0bWxcbmltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5pbXBvcnQgZGVsYXVuYXkgZnJvbSAnLi4vdXRpbC9kZWxhdW5heSc7XG5pbXBvcnQgVmVjdG9yMiBmcm9tICcuLi9tYXRoL1ZlY3RvcjInO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IGNsYXkuYW5pbWF0aW9uLkJsZW5kMkRDbGlwLklDbGlwSW5wdXRcbiAqIEBwcm9wZXJ0eSB7Y2xheS5tYXRoLlZlY3RvcjJ9IHBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGNsaXBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKipcbiAqIDJkIGJsZW5kaW5nIG5vZGUgaW4gYW5pbWF0aW9uIGJsZW5kIHRyZWUuXG4gKiBvdXRwdXQgY2xpcCBtdXN0IGhhdmUgYmxlbmQyRCBtZXRob2RcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuYW5pbWF0aW9uLkJsZW5kMkRDbGlwXG4gKiBAZXh0ZW5kcyBjbGF5LmFuaW1hdGlvbi5DbGlwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm5hbWVdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxpZmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZGVsYXldXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZ2FwXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnBsYXliYWNrUmF0aW9dXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbb3B0cy5sb29wXSBJZiBsb29wIGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZSB0aGUgbG9vcCBjb3VudCBvZiBhbmltYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBbb3B0cy5lYXNpbmddXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbmZyYW1lXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25maW5pc2hdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbnJlc3RhcnRdXG4gKiBAcGFyYW0ge29iamVjdFtdfSBbb3B0cy5pbnB1dHNdXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IyfSBbb3B0cy5wb3NpdGlvbl1cbiAqIEBwYXJhbSB7Y2xheS5hbmltYXRpb24uQ2xpcH0gW29wdHMub3V0cHV0XVxuICovXG52YXIgQmxlbmQyRENsaXAgPSBmdW5jdGlvbiAob3B0cykge1xuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICBDbGlwLmNhbGwodGhpcywgb3B0cyk7XG4gICAgLyoqXG4gICAgICogT3V0cHV0IGNsaXAgbXVzdCBoYXZlIGJsZW5kMkQgbWV0aG9kXG4gICAgICogQHR5cGUge2NsYXkuYW5pbWF0aW9uLkNsaXB9XG4gICAgICovXG4gICAgdGhpcy5vdXRwdXQgPSBvcHRzLm91dHB1dCB8fCBudWxsO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5CbGVuZDJEQ2xpcC5JQ2xpcElucHV0W119XG4gICAgICovXG4gICAgdGhpcy5pbnB1dHMgPSBvcHRzLmlucHV0cyB8fCBbXTtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjJ9XG4gICAgICovXG4gICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBWZWN0b3IyKCk7XG5cbiAgICB0aGlzLl9jYWNoZVRyaWFuZ2xlID0gbnVsbDtcblxuICAgIHRoaXMuX3RyaWFuZ2xlcyA9IFtdO1xuXG4gICAgdGhpcy5fdXBkYXRlVHJpYW5nbGVzKCk7XG59O1xuXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUgPSBuZXcgQ2xpcCgpO1xuQmxlbmQyRENsaXAucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmxlbmQyRENsaXA7XG4vKipcbiAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjJ9IHBvc2l0aW9uXG4gKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGlucHV0Q2xpcFxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRdXG4gKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5CbGVuZDJEQ2xpcC5JQ2xpcElucHV0fVxuICovXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuYWRkSW5wdXQgPSBmdW5jdGlvbiAocG9zaXRpb24sIGlucHV0Q2xpcCwgb2Zmc2V0KSB7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgICAgcG9zaXRpb24gOiBwb3NpdGlvbixcbiAgICAgICAgY2xpcCA6IGlucHV0Q2xpcCxcbiAgICAgICAgb2Zmc2V0IDogb2Zmc2V0IHx8IDBcbiAgICB9O1xuICAgIHRoaXMuaW5wdXRzLnB1c2gob2JqKTtcbiAgICB0aGlzLmxpZmUgPSBNYXRoLm1heChpbnB1dENsaXAubGlmZSwgdGhpcy5saWZlKTtcbiAgICAvLyBUT0RPIENoYW5nZSB0byBpbmNyZW1lbnRhbGx5IGFkZGluZ1xuICAgIHRoaXMuX3VwZGF0ZVRyaWFuZ2xlcygpO1xuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIERlbGF1bmF5IHRyaWFuZ3VsYXRlXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuX3VwZGF0ZVRyaWFuZ2xlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXRzID0gdGhpcy5pbnB1dHMubWFwKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBhLnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIHRoaXMuX3RyaWFuZ2xlcyA9IGRlbGF1bmF5LnRyaWFuZ3VsYXRlKGlucHV0cywgJ2FycmF5Jyk7XG59O1xuXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICh0aW1lLCBkVGltZSwgc2lsZW50KSB7XG5cbiAgICB2YXIgcmV0ID0gQ2xpcC5wcm90b3R5cGUuc3RlcC5jYWxsKHRoaXMsIHRpbWUpO1xuXG4gICAgaWYgKHJldCAhPT0gJ2ZpbmlzaCcpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSk7XG4gICAgfVxuXG4gICAgLy8gUEVORElORyBTY2hlZHVsZVxuICAgIGlmICghc2lsZW50ICYmIHJldCAhPT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgdGhpcy5maXJlKCdmcmFtZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxuQmxlbmQyRENsaXAucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHZhciByZXMgPSB0aGlzLl9maW5kVHJpYW5nbGUodGhpcy5wb3NpdGlvbik7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJbiBCYXJ5Y2VudHJpY1xuICAgIHZhciBhID0gcmVzWzFdOyAvLyBQZXJjZW50IG9mIGNsaXAyXG4gICAgdmFyIGIgPSByZXNbMl07IC8vIFBlcmNlbnQgb2YgY2xpcDNcblxuICAgIHZhciB0cmkgPSByZXNbMF07XG5cbiAgICB2YXIgaW4xID0gdGhpcy5pbnB1dHNbdHJpLmluZGljZXNbMF1dO1xuICAgIHZhciBpbjIgPSB0aGlzLmlucHV0c1t0cmkuaW5kaWNlc1sxXV07XG4gICAgdmFyIGluMyA9IHRoaXMuaW5wdXRzW3RyaS5pbmRpY2VzWzJdXTtcbiAgICB2YXIgY2xpcDEgPSBpbjEuY2xpcDtcbiAgICB2YXIgY2xpcDIgPSBpbjIuY2xpcDtcbiAgICB2YXIgY2xpcDMgPSBpbjMuY2xpcDtcblxuICAgIGNsaXAxLnNldFRpbWUoKHRpbWUgKyBpbjEub2Zmc2V0KSAlIGNsaXAxLmxpZmUpO1xuICAgIGNsaXAyLnNldFRpbWUoKHRpbWUgKyBpbjIub2Zmc2V0KSAlIGNsaXAyLmxpZmUpO1xuICAgIGNsaXAzLnNldFRpbWUoKHRpbWUgKyBpbjMub2Zmc2V0KSAlIGNsaXAzLmxpZmUpO1xuXG4gICAgdmFyIGMxID0gY2xpcDEub3V0cHV0IGluc3RhbmNlb2YgQ2xpcCA/IGNsaXAxLm91dHB1dCA6IGNsaXAxO1xuICAgIHZhciBjMiA9IGNsaXAyLm91dHB1dCBpbnN0YW5jZW9mIENsaXAgPyBjbGlwMi5vdXRwdXQgOiBjbGlwMjtcbiAgICB2YXIgYzMgPSBjbGlwMy5vdXRwdXQgaW5zdGFuY2VvZiBDbGlwID8gY2xpcDMub3V0cHV0IDogY2xpcDM7XG5cbiAgICB0aGlzLm91dHB1dC5ibGVuZDJEKGMxLCBjMiwgYzMsIGEsIGIpO1xufTtcblxuLyoqXG4gKiBDbG9uZSBhIG5ldyBCbGVuZDJEIGNsaXBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xvbmVJbnB1dHMgVHJ1ZSBpZiBjbG9uZSB0aGUgaW5wdXQgY2xpcHNcbiAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkJsZW5kMkRDbGlwfVxuICovXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY2xvbmVJbnB1dHMpIHtcbiAgICB2YXIgY2xpcCA9IENsaXAucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgY2xpcC5vdXRwdXQgPSB0aGlzLm91dHB1dC5jbG9uZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlucHV0Q2xpcCA9IGNsb25lSW5wdXRzID8gdGhpcy5pbnB1dHNbaV0uY2xpcC5jbG9uZSh0cnVlKSA6IHRoaXMuaW5wdXRzW2ldLmNsaXA7XG4gICAgICAgIGNsaXAuYWRkSW5wdXQodGhpcy5pbnB1dHNbaV0ucG9zaXRpb24sIGlucHV0Q2xpcCwgdGhpcy5pbnB1dHNbaV0ub2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaXA7XG59O1xuXG5CbGVuZDJEQ2xpcC5wcm90b3R5cGUuX2ZpbmRUcmlhbmdsZSA9IGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgIGlmICh0aGlzLl9jYWNoZVRyaWFuZ2xlKSB7XG4gICAgICAgIHZhciByZXMgPSBkZWxhdW5heS5jb250YWlucyh0aGlzLl9jYWNoZVRyaWFuZ2xlLnZlcnRpY2VzLCBwb3NpdGlvbi5hcnJheSk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5fY2FjaGVUcmlhbmdsZSwgcmVzWzBdLCByZXNbMV1dO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdHJpYW5nbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0cmkgPSB0aGlzLl90cmlhbmdsZXNbaV07XG4gICAgICAgIHZhciByZXMgPSBkZWxhdW5heS5jb250YWlucyh0cmkudmVydGljZXMsIHRoaXMucG9zaXRpb24uYXJyYXkpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZVRyaWFuZ2xlID0gdHJpO1xuICAgICAgICAgICAgcmV0dXJuIFt0cmksIHJlc1swXSwgcmVzWzFdXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJsZW5kMkRDbGlwOyIsImltcG9ydCBDbGlwIGZyb20gJy4vQ2xpcCc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG5mdW5jdGlvbiBrZXlmcmFtZVNvcnQoYSwgYikge1xuICAgIHJldHVybiBhLnRpbWUgLSBiLnRpbWU7XG59XG5cbnZhciBUcmFuc2Zvcm1UcmFjayA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cbiAgICB0aGlzLm5hbWUgPSBvcHRzLm5hbWUgfHwgJyc7XG4gICAgLy9be1xuICAgIC8vICB0aW1lOiAvL21zXG4gICAgLy8gIHBvc2l0aW9uOiAgLy8gb3B0aW9uYWxcbiAgICAvLyAgcm90YXRpb246ICAvLyBvcHRpb25hbFxuICAgIC8vICBzY2FsZTogICAgIC8vIG9wdGlvbmFsXG4gICAgLy99XVxuICAgIHRoaXMua2V5RnJhbWVzID0gW107XG4gICAgaWYgKG9wdHMua2V5RnJhbWVzKSB7XG4gICAgICAgIHRoaXMuYWRkS2V5RnJhbWVzKG9wdHMua2V5RnJhbWVzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHRoaXMucm90YXRpb24gPSBxdWF0LmNyZWF0ZSgpO1xuXG4gICAgdGhpcy5zY2FsZSA9IHZlYzMuZnJvbVZhbHVlcygxLCAxLCAxKTtcblxuICAgIHRoaXMuX2NhY2hlS2V5ID0gMDtcbiAgICB0aGlzLl9jYWNoZVRpbWUgPSAwO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGlwLnByb3RvdHlwZSk7XG5cblRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRyYW5zZm9ybVRyYWNrO1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICh0aW1lLCBkVGltZSwgc2lsZW50KSB7XG5cbiAgICB2YXIgcmV0ID0gQ2xpcC5wcm90b3R5cGUuc3RlcC5jYWxsKHRoaXMsIHRpbWUsIGRUaW1lLCB0cnVlKTtcblxuICAgIGlmIChyZXQgIT09ICdmaW5pc2gnKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh0aGlzLmdldEVsYXBzZWRUaW1lKCkpO1xuICAgIH1cblxuICAgIC8vIFBFTkRJTkcgU2NoZWR1bGVcbiAgICBpZiAoIXNpbGVudCAmJiByZXQgIT09ICdwYXVzZWQnKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZnJhbWUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHRoaXMuX2ludGVycG9sYXRlRmllbGQodGltZSwgJ3Bvc2l0aW9uJyk7XG4gICAgdGhpcy5faW50ZXJwb2xhdGVGaWVsZCh0aW1lLCAncm90YXRpb24nKTtcbiAgICB0aGlzLl9pbnRlcnBvbGF0ZUZpZWxkKHRpbWUsICdzY2FsZScpO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLmdldE1heFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtmID0gdGhpcy5rZXlGcmFtZXNbdGhpcy5rZXlGcmFtZXMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGtmID8ga2YudGltZSA6IDA7XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYWRkS2V5RnJhbWUgPSBmdW5jdGlvbiAoa2YpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMua2V5RnJhbWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICB2YXIgcHJldkZyYW1lID0gdGhpcy5rZXlGcmFtZXNbaV07XG4gICAgICAgIHZhciBuZXh0RnJhbWUgPSB0aGlzLmtleUZyYW1lc1tpICsgMV07XG4gICAgICAgIGlmIChwcmV2RnJhbWUudGltZSA8PSBrZi50aW1lICYmIG5leHRGcmFtZS50aW1lID49IGtmLnRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMua2V5RnJhbWVzLnNwbGljZShpLCAwLCBrZik7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGlmZSA9IGtmLnRpbWU7XG4gICAgdGhpcy5rZXlGcmFtZXMucHVzaChrZik7XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYWRkS2V5RnJhbWVzID0gZnVuY3Rpb24gKGtmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2ZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMua2V5RnJhbWVzLnB1c2goa2ZzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLmtleUZyYW1lcy5zb3J0KGtleWZyYW1lU29ydCk7XG5cbiAgICB0aGlzLmxpZmUgPSB0aGlzLmtleUZyYW1lc1t0aGlzLmtleUZyYW1lcy5sZW5ndGggLSAxXS50aW1lO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUZpZWxkID0gZnVuY3Rpb24gKHRpbWUsIGZpZWxkTmFtZSkge1xuICAgIHZhciBrZnMgPSB0aGlzLmtleUZyYW1lcztcbiAgICB2YXIgbGVuID0ga2ZzLmxlbmd0aDtcbiAgICB2YXIgc3RhcnQ7XG4gICAgdmFyIGVuZDtcblxuICAgIGlmICgha2ZzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aW1lIDwga2ZzWzBdLnRpbWUgfHwgdGltZSA+IGtmc1trZnMubGVuZ3RoLTFdLnRpbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGltZSA8IHRoaXMuX2NhY2hlVGltZSkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuX2NhY2hlS2V5ID49IGxlbi0xID8gbGVuLTEgOiB0aGlzLl9jYWNoZUtleSsxO1xuICAgICAgICBmb3IgKHZhciBpID0gczsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChrZnNbaV0udGltZSA8PSB0aW1lICYmIGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBrZnNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlVGltZSA9IHRpbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgZW5kID0ga2ZzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX2NhY2hlS2V5OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChrZnNbaV0udGltZSA8PSB0aW1lICYmIGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBrZnNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlVGltZSA9IHRpbWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtmc1tpXVtmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgZW5kID0ga2ZzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgICB2YXIgcGVyY2VudCA9ICh0aW1lIC0gc3RhcnQudGltZSkgLyAoZW5kLnRpbWUgLSBzdGFydC50aW1lKTtcbiAgICAgICAgcGVyY2VudCA9IE1hdGgubWF4KE1hdGgubWluKHBlcmNlbnQsIDEpLCAwKTtcbiAgICAgICAgaWYgKGZpZWxkTmFtZSA9PT0gJ3JvdGF0aW9uJykge1xuICAgICAgICAgICAgcXVhdC5zbGVycCh0aGlzW2ZpZWxkTmFtZV0sIHN0YXJ0W2ZpZWxkTmFtZV0sIGVuZFtmaWVsZE5hbWVdLCBwZXJjZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlYzMubGVycCh0aGlzW2ZpZWxkTmFtZV0sIHN0YXJ0W2ZpZWxkTmFtZV0sIGVuZFtmaWVsZE5hbWVdLCBwZXJjZW50KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gMDtcbiAgICAgICAgdGhpcy5fY2FjaGVUaW1lID0gMDtcbiAgICB9XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYmxlbmQxRCA9IGZ1bmN0aW9uICh0MSwgdDIsIHcpIHtcbiAgICB2ZWMzLmxlcnAodGhpcy5wb3NpdGlvbiwgdDEucG9zaXRpb24sIHQyLnBvc2l0aW9uLCB3KTtcbiAgICB2ZWMzLmxlcnAodGhpcy5zY2FsZSwgdDEuc2NhbGUsIHQyLnNjYWxlLCB3KTtcbiAgICBxdWF0LnNsZXJwKHRoaXMucm90YXRpb24sIHQxLnJvdGF0aW9uLCB0Mi5yb3RhdGlvbiwgdyk7XG59O1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYmxlbmQyRCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHExID0gcXVhdC5jcmVhdGUoKTtcbiAgICB2YXIgcTIgPSBxdWF0LmNyZWF0ZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiAodDEsIHQyLCB0MywgZiwgZykge1xuICAgICAgICB2YXIgYSA9IDEgLSBmIC0gZztcblxuICAgICAgICB0aGlzLnBvc2l0aW9uWzBdID0gdDEucG9zaXRpb25bMF0gKiBhICsgdDIucG9zaXRpb25bMF0gKiBmICsgdDMucG9zaXRpb25bMF0gKiBnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uWzFdID0gdDEucG9zaXRpb25bMV0gKiBhICsgdDIucG9zaXRpb25bMV0gKiBmICsgdDMucG9zaXRpb25bMV0gKiBnO1xuICAgICAgICB0aGlzLnBvc2l0aW9uWzJdID0gdDEucG9zaXRpb25bMl0gKiBhICsgdDIucG9zaXRpb25bMl0gKiBmICsgdDMucG9zaXRpb25bMl0gKiBnO1xuXG4gICAgICAgIHRoaXMuc2NhbGVbMF0gPSB0MS5zY2FsZVswXSAqIGEgKyB0Mi5zY2FsZVswXSAqIGYgKyB0My5zY2FsZVswXSAqIGc7XG4gICAgICAgIHRoaXMuc2NhbGVbMV0gPSB0MS5zY2FsZVsxXSAqIGEgKyB0Mi5zY2FsZVsxXSAqIGYgKyB0My5zY2FsZVsxXSAqIGc7XG4gICAgICAgIHRoaXMuc2NhbGVbMl0gPSB0MS5zY2FsZVsyXSAqIGEgKyB0Mi5zY2FsZVsyXSAqIGYgKyB0My5zY2FsZVsyXSAqIGc7XG5cbiAgICAgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9iYjIwNTQwMyh2PXZzLjg1KS5hc3B4XG4gICAgICAgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbWljcm9zb2Z0LmRpcmVjdHhfc2RrLnF1YXRlcm5pb24ueG1xdWF0ZXJuaW9uYmFyeWNlbnRyaWModj12cy44NSkuYXNweFxuICAgICAgICB2YXIgcyA9IGYgKyBnO1xuICAgICAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICAgICAgcXVhdC5jb3B5KHRoaXMucm90YXRpb24sIHQxLnJvdGF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YXQuc2xlcnAocTEsIHQxLnJvdGF0aW9uLCB0Mi5yb3RhdGlvbiwgcyk7XG4gICAgICAgICAgICBxdWF0LnNsZXJwKHEyLCB0MS5yb3RhdGlvbiwgYzMucm90YXRpb24sIHMpO1xuICAgICAgICAgICAgcXVhdC5zbGVycCh0aGlzLnJvdGF0aW9uLCBxMSwgcTIsIGcgLyBzKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5UcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuYWRkaXRpdmVCbGVuZCA9IGZ1bmN0aW9uICh0MSwgdDIpIHtcbiAgICB2ZWMzLmFkZCh0aGlzLnBvc2l0aW9uLCB0MS5wb3NpdGlvbiwgdDIucG9zaXRpb24pO1xuICAgIHZlYzMuYWRkKHRoaXMuc2NhbGUsIHQxLnNjYWxlLCB0Mi5zY2FsZSk7XG4gICAgcXVhdC5tdWx0aXBseSh0aGlzLnJvdGF0aW9uLCB0Mi5yb3RhdGlvbiwgdDEucm90YXRpb24pO1xufTtcblxuVHJhbnNmb3JtVHJhY2sucHJvdG90eXBlLnN1YnRyYWN0aXZlQmxlbmQgPSBmdW5jdGlvbiAodDEsIHQyKSB7XG4gICAgdmVjMy5zdWIodGhpcy5wb3NpdGlvbiwgdDEucG9zaXRpb24sIHQyLnBvc2l0aW9uKTtcbiAgICB2ZWMzLnN1Yih0aGlzLnNjYWxlLCB0MS5zY2FsZSwgdDIuc2NhbGUpO1xuICAgIHF1YXQuaW52ZXJ0KHRoaXMucm90YXRpb24sIHQyLnJvdGF0aW9uKTtcbiAgICBxdWF0Lm11bHRpcGx5KHRoaXMucm90YXRpb24sIHRoaXMucm90YXRpb24sIHQxLnJvdGF0aW9uKTtcbn07XG5cblRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5nZXRTdWJDbGlwID0gZnVuY3Rpb24gKHN0YXJ0VGltZSwgZW5kVGltZSkge1xuICAgIC8vIFRPRE9cbiAgICBjb25zb2xlLndhcm4oJ1RPRE8nKTtcbn07XG5cblRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdHJhY2sgPSBUcmFuc2Zvcm1UcmFjay5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICB0cmFjay5rZXlGcmFtZXMgPSB0aGlzLmtleUZyYW1lcztcblxuICAgIHZlYzMuY29weSh0cmFjay5wb3NpdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgcXVhdC5jb3B5KHRyYWNrLnJvdGF0aW9uLCB0aGlzLnJvdGF0aW9uKTtcbiAgICB2ZWMzLmNvcHkodHJhY2suc2NhbGUsIHRoaXMuc2NhbGUpO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xufTtcblxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2Zvcm1UcmFjaztcbiIsIi8vIFNhbXBsZXIgY2xpcCBpcyBlc3BlY2lhbGx5IGZvciB0aGUgYW5pbWF0aW9uIHNhbXBsZXIgaW4gZ2xURlxuLy8gVXNlIFR5cGVkIEFycmF5IGNhbiByZWR1Y2UgYSBsb3Qgb2YgaGVhcCBtZW1vcnlcbi8vXG4vLyBUT0RPIFN5bmMgdGFyZ2V0IHRyYW5zZm9ybVxuXG5pbXBvcnQgVHJhbnNmb3JtVHJhY2sgZnJvbSAnLi9UcmFuc2Zvcm1UcmFjayc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG4vLyBsZXJwIGZ1bmN0aW9uIHdpdGggb2Zmc2V0IGluIGxhcmdlIGFycmF5XG5mdW5jdGlvbiB2ZWMzbGVycChvdXQsIGEsIGIsIHQsIG9hLCBvYikge1xuICAgIHZhciBheCA9IGFbb2FdO1xuICAgIHZhciBheSA9IGFbb2EgKyAxXTtcbiAgICB2YXIgYXogPSBhW29hICsgMl07XG4gICAgb3V0WzBdID0gYXggKyB0ICogKGJbb2JdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiW29iICsgMV0gLSBheSk7XG4gICAgb3V0WzJdID0gYXogKyB0ICogKGJbb2IgKyAyXSAtIGF6KTtcblxuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHF1YXRTbGVycChvdXQsIGEsIGIsIHQsIG9hLCBvYikge1xuICAgIC8vIGJlbmNobWFya3M6XG4gICAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcblxuICAgIHZhciBheCA9IGFbMCArIG9hXSwgYXkgPSBhWzEgKyBvYV0sIGF6ID0gYVsyICsgb2FdLCBhdyA9IGFbMyArIG9hXSxcbiAgICAgICAgYnggPSBiWzAgKyBvYl0sIGJ5ID0gYlsxICsgb2JdLCBieiA9IGJbMiArIG9iXSwgYncgPSBiWzMgKyBvYl07XG5cbiAgICB2YXIgb21lZ2EsIGNvc29tLCBzaW5vbSwgc2NhbGUwLCBzY2FsZTE7XG5cbiAgICAvLyBjYWxjIGNvc2luZVxuICAgIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidztcbiAgICAvLyBhZGp1c3Qgc2lnbnMgKGlmIG5lY2Vzc2FyeSlcbiAgICBpZiAoY29zb20gPCAwLjApIHtcbiAgICAgICAgY29zb20gPSAtY29zb207XG4gICAgICAgIGJ4ID0gLSBieDtcbiAgICAgICAgYnkgPSAtIGJ5O1xuICAgICAgICBieiA9IC0gYno7XG4gICAgICAgIGJ3ID0gLSBidztcbiAgICB9XG4gICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuICAgIGlmICgoMS4wIC0gY29zb20pID4gMC4wMDAwMDEpIHtcbiAgICAgICAgLy8gc3RhbmRhcmQgY2FzZSAoc2xlcnApXG4gICAgICAgIG9tZWdhICA9IE1hdGguYWNvcyhjb3NvbSk7XG4gICAgICAgIHNpbm9tICA9IE1hdGguc2luKG9tZWdhKTtcbiAgICAgICAgc2NhbGUwID0gTWF0aC5zaW4oKDEuMCAtIHQpICogb21lZ2EpIC8gc2lub207XG4gICAgICAgIHNjYWxlMSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vICdmcm9tJyBhbmQgJ3RvJyBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgICAgICAvLyAgLi4uIHNvIHdlIGNhbiBkbyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgICAgIHNjYWxlMCA9IDEuMCAtIHQ7XG4gICAgICAgIHNjYWxlMSA9IHQ7XG4gICAgfVxuICAgIC8vIGNhbGN1bGF0ZSBmaW5hbCB2YWx1ZXNcbiAgICBvdXRbMF0gPSBzY2FsZTAgKiBheCArIHNjYWxlMSAqIGJ4O1xuICAgIG91dFsxXSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7XG4gICAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgICBvdXRbM10gPSBzY2FsZTAgKiBhdyArIHNjYWxlMSAqIGJ3O1xuXG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTYW1wbGVyVHJhY2sgbWFuYWdlcyBgcG9zaXRpb25gLCBgcm90YXRpb25gLCBgc2NhbGVgIHRyYWNrcyBpbiBhbmltYXRpb24gb2Ygc2luZ2xlIHNjZW5lIG5vZGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2tcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5uYW1lXSBUcmFjayBuYW1lXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW29wdHMudGFyZ2V0XSBUYXJnZXQgbm9kZSdzIHRyYW5zZm9ybSB3aWxsIHVwZGF0ZWQgYXV0b21hdGljYWxseVxuICovXG52YXIgU2FtcGxlclRyYWNrID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIHRoaXMubmFtZSA9IG9wdHMubmFtZSB8fCAnJztcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IG9wdHMudGFyZ2V0IHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLnBvc2l0aW9uID0gdmVjMy5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBSb3RhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIHF1YXRlcm5pb25cbiAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxuICAgICAqL1xuICAgIHRoaXMucm90YXRpb24gPSBxdWF0LmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5zY2FsZSA9IHZlYzMuZnJvbVZhbHVlcygxLCAxLCAxKTtcblxuICAgIHRoaXMuY2hhbm5lbHMgPSB7XG4gICAgICAgIHRpbWU6IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgICByb3RhdGlvbjogbnVsbCxcbiAgICAgICAgc2NhbGU6IG51bGxcbiAgICB9O1xuXG4gICAgdGhpcy5fY2FjaGVLZXkgPSAwO1xuICAgIHRoaXMuX2NhY2hlVGltZSA9IDA7XG59O1xuXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIGlmICghdGhpcy5jaGFubmVscy50aW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNoYW5uZWxzID0gdGhpcy5jaGFubmVscztcbiAgICB2YXIgbGVuID0gY2hhbm5lbHMudGltZS5sZW5ndGg7XG4gICAgdmFyIGtleSA9IC0xO1xuICAgIC8vIE9ubHkgb25lIGZyYW1lXG4gICAgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICBpZiAoY2hhbm5lbHMucm90YXRpb24pIHtcbiAgICAgICAgICAgIHF1YXQuY29weSh0aGlzLnJvdGF0aW9uLCBjaGFubmVscy5yb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5uZWxzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICB2ZWMzLmNvcHkodGhpcy5wb3NpdGlvbiwgY2hhbm5lbHMucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5zY2FsZSkge1xuICAgICAgICAgICAgdmVjMy5jb3B5KHRoaXMuc2NhbGUsIGNoYW5uZWxzLnNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENsYW1wXG4gICAgZWxzZSBpZiAodGltZSA8PSBjaGFubmVscy50aW1lWzBdKSB7XG4gICAgICAgIHRpbWUgPSBjaGFubmVscy50aW1lWzBdO1xuICAgICAgICBrZXkgPSAwO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aW1lID49IGNoYW5uZWxzLnRpbWVbbGVuIC0gMV0pIHtcbiAgICAgICAgdGltZSA9IGNoYW5uZWxzLnRpbWVbbGVuIC0gMV07XG4gICAgICAgIGtleSA9IGxlbiAtIDI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodGltZSA8IHRoaXMuX2NhY2hlVGltZSkge1xuICAgICAgICAgICAgdmFyIHMgPSBNYXRoLm1pbihsZW4gLSAxLCB0aGlzLl9jYWNoZUtleSArIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHM7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzLnRpbWVbaSAtIDFdIDw9IHRpbWUgJiYgY2hhbm5lbHMudGltZVtpXSA+IHRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9jYWNoZUtleTsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjaGFubmVscy50aW1lW2ldIDw9IHRpbWUgJiYgY2hhbm5lbHMudGltZVtpICsgMV0gPiB0aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID4gLTEpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuX2NhY2hlVGltZSA9IHRpbWU7XG4gICAgICAgIHZhciBzdGFydCA9IGtleTtcbiAgICAgICAgdmFyIGVuZCA9IGtleSArIDE7XG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBjaGFubmVscy50aW1lW3N0YXJ0XTtcbiAgICAgICAgdmFyIGVuZFRpbWUgPSBjaGFubmVscy50aW1lW2VuZF07XG4gICAgICAgIHZhciByYW5nZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICAgIHZhciBwZXJjZW50ID0gcmFuZ2UgPT09IDAgPyAwIDogKHRpbWUgLSBzdGFydFRpbWUpIC8gcmFuZ2U7XG5cbiAgICAgICAgaWYgKGNoYW5uZWxzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBxdWF0U2xlcnAodGhpcy5yb3RhdGlvbiwgY2hhbm5lbHMucm90YXRpb24sIGNoYW5uZWxzLnJvdGF0aW9uLCBwZXJjZW50LCBzdGFydCAqIDQsIGVuZCAqIDQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5wb3NpdGlvbikge1xuICAgICAgICAgICAgdmVjM2xlcnAodGhpcy5wb3NpdGlvbiwgY2hhbm5lbHMucG9zaXRpb24sIGNoYW5uZWxzLnBvc2l0aW9uLCBwZXJjZW50LCBzdGFydCAqIDMsIGVuZCAqIDMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5zY2FsZSkge1xuICAgICAgICAgICAgdmVjM2xlcnAodGhpcy5zY2FsZSwgY2hhbm5lbHMuc2NhbGUsIGNoYW5uZWxzLnNjYWxlLCBwZXJjZW50LCBzdGFydCAqIDMsIGVuZCAqIDMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIExvb3AgaGFuZGxpbmdcbiAgICBpZiAoa2V5ID09IGxlbiAtIDIpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSAwO1xuICAgICAgICB0aGlzLl9jYWNoZVRpbWUgPSAwO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVGFyZ2V0KCk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSB0cmFuc2Zvcm0gb2YgdGFyZ2V0IG5vZGUgbWFudWFsbHlcbiAqL1xuU2FtcGxlclRyYWNrLnByb3RvdHlwZS51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoYW5uZWxzID0gdGhpcy5jaGFubmVscztcbiAgICBpZiAodGhpcy50YXJnZXQpIHtcbiAgICAgICAgLy8gT25seSB1cGRhdGUgdGFyZ2V0IHByb3AgaWYgaGF2ZSBkYXRhLlxuICAgICAgICBpZiAoY2hhbm5lbHMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc2l0aW9uLnNldEFycmF5KHRoaXMucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFubmVscy5yb3RhdGlvbikge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQucm90YXRpb24uc2V0QXJyYXkodGhpcy5yb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5uZWxzLnNjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5zY2FsZS5zZXRBcnJheSh0aGlzLnNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLmdldE1heFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbHMudGltZVt0aGlzLmNoYW5uZWxzLnRpbWUubGVuZ3RoIC0gMV07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFRpbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRUaW1lXG4gKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t9XG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuZ2V0U3ViVHJhY2sgPSBmdW5jdGlvbiAoc3RhcnRUaW1lLCBlbmRUaW1lKSB7XG5cbiAgICB2YXIgc3ViQ2xpcCA9IG5ldyBTYW1wbGVyVHJhY2soe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWVcbiAgICB9KTtcbiAgICB2YXIgbWluVGltZSA9IHRoaXMuY2hhbm5lbHMudGltZVswXTtcbiAgICBzdGFydFRpbWUgPSBNYXRoLm1pbihNYXRoLm1heChzdGFydFRpbWUsIG1pblRpbWUpLCB0aGlzLmxpZmUpO1xuICAgIGVuZFRpbWUgPSBNYXRoLm1pbihNYXRoLm1heChlbmRUaW1lLCBtaW5UaW1lKSwgdGhpcy5saWZlKTtcblxuICAgIHZhciByYW5nZVN0YXJ0ID0gdGhpcy5fZmluZFJhbmdlKHN0YXJ0VGltZSk7XG4gICAgdmFyIHJhbmdlRW5kID0gdGhpcy5fZmluZFJhbmdlKGVuZFRpbWUpO1xuXG4gICAgdmFyIGNvdW50ID0gcmFuZ2VFbmRbMF0gLSByYW5nZVN0YXJ0WzBdICsgMTtcbiAgICBpZiAocmFuZ2VTdGFydFsxXSA9PT0gMCAmJiByYW5nZUVuZFsxXSA9PT0gMCkge1xuICAgICAgICBjb3VudCAtPSAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy5yb3RhdGlvbikge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnJvdGF0aW9uID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy5wb3NpdGlvbikge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy5zY2FsZSkge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnNjYWxlID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGFubmVscy50aW1lKSB7XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMudGltZSA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQpO1xuICAgIH1cbiAgICAvLyBDbGlwIGF0IHRoZSBzdGFydFxuICAgIHRoaXMuc2V0VGltZShzdGFydFRpbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMucm90YXRpb25baV0gPSB0aGlzLnJvdGF0aW9uW2ldO1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnBvc2l0aW9uW2ldID0gdGhpcy5wb3NpdGlvbltpXTtcbiAgICAgICAgc3ViQ2xpcC5jaGFubmVscy5zY2FsZVtpXSA9IHRoaXMuc2NhbGVbaV07XG4gICAgfVxuICAgIHN1YkNsaXAuY2hhbm5lbHMudGltZVswXSA9IDA7XG4gICAgc3ViQ2xpcC5jaGFubmVscy5yb3RhdGlvblszXSA9IHRoaXMucm90YXRpb25bM107XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNvdW50LTE7IGkrKykge1xuICAgICAgICB2YXIgaTI7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICBpMiA9IHJhbmdlU3RhcnRbMF0gKyBpO1xuICAgICAgICAgICAgc3ViQ2xpcC5jaGFubmVscy5yb3RhdGlvbltpICogNCArIGpdID0gdGhpcy5jaGFubmVscy5yb3RhdGlvbltpMiAqIDQgKyBqXTtcbiAgICAgICAgICAgIHN1YkNsaXAuY2hhbm5lbHMucG9zaXRpb25baSAqIDMgKyBqXSA9IHRoaXMuY2hhbm5lbHMucG9zaXRpb25baTIgKiAzICsgal07XG4gICAgICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnNjYWxlW2kgKiAzICsgal0gPSB0aGlzLmNoYW5uZWxzLnNjYWxlW2kyICogMyArIGpdO1xuICAgICAgICB9XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMudGltZVtpXSA9IHRoaXMuY2hhbm5lbHMudGltZVtpMl0gLSBzdGFydFRpbWU7XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMucm90YXRpb25baSAqIDQgKyAzXSA9IHRoaXMuY2hhbm5lbHMucm90YXRpb25baTIgKiA0ICsgM107XG4gICAgfVxuICAgIC8vIENsaXAgYXQgdGhlIGVuZFxuICAgIHRoaXMuc2V0VGltZShlbmRUaW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICBzdWJDbGlwLmNoYW5uZWxzLnJvdGF0aW9uWyhjb3VudCAtIDEpICogNCArIGldID0gdGhpcy5yb3RhdGlvbltpXTtcbiAgICAgICAgc3ViQ2xpcC5jaGFubmVscy5wb3NpdGlvblsoY291bnQgLSAxKSAqIDMgKyBpXSA9IHRoaXMucG9zaXRpb25baV07XG4gICAgICAgIHN1YkNsaXAuY2hhbm5lbHMuc2NhbGVbKGNvdW50IC0gMSkgKiAzICsgaV0gPSB0aGlzLnNjYWxlW2ldO1xuICAgIH1cbiAgICBzdWJDbGlwLmNoYW5uZWxzLnRpbWVbKGNvdW50IC0gMSldID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICBzdWJDbGlwLmNoYW5uZWxzLnJvdGF0aW9uWyhjb3VudCAtIDEpICogNCArIDNdID0gdGhpcy5yb3RhdGlvblszXTtcblxuICAgIC8vIFRPRE8gc2V0IGJhY2sgP1xuICAgIHN1YkNsaXAubGlmZSA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgcmV0dXJuIHN1YkNsaXA7XG59O1xuXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLl9maW5kUmFuZ2UgPSBmdW5jdGlvbiAodGltZSkge1xuICAgIHZhciBjaGFubmVscyA9IHRoaXMuY2hhbm5lbHM7XG4gICAgdmFyIGxlbiA9IGNoYW5uZWxzLnRpbWUubGVuZ3RoO1xuICAgIHZhciBzdGFydCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChjaGFubmVscy50aW1lW2ldIDw9IHRpbWUgJiYgY2hhbm5lbHMudGltZVtpKzFdID4gdGltZSkge1xuICAgICAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBwZXJjZW50ID0gMDtcbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gY2hhbm5lbHMudGltZVtzdGFydF07XG4gICAgICAgIHZhciBlbmRUaW1lID0gY2hhbm5lbHMudGltZVtzdGFydCsxXTtcbiAgICAgICAgdmFyIHBlcmNlbnQgPSAodGltZS1zdGFydFRpbWUpIC8gKGVuZFRpbWUtc3RhcnRUaW1lKTtcbiAgICB9XG4gICAgLy8gUGVyY2VudCBbMCwgMSlcbiAgICByZXR1cm4gW3N0YXJ0LCBwZXJjZW50XTtcbn07XG5cbi8qKlxuICogMUQgYmxlbmRpbmcgYmV0d2VlbiB0d28gY2xpcHNcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfGNsYXkuYW5pbWF0aW9uLlRyYW5zZm9ybVRyYWNrfSBjMVxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfGNsYXkuYW5pbWF0aW9uLlRyYW5zZm9ybVRyYWNrfSBjMlxuICogQHBhcmFtICB7bnVtYmVyfSB3XG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuYmxlbmQxRCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5ibGVuZDFEO1xuLyoqXG4gKiAyRCBibGVuZGluZyBiZXR3ZWVuIHRocmVlIGNsaXBzXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja3xjbGF5LmFuaW1hdGlvbi5UcmFuc2Zvcm1UcmFja30gYzFcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja3xjbGF5LmFuaW1hdGlvbi5UcmFuc2Zvcm1UcmFja30gYzJcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja3xjbGF5LmFuaW1hdGlvbi5UcmFuc2Zvcm1UcmFja30gYzNcbiAqIEBwYXJhbSAge251bWJlcn0gZlxuICogQHBhcmFtICB7bnVtYmVyfSBnXG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuYmxlbmQyRCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5ibGVuZDJEO1xuLyoqXG4gKiBBZGRpdGl2ZSBibGVuZGluZyBiZXR3ZWVuIHR3byBjbGlwc1xuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMxXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMyXG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuYWRkaXRpdmVCbGVuZCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5hZGRpdGl2ZUJsZW5kO1xuLyoqXG4gKiBTdWJ0cmFjdGl2ZSBibGVuZGluZyBiZXR3ZWVuIHR3byBjbGlwc1xuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMxXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2t8Y2xheS5hbmltYXRpb24uVHJhbnNmb3JtVHJhY2t9IGMyXG4gKi9cblNhbXBsZXJUcmFjay5wcm90b3R5cGUuc3VidHJhY3RpdmVCbGVuZCA9IFRyYW5zZm9ybVRyYWNrLnByb3RvdHlwZS5zdWJ0cmFjdGl2ZUJsZW5kO1xuXG4vKipcbiAqIENsb25lIGEgbmV3IFNhbXBsZXJUcmFja1xuICogQHJldHVybiB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfVxuICovXG5TYW1wbGVyVHJhY2sucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0cmFjayA9IFNhbXBsZXJUcmFjay5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICB0cmFjay5jaGFubmVscyA9IHtcbiAgICAgICAgdGltZTogdGhpcy5jaGFubmVscy50aW1lIHx8IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmNoYW5uZWxzLnBvc2l0aW9uIHx8IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiB0aGlzLmNoYW5uZWxzLnJvdGF0aW9uIHx8IG51bGwsXG4gICAgICAgIHNjYWxlOiB0aGlzLmNoYW5uZWxzLnNjYWxlIHx8IG51bGxcbiAgICB9O1xuICAgIHZlYzMuY29weSh0cmFjay5wb3NpdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgcXVhdC5jb3B5KHRyYWNrLnJvdGF0aW9uLCB0aGlzLnJvdGF0aW9uKTtcbiAgICB2ZWMzLmNvcHkodHJhY2suc2NhbGUsIHRoaXMuc2NhbGUpO1xuXG4gICAgdHJhY2sudGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG4gICAgdHJhY2sudXBkYXRlVGFyZ2V0KCk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNhbXBsZXJUcmFjaztcbiIsIi8qKlxuICogRXh0ZW5kIGEgc3ViIGNsYXNzIGZyb20gYmFzZSBjbGFzc1xuICogQHBhcmFtIHtvYmplY3R8RnVuY3Rpb259IG1ha2VEZWZhdWx0T3B0IGRlZmF1bHQgb3B0aW9uIG9mIHRoaXMgc3ViIGNsYXNzLCBtZXRob2Qgb2YgdGhlIHN1YiBjYW4gdXNlIHRoaXMueHh4IHRvIGFjY2VzcyB0aGlzIG9wdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2luaXRpYWxpemVdIEluaXRpYWxpemUgYWZ0ZXIgdGhlIHN1YiBjbGFzcyBpcyBpbnN0YW50aWF0ZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvdG9dIFByb3RvdHlwZSBtZXRob2RzL3Byb3BlcnRpZXMgb2YgdGhlIHN1YiBjbGFzc1xuICogQG1lbWJlck9mIGNsYXkuY29yZS5taXhpbi5leHRlbmRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZXJpdmUobWFrZURlZmF1bHRPcHQsIGluaXRpYWxpemUvKm9wdGlvbmFsKi8sIHByb3RvLypvcHRpb25hbCovKSB7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxpemUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcHJvdG8gPSBpbml0aWFsaXplO1xuICAgICAgICBpbml0aWFsaXplID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgX3N1cGVyID0gdGhpcztcblxuICAgIHZhciBwcm9wTGlzdDtcbiAgICBpZiAoIShtYWtlRGVmYXVsdE9wdCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAvLyBPcHRpbWl6ZSB0aGUgcHJvcGVydHkgaXRlcmF0ZSBpZiBpdCBoYXZlIGJlZW4gZml4ZWRcbiAgICAgICAgcHJvcExpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gbWFrZURlZmF1bHRPcHQpIHtcbiAgICAgICAgICAgIGlmIChtYWtlRGVmYXVsdE9wdC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wTGlzdC5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdWIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICAgICAgLy8gY2FsbCBzdXBlciBjb25zdHJ1Y3RvclxuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICBpZiAobWFrZURlZmF1bHRPcHQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgLy8gSW52b2tlIG1ha2VEZWZhdWx0T3B0IGVhY2ggdGltZSBpZiBpdCBpcyBhIGZ1bmN0aW9uLCBTbyB3ZSBjYW4gbWFrZSBzdXJlIGVhY2hcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGluIHRoZSBvYmplY3Qgd2lsbCBub3QgYmUgc2hhcmVkIGJ5IG11dGlwbGUgaW5zdGFuY2VzXG4gICAgICAgICAgICBleHRlbmQodGhpcywgbWFrZURlZmF1bHRPcHQuY2FsbCh0aGlzLCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHRlbmRXaXRoUHJvcExpc3QodGhpcywgbWFrZURlZmF1bHRPcHQsIHByb3BMaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBzdWIpIHtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIG9mIGluaGVyaXRcbiAgICAgICAgICAgIHZhciBpbml0aWFsaXplcnMgPSBzdWIuX19pbml0aWFsaXplcnNfXztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIHNhdmUgc3VwZXIgY29uc3RydWN0b3JcbiAgICBzdWIuX19zdXBlcl9fID0gX3N1cGVyO1xuICAgIC8vIEluaXRpYWxpemUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBpcyBjYWxsZWRcbiAgICBpZiAoIV9zdXBlci5fX2luaXRpYWxpemVyc19fKSB7XG4gICAgICAgIHN1Yi5fX2luaXRpYWxpemVyc19fID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3ViLl9faW5pdGlhbGl6ZXJzX18gPSBfc3VwZXIuX19pbml0aWFsaXplcnNfXy5zbGljZSgpO1xuICAgIH1cbiAgICBpZiAoaW5pdGlhbGl6ZSkge1xuICAgICAgICBzdWIuX19pbml0aWFsaXplcnNfXy5wdXNoKGluaXRpYWxpemUpO1xuICAgIH1cblxuICAgIHZhciBDdG9yID0gZnVuY3Rpb24oKSB7fTtcbiAgICBDdG9yLnByb3RvdHlwZSA9IF9zdXBlci5wcm90b3R5cGU7XG4gICAgc3ViLnByb3RvdHlwZSA9IG5ldyBDdG9yKCk7XG4gICAgc3ViLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YjtcbiAgICBleHRlbmQoc3ViLnByb3RvdHlwZSwgcHJvdG8pO1xuXG4gICAgLy8gZXh0ZW5kIHRoZSBkZXJpdmUgbWV0aG9kIGFzIGEgc3RhdGljIG1ldGhvZDtcbiAgICBzdWIuZXh0ZW5kID0gX3N1cGVyLmV4dGVuZDtcblxuICAgIC8vIERFUENSQVRFRFxuICAgIHN1Yi5kZXJpdmUgPSBfc3VwZXIuZXh0ZW5kO1xuXG4gICAgcmV0dXJuIHN1Yjtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBuYW1lIGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV4dGVuZFdpdGhQcm9wTGlzdCh0YXJnZXQsIHNvdXJjZSwgcHJvcExpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BMaXN0W2ldO1xuICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICB9XG59XG5cbi8qKlxuICogQGFsaWFzIGNsYXkuY29yZS5taXhpbi5leHRlbmRcbiAqIEBtaXhpblxuICovXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgICBleHRlbmQ6IGRlcml2ZSxcblxuICAgIC8vIERFUENSQVRFRFxuICAgIGRlcml2ZTogZGVyaXZlXG59O1xuIiwiZnVuY3Rpb24gSGFuZGxlcihhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xufVxuLyoqXG4gKiBAbWl4aW5cbiAqIEBhbGlhcyBjbGF5LmNvcmUubWl4aW4ubm90aWZpZXJcbiAqL1xudmFyIG5vdGlmaWVyID0ge1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgZXZlbnRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKi9cbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19oYW5kbGVyc19fJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX19oYW5kbGVyc19fLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGRscyA9IHRoaXMuX19oYW5kbGVyc19fW25hbWVdO1xuICAgICAgICB2YXIgbCA9IGhkbHMubGVuZ3RoLCBpID0gLTEsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIC8vIE9wdGltaXplIGFkdmlzZSBmcm9tIGJhY2tib25lXG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbCkge1xuICAgICAgICAgICAgICAgICAgICBoZGxzW2ldLmFjdGlvbi5jYWxsKGhkbHNbaV0uY29udGV4dCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgd2hpbGUgKCsraSA8IGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaGRsc1tpXS5hY3Rpb24uYXBwbHkoaGRsc1tpXS5jb250ZXh0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgZXZlbnQgaGFuZGxlclxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBhY3Rpb25cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IFtjb250ZXh0XVxuICAgICAqIEBjaGFpbmFibGVcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24obmFtZSwgYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fX2hhbmRsZXJzX18gfHwgKHRoaXMuX19oYW5kbGVyc19fPXt9KTtcbiAgICAgICAgaWYgKCFoYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgaGFuZGxlcnNbbmFtZV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhuYW1lLCBhY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoYWN0aW9uLCBjb250ZXh0IHx8IHRoaXMpO1xuICAgICAgICBoYW5kbGVyc1tuYW1lXS5wdXNoKGhhbmRsZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBldmVudCwgZXZlbnQgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBvbmNlIGFuZCB0aGVuIHJlbW92ZWRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gYWN0aW9uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbY29udGV4dF1cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24obmFtZSwgYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICAgICAgc2VsZi5vZmYobmFtZSwgd3JhcHBlcik7XG4gICAgICAgICAgICBhY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vbihuYW1lLCB3cmFwcGVyLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2Ygb25jZSgnYmVmb3JlJyArIG5hbWUpXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGFjdGlvblxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHRdXG4gICAgICogQGNoYWluYWJsZVxuICAgICAqL1xuICAgIGJlZm9yZTogZnVuY3Rpb24obmFtZSwgYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmFtZSA9ICdiZWZvcmUnICsgbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMub24obmFtZSwgYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2Ygb25jZSgnYWZ0ZXInICsgbmFtZSlcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gYWN0aW9uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbY29udGV4dF1cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgYWZ0ZXI6IGZ1bmN0aW9uKG5hbWUsIGFjdGlvbiwgY29udGV4dCkge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWFjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5hbWUgPSAnYWZ0ZXInICsgbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMub24obmFtZSwgYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2Ygb24oJ3N1Y2Nlc3MnKVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBhY3Rpb25cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IFtjb250ZXh0XVxuICAgICAqIEBjaGFpbmFibGVcbiAgICAgKi9cbiAgICBzdWNjZXNzOiBmdW5jdGlvbihhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25jZSgnc3VjY2VzcycsIGFjdGlvbiwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIG9uKCdlcnJvcicpXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGFjdGlvblxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHRdXG4gICAgICogQGNoYWluYWJsZVxuICAgICAqL1xuICAgIGVycm9yOiBmdW5jdGlvbihhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25jZSgnZXJyb3InLCBhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gYWN0aW9uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbY29udGV4dF1cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgb2ZmOiBmdW5jdGlvbihuYW1lLCBhY3Rpb24pIHtcblxuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9faGFuZGxlcnNfXyB8fCAodGhpcy5fX2hhbmRsZXJzX189e30pO1xuXG4gICAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgICAgICBoYW5kbGVyc1tuYW1lXSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgdmFyIGhkbHMgPSBoYW5kbGVyc1tuYW1lXTtcbiAgICAgICAgICAgIHZhciByZXRhaW5zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhkbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICYmIGhkbHNbaV0uYWN0aW9uICE9PSBhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWlucy5wdXNoKGhkbHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXJzW25hbWVdID0gcmV0YWlucztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiByZWdpc3RlcmVkIHRoZSBldmVudCBoYW5kbGVyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgYWN0aW9uXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBoYXM6IGZ1bmN0aW9uKG5hbWUsIGFjdGlvbikge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9faGFuZGxlcnNfXztcblxuICAgICAgICBpZiAoISBoYW5kbGVycyB8fFxuICAgICAgICAgICAgISBoYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoZGxzID0gaGFuZGxlcnNbbmFtZV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGRscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGhkbHNbaV0uYWN0aW9uID09PSBhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG5vdGlmaWVyOyIsInZhciBndWlkID0gMDtcblxudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG52YXIgbmF0aXZlRm9yRWFjaCA9IEFycmF5UHJvdG8uZm9yRWFjaDtcblxuLyoqXG4gKiBVdGlsIGZ1bmN0aW9uc1xuICogQG5hbWVzcGFjZSBjbGF5LmNvcmUudXRpbFxuICovXG52YXIgdXRpbCA9IHtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIEdVSURcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZ2VuR1VJRDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKytndWlkO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVsYXRpdmUgcGF0aCB0byBhYnNvbHV0ZSBwYXRoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBiYXNlUGF0aFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5jb3JlLnV0aWxcbiAgICAgKi9cbiAgICByZWxhdGl2ZTJhYnNvbHV0ZTogZnVuY3Rpb24gKHBhdGgsIGJhc2VQYXRoKSB7XG4gICAgICAgIGlmICghYmFzZVBhdGggfHwgcGF0aC5tYXRjaCgvXlxcLy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aFBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICB2YXIgYmFzZVBhdGhQYXJ0cyA9IGJhc2VQYXRoLnNwbGl0KCcvJyk7XG5cbiAgICAgICAgdmFyIGl0ZW0gPSBwYXRoUGFydHNbMF07XG4gICAgICAgIHdoaWxlKGl0ZW0gPT09ICcuJyB8fCBpdGVtID09PSAnLi4nKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gJy4uJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoUGFydHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRoUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGl0ZW0gPSBwYXRoUGFydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VQYXRoUGFydHMuam9pbignLycpICsgJy8nICsgcGF0aFBhcnRzLmpvaW4oJy8nKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIHRhcmdldCB3aXRoIHNvdXJjZVxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0XG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZXh0ZW5kOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IHNvdXJjZVtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIHByb3BlcnRpZXMgdG8gdGFyZ2V0IGlmIG5vdCBleGlzdC5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFxuICAgICAqIEBwYXJhbSAge09iamVjdH0gc291cmNlXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmNvcmUudXRpbFxuICAgICAqL1xuICAgIGRlZmF1bHRzOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEV4dGVuZCBwcm9wZXJ0aWVzIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBsaXN0IHRvIGF2b2lkIGZvci4uaW4uLiBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSB0YXJnZXRcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHNvdXJjZVxuICAgICAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcm9wTGlzdFxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5jb3JlLnV0aWxcbiAgICAgKi9cbiAgICBleHRlbmRXaXRoUHJvcExpc3Q6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgcHJvcExpc3QpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BMaXN0W2ldO1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFeHRlbmQgcHJvcGVydGllcyB0byB0YXJnZXQgaWYgbm90IGV4aXN0LiBXaXRoIGEgZ2l2ZW4gcHJvcGVydHkgbGlzdCBhdm9pZCBmb3IuLmluLi4gaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0XG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcHJvcExpc3RcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZGVmYXVsdHNXaXRoUHJvcExpc3Q6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgcHJvcExpc3QpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BMaXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R8QXJyYXl9IG9ialxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBpdGVyYXRvclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gW2NvbnRleHRdXG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgZWFjaDogZnVuY3Rpb24gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCEob2JqICYmIGl0ZXJhdG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmouZm9yRWFjaCAmJiBvYmouZm9yRWFjaCA9PT0gbmF0aXZlRm9yRWFjaCkge1xuICAgICAgICAgICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iai5sZW5ndGggPT09ICsgb2JqLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElzIG9iamVjdFxuICAgICAqIEBwYXJhbSAge30gIG9ialxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgaXNPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElzIGFycmF5ID9cbiAgICAgKiBAcGFyYW0gIHt9ICBvYmpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmNvcmUudXRpbFxuICAgICAqL1xuICAgIGlzQXJyYXk6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSXMgYXJyYXkgbGlrZSwgd2hpY2ggaGF2ZSBhIGxlbmd0aCBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSAge30gIG9ialxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgaXNBcnJheUxpa2U6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvYmoubGVuZ3RoID09PSArIG9iai5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7fSBvYmpcbiAgICAgKiBAcmV0dXJuIHt9XG4gICAgICogQG1lbWJlck9mIGNsYXkuY29yZS51dGlsXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKCF1dGlsLmlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXRpbC5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1dGlsLmlzQXJyYXlMaWtlKG9iaikpIHsgLy8gaXMgdHlwZWQgYXJyYXlcbiAgICAgICAgICAgIHZhciByZXQgPSBuZXcgb2JqLmNvbnN0cnVjdG9yKG9iai5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXRbaV0gPSBvYmpbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHt9LCBvYmopO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbDtcbiIsImltcG9ydCBleHRlbmRNaXhpbiBmcm9tICcuL21peGluL2V4dGVuZCc7XG5pbXBvcnQgbm90aWZpZXJNaXhpbiBmcm9tICcuL21peGluL25vdGlmaWVyJztcbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBvZiBhbGwgb2JqZWN0c1xuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5jb3JlLkJhc2VcbiAqIEBtaXhlcyBjbGF5LmNvcmUubWl4aW4ubm90aWZpZXJcbiAqL1xudmFyIEJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLl9fdWlkX18gPSB1dGlsLmdlbkdVSUQoKTtcbn07XG5cbkJhc2UuX19pbml0aWFsaXplcnNfXyA9IFtcbiAgICBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB1dGlsLmV4dGVuZCh0aGlzLCBvcHRzKTtcbiAgICB9XG5dO1xuXG51dGlsLmV4dGVuZChCYXNlLCBleHRlbmRNaXhpbik7XG51dGlsLmV4dGVuZChCYXNlLnByb3RvdHlwZSwgbm90aWZpZXJNaXhpbik7XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2U7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IEFuaW1hdG9yIGZyb20gJy4vQW5pbWF0b3InO1xuXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZnVuY3Rpb24gKGZ1bmMpeyBzZXRUaW1lb3V0KGZ1bmMsIDE2KTsgfTtcblxuLyoqXG4gKiBBbmltYXRpb24gaXMgZ2xvYmFsIHRpbWVsaW5lIHRoYXQgc2NoZWR1bGUgYWxsIGNsaXBzLiBlYWNoIGZyYW1lIGFuaW1hdGlvbiB3aWxsIHNldCB0aGUgdGltZSBvZiBjbGlwcyB0byBjdXJyZW50IGFuZCB1cGRhdGUgdGhlIHN0YXRlcyBvZiBjbGlwc1xuICogQGNvbnN0cnVjdG9yIGNsYXkuYW5pbWF0aW9uLkFuaW1hdGlvblxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIGFuaW1hdGlvbiA9IG5ldyBjbGF5LmFuaW1hdGlvbi5BbmltYXRpb24oKTtcbiAqIHZhciBub2RlID0gbmV3IGNsYXkuTm9kZSgpO1xuICogYW5pbWF0aW9uLmFuaW1hdGUobm9kZS5wb3NpdGlvbilcbiAqICAgICAud2hlbigxMDAwLCB7XG4gKiAgICAgICAgIHg6IDUwMCxcbiAqICAgICAgICAgeTogNTAwXG4gKiAgICAgfSlcbiAqICAgICAud2hlbigyMDAwLCB7XG4gKiAgICAgICAgIHg6IDEwMCxcbiAqICAgICAgICAgeTogMTAwXG4gKiAgICAgfSlcbiAqICAgICAud2hlbigzMDAwLCB7XG4gKiAgICAgICAgIHo6IDEwXG4gKiAgICAgfSlcbiAqICAgICAuc3RhcnQoJ3NwbGluZScpO1xuICovXG52YXIgVGltZWxpbmUgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5hbmltYXRpb24uVGltZWxpbmUjICove1xuICAgICAgICAvKipcbiAgICAgICAgICogc3RhZ2UgaXMgYW4gb2JqZWN0IHdpdGggcmVuZGVyIG1ldGhvZCwgZWFjaCBmcmFtZSBpZiB0aGVyZSBleGlzdHMgYW55IGFuaW1hdGluZyBjbGlwcywgc3RhZ2UucmVuZGVyIHdpbGwgYmUgY2FsbGVkXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBzdGFnZTogbnVsbCxcblxuICAgICAgICBfY2xpcHM6IFtdLFxuXG4gICAgICAgIF9ydW5uaW5nOiBmYWxzZSxcblxuICAgICAgICBfdGltZTogMCxcblxuICAgICAgICBfcGF1c2VkOiBmYWxzZSxcblxuICAgICAgICBfcGF1c2VkVGltZTogMFxuICAgIH07XG59LFxuLyoqIEBsZW5kcyBjbGF5LmFuaW1hdGlvbi5UaW1lbGluZS5wcm90b3R5cGUgKi9cbntcblxuICAgIC8qKlxuICAgICAqIEFkZCBhbmltYXRvclxuICAgICAqIEBwYXJhbSB7Y2xheS5hbmltYXRlLkFuaW1hdG9yfSBhbmltYXRvclxuICAgICAqL1xuICAgIGFkZEFuaW1hdG9yOiBmdW5jdGlvbiAoYW5pbWF0b3IpIHtcbiAgICAgICAgYW5pbWF0b3IuYW5pbWF0aW9uID0gdGhpcztcbiAgICAgICAgdmFyIGNsaXBzID0gYW5pbWF0b3IuZ2V0Q2xpcHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGRDbGlwKGNsaXBzW2ldKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLkNsaXB9IGNsaXBcbiAgICAgKi9cbiAgICBhZGRDbGlwOiBmdW5jdGlvbiAoY2xpcCkge1xuICAgICAgICBpZiAodGhpcy5fY2xpcHMuaW5kZXhPZihjbGlwKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaXBzLnB1c2goY2xpcCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uQ2xpcH0gY2xpcFxuICAgICAqL1xuICAgIHJlbW92ZUNsaXA6IGZ1bmN0aW9uIChjbGlwKSB7XG4gICAgICAgIHZhciBpZHggPSB0aGlzLl9jbGlwcy5pbmRleE9mKGNsaXApO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaXBzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbmltYXRvclxuICAgICAqIEBwYXJhbSB7Y2xheS5hbmltYXRlLkFuaW1hdG9yfSBhbmltYXRvclxuICAgICAqL1xuICAgIHJlbW92ZUFuaW1hdG9yOiBmdW5jdGlvbiAoYW5pbWF0b3IpIHtcbiAgICAgICAgdmFyIGNsaXBzID0gYW5pbWF0b3IuZ2V0Q2xpcHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGlwKGNsaXBzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBhbmltYXRvci5hbmltYXRpb24gPSBudWxsO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpIC0gdGhpcy5fcGF1c2VkVGltZTtcbiAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMuX3RpbWU7XG4gICAgICAgIHZhciBjbGlwcyA9IHRoaXMuX2NsaXBzO1xuICAgICAgICB2YXIgbGVuID0gY2xpcHMubGVuZ3RoO1xuXG4gICAgICAgIHZhciBkZWZlcnJlZEV2ZW50cyA9IFtdO1xuICAgICAgICB2YXIgZGVmZXJyZWRDbGlwcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2xpcCA9IGNsaXBzW2ldO1xuICAgICAgICAgICAgdmFyIGUgPSBjbGlwLnN0ZXAodGltZSwgZGVsdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIFRocm93IG91dCB0aGUgZXZlbnRzIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyXG4gICAgICAgICAgICAvLyBzdGFnZS5yZW5kZXIsIGxpa2UgZmluaXNoXG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgIGRlZmVycmVkRXZlbnRzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWRDbGlwcy5wdXNoKGNsaXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBmaW5pc2hlZCBjbGlwXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOykge1xuICAgICAgICAgICAgaWYgKGNsaXBzW2ldLl9uZWVkc1JlbW92ZSkge1xuICAgICAgICAgICAgICAgIGNsaXBzW2ldID0gY2xpcHNbbGVuLTFdO1xuICAgICAgICAgICAgICAgIGNsaXBzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZW4gPSBkZWZlcnJlZEV2ZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGRlZmVycmVkQ2xpcHNbaV0uZmlyZShkZWZlcnJlZEV2ZW50c1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90aW1lID0gdGltZTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2ZyYW1lJywgZGVsdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YWdlICYmIHRoaXMuc3RhZ2UucmVuZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWdlLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTdGFydCBydW5uaW5nIGFuaW1hdGlvblxuICAgICAqL1xuICAgIHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdGhpcy5fcGF1c2VkVGltZSA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gc3RlcCgpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9ydW5uaW5nKSB7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuX3BhdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7XG5cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFN0b3AgcnVubmluZyBhbmltYXRpb25cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGF1c2VcbiAgICAgKi9cbiAgICBwYXVzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc3VtZVxuICAgICAqL1xuICAgIHJlc3VtZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZWRUaW1lICs9IERhdGUubm93KCkgLSB0aGlzLl9wYXVzZVN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBjbGlwc1xuICAgICAqL1xuICAgIHJlbW92ZUNsaXBzQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NsaXBzID0gW107XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBhbmltYXRvclxuICAgICAqIEBwYXJhbSAge09iamVjdH0gdGFyZ2V0XG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbb3B0aW9ucy5sb29wXVxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZXR0ZXJdXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtvcHRpb25zLnNldHRlcl1cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW29wdGlvbnMuaW50ZXJwb2xhdGVyXVxuICAgICAqIEByZXR1cm4ge2NsYXkuYW5pbWF0aW9uLkFuaW1hdG9yfVxuICAgICAqL1xuICAgIGFuaW1hdGU6IGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciBhbmltYXRvciA9IG5ldyBBbmltYXRvcihcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIG9wdGlvbnMubG9vcCxcbiAgICAgICAgICAgIG9wdGlvbnMuZ2V0dGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmludGVycG9sYXRlclxuICAgICAgICApO1xuICAgICAgICBhbmltYXRvci5hbmltYXRpb24gPSB0aGlzO1xuICAgICAgICByZXR1cm4gYW5pbWF0b3I7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWVsaW5lO1xuIiwiaW1wb3J0IENsaXAgZnJvbSAnLi9DbGlwJztcblxuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgcXVhdCA9IGdsTWF0cml4LnF1YXQ7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICpcbiAqIEFuaW1hdGlvbiBjbGlwIHRoYXQgbWFuYWdlIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgY2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfVxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5hbmltYXRpb24uVHJhY2tDbGlwXG4gKlxuICogQGV4dGVuZHMgY2xheS5hbmltYXRpb24uQ2xpcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm5hbWVdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxpZmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZGVsYXldXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuZ2FwXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnBsYXliYWNrUmF0aW9dXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbb3B0cy5sb29wXSBJZiBsb29wIGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZSB0aGUgbG9vcCBjb3VudCBvZiBhbmltYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBbb3B0cy5lYXNpbmddXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbmZyYW1lXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMub25maW5pc2hdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5vbnJlc3RhcnRdXG4gKiBAcGFyYW0ge0FycmF5LjxjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2s+fSBbb3B0cy50cmFja3NdXG4gKi9cbnZhciBUcmFja0NsaXAgPSBmdW5jdGlvbiAob3B0cykge1xuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICBDbGlwLmNhbGwodGhpcywgb3B0cyk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5TYW1wbGVyVHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IG9wdHMudHJhY2tzIHx8IFtdO1xufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xpcC5wcm90b3R5cGUpO1xuXG5UcmFja0NsaXAucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHJhY2tDbGlwO1xuXG5UcmFja0NsaXAucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAodGltZSwgZFRpbWUsIHNpbGVudCkge1xuXG4gICAgdmFyIHJldCA9IENsaXAucHJvdG90eXBlLnN0ZXAuY2FsbCh0aGlzLCB0aW1lLCBkVGltZSwgdHJ1ZSk7XG5cbiAgICBpZiAocmV0ICE9PSAnZmluaXNoJykge1xuICAgICAgICB2YXIgdGltZSA9IHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcbiAgICAgICAgLy8gVE9ETyBsaWZlIG1heSBiZSBjaGFuZ2VkLlxuICAgICAgICBpZiAodGhpcy5fcmFuZ2UpIHtcbiAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9yYW5nZVswXSArIHRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUaW1lKHRpbWUpO1xuICAgIH1cblxuICAgIC8vIFBFTkRJTkcgU2NoZWR1bGVcbiAgICBpZiAoIXNpbGVudCAmJiByZXQgIT09ICdwYXVzZWQnKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZnJhbWUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSByYW5nZVxuICovXG5UcmFja0NsaXAucHJvdG90eXBlLnNldFJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgdGhpcy5jYWxjTGlmZUZyb21UcmFja3MoKTtcbiAgICB0aGlzLl9yYW5nZSA9IHJhbmdlO1xuICAgIGlmIChyYW5nZSkge1xuICAgICAgICByYW5nZVsxXSA9IE1hdGgubWluKHJhbmdlWzFdLCB0aGlzLmxpZmUpO1xuICAgICAgICByYW5nZVswXSA9IE1hdGgubWluKHJhbmdlWzBdLCB0aGlzLmxpZmUpO1xuICAgICAgICB0aGlzLmxpZmUgPSAocmFuZ2VbMV0gLSByYW5nZVswXSk7XG4gICAgfVxufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZS5zZXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudHJhY2tzW2ldLnNldFRpbWUodGltZSk7XG4gICAgfVxufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZS5jYWxjTGlmZUZyb21UcmFja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5saWZlID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMubGlmZSA9IE1hdGgubWF4KHRoaXMubGlmZSwgdGhpcy50cmFja3NbaV0uZ2V0TWF4VGltZSgpKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Y2xheS5hbmltYXRpb24uU2FtcGxlclRyYWNrfSBqb2ludENsaXBcbiAqL1xuVHJhY2tDbGlwLnByb3RvdHlwZS5hZGRUcmFjayA9IGZ1bmN0aW9uICh0cmFjaykge1xuICAgIHRoaXMudHJhY2tzLnB1c2godHJhY2spO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2NsYXkuYW5pbWF0aW9uLlNhbXBsZXJUcmFja30gam9pbnRDbGlwXG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUucmVtb3ZlVGFyY2sgPSBmdW5jdGlvbiAodHJhY2spIHtcbiAgICB2YXIgaWR4ID0gdGhpcy50cmFja3MuaW5kZXhPZih0cmFjayk7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLnNwbGljZShpZHgsIDEpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0VGltZVxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFRpbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMb29wXG4gKiBAcmV0dXJuIHtjbGF5LmFuaW1hdGlvbi5UcmFja0NsaXB9XG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUuZ2V0U3ViQ2xpcCA9IGZ1bmN0aW9uIChzdGFydFRpbWUsIGVuZFRpbWUsIGlzTG9vcCkge1xuICAgIHZhciBzdWJDbGlwID0gbmV3IFRyYWNrQ2xpcCh7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3ViVHJhY2sgPSB0aGlzLnRyYWNrc1tpXS5nZXRTdWJUcmFjayhzdGFydFRpbWUsIGVuZFRpbWUpO1xuICAgICAgICBzdWJDbGlwLmFkZFRyYWNrKHN1YlRyYWNrKTtcbiAgICB9XG5cbiAgICBpZiAoaXNMb29wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3ViQ2xpcC5zZXRMb29wKGlzTG9vcCk7XG4gICAgfVxuXG4gICAgc3ViQ2xpcC5saWZlID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIHJldHVybiBzdWJDbGlwO1xufTtcblxuLyoqXG4gKiAxZCBibGVuZGluZyBmcm9tIHR3byBza2lubmluZyBjbGlwc1xuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMVxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMlxuICogQHBhcmFtICB7bnVtYmVyfSB3XG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUuYmxlbmQxRCA9IGZ1bmN0aW9uIChjbGlwMSwgY2xpcDIsIHcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjMSA9IGNsaXAxLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIGMyID0gY2xpcDIudHJhY2tzW2ldO1xuICAgICAgICB2YXIgdENsaXAgPSB0aGlzLnRyYWNrc1tpXTtcblxuICAgICAgICB0Q2xpcC5ibGVuZDFEKGMxLCBjMiwgdyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGRpdGl2ZSBibGVuZGluZyBmcm9tIHR3byBza2lubmluZyBjbGlwc1xuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMVxuICogQHBhcmFtICB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwfSBjbGlwMlxuICovXG5UcmFja0NsaXAucHJvdG90eXBlLmFkZGl0aXZlQmxlbmQgPSBmdW5jdGlvbiAoY2xpcDEsIGNsaXAyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYzEgPSBjbGlwMS50cmFja3NbaV07XG4gICAgICAgIHZhciBjMiA9IGNsaXAyLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIHRDbGlwID0gdGhpcy50cmFja3NbaV07XG5cbiAgICAgICAgdENsaXAuYWRkaXRpdmVCbGVuZChjMSwgYzIpO1xuICAgIH1cbn07XG5cbi8qKlxuICogU3VidHJhY3RpdmUgYmxlbmRpbmcgZnJvbSB0d28gc2tpbm5pbmcgY2xpcHNcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDFcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDJcbiAqL1xuVHJhY2tDbGlwLnByb3RvdHlwZS5zdWJ0cmFjdGl2ZUJsZW5kID0gZnVuY3Rpb24gKGNsaXAxLCBjbGlwMikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMxID0gY2xpcDEudHJhY2tzW2ldO1xuICAgICAgICB2YXIgYzIgPSBjbGlwMi50cmFja3NbaV07XG4gICAgICAgIHZhciB0Q2xpcCA9IHRoaXMudHJhY2tzW2ldO1xuXG4gICAgICAgIHRDbGlwLnN1YnRyYWN0aXZlQmxlbmQoYzEsIGMyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIDJEIGJsZW5kaW5nIGZyb20gdGhyZWUgc2tpbm5pbmcgY2xpcHNcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDFcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDJcbiAqIEBwYXJhbSAge2NsYXkuYW5pbWF0aW9uLlRyYWNrQ2xpcH0gY2xpcDNcbiAqIEBwYXJhbSAge251bWJlcn0gZlxuICogQHBhcmFtICB7bnVtYmVyfSBnXG4gKi9cblRyYWNrQ2xpcC5wcm90b3R5cGUuYmxlbmQyRCA9IGZ1bmN0aW9uIChjbGlwMSwgY2xpcDIsIGNsaXAzLCBmLCBnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYzEgPSBjbGlwMS50cmFja3NbaV07XG4gICAgICAgIHZhciBjMiA9IGNsaXAyLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIGMzID0gY2xpcDMudHJhY2tzW2ldO1xuICAgICAgICB2YXIgdENsaXAgPSB0aGlzLnRyYWNrc1tpXTtcblxuICAgICAgICB0Q2xpcC5ibGVuZDJEKGMxLCBjMiwgYzMsIGYsIGcpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ29weSBTUlQgb2YgYWxsIGpvaW50cyBjbGlwcyBmcm9tIGFub3RoZXIgVHJhY2tDbGlwXG4gKiBAcGFyYW0gIHtjbGF5LmFuaW1hdGlvbi5UcmFja0NsaXB9IGNsaXBcbiAqL1xuVHJhY2tDbGlwLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKGNsaXApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzVHJhY2sgPSBjbGlwLnRyYWNrc1tpXTtcbiAgICAgICAgdmFyIHRUcmFjayA9IHRoaXMudHJhY2tzW2ldO1xuXG4gICAgICAgIHZlYzMuY29weSh0VHJhY2sucG9zaXRpb24sIHNUcmFjay5wb3NpdGlvbik7XG4gICAgICAgIHZlYzMuY29weSh0VHJhY2suc2NhbGUsIHNUcmFjay5zY2FsZSk7XG4gICAgICAgIHF1YXQuY29weSh0VHJhY2sucm90YXRpb24sIHNUcmFjay5yb3RhdGlvbik7XG4gICAgfVxufTtcblxuVHJhY2tDbGlwLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2xpcCA9IENsaXAucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbGlwLmFkZFRyYWNrKHRoaXMudHJhY2tzW2ldLmNsb25lKCkpO1xuICAgIH1cbiAgICBjbGlwLmxpZmUgPSB0aGlzLmxpZmU7XG4gICAgcmV0dXJuIGNsaXA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUcmFja0NsaXA7XG4iLCJ2YXIgRVhURU5TSU9OX0xJU1QgPSBbXG4gICAgJ09FU190ZXh0dXJlX2Zsb2F0JyxcbiAgICAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcsXG4gICAgJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicsXG4gICAgJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyxcbiAgICAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyxcbiAgICAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnLFxuICAgICdPRVNfZWxlbWVudF9pbmRleF91aW50JyxcbiAgICAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnLFxuICAgICdXRUJHTF9kZXB0aF90ZXh0dXJlJyxcbiAgICAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyxcbiAgICAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcsXG4gICAgJ1dFQkdMX2RyYXdfYnVmZmVycycsXG4gICAgJ0VYVF9mcmFnX2RlcHRoJyxcbiAgICAnRVhUX3NSR0InXG5dO1xuXG52YXIgUEFSQU1FVEVSX05BTUVTID0gW1xuICAgICdNQVhfVEVYVFVSRV9TSVpFJyxcbiAgICAnTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSdcbl07XG5cbmZ1bmN0aW9uIEdMSW5mbyhfZ2wpIHtcbiAgICB2YXIgZXh0ZW5zaW9ucyA9IHt9O1xuICAgIHZhciBwYXJhbWV0ZXJzID0ge307XG5cbiAgICAvLyBHZXQgd2ViZ2wgZXh0ZW5zaW9uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBFWFRFTlNJT05fTElTVC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXh0TmFtZSA9IEVYVEVOU0lPTl9MSVNUW2ldO1xuICAgICAgICBjcmVhdGVFeHRlbnNpb24oZXh0TmFtZSk7XG4gICAgfVxuICAgIC8vIEdldCBwYXJhbWV0ZXJzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQQVJBTUVURVJfTkFNRVMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBQQVJBTUVURVJfTkFNRVNbaV07XG4gICAgICAgIHBhcmFtZXRlcnNbbmFtZV0gPSBfZ2wuZ2V0UGFyYW1ldGVyKF9nbFtuYW1lXSk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRFeHRlbnNpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAoIShuYW1lIGluIGV4dGVuc2lvbnMpKSB7XG4gICAgICAgICAgICBjcmVhdGVFeHRlbnNpb24obmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnNbbmFtZV07XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0UGFyYW1ldGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnNbbmFtZV07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgICAgIHZhciBleHQgPSBfZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpO1xuICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgZXh0ID0gX2dsLmdldEV4dGVuc2lvbignTU9aXycgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4dCkge1xuICAgICAgICAgICAgZXh0ID0gX2dsLmdldEV4dGVuc2lvbignV0VCS0lUXycgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBleHRlbnNpb25zW25hbWVdID0gZXh0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR0xJbmZvO1xuIiwiLyoqXG4gKiBAbmFtZXNwYWNlIGNsYXkuY29yZS5nbGVudW1cbiAqIEBzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9zcGVjcy9sYXRlc3QvMS4wLyM1LjE0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvKiBDbGVhckJ1ZmZlck1hc2sgKi9cbiAgICBERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgOiAweDAwMDAwMTAwLFxuICAgIFNURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICA6IDB4MDAwMDA0MDAsXG4gICAgQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDogMHgwMDAwNDAwMCxcblxuICAgIC8qIEJlZ2luTW9kZSAqL1xuICAgIFBPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDAwMCxcbiAgICBMSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDAwMDEsXG4gICAgTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDogMHgwMDAyLFxuICAgIExJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICA6IDB4MDAwMyxcbiAgICBUUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgOiAweDAwMDQsXG4gICAgVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDogMHgwMDA1LFxuICAgIFRSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICA6IDB4MDAwNixcblxuICAgIC8qIEFscGhhRnVuY3Rpb24gKG5vdCBzdXBwb3J0ZWQgaW4gRVMyMCkgKi9cbiAgICAvKiAgICAgIE5FVkVSICovXG4gICAgLyogICAgICBMRVNTICovXG4gICAgLyogICAgICBFUVVBTCAqL1xuICAgIC8qICAgICAgTEVRVUFMICovXG4gICAgLyogICAgICBHUkVBVEVSICovXG4gICAgLyogICAgICBOT1RFUVVBTCAqL1xuICAgIC8qICAgICAgR0VRVUFMICovXG4gICAgLyogICAgICBBTFdBWVMgKi9cblxuICAgIC8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqL1xuICAgIFpFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMSxcbiAgICBTUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgOiAweDAzMDAsXG4gICAgT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDogMHgwMzAxLFxuICAgIFNSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICA6IDB4MDMwMixcbiAgICBPTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgOiAweDAzMDMsXG4gICAgRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDogMHgwMzA0LFxuICAgIE9ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICA6IDB4MDMwNSxcblxuICAgIC8qIEJsZW5kaW5nRmFjdG9yU3JjICovXG4gICAgLyogICAgICBaRVJPICovXG4gICAgLyogICAgICBPTkUgKi9cbiAgICBEU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgOiAweDAzMDYsXG4gICAgT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDogMHgwMzA3LFxuICAgIFNSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICA6IDB4MDMwOCxcbiAgICAvKiAgICAgIFNSQ19BTFBIQSAqL1xuICAgIC8qICAgICAgT05FX01JTlVTX1NSQ19BTFBIQSAqL1xuICAgIC8qICAgICAgRFNUX0FMUEhBICovXG4gICAgLyogICAgICBPTkVfTUlOVVNfRFNUX0FMUEhBICovXG5cbiAgICAvKiBCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKi9cbiAgICBGVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgOiAweDgwMDYsXG4gICAgQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgIDogMHg4MDA5LFxuICAgIEJMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICA6IDB4ODAwOSwgLyogc2FtZSBhcyBCTEVORF9FUVVBVElPTiAqL1xuICAgIEJMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICA6IDB4ODgzRCxcblxuICAgIC8qIEJsZW5kU3VidHJhY3QgKi9cbiAgICBGVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgOiAweDgwMEEsXG4gICAgRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgIDogMHg4MDBCLFxuXG4gICAgLyogU2VwYXJhdGUgQmxlbmQgRnVuY3Rpb25zICovXG4gICAgQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDogMHg4MEM4LFxuICAgIEJMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICA6IDB4ODBDOSxcbiAgICBCTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgOiAweDgwQ0EsXG4gICAgQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDogMHg4MENCLFxuICAgIENPTlNUQU5UX0NPTE9SICAgICAgICAgICAgICAgICA6IDB4ODAwMSxcbiAgICBPTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgOiAweDgwMDIsXG4gICAgQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgIDogMHg4MDAzLFxuICAgIE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAgICAgICA6IDB4ODAwNCxcbiAgICBCTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgOiAweDgwMDUsXG5cbiAgICAvKiBCdWZmZXIgT2JqZWN0cyAqL1xuICAgIEFSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICA6IDB4ODg5MixcbiAgICBFTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgOiAweDg4OTMsXG4gICAgQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgIDogMHg4ODk0LFxuICAgIEVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICA6IDB4ODg5NSxcblxuICAgIFNUUkVBTV9EUkFXICAgICAgICAgICAgICAgICAgICA6IDB4ODhFMCxcbiAgICBTVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgOiAweDg4RTQsXG4gICAgRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDogMHg4OEU4LFxuXG4gICAgQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDogMHg4NzY0LFxuICAgIEJVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICA6IDB4ODc2NSxcblxuICAgIENVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICA6IDB4ODYyNixcblxuICAgIC8qIEN1bGxGYWNlTW9kZSAqL1xuICAgIEZST05UICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDQwNCxcbiAgICBCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDA0MDUsXG4gICAgRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDogMHgwNDA4LFxuXG4gICAgLyogRGVwdGhGdW5jdGlvbiAqL1xuICAgIC8qICAgICAgTkVWRVIgKi9cbiAgICAvKiAgICAgIExFU1MgKi9cbiAgICAvKiAgICAgIEVRVUFMICovXG4gICAgLyogICAgICBMRVFVQUwgKi9cbiAgICAvKiAgICAgIEdSRUFURVIgKi9cbiAgICAvKiAgICAgIE5PVEVRVUFMICovXG4gICAgLyogICAgICBHRVFVQUwgKi9cbiAgICAvKiAgICAgIEFMV0FZUyAqL1xuXG4gICAgLyogRW5hYmxlQ2FwICovXG4gICAgLyogVEVYVFVSRV8yRCAqL1xuICAgIENVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICA6IDB4MEI0NCxcbiAgICBCTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDBCRTIsXG4gICAgRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwQkQwLFxuICAgIFNURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICA6IDB4MEI5MCxcbiAgICBERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgOiAweDBCNzEsXG4gICAgU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDogMHgwQzExLFxuICAgIFBPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICA6IDB4ODAzNyxcbiAgICBTQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgOiAweDgwOUUsXG4gICAgU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDogMHg4MEEwLFxuXG4gICAgLyogRXJyb3JDb2RlICovXG4gICAgTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICBJTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgOiAweDA1MDAsXG4gICAgSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDogMHgwNTAxLFxuICAgIElOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICA6IDB4MDUwMixcbiAgICBPVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgOiAweDA1MDUsXG5cbiAgICAvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi9cbiAgICBDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDA5MDAsXG4gICAgQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwOTAxLFxuXG4gICAgLyogR2V0UE5hbWUgKi9cbiAgICBMSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgOiAweDBCMjEsXG4gICAgQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDogMHg4NDZELFxuICAgIEFMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICA6IDB4ODQ2RSxcbiAgICBDVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgOiAweDBCNDUsXG4gICAgRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgIDogMHgwQjQ2LFxuICAgIERFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICA6IDB4MEI3MCxcbiAgICBERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgOiAweDBCNzIsXG4gICAgREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDogMHgwQjczLFxuICAgIERFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICA6IDB4MEI3NCxcbiAgICBTVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgOiAweDBCOTEsXG4gICAgU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgIDogMHgwQjkyLFxuICAgIFNURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICA6IDB4MEI5NCxcbiAgICBTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAgICAgICAgOiAweDBCOTUsXG4gICAgU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgIDogMHgwQjk2LFxuICAgIFNURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICA6IDB4MEI5NyxcbiAgICBTVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgOiAweDBCOTMsXG4gICAgU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgIDogMHgwQjk4LFxuICAgIFNURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICA6IDB4ODgwMCxcbiAgICBTVEVOQ0lMX0JBQ0tfRkFJTCAgICAgICAgICAgICAgOiAweDg4MDEsXG4gICAgU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCAgIDogMHg4ODAyLFxuICAgIFNURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICA6IDB4ODgwMyxcbiAgICBTVEVOQ0lMX0JBQ0tfUkVGICAgICAgICAgICAgICAgOiAweDhDQTMsXG4gICAgU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgICAgICAgIDogMHg4Q0E0LFxuICAgIFNURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICA6IDB4OENBNSxcbiAgICBWSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgOiAweDBCQTIsXG4gICAgU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgIDogMHgwQzEwLFxuICAgIC8qICAgICAgU0NJU1NPUl9URVNUICovXG4gICAgQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDogMHgwQzIyLFxuICAgIENPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICA6IDB4MEMyMyxcbiAgICBVTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgOiAweDBDRjUsXG4gICAgUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDogMHgwRDA1LFxuICAgIE1BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICA6IDB4MEQzMyxcbiAgICBNQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgOiAweDBEM0EsXG4gICAgU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDogMHgwRDUwLFxuICAgIFJFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICA6IDB4MEQ1MixcbiAgICBHUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgOiAweDBENTMsXG4gICAgQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDogMHgwRDU0LFxuICAgIEFMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICA6IDB4MEQ1NSxcbiAgICBERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgOiAweDBENTYsXG4gICAgU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDogMHgwRDU3LFxuICAgIFBPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICA6IDB4MkEwMCxcbiAgICAvKiAgICAgIFBPTFlHT05fT0ZGU0VUX0ZJTEwgKi9cbiAgICBQT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgOiAweDgwMzgsXG4gICAgVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgIDogMHg4MDY5LFxuICAgIFNBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICA6IDB4ODBBOCxcbiAgICBTQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgOiAweDgwQTksXG4gICAgU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgIDogMHg4MEFBLFxuICAgIFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICA6IDB4ODBBQixcblxuICAgIC8qIEdldFRleHR1cmVQYXJhbWV0ZXIgKi9cbiAgICAvKiAgICAgIFRFWFRVUkVfTUFHX0ZJTFRFUiAqL1xuICAgIC8qICAgICAgVEVYVFVSRV9NSU5fRklMVEVSICovXG4gICAgLyogICAgICBURVhUVVJFX1dSQVBfUyAqL1xuICAgIC8qICAgICAgVEVYVFVSRV9XUkFQX1QgKi9cblxuICAgIENPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICA6IDB4ODZBMyxcblxuICAgIC8qIEhpbnRNb2RlICovXG4gICAgRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDogMHgxMTAwLFxuICAgIEZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTEwMSxcbiAgICBOSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDExMDIsXG5cbiAgICAvKiBIaW50VGFyZ2V0ICovXG4gICAgR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgICA6IDB4ODE5MixcblxuICAgIC8qIERhdGFUeXBlICovXG4gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxNDAwLFxuICAgIFVOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICA6IDB4MTQwMSxcbiAgICBTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDE0MDIsXG4gICAgVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDogMHgxNDAzLFxuICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTQwNCxcbiAgICBVTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgOiAweDE0MDUsXG4gICAgRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxNDA2LFxuXG4gICAgLyogUGl4ZWxGb3JtYXQgKi9cbiAgICBERVBUSF9DT01QT05FTlQgICAgICAgICAgICAgICAgOiAweDE5MDIsXG4gICAgQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxOTA2LFxuICAgIFJHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTkwNyxcbiAgICBSR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDE5MDgsXG4gICAgTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDogMHgxOTA5LFxuICAgIExVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICA6IDB4MTkwQSxcblxuICAgIC8qIFBpeGVsVHlwZSAqL1xuICAgIC8qICAgICAgVU5TSUdORURfQllURSAqL1xuICAgIFVOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICA6IDB4ODAzMyxcbiAgICBVTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgOiAweDgwMzQsXG4gICAgVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDogMHg4MzYzLFxuXG4gICAgLyogU2hhZGVycyAqL1xuICAgIEZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAgIDogMHg4QjMwLFxuICAgIFZFUlRFWF9TSEFERVIgICAgICAgICAgICAgICAgICAgIDogMHg4QjMxLFxuICAgIE1BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAgIDogMHg4ODY5LFxuICAgIE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICAgICAgIDogMHg4REZCLFxuICAgIE1BWF9WQVJZSU5HX1ZFQ1RPUlMgICAgICAgICAgICAgIDogMHg4REZDLFxuICAgIE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDogMHg4QjRELFxuICAgIE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgIDogMHg4QjRDLFxuICAgIE1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAgIDogMHg4ODcyLFxuICAgIE1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAgIDogMHg4REZELFxuICAgIFNIQURFUl9UWVBFICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjRGLFxuICAgIERFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDogMHg4QjgwLFxuICAgIExJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjgyLFxuICAgIFZBTElEQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgIDogMHg4QjgzLFxuICAgIEFUVEFDSEVEX1NIQURFUlMgICAgICAgICAgICAgICAgIDogMHg4Qjg1LFxuICAgIEFDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAgIDogMHg4Qjg2LFxuICAgIEFDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAgIDogMHg4Qjg5LFxuICAgIFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAgICAgICAgIDogMHg4QjhDLFxuICAgIENVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAgIDogMHg4QjhELFxuXG4gICAgLyogU3RlbmNpbEZ1bmN0aW9uICovXG4gICAgTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwMjAwLFxuICAgIExFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDIwMSxcbiAgICBFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDAyMDIsXG4gICAgTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwMjAzLFxuICAgIEdSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDIwNCxcbiAgICBOT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgOiAweDAyMDUsXG4gICAgR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgwMjA2LFxuICAgIEFMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MDIwNyxcblxuICAgIC8qIFN0ZW5jaWxPcCAqL1xuICAgIC8qICAgICAgWkVSTyAqL1xuICAgIEtFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MUUwMCxcbiAgICBSRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgOiAweDFFMDEsXG4gICAgSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgxRTAyLFxuICAgIERFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MUUwMyxcbiAgICBJTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDE1MEEsXG4gICAgSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDogMHg4NTA3LFxuICAgIERFQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICA6IDB4ODUwOCxcblxuICAgIC8qIFN0cmluZ05hbWUgKi9cbiAgICBWRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDFGMDAsXG4gICAgUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDogMHgxRjAxLFxuICAgIFZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICA6IDB4MUYwMixcblxuICAgIC8qIFRleHR1cmVNYWdGaWx0ZXIgKi9cbiAgICBORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgOiAweDI2MDAsXG4gICAgTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgyNjAxLFxuXG4gICAgLyogVGV4dHVyZU1pbkZpbHRlciAqL1xuICAgIC8qICAgICAgTkVBUkVTVCAqL1xuICAgIC8qICAgICAgTElORUFSICovXG4gICAgTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDogMHgyNzAwLFxuICAgIExJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICA6IDB4MjcwMSxcbiAgICBORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgOiAweDI3MDIsXG4gICAgTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDogMHgyNzAzLFxuXG4gICAgLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi9cbiAgICBURVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgOiAweDI4MDAsXG4gICAgVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDogMHgyODAxLFxuICAgIFRFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICA6IDB4MjgwMixcbiAgICBURVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgOiAweDI4MDMsXG5cbiAgICAvKiBUZXh0dXJlVGFyZ2V0ICovXG4gICAgVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDogMHgwREUxLFxuICAgIFRFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MTcwMixcblxuICAgIFRFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICA6IDB4ODUxMyxcbiAgICBURVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgOiAweDg1MTQsXG4gICAgVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgIDogMHg4NTE1LFxuICAgIFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICA6IDB4ODUxNixcbiAgICBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgOiAweDg1MTcsXG4gICAgVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgIDogMHg4NTE4LFxuICAgIFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICA6IDB4ODUxOSxcbiAgICBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgOiAweDg1MUEsXG4gICAgTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgIDogMHg4NTFDLFxuXG4gICAgLyogVGV4dHVyZVVuaXQgKi9cbiAgICBURVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzAsXG4gICAgVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEMxLFxuICAgIFRFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDMixcbiAgICBURVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzMsXG4gICAgVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEM0LFxuICAgIFRFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDNSxcbiAgICBURVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzYsXG4gICAgVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEM3LFxuICAgIFRFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDOCxcbiAgICBURVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0QzksXG4gICAgVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDogMHg4NENBLFxuICAgIFRFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDQixcbiAgICBURVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgOiAweDg0Q0MsXG4gICAgVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDogMHg4NENELFxuICAgIFRFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRDRSxcbiAgICBURVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgOiAweDg0Q0YsXG4gICAgVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQwLFxuICAgIFRFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICA6IDB4ODREMSxcbiAgICBURVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgOiAweDg0RDIsXG4gICAgVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQzLFxuICAgIFRFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRENCxcbiAgICBURVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgOiAweDg0RDUsXG4gICAgVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQ2LFxuICAgIFRFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRENyxcbiAgICBURVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgOiAweDg0RDgsXG4gICAgVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NEQ5LFxuICAgIFRFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICA6IDB4ODREQSxcbiAgICBURVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgOiAweDg0REIsXG4gICAgVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDogMHg4NERDLFxuICAgIFRFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICA6IDB4ODRERCxcbiAgICBURVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgOiAweDg0REUsXG4gICAgVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDogMHg4NERGLFxuICAgIEFDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICA6IDB4ODRFMCxcblxuICAgIC8qIFRleHR1cmVXcmFwTW9kZSAqL1xuICAgIFJFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4MjkwMSxcbiAgICBDTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgOiAweDgxMkYsXG4gICAgTUlSUk9SRURfUkVQRUFUICAgICAgICAgICAgICAgIDogMHg4MzcwLFxuXG4gICAgLyogVW5pZm9ybSBUeXBlcyAqL1xuICAgIEZMT0FUX1ZFQzIgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1MCxcbiAgICBGTE9BVF9WRUMzICAgICAgICAgICAgICAgICAgICAgOiAweDhCNTEsXG4gICAgRkxPQVRfVkVDNCAgICAgICAgICAgICAgICAgICAgIDogMHg4QjUyLFxuICAgIElOVF9WRUMyICAgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1MyxcbiAgICBJTlRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgOiAweDhCNTQsXG4gICAgSU5UX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjU1LFxuICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1NixcbiAgICBCT09MX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgOiAweDhCNTcsXG4gICAgQk9PTF9WRUMzICAgICAgICAgICAgICAgICAgICAgIDogMHg4QjU4LFxuICAgIEJPT0xfVkVDNCAgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1OSxcbiAgICBGTE9BVF9NQVQyICAgICAgICAgICAgICAgICAgICAgOiAweDhCNUEsXG4gICAgRkxPQVRfTUFUMyAgICAgICAgICAgICAgICAgICAgIDogMHg4QjVCLFxuICAgIEZMT0FUX01BVDQgICAgICAgICAgICAgICAgICAgICA6IDB4OEI1QyxcbiAgICBTQU1QTEVSXzJEICAgICAgICAgICAgICAgICAgICAgOiAweDhCNUUsXG4gICAgU0FNUExFUl9DVUJFICAgICAgICAgICAgICAgICAgIDogMHg4QjYwLFxuXG4gICAgLyogVmVydGV4IEFycmF5cyAqL1xuICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAgICAgICAgOiAweDg2MjIsXG4gICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFICAgICAgICAgICA6IDB4ODYyMyxcbiAgICBWRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSAgICAgICAgIDogMHg4NjI0LFxuICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAgICAgICAgICAgOiAweDg2MjUsXG4gICAgVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEICAgICA6IDB4ODg2QSxcbiAgICBWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIgICAgICAgIDogMHg4NjQ1LFxuICAgIFZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgOiAweDg4OUYsXG5cbiAgICAvKiBTaGFkZXIgU291cmNlICovXG4gICAgQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgICAgIDogMHg4QjgxLFxuXG4gICAgLyogU2hhZGVyIFByZWNpc2lvbi1TcGVjaWZpZWQgVHlwZXMgKi9cbiAgICBMT1dfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgOiAweDhERjAsXG4gICAgTUVESVVNX0ZMT0FUICAgICAgICAgICAgICAgICAgIDogMHg4REYxLFxuICAgIEhJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICA6IDB4OERGMixcbiAgICBMT1dfSU5UICAgICAgICAgICAgICAgICAgICAgICAgOiAweDhERjMsXG4gICAgTUVESVVNX0lOVCAgICAgICAgICAgICAgICAgICAgIDogMHg4REY0LFxuICAgIEhJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICA6IDB4OERGNSxcblxuICAgIC8qIEZyYW1lYnVmZmVyIE9iamVjdC4gKi9cbiAgICBGUkFNRUJVRkZFUiAgICAgICAgICAgICAgICAgICAgOiAweDhENDAsXG4gICAgUkVOREVSQlVGRkVSICAgICAgICAgICAgICAgICAgIDogMHg4RDQxLFxuXG4gICAgUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg4MDU2LFxuICAgIFJHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICA6IDB4ODA1NyxcbiAgICBSR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgOiAweDhENjIsXG4gICAgREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgIDogMHg4MUE1LFxuICAgIFNURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICA6IDB4MTkwMSxcbiAgICBTVEVOQ0lMX0lOREVYOCAgICAgICAgICAgICAgICAgOiAweDhENDgsXG4gICAgREVQVEhfU1RFTkNJTCAgICAgICAgICAgICAgICAgIDogMHg4NEY5LFxuXG4gICAgUkVOREVSQlVGRkVSX1dJRFRIICAgICAgICAgICAgIDogMHg4RDQyLFxuICAgIFJFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICA6IDB4OEQ0MyxcbiAgICBSRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUICAgOiAweDhENDQsXG4gICAgUkVOREVSQlVGRkVSX1JFRF9TSVpFICAgICAgICAgIDogMHg4RDUwLFxuICAgIFJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICA6IDB4OEQ1MSxcbiAgICBSRU5ERVJCVUZGRVJfQkxVRV9TSVpFICAgICAgICAgOiAweDhENTIsXG4gICAgUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUgICAgICAgIDogMHg4RDUzLFxuICAgIFJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICA6IDB4OEQ1NCxcbiAgICBSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFICAgICAgOiAweDhENTUsXG5cbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFICAgICAgICAgICA6IDB4OENEMCxcbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FICAgICAgICAgICA6IDB4OENEMSxcbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgICAgICAgICA6IDB4OENEMixcbiAgICBGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRSA6IDB4OENEMyxcblxuICAgIENPTE9SX0FUVEFDSE1FTlQwICAgICAgICAgICAgICA6IDB4OENFMCxcbiAgICBERVBUSF9BVFRBQ0hNRU5UICAgICAgICAgICAgICAgOiAweDhEMDAsXG4gICAgU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgICAgICAgIDogMHg4RDIwLFxuICAgIERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCAgICAgICA6IDB4ODIxQSxcblxuICAgIE5PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG5cbiAgICBGUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICA6IDB4OENENSxcbiAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQgICAgICAgICA6IDB4OENENixcbiAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCA6IDB4OENENyxcbiAgICBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgICAgICAgICA6IDB4OENEOSxcbiAgICBGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICA6IDB4OENERCxcblxuICAgIEZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA6IDB4OENBNixcbiAgICBSRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgOiAweDhDQTcsXG4gICAgTUFYX1JFTkRFUkJVRkZFUl9TSVpFICAgICAgICAgIDogMHg4NEU4LFxuXG4gICAgSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gIDogMHgwNTA2LFxuXG4gICAgLyogV2ViR0wtc3BlY2lmaWMgZW51bXMgKi9cbiAgICBVTlBBQ0tfRkxJUF9ZX1dFQkdMICAgICAgICAgICAgOiAweDkyNDAsXG4gICAgVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIDogMHg5MjQxLFxuICAgIENPTlRFWFRfTE9TVF9XRUJHTCAgICAgICAgICAgICA6IDB4OTI0MixcbiAgICBVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMIDogMHg5MjQzLFxuICAgIEJST1dTRVJfREVGQVVMVF9XRUJHTCAgICAgICAgICA6IDB4OTI0NCxcbn07XG4iLCJ2YXIgc3VwcG9ydFdlYkdMID0gdHJ1ZTtcbnRyeSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbn0gY2F0Y2ggKGUpIHtcbiAgICBzdXBwb3J0V2ViR0wgPSBmYWxzZTtcbn1cblxudmFyIHZlbmRvciA9IHt9O1xuXG4vKipcbiAqIElmIHN1cHBvcnQgV2ViR0xcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnZlbmRvci5zdXBwb3J0V2ViR0wgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRXZWJHTDtcbn07XG5cblxudmVuZG9yLkludDhBcnJheSA9IHR5cGVvZiBJbnQ4QXJyYXkgPT0gJ3VuZGVmaW5lZCcgPyBBcnJheSA6IEludDhBcnJheTtcblxudmVuZG9yLlVpbnQ4QXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PSAndW5kZWZpbmVkJyA/IEFycmF5IDogVWludDhBcnJheTtcblxudmVuZG9yLlVpbnQxNkFycmF5ID0gdHlwZW9mIFVpbnQxNkFycmF5ID09ICd1bmRlZmluZWQnID8gQXJyYXkgOiBVaW50MTZBcnJheTtcblxudmVuZG9yLlVpbnQzMkFycmF5ID0gdHlwZW9mIFVpbnQzMkFycmF5ID09ICd1bmRlZmluZWQnID8gQXJyYXkgOiBVaW50MzJBcnJheTtcblxudmVuZG9yLkludDE2QXJyYXkgPSB0eXBlb2YgSW50MTZBcnJheSA9PSAndW5kZWZpbmVkJyA/IEFycmF5IDogSW50MTZBcnJheTtcblxudmVuZG9yLkZsb2F0MzJBcnJheSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT0gJ3VuZGVmaW5lZCcgPyBBcnJheSA6IEZsb2F0MzJBcnJheTtcblxudmVuZG9yLkZsb2F0NjRBcnJheSA9IHR5cGVvZiBGbG9hdDY0QXJyYXkgPT0gJ3VuZGVmaW5lZCcgPyBBcnJheSA6IEZsb2F0NjRBcnJheTtcblxuZXhwb3J0IGRlZmF1bHQgdmVuZG9yO1xuIiwiaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlZlY3RvcjNcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IHpcbiAqL1xudmFyIFZlY3RvcjMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG5cbiAgICB4ID0geCB8fCAwO1xuICAgIHkgPSB5IHx8IDA7XG4gICAgeiA9IHogfHwgMDtcblxuICAgIC8qKlxuICAgICAqIFN0b3JhZ2Ugb2YgVmVjdG9yMywgcmVhZCBhbmQgd3JpdGUgb2YgeCwgeSwgeiB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIGluIGFycmF5XG4gICAgICogQWxsIG1ldGhvZHMgYWxzbyBvcGVyYXRlIG9uIHRoZSBhcnJheSBpbnN0ZWFkIG9mIHgsIHksIHogY29tcG9uZW50c1xuICAgICAqIEBuYW1lIGFycmF5XG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjMjXG4gICAgICovXG4gICAgdGhpcy5hcnJheSA9IHZlYzMuZnJvbVZhbHVlcyh4LCB5LCB6KTtcblxuICAgIC8qKlxuICAgICAqIERpcnR5IGZsYWcgaXMgdXNlZCBieSB0aGUgTm9kZSB0byBkZXRlcm1pbmVcbiAgICAgKiBpZiB0aGUgbWF0cml4IGlzIHVwZGF0ZWQgdG8gbGF0ZXN0XG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3IzI1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cblZlY3RvcjMucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3IgOiBWZWN0b3IzLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGIgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAoYikge1xuICAgICAgICB2ZWMzLmFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHgsIHkgYW5kIHogY29tcG9uZW50c1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB5XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgelxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gKHgsIHksIHopIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IHg7XG4gICAgICAgIHRoaXMuYXJyYXlbMV0gPSB5O1xuICAgICAgICB0aGlzLmFycmF5WzJdID0gejtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHgsIHkgYW5kIHogY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICB0aGlzLmFycmF5WzBdID0gYXJyWzBdO1xuICAgICAgICB0aGlzLmFycmF5WzFdID0gYXJyWzFdO1xuICAgICAgICB0aGlzLmFycmF5WzJdID0gYXJyWzJdO1xuXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IFZlY3RvcjNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAoYikge1xuICAgICAgICB2ZWMzLmNvcHkodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyb3NzIHByb2R1Y3Qgb2Ygc2VsZiBhbmQgYiwgd3JpdHRlbiB0byBhIFZlY3RvcjMgb3V0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGNyb3NzOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICB2ZWMzLmNyb3NzKHRoaXMuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGlzdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gdmVjMy5kaXN0KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXN0YW5jZSBiZXR3ZWVuIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0YW5jZTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZGlzdGFuY2UodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBkaXZpZGVcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGRpdjogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5kaXYodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSBzZWxmIGJ5IGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGRpdmlkZTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5kaXZpZGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERvdCBwcm9kdWN0IG9mIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkb3Q6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmRvdCh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgb2YgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5sZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5sZW5ndGgodGhpcy5hcnJheSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGxlcnA6IGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIHZlYzMubGVycCh0aGlzLmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBtaW46IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHZlYzMubWluKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIG1heDogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5tYXgodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdWx0aXBseVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgbXVsOiBmdW5jdGlvbiAoYikge1xuICAgICAgICB2ZWMzLm11bCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXV0aXBseSBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBtdWx0aXBseTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5tdWx0aXBseSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTmVnYXRlIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBuZWdhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmVjMy5uZWdhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSBzZWxmXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZlYzMubm9ybWFsaXplKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSByYW5kb20geCwgeSwgeiBjb21wb25lbnRzIHdpdGggYSBnaXZlbiBzY2FsZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICByYW5kb206IGZ1bmN0aW9uIChzY2FsZSkge1xuICAgICAgICB2ZWMzLnJhbmRvbSh0aGlzLmFycmF5LCBzY2FsZSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHNlbGZcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbiAocykge1xuICAgICAgICB2ZWMzLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHMpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTY2FsZSBiIGFuZCBhZGQgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzY2FsZUFuZEFkZDogZnVuY3Rpb24gKGIsIHMpIHtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5LCBzKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHNxdWFyZWREaXN0YW5jZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckRpc3Q6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLnNxckRpc3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZERpc3RhbmNlOiBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gdmVjMy5zcXVhcmVkRGlzdGFuY2UodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzcXVhcmVkTGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5zcXJMZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgbGVuZ3RoIG9mIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZExlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmVjMy5zcXVhcmVkTGVuZ3RoKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Igc3VidHJhY3RcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHN1YjogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5zdWIodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IGIgZnJvbSBzZWxmXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdmVjMy5zdWJ0cmFjdCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIE1hdHJpeDMgbVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdHJhbnNmb3JtTWF0MzogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQzKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIG0uYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gc2VsZiB3aXRoIGEgTWF0cml4NCBtXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1NYXQ0OiBmdW5jdGlvbiAobSkge1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgbS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gc2VsZiB3aXRoIGEgUXVhdGVybmlvbiBxXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1RdWF0OiBmdW5jdGlvbiAocSkge1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybVF1YXQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYXNuZm9ybSBzZWxmIGludG8gcHJvamVjdGlvbiBzcGFjZSB3aXRoIG1cbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLmFycmF5O1xuICAgICAgICBtID0gbS5hcnJheTtcblxuICAgICAgICAvLyBQZXJzcGVjdGl2ZSBwcm9qZWN0aW9uXG4gICAgICAgIGlmIChtWzE1XSA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHcgPSAtMSAvIHZbMl07XG4gICAgICAgICAgICB2WzBdID0gbVswXSAqIHZbMF0gKiB3O1xuICAgICAgICAgICAgdlsxXSA9IG1bNV0gKiB2WzFdICogdztcbiAgICAgICAgICAgIHZbMl0gPSAobVsxMF0gKiB2WzJdICsgbVsxNF0pICogdztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZbMF0gPSBtWzBdICogdlswXSArIG1bMTJdO1xuICAgICAgICAgICAgdlsxXSA9IG1bNV0gKiB2WzFdICsgbVsxM107XG4gICAgICAgICAgICB2WzJdID0gbVsxMF0gKiB2WzJdICsgbVsxNF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBldWxlckZyb21RdWF0OiBmdW5jdGlvbihxLCBvcmRlcikge1xuICAgICAgICBWZWN0b3IzLmV1bGVyRnJvbVF1YXQodGhpcywgcSwgb3JkZXIpO1xuICAgIH0sXG5cbiAgICBldWxlckZyb21NYXQzOiBmdW5jdGlvbiAobSwgb3JkZXIpIHtcbiAgICAgICAgVmVjdG9yMy5ldWxlckZyb21NYXQzKHRoaXMsIG0sIG9yZGVyKTtcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ1snICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbCh0aGlzLmFycmF5LCAnLCcpICsgJ10nO1xuICAgIH0sXG5cbiAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KTtcbiAgICB9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBHZXR0ZXIgYW5kIFNldHRlclxuaWYgKGRlZmluZVByb3BlcnR5KSB7XG5cbiAgICB2YXIgcHJvdG8gPSBWZWN0b3IzLnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBAbmFtZSB4XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3gnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbMF07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzBdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguVmVjdG9yM1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgelxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3IzXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd6Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzJdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVsyXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cblxuLy8gU3VwcGx5IG1ldGhvZHMgdGhhdCBhcmUgbm90IGluIHBsYWNlXG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLmFkZChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge251bWJlcn0gIHhcbiAqIEBwYXJhbSAge251bWJlcn0gIHlcbiAqIEBwYXJhbSAge251bWJlcn0gIHpcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSwgeikge1xuICAgIHZlYzMuc2V0KG91dC5hcnJheSwgeCwgeSwgeik7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5jb3B5ID0gZnVuY3Rpb24ob3V0LCBiKSB7XG4gICAgdmVjMy5jb3B5KG91dC5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzMuY3Jvc3Mob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5kaXN0ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWMzLmRpc3RhbmNlKGEuYXJyYXksIGIuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3IzLmRpc3RhbmNlID0gVmVjdG9yMy5kaXN0O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuZGl2ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMy5kaXZpZGUob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuZGl2aWRlID0gVmVjdG9yMy5kaXY7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjMuZG90ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWMzLmRvdChhLmFycmF5LCBiLmFycmF5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5sZW4gPSBmdW5jdGlvbihiKSB7XG4gICAgcmV0dXJuIHZlYzMubGVuZ3RoKGIuYXJyYXkpO1xufTtcblxuLy8gVmVjdG9yMy5sZW5ndGggPSBWZWN0b3IzLmxlbjtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAqIEBwYXJhbSAge251bWJlcn0gIHRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLmxlcnAgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHQpIHtcbiAgICB2ZWMzLmxlcnAob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLm1pbihvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjMy5tYXgob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5tdWwgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLm11bHRpcGx5KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5tdWx0aXBseSA9IFZlY3RvcjMubXVsO1xuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmVjMy5uZWdhdGUob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZlYzMubm9ybWFsaXplKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge251bWJlcn0gIHNjYWxlXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5yYW5kb20gPSBmdW5jdGlvbihvdXQsIHNjYWxlKSB7XG4gICAgdmVjMy5yYW5kb20ob3V0LmFycmF5LCBzY2FsZSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHNjYWxlKSB7XG4gICAgdmVjMy5zY2FsZShvdXQuYXJyYXksIGEuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjMuc3FyRGlzdCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gdmVjMy5zcXJEaXN0KGEuYXJyYXksIGIuYXJyYXkpO1xufTtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5zcXVhcmVkRGlzdGFuY2UgPSBWZWN0b3IzLnNxckRpc3Q7XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjMuc3FyTGVuID0gZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiB2ZWMzLnNxckxlbihhLmFycmF5KTtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yMy5zcXVhcmVkTGVuZ3RoID0gVmVjdG9yMy5zcXJMZW47XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5zdWIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWMzLnN1YnRyYWN0KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5zdWJ0cmFjdCA9IFZlY3RvcjMuc3ViO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtNYXRyaXgzfSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMy50cmFuc2Zvcm1NYXQzKG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy50cmFuc2Zvcm1NYXQ0ID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmVjMy50cmFuc2Zvcm1NYXQ0KG91dC5hcnJheSwgYS5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gcVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZlYzMudHJhbnNmb3JtUXVhdChvdXQuYXJyYXksIGEuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5mdW5jdGlvbiBjbGFtcCh2YWwsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIHZhbCA8IG1pbiA/IG1pbiA6ICh2YWwgPiBtYXggPyBtYXggOiB2YWwpO1xufVxudmFyIGF0YW4yID0gTWF0aC5hdGFuMjtcbnZhciBhc2luID0gTWF0aC5hc2luO1xudmFyIGFicyA9IE1hdGguYWJzO1xuLyoqXG4gKiBDb252ZXJ0IHF1YXRlcm5pb24gdG8gZXVsZXIgYW5nbGVcbiAqIFF1YXRlcm5pb24gbXVzdCBiZSBub3JtYWxpemVkXG4gKiBGcm9tIHRocmVlLmpzXG4gKi9cblZlY3RvcjMuZXVsZXJGcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEsIG9yZGVyKSB7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcSA9IHEuYXJyYXk7XG5cbiAgICB2YXIgdGFyZ2V0ID0gb3V0LmFycmF5O1xuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXTtcbiAgICB2YXIgeDIgPSB4ICogeDtcbiAgICB2YXIgeTIgPSB5ICogeTtcbiAgICB2YXIgejIgPSB6ICogejtcbiAgICB2YXIgdzIgPSB3ICogdztcblxuICAgIHZhciBvcmRlciA9IChvcmRlciB8fCAnWFlaJykudG9VcHBlckNhc2UoKTtcblxuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgICAgY2FzZSAnWFlaJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKDIgKiAoeCAqIHcgLSB5ICogeiksICh3MiAtIHgyIC0geTIgKyB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbihjbGFtcCgyICogKHggKiB6ICsgeSAqIHcpLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKDIgKiAoeiAqIHcgLSB4ICogeSksICh3MiArIHgyIC0geTIgLSB6MikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1lYWic6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBhc2luKGNsYW1wKDIgKiAoeCAqIHcgLSB5ICogeiksIC0gMSwgMSkpO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIoMiAqICh4ICogeiArIHkgKiB3KSwgKHcyIC0geDIgLSB5MiArIHoyKSk7XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBhdGFuMigyICogKHggKiB5ICsgeiAqIHcpLCAodzIgLSB4MiArIHkyIC0gejIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdaWFknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXNpbihjbGFtcCgyICogKHggKiB3ICsgeSAqIHopLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGF0YW4yKDIgKiAoeSAqIHcgLSB6ICogeCksICh3MiAtIHgyIC0geTIgKyB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYXRhbjIoMiAqICh6ICogdyAtIHggKiB5KSwgKHcyIC0geDIgKyB5MiAtIHoyKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWllYJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKDIgKiAoeCAqIHcgKyB6ICogeSksICh3MiAtIHgyIC0geTIgKyB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbihjbGFtcCgyICogKHkgKiB3IC0geCAqIHopLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKDIgKiAoeCAqIHkgKyB6ICogdyksICh3MiArIHgyIC0geTIgLSB6MikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1laWCc6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBhdGFuMigyICogKHggKiB3IC0geiAqIHkpLCAodzIgLSB4MiArIHkyIC0gejIpKTtcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGF0YW4yKDIgKiAoeSAqIHcgLSB4ICogeiksICh3MiArIHgyIC0geTIgLSB6MikpO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYXNpbihjbGFtcCgyICogKHggKiB5ICsgeiAqIHcpLCAtIDEsIDEpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdYWlknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIoMiAqICh4ICogdyArIHkgKiB6KSwgKHcyIC0geDIgKyB5MiAtIHoyKSk7XG4gICAgICAgICAgICB0YXJnZXRbMV0gPSBhdGFuMigyICogKHggKiB6ICsgeSAqIHcpLCAodzIgKyB4MiAtIHkyIC0gejIpKTtcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGFzaW4oY2xhbXAoMiAqICh6ICogdyAtIHggKiB5KSwgLSAxLCAxKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5rb3duIG9yZGVyOiAnICsgb3JkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHJvdGF0aW9uIG1hdHJpeCB0byBldWxlciBhbmdsZVxuICogZnJvbSB0aHJlZS5qc1xuICovXG5WZWN0b3IzLmV1bGVyRnJvbU1hdDMgPSBmdW5jdGlvbiAob3V0LCBtLCBvcmRlcikge1xuICAgIC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG4gICAgdmFyIHRlID0gbS5hcnJheTtcbiAgICB2YXIgbTExID0gdGVbMF0sIG0xMiA9IHRlWzNdLCBtMTMgPSB0ZVs2XTtcbiAgICB2YXIgbTIxID0gdGVbMV0sIG0yMiA9IHRlWzRdLCBtMjMgPSB0ZVs3XTtcbiAgICB2YXIgbTMxID0gdGVbMl0sIG0zMiA9IHRlWzVdLCBtMzMgPSB0ZVs4XTtcbiAgICB2YXIgdGFyZ2V0ID0gb3V0LmFycmF5O1xuXG4gICAgdmFyIG9yZGVyID0gKG9yZGVyIHx8ICdYWVonKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgICAgICBjYXNlICdYWVonOlxuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbihjbGFtcChtMTMsIC0xLCAxKSk7XG4gICAgICAgICAgICBpZiAoYWJzKG0xMykgPCAwLjk5OTk5KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIoLW0yMywgbTMzKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMl0gPSBhdGFuMigtbTEyLCBtMTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIobTMyLCBtMjIpO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVhaJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IGFzaW4oLWNsYW1wKG0yMywgLTEsIDEpKTtcbiAgICAgICAgICAgIGlmIChhYnMobTIzKSA8IDAuOTk5OTkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMV0gPSBhdGFuMihtMTMsIG0zMyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzJdID0gYXRhbjIobTIxLCBtMjIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIoLW0zMSwgbTExKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1pYWSc6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBhc2luKGNsYW1wKG0zMiwgLTEsIDEpKTtcbiAgICAgICAgICAgIGlmIChhYnMobTMyKSA8IDAuOTk5OTkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMV0gPSBhdGFuMigtbTMxLCBtMzMpO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKC1tMTIsIG0yMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMV0gPSAwO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKG0yMSwgbTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdaWVgnOlxuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXNpbigtY2xhbXAobTMxLCAtMSwgMSkpO1xuICAgICAgICAgICAgaWYgKGFicyhtMzEpIDwgMC45OTk5OSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKG0zMiwgbTMzKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMl0gPSBhdGFuMihtMjEsIG0xMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbMF0gPSAwO1xuICAgICAgICAgICAgICAgIHRhcmdldFsyXSA9IGF0YW4yKC1tMTIsIG0yMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVpYJzpcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGFzaW4oY2xhbXAobTIxLCAtMSwgMSkpO1xuICAgICAgICAgICAgaWYgKGFicyhtMjEpIDwgMC45OTk5OSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKC1tMjMsIG0yMik7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIoLW0zMSwgbTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IDA7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gYXRhbjIobTEzLCBtMzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1haWSc6XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBhc2luKC1jbGFtcChtMTIsIC0xLCAxKSk7XG4gICAgICAgICAgICBpZiAoYWJzKG0xMikgPCAwLjk5OTk5KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gYXRhbjIobTMyLCBtMjIpO1xuICAgICAgICAgICAgICAgIHRhcmdldFsxXSA9IGF0YW4yKG0xMywgbTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFswXSA9IGF0YW4yKC1tMjMsIG0zMyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtvd24gb3JkZXI6ICcgKyBvcmRlcik7XG4gICAgfVxuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8vIFRPRE8gcmV0dXJuIG5ldy5cbi8qKlxuICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLlBPU0lUSVZFX1ggPSBuZXcgVmVjdG9yMygxLCAwLCAwKTtcbi8qKlxuICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLk5FR0FUSVZFX1ggPSBuZXcgVmVjdG9yMygtMSwgMCwgMCk7XG4vKipcbiAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5QT1NJVElWRV9ZID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG4vKipcbiAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5ORUdBVElWRV9ZID0gbmV3IFZlY3RvcjMoMCwgLTEsIDApO1xuLyoqXG4gKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuUE9TSVRJVkVfWiA9IG5ldyBWZWN0b3IzKDAsIDAsIDEpO1xuLyoqXG4gKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gKi9cblZlY3RvcjMuTkVHQVRJVkVfWiA9IG5ldyBWZWN0b3IzKDAsIDAsIC0xKTtcbi8qKlxuICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICovXG5WZWN0b3IzLlVQID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG4vKipcbiAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmVjdG9yMy5aRVJPID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvcjM7XG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbnZhciB2ZWMzQ29weSA9IHZlYzMuY29weTtcbnZhciB2ZWMzU2V0ID0gdmVjMy5zZXQ7XG5cbi8qKlxuICogQXhpcyBhbGlnbmVkIGJvdW5kaW5nIGJveFxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLkJvdW5kaW5nQm94XG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbbWluXVxuICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gW21heF1cbiAqL1xudmFyIEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIGNvb3JkcyBvZiBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy5taW4gPSBtaW4gfHwgbmV3IFZlY3RvcjMoSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eSk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIGNvb3JkcyBvZiBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy5tYXggPSBtYXggfHwgbmV3IFZlY3RvcjMoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSk7XG59O1xuXG5Cb3VuZGluZ0JveC5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogQm91bmRpbmdCb3gsXG4gICAgLyoqXG4gICAgICogVXBkYXRlIG1pbiBhbmQgbWF4IGNvb3JkcyBmcm9tIGEgdmVydGljZXMgYXJyYXlcbiAgICAgKiBAcGFyYW0gIHthcnJheX0gdmVydGljZXNcbiAgICAgKi9cbiAgICB1cGRhdGVGcm9tVmVydGljZXM6IGZ1bmN0aW9uICh2ZXJ0aWNlcykge1xuICAgICAgICBpZiAodmVydGljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIG1pbiA9IHRoaXMubWluO1xuICAgICAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICAgICAgdmFyIG1pbkFyciA9IG1pbi5hcnJheTtcbiAgICAgICAgICAgIHZhciBtYXhBcnIgPSBtYXguYXJyYXk7XG4gICAgICAgICAgICB2ZWMzQ29weShtaW5BcnIsIHZlcnRpY2VzWzBdKTtcbiAgICAgICAgICAgIHZlYzNDb3B5KG1heEFyciwgdmVydGljZXNbMF0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhbMF0gPCBtaW5BcnJbMF0pIHsgbWluQXJyWzBdID0gdmVydGV4WzBdOyB9XG4gICAgICAgICAgICAgICAgaWYgKHZlcnRleFsxXSA8IG1pbkFyclsxXSkgeyBtaW5BcnJbMV0gPSB2ZXJ0ZXhbMV07IH1cbiAgICAgICAgICAgICAgICBpZiAodmVydGV4WzJdIDwgbWluQXJyWzJdKSB7IG1pbkFyclsyXSA9IHZlcnRleFsyXTsgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHZlcnRleFswXSA+IG1heEFyclswXSkgeyBtYXhBcnJbMF0gPSB2ZXJ0ZXhbMF07IH1cbiAgICAgICAgICAgICAgICBpZiAodmVydGV4WzFdID4gbWF4QXJyWzFdKSB7IG1heEFyclsxXSA9IHZlcnRleFsxXTsgfVxuICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhbMl0gPiBtYXhBcnJbMl0pIHsgbWF4QXJyWzJdID0gdmVydGV4WzJdOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1heC5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVuaW9uIG9wZXJhdGlvbiB3aXRoIGFub3RoZXIgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fSBiYm94XG4gICAgICovXG4gICAgdW5pb246IGZ1bmN0aW9uIChiYm94KSB7XG4gICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICB2ZWMzLm1pbihtaW4uYXJyYXksIG1pbi5hcnJheSwgYmJveC5taW4uYXJyYXkpO1xuICAgICAgICB2ZWMzLm1heChtYXguYXJyYXksIG1heC5hcnJheSwgYmJveC5tYXguYXJyYXkpO1xuICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcnNlY3Rpb24gb3BlcmF0aW9uIHdpdGggYW5vdGhlciBib3VuZGluZyBib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9IGJib3hcbiAgICAgKi9cbiAgICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIChiYm94KSB7XG4gICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICB2ZWMzLm1heChtaW4uYXJyYXksIG1pbi5hcnJheSwgYmJveC5taW4uYXJyYXkpO1xuICAgICAgICB2ZWMzLm1pbihtYXguYXJyYXksIG1heC5hcnJheSwgYmJveC5tYXguYXJyYXkpO1xuICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBpbnRlcnNlY3Qgd2l0aCBhbm90aGVyIGJvdW5kaW5nIGJveFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5Cb3VuZGluZ0JveH0gYmJveFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW50ZXJzZWN0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uIChiYm94KSB7XG4gICAgICAgIHZhciBfbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBfbWF4ID0gdGhpcy5tYXguYXJyYXk7XG5cbiAgICAgICAgdmFyIF9taW4yID0gYmJveC5taW4uYXJyYXk7XG4gICAgICAgIHZhciBfbWF4MiA9IGJib3gubWF4LmFycmF5O1xuXG4gICAgICAgIHJldHVybiAhIChfbWluWzBdID4gX21heDJbMF0gfHwgX21pblsxXSA+IF9tYXgyWzFdIHx8IF9taW5bMl0gPiBfbWF4MlsyXVxuICAgICAgICAgICAgfHwgX21heFswXSA8IF9taW4yWzBdIHx8IF9tYXhbMV0gPCBfbWluMlsxXSB8fCBfbWF4WzJdIDwgX21pbjJbMl0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBjb250YWluIGFub3RoZXIgYm91bmRpbmcgYm94IGVudGlyZWx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fSBiYm94XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjb250YWluQm91bmRpbmdCb3g6IGZ1bmN0aW9uIChiYm94KSB7XG5cbiAgICAgICAgdmFyIF9taW4gPSB0aGlzLm1pbi5hcnJheTtcbiAgICAgICAgdmFyIF9tYXggPSB0aGlzLm1heC5hcnJheTtcblxuICAgICAgICB2YXIgX21pbjIgPSBiYm94Lm1pbi5hcnJheTtcbiAgICAgICAgdmFyIF9tYXgyID0gYmJveC5tYXguYXJyYXk7XG5cbiAgICAgICAgcmV0dXJuIF9taW5bMF0gPD0gX21pbjJbMF0gJiYgX21pblsxXSA8PSBfbWluMlsxXSAmJiBfbWluWzJdIDw9IF9taW4yWzJdXG4gICAgICAgICAgICAmJiBfbWF4WzBdID49IF9tYXgyWzBdICYmIF9tYXhbMV0gPj0gX21heDJbMV0gJiYgX21heFsyXSA+PSBfbWF4MlsyXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgY29udGFpbiBwb2ludCBlbnRpcmVseVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBwb2ludFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgY29udGFpblBvaW50OiBmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgX21pbiA9IHRoaXMubWluLmFycmF5O1xuICAgICAgICB2YXIgX21heCA9IHRoaXMubWF4LmFycmF5O1xuXG4gICAgICAgIHZhciBfcCA9IHAuYXJyYXk7XG5cbiAgICAgICAgcmV0dXJuIF9taW5bMF0gPD0gX3BbMF0gJiYgX21pblsxXSA8PSBfcFsxXSAmJiBfbWluWzJdIDw9IF9wWzJdXG4gICAgICAgICAgICAmJiBfbWF4WzBdID49IF9wWzBdICYmIF9tYXhbMV0gPj0gX3BbMV0gJiYgX21heFsyXSA+PSBfcFsyXTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgYm91bmRpbmcgYm94IGlzIGZpbml0ZVxuICAgICAqL1xuICAgIGlzRmluaXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBfbWF4ID0gdGhpcy5tYXguYXJyYXk7XG4gICAgICAgIHJldHVybiBpc0Zpbml0ZShfbWluWzBdKSAmJiBpc0Zpbml0ZShfbWluWzFdKSAmJiBpc0Zpbml0ZShfbWluWzJdKVxuICAgICAgICAgICAgJiYgaXNGaW5pdGUoX21heFswXSkgJiYgaXNGaW5pdGUoX21heFsxXSkgJiYgaXNGaW5pdGUoX21heFsyXSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGFuIGFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHRvIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbWF0cml4XG4gICAgICovXG4gICAgYXBwbHlUcmFuc2Zvcm06IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGh0dHA6Ly9kZXYudGhlb21hZGVyLmNvbS90cmFuc2Zvcm0tYm91bmRpbmctYm94ZXMvXG4gICAgICAgIHZhciB4YSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB4YiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB5YSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB5YiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB6YSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB6YiA9IHZlYzMuY3JlYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtYXRyaXgpIHtcbiAgICAgICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbi5hcnJheTtcbiAgICAgICAgICAgIHZhciBtYXggPSB0aGlzLm1heC5hcnJheTtcblxuICAgICAgICAgICAgdmFyIG0gPSBtYXRyaXguYXJyYXk7XG5cbiAgICAgICAgICAgIHhhWzBdID0gbVswXSAqIG1pblswXTsgeGFbMV0gPSBtWzFdICogbWluWzBdOyB4YVsyXSA9IG1bMl0gKiBtaW5bMF07XG4gICAgICAgICAgICB4YlswXSA9IG1bMF0gKiBtYXhbMF07IHhiWzFdID0gbVsxXSAqIG1heFswXTsgeGJbMl0gPSBtWzJdICogbWF4WzBdO1xuXG4gICAgICAgICAgICB5YVswXSA9IG1bNF0gKiBtaW5bMV07IHlhWzFdID0gbVs1XSAqIG1pblsxXTsgeWFbMl0gPSBtWzZdICogbWluWzFdO1xuICAgICAgICAgICAgeWJbMF0gPSBtWzRdICogbWF4WzFdOyB5YlsxXSA9IG1bNV0gKiBtYXhbMV07IHliWzJdID0gbVs2XSAqIG1heFsxXTtcblxuICAgICAgICAgICAgemFbMF0gPSBtWzhdICogbWluWzJdOyB6YVsxXSA9IG1bOV0gKiBtaW5bMl07IHphWzJdID0gbVsxMF0gKiBtaW5bMl07XG4gICAgICAgICAgICB6YlswXSA9IG1bOF0gKiBtYXhbMl07IHpiWzFdID0gbVs5XSAqIG1heFsyXTsgemJbMl0gPSBtWzEwXSAqIG1heFsyXTtcblxuICAgICAgICAgICAgbWluWzBdID0gTWF0aC5taW4oeGFbMF0sIHhiWzBdKSArIE1hdGgubWluKHlhWzBdLCB5YlswXSkgKyBNYXRoLm1pbih6YVswXSwgemJbMF0pICsgbVsxMl07XG4gICAgICAgICAgICBtaW5bMV0gPSBNYXRoLm1pbih4YVsxXSwgeGJbMV0pICsgTWF0aC5taW4oeWFbMV0sIHliWzFdKSArIE1hdGgubWluKHphWzFdLCB6YlsxXSkgKyBtWzEzXTtcbiAgICAgICAgICAgIG1pblsyXSA9IE1hdGgubWluKHhhWzJdLCB4YlsyXSkgKyBNYXRoLm1pbih5YVsyXSwgeWJbMl0pICsgTWF0aC5taW4oemFbMl0sIHpiWzJdKSArIG1bMTRdO1xuXG4gICAgICAgICAgICBtYXhbMF0gPSBNYXRoLm1heCh4YVswXSwgeGJbMF0pICsgTWF0aC5tYXgoeWFbMF0sIHliWzBdKSArIE1hdGgubWF4KHphWzBdLCB6YlswXSkgKyBtWzEyXTtcbiAgICAgICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHhhWzFdLCB4YlsxXSkgKyBNYXRoLm1heCh5YVsxXSwgeWJbMV0pICsgTWF0aC5tYXgoemFbMV0sIHpiWzFdKSArIG1bMTNdO1xuICAgICAgICAgICAgbWF4WzJdID0gTWF0aC5tYXgoeGFbMl0sIHhiWzJdKSArIE1hdGgubWF4KHlhWzJdLCB5YlsyXSkgKyBNYXRoLm1heCh6YVsyXSwgemJbMl0pICsgbVsxNF07XG5cbiAgICAgICAgICAgIHRoaXMubWluLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1heC5fZGlydHkgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBwcm9qZWN0aW9uIG1hdHJpeCB0byB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG1hdHJpeFxuICAgICAqL1xuICAgIGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKG1hdHJpeCkge1xuICAgICAgICB2YXIgbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heC5hcnJheTtcblxuICAgICAgICB2YXIgbSA9IG1hdHJpeC5hcnJheTtcbiAgICAgICAgLy8gbWluIGluIG1pbiB6XG4gICAgICAgIHZhciB2MTAgPSBtaW5bMF07XG4gICAgICAgIHZhciB2MTEgPSBtaW5bMV07XG4gICAgICAgIHZhciB2MTIgPSBtaW5bMl07XG4gICAgICAgIC8vIG1heCBpbiBtaW4gelxuICAgICAgICB2YXIgdjIwID0gbWF4WzBdO1xuICAgICAgICB2YXIgdjIxID0gbWF4WzFdO1xuICAgICAgICB2YXIgdjIyID0gbWluWzJdO1xuICAgICAgICAvLyBtYXggaW4gbWF4IHpcbiAgICAgICAgdmFyIHYzMCA9IG1heFswXTtcbiAgICAgICAgdmFyIHYzMSA9IG1heFsxXTtcbiAgICAgICAgdmFyIHYzMiA9IG1heFsyXTtcblxuICAgICAgICBpZiAobVsxNV0gPT09IDEpIHsgIC8vIE9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uXG4gICAgICAgICAgICBtaW5bMF0gPSBtWzBdICogdjEwICsgbVsxMl07XG4gICAgICAgICAgICBtaW5bMV0gPSBtWzVdICogdjExICsgbVsxM107XG4gICAgICAgICAgICBtYXhbMl0gPSBtWzEwXSAqIHYxMiArIG1bMTRdO1xuXG4gICAgICAgICAgICBtYXhbMF0gPSBtWzBdICogdjMwICsgbVsxMl07XG4gICAgICAgICAgICBtYXhbMV0gPSBtWzVdICogdjMxICsgbVsxM107XG4gICAgICAgICAgICBtaW5bMl0gPSBtWzEwXSAqIHYzMiArIG1bMTRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHcgPSAtMSAvIHYxMjtcbiAgICAgICAgICAgIG1pblswXSA9IG1bMF0gKiB2MTAgKiB3O1xuICAgICAgICAgICAgbWluWzFdID0gbVs1XSAqIHYxMSAqIHc7XG4gICAgICAgICAgICBtYXhbMl0gPSAobVsxMF0gKiB2MTIgKyBtWzE0XSkgKiB3O1xuXG4gICAgICAgICAgICB3ID0gLTEgLyB2MjI7XG4gICAgICAgICAgICBtYXhbMF0gPSBtWzBdICogdjIwICogdztcbiAgICAgICAgICAgIG1heFsxXSA9IG1bNV0gKiB2MjEgKiB3O1xuXG4gICAgICAgICAgICB3ID0gLTEgLyB2MzI7XG4gICAgICAgICAgICBtaW5bMl0gPSAobVsxMF0gKiB2MzIgKyBtWzE0XSkgKiB3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMubWF4Ll9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHVwZGF0ZVZlcnRpY2VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG4gICAgICAgIGlmICghdmVydGljZXMpIHtcbiAgICAgICAgICAgIC8vIEN1YmUgdmVydGljZXNcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHZlYzMuZnJvbVZhbHVlcygwLCAwLCAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBFaWdodCBjb29yZHMgb2YgYm91bmRpbmcgYm94XG4gICAgICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMudmVydGljZXMgPSB2ZXJ0aWNlcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWluID0gdGhpcy5taW4uYXJyYXk7XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heC5hcnJheTtcbiAgICAgICAgLy8tLS0gbWluIHpcbiAgICAgICAgLy8gbWluIHhcbiAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1swXSwgbWluWzBdLCBtaW5bMV0sIG1pblsyXSk7XG4gICAgICAgIHZlYzNTZXQodmVydGljZXNbMV0sIG1pblswXSwgbWF4WzFdLCBtaW5bMl0pO1xuICAgICAgICAvLyBtYXggeFxuICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzJdLCBtYXhbMF0sIG1pblsxXSwgbWluWzJdKTtcbiAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1szXSwgbWF4WzBdLCBtYXhbMV0sIG1pblsyXSk7XG5cbiAgICAgICAgLy8tLSBtYXggelxuICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzRdLCBtaW5bMF0sIG1pblsxXSwgbWF4WzJdKTtcbiAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1s1XSwgbWluWzBdLCBtYXhbMV0sIG1heFsyXSk7XG4gICAgICAgIHZlYzNTZXQodmVydGljZXNbNl0sIG1heFswXSwgbWluWzFdLCBtYXhbMl0pO1xuICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzddLCBtYXhbMF0sIG1heFsxXSwgbWF4WzJdKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENvcHkgdmFsdWVzIGZyb20gYW5vdGhlciBib3VuZGluZyBib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9IGJib3hcbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAoYmJveCkge1xuICAgICAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgdmVjM0NvcHkobWluLmFycmF5LCBiYm94Lm1pbi5hcnJheSk7XG4gICAgICAgIHZlYzNDb3B5KG1heC5hcnJheSwgYmJveC5tYXguYXJyYXkpO1xuICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBib3VuZGluZyBib3hcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIGJvdW5kaW5nQm94LmNvcHkodGhpcyk7XG4gICAgICAgIHJldHVybiBib3VuZGluZ0JveDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCb3VuZGluZ0JveDtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi9WZWN0b3IzJztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbnZhciBtYXQzID0gZ2xNYXRyaXgubWF0MztcbnZhciBxdWF0ID0gZ2xNYXRyaXgucXVhdDtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5Lm1hdGguTWF0cml4NFxuICovXG52YXIgTWF0cml4NCA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdGhpcy5fYXhpc1ggPSBuZXcgVmVjdG9yMygpO1xuICAgIHRoaXMuX2F4aXNZID0gbmV3IFZlY3RvcjMoKTtcbiAgICB0aGlzLl9heGlzWiA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIE1hdHJpeDRcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXg0I1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBtYXQ0LmNyZWF0ZSgpO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXg0I1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cbk1hdHJpeDQucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IE1hdHJpeDQsXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbaV0gPSBhcnJbaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgYWRqdWdhdGUgb2Ygc2VsZiwgaW4tcGxhY2VcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBhZGpvaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWF0NC5hZGpvaW50KHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBNYXRyaXg0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKG5ldyBNYXRyaXg0KCkpLmNvcHkodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbihhKSB7XG4gICAgICAgIG1hdDQuY29weSh0aGlzLmFycmF5LCBhLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG1hdHJpeCBkZXRlcm1pbmFudFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkZXRlcm1pbmFudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtYXQ0LmRldGVybWluYW50KHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXBwZXIgM3gzIHBhcnQgZnJvbSBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBmcm9tUXVhdDogZnVuY3Rpb24ocSkge1xuICAgICAgICBtYXQ0LmZyb21RdWF0KHRoaXMuYXJyYXksIHEuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gdlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uOiBmdW5jdGlvbihxLCB2KSB7XG4gICAgICAgIG1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24odGhpcy5hcnJheSwgcS5hcnJheSwgdi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBmcm9tIE1hdHJpeDJkLCBpdCBpcyB1c2VkIHdoZW4gY29udmVydGluZyBhIDJkIHNoYXBlIHRvIDNkIHNwYWNlLlxuICAgICAqIEluIDNkIHNwYWNlIGl0IGlzIGVxdWl2YWxlbnQgdG8gcmFuc2xhdGUgb24geHkgcGxhbmUgYW5kIHJvdGF0ZSBhYm91dCB6IGF4aXNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IG0yZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGZyb21NYXQyZDogZnVuY3Rpb24obTJkKSB7XG4gICAgICAgIE1hdHJpeDQuZnJvbU1hdDJkKHRoaXMsIG0yZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZnJvbSBmcnVzdHVtIGJvdW5kc1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gbGVmdFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gcmlnaHRcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGJvdHRvbVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gdG9wXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBuZWFyXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBmYXJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBmcnVzdHVtOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICAgICAgbWF0NC5mcnVzdHVtKHRoaXMuYXJyYXksIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgaWRlbnRpdHkgbWF0cml4XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgaWRlbnRpdHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbnZlcnQgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGludmVydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDQuaW52ZXJ0KHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgYXMgYSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gZXllXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGNlbnRlclxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSB1cFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIGxvb2tBdDogZnVuY3Rpb24oZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgICAgIG1hdDQubG9va0F0KHRoaXMuYXJyYXksIGV5ZS5hcnJheSwgY2VudGVyLmFycmF5LCB1cC5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdXRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0NC5tdWwodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdWx0aXBseUxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIG11bExlZnQ6IGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgbWF0NC5tdWwodGhpcy5hcnJheSwgYS5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIG11bHRpcGx5OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDQubXVsdGlwbHkodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IGEgYW5kIHNlbGYsIGEgaXMgb24gdGhlIGxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICAgICAqL1xuICAgIG11bHRpcGx5TGVmdDogZnVuY3Rpb24oYSkge1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgYXMgYSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGxlZnRcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHJpZ2h0XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBib3R0b21cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHRvcFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gbmVhclxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZmFyXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgb3J0aG86IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gICAgICAgIG1hdDQub3J0aG8odGhpcy5hcnJheSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2V0IGFzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGZvdnlcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGFzcGVjdFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gbmVhclxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZmFyXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgcGVyc3BlY3RpdmU6IGZ1bmN0aW9uKGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUodGhpcy5hcnJheSwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSByYWQgYWJvdXQgYXhpcy5cbiAgICAgKiBFcXVhbCB0byByaWdodC1tdWx0aXBseSBhIHJvdGFpb24gbWF0cml4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgIHJhZFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBheGlzXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgcm90YXRlOiBmdW5jdGlvbihyYWQsIGF4aXMpIHtcbiAgICAgICAgbWF0NC5yb3RhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkLCBheGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHNlbGYgYnkgYSBnaXZlbiByYWRpYW4gYWJvdXQgWCBheGlzLlxuICAgICAqIEVxdWFsIHRvIHJpZ2h0LW11bHRpcGx5IGEgcm90YWlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgcm90YXRlWDogZnVuY3Rpb24ocmFkKSB7XG4gICAgICAgIG1hdDQucm90YXRlWCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCByYWQpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSBhIGdpdmVuIHJhZGlhbiBhYm91dCBZIGF4aXMuXG4gICAgICogRXF1YWwgdG8gcmlnaHQtbXVsdGlwbHkgYSByb3RhaW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICByb3RhdGVZOiBmdW5jdGlvbihyYWQpIHtcbiAgICAgICAgbWF0NC5yb3RhdGVZKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBzZWxmIGJ5IGEgZ2l2ZW4gcmFkaWFuIGFib3V0IFogYXhpcy5cbiAgICAgKiBFcXVhbCB0byByaWdodC1tdWx0aXBseSBhIHJvdGFpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIHJvdGF0ZVo6IGZ1bmN0aW9uKHJhZCkge1xuICAgICAgICBtYXQ0LnJvdGF0ZVoodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgc2VsZiBieSBzXG4gICAgICogRXF1YWwgdG8gcmlnaHQtbXVsdGlwbHkgYSBzY2FsZSBtYXRyaXhcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gIHNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHYuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgc2VsZiBieSB2LlxuICAgICAqIEVxdWFsIHRvIHJpZ2h0LW11bHRpcGx5IGEgdHJhbnNsYXRlIG1hdHJpeFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSAgdlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCB2LmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNwb3NlIHNlbGYsIGluLXBsYWNlLlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIHRyYW5zcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDQudHJhbnNwb3NlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZWNvbXBvc2UgYSBtYXRyaXggdG8gU1JUXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gW3NjYWxlXVxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHJvdGF0aW9uXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yfSBwb3NpdGlvblxuICAgICAqIEBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21pY3Jvc29mdC54bmEuZnJhbWV3b3JrLm1hdHJpeC5kZWNvbXBvc2UuYXNweFxuICAgICAqL1xuICAgIGRlY29tcG9zZU1hdHJpeDogKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciB4ID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgdmFyIHkgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgICB2YXIgeiA9IHZlYzMuY3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIG0zID0gbWF0My5jcmVhdGUoKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NhbGUsIHJvdGF0aW9uLCBwb3NpdGlvbikge1xuXG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdmVjMy5zZXQoeCwgZWxbMF0sIGVsWzFdLCBlbFsyXSk7XG4gICAgICAgICAgICB2ZWMzLnNldCh5LCBlbFs0XSwgZWxbNV0sIGVsWzZdKTtcbiAgICAgICAgICAgIHZlYzMuc2V0KHosIGVsWzhdLCBlbFs5XSwgZWxbMTBdKTtcblxuICAgICAgICAgICAgdmFyIHN4ID0gdmVjMy5sZW5ndGgoeCk7XG4gICAgICAgICAgICB2YXIgc3kgPSB2ZWMzLmxlbmd0aCh5KTtcbiAgICAgICAgICAgIHZhciBzeiA9IHZlYzMubGVuZ3RoKHopO1xuXG4gICAgICAgICAgICAvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZVxuICAgICAgICAgICAgdmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcbiAgICAgICAgICAgIGlmIChkZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgc3ggPSAtc3g7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY2FsZSkge1xuICAgICAgICAgICAgICAgIHNjYWxlLnNldChzeCwgc3ksIHN6KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zaXRpb24uc2V0KGVsWzEyXSwgZWxbMTNdLCBlbFsxNF0pO1xuXG4gICAgICAgICAgICBtYXQzLmZyb21NYXQ0KG0zLCBlbCk7XG4gICAgICAgICAgICAvLyBOb3QgbGlrZSBtYXQ0LCBtYXQzIGluIGdsbWF0cml4IHNlZW1zIHRvIGJlIHJvdy1iYXNlZFxuICAgICAgICAgICAgLy8gU2VlbXMgZml4ZWQgaW4gZ2wtbWF0cml4IDIuMi4yXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXgvaXNzdWVzLzExNFxuICAgICAgICAgICAgLy8gbWF0My50cmFuc3Bvc2UobTMsIG0zKTtcblxuICAgICAgICAgICAgbTNbMF0gLz0gc3g7XG4gICAgICAgICAgICBtM1sxXSAvPSBzeDtcbiAgICAgICAgICAgIG0zWzJdIC89IHN4O1xuXG4gICAgICAgICAgICBtM1szXSAvPSBzeTtcbiAgICAgICAgICAgIG0zWzRdIC89IHN5O1xuICAgICAgICAgICAgbTNbNV0gLz0gc3k7XG5cbiAgICAgICAgICAgIG0zWzZdIC89IHN6O1xuICAgICAgICAgICAgbTNbN10gLz0gc3o7XG4gICAgICAgICAgICBtM1s4XSAvPSBzejtcblxuICAgICAgICAgICAgcXVhdC5mcm9tTWF0Myhyb3RhdGlvbi5hcnJheSwgbTMpO1xuICAgICAgICAgICAgcXVhdC5ub3JtYWxpemUocm90YXRpb24uYXJyYXksIHJvdGF0aW9uLmFycmF5KTtcblxuICAgICAgICAgICAgcm90YXRpb24uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHBvc2l0aW9uLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwodGhpcy5hcnJheSwgJywnKSArICddJztcbiAgICB9LFxuXG4gICAgdG9BcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSk7XG4gICAgfVxufTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5pZiAoZGVmaW5lUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvdG8gPSBNYXRyaXg0LnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBaIEF4aXMgb2YgbG9jYWwgdHJhbnNmb3JtXG4gICAgICogQG5hbWUgelxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLk1hdHJpeDRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3onLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5hcnJheTtcbiAgICAgICAgICAgIHRoaXMuX2F4aXNaLnNldChlbFs4XSwgZWxbOV0sIGVsWzEwXSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXhpc1o7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gSGVyZSBoYXMgYSBwcm9ibGVtXG4gICAgICAgICAgICAvLyBJZiBvbmx5IHNldCBhbiBpdGVtIG9mIHZlY3RvciB3aWxsIG5vdCB3b3JrXG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdiA9IHYuYXJyYXk7XG4gICAgICAgICAgICBlbFs4XSA9IHZbMF07XG4gICAgICAgICAgICBlbFs5XSA9IHZbMV07XG4gICAgICAgICAgICBlbFsxMF0gPSB2WzJdO1xuXG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFkgQXhpcyBvZiBsb2NhbCB0cmFuc2Zvcm1cbiAgICAgKiBAbmFtZSB5XG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4NFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdGhpcy5fYXhpc1kuc2V0KGVsWzRdLCBlbFs1XSwgZWxbNl0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F4aXNZO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmFycmF5O1xuICAgICAgICAgICAgdiA9IHYuYXJyYXk7XG4gICAgICAgICAgICBlbFs0XSA9IHZbMF07XG4gICAgICAgICAgICBlbFs1XSA9IHZbMV07XG4gICAgICAgICAgICBlbFs2XSA9IHZbMl07XG5cbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogWCBBeGlzIG9mIGxvY2FsIHRyYW5zZm9ybVxuICAgICAqIEBuYW1lIHhcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXg0XG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd4Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuYXJyYXk7XG4gICAgICAgICAgICB0aGlzLl9heGlzWC5zZXQoZWxbMF0sIGVsWzFdLCBlbFsyXSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXhpc1g7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuYXJyYXk7XG4gICAgICAgICAgICB2ID0gdi5hcnJheTtcbiAgICAgICAgICAgIGVsWzBdID0gdlswXTtcbiAgICAgICAgICAgIGVsWzFdID0gdlsxXTtcbiAgICAgICAgICAgIGVsWzJdID0gdlsyXTtcblxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuYWRqb2ludCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG1hdDQuYWRqb2ludChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgbWF0NC5jb3B5KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuTWF0cml4NC5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gbWF0NC5kZXRlcm1pbmFudChhLmFycmF5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBtYXQ0LmlkZW50aXR5KG91dC5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgbGVmdFxuICogQHBhcmFtICB7bnVtYmVyfSAgcmlnaHRcbiAqIEBwYXJhbSAge251bWJlcn0gIGJvdHRvbVxuICogQHBhcmFtICB7bnVtYmVyfSAgdG9wXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBuZWFyXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBmYXJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0Lm9ydGhvID0gZnVuY3Rpb24ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICAgIG1hdDQub3J0aG8ob3V0LmFycmF5LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcik7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgZm92eVxuICogQHBhcmFtICB7bnVtYmVyfSAgYXNwZWN0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBuZWFyXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBmYXJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnBlcnNwZWN0aXZlID0gZnVuY3Rpb24ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIG1hdDQucGVyc3BlY3RpdmUob3V0LmFycmF5LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcik7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGV5ZVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGNlbnRlclxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IHVwXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC5sb29rQXQgPSBmdW5jdGlvbihvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIG1hdDQubG9va0F0KG91dC5hcnJheSwgZXllLmFycmF5LCBjZW50ZXIuYXJyYXksIHVwLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgbWF0NC5pbnZlcnQob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0Lm11bCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG1hdDQubXVsKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0Lm11bHRpcGx5ID0gTWF0cml4NC5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9ICAgIG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LmZyb21RdWF0ID0gZnVuY3Rpb24ob3V0LCBxKSB7XG4gICAgbWF0NC5mcm9tUXVhdChvdXQuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSAgICBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBxXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gICAgdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24gPSBmdW5jdGlvbihvdXQsIHEsIHYpIHtcbiAgICBtYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dC5hcnJheSwgcS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG00XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IG0yZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuZnJvbU1hdDJkID0gZnVuY3Rpb24obTQsIG0yZCkge1xuICAgIG00Ll9kaXJ0eSA9IHRydWU7XG4gICAgdmFyIG0yZCA9IG0yZC5hcnJheTtcbiAgICB2YXIgbTQgPSBtNC5hcnJheTtcblxuICAgIG00WzBdID0gbTJkWzBdO1xuICAgIG00WzRdID0gbTJkWzJdO1xuICAgIG00WzEyXSA9IG0yZFs0XTtcblxuICAgIG00WzFdID0gbTJkWzFdO1xuICAgIG00WzVdID0gbTJkWzNdO1xuICAgIG00WzEzXSA9IG0yZFs1XTtcblxuICAgIHJldHVybiBtNDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHJhZFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGF4aXNcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnJvdGF0ZSA9IGZ1bmN0aW9uKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gICAgbWF0NC5yb3RhdGUob3V0LmFycmF5LCBhLmFycmF5LCByYWQsIGF4aXMuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICByYWRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnJvdGF0ZVggPSBmdW5jdGlvbihvdXQsIGEsIHJhZCkge1xuICAgIG1hdDQucm90YXRlWChvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQucm90YXRlWSA9IGZ1bmN0aW9uKG91dCwgYSwgcmFkKSB7XG4gICAgbWF0NC5yb3RhdGVZKG91dC5hcnJheSwgYS5hcnJheSwgcmFkKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gYVxuICogQHBhcmFtICB7bnVtYmVyfSAgcmFkXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC5yb3RhdGVaID0gZnVuY3Rpb24ob3V0LCBhLCByYWQpIHtcbiAgICBtYXQ0LnJvdGF0ZVoob3V0LmFycmF5LCBhLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gKi9cbk1hdHJpeDQuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICBtYXQ0LnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXg0fVxuICovXG5NYXRyaXg0LnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG1hdDQudHJhbnNwb3NlKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSB2XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAqL1xuTWF0cml4NC50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICBtYXQ0LnRyYW5zbGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXg0O1xuIiwidmFyIERJUlRZX1BSRUZJWCA9ICdfX2R0X18nO1xuXG52YXIgQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICB0aGlzLl9jb250ZXh0SWQgPSAwO1xuXG4gICAgdGhpcy5fY2FjaGVzID0gW107XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge307XG59O1xuXG5DYWNoZS5wcm90b3R5cGUgPSB7XG5cbiAgICB1c2U6IGZ1bmN0aW9uIChjb250ZXh0SWQsIGRvY3VtZW50U2NoZW1hKSB7XG4gICAgICAgIHZhciBjYWNoZXMgPSB0aGlzLl9jYWNoZXM7XG4gICAgICAgIGlmICghY2FjaGVzW2NvbnRleHRJZF0pIHtcbiAgICAgICAgICAgIGNhY2hlc1tjb250ZXh0SWRdID0ge307XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudFNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGNhY2hlc1tjb250ZXh0SWRdID0gZG9jdW1lbnRTY2hlbWEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSBjb250ZXh0SWQ7XG5cbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNhY2hlc1tjb250ZXh0SWRdO1xuICAgIH0sXG5cbiAgICBwdXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH0sXG5cbiAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHRba2V5XTtcbiAgICB9LFxuXG4gICAgZGlydHk6IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICBmaWVsZCA9IGZpZWxkIHx8ICcnO1xuICAgICAgICB2YXIga2V5ID0gRElSVFlfUFJFRklYICsgZmllbGQ7XG4gICAgICAgIHRoaXMucHV0KGtleSwgdHJ1ZSk7XG4gICAgfSxcblxuICAgIGRpcnR5QWxsOiBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgZmllbGQgPSBmaWVsZCB8fCAnJztcbiAgICAgICAgdmFyIGtleSA9IERJUlRZX1BSRUZJWCArIGZpZWxkO1xuICAgICAgICB2YXIgY2FjaGVzID0gdGhpcy5fY2FjaGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhY2hlc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhY2hlc1tpXVtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmcmVzaDogZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGZpZWxkID0gZmllbGQgfHwgJyc7XG4gICAgICAgIHZhciBrZXkgPSBESVJUWV9QUkVGSVggKyBmaWVsZDtcbiAgICAgICAgdGhpcy5wdXQoa2V5LCBmYWxzZSk7XG4gICAgfSxcblxuICAgIGZyZXNoQWxsOiBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgZmllbGQgPSBmaWVsZCB8fCAnJztcbiAgICAgICAgdmFyIGtleSA9IERJUlRZX1BSRUZJWCArIGZpZWxkO1xuICAgICAgICB2YXIgY2FjaGVzID0gdGhpcy5fY2FjaGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNhY2hlc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhY2hlc1tpXVtrZXldID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNEaXJ0eTogZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGZpZWxkID0gZmllbGQgfHwgJyc7XG4gICAgICAgIHZhciBrZXkgPSBESVJUWV9QUkVGSVggKyBmaWVsZDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9jb250ZXh0O1xuICAgICAgICByZXR1cm4gICFjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSlcbiAgICAgICAgICAgIHx8IGNvbnRleHRba2V5XSA9PT0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZGVsZXRlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHRJZCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fY2FjaGVzW2NvbnRleHRJZF07XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSB7fTtcbiAgICB9LFxuXG4gICAgZGVsZXRlOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jb250ZXh0W2tleV07XG4gICAgfSxcblxuICAgIGNsZWFyQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlcyA9IHt9O1xuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuICAgIH0sXG5cbiAgICBlYWNoQ29udGV4dCA6IGZ1bmN0aW9uIChjYiwgY29udGV4dCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2NhY2hlcyk7XG4gICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjYiAmJiBjYi5jYWxsKGNvbnRleHQsIGtleSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBtaXNzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIHRoaXMuX2NvbnRleHQuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgICB9XG59O1xuXG5DYWNoZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYWNoZTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FjaGU7XG4iLCIvKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0ZXh0dXJlcyBsaWtlIGNvbXByZXNzZWQgdGV4dHVyZSwgdGV4dHVyZTJkLCB0ZXh0dXJlY3ViZVxuICogVE9ETyBtYXBwaW5nXG4gKi9cbmltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgQ2FjaGUgZnJvbSAnLi9jb3JlL0NhY2hlJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LlRleHR1cmVcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBUZXh0dXJlID0gQmFzZS5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkuVGV4dHVyZSMgKi9cbntcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHdpZHRoLCByZWFkb25seSB3aGVuIHRoZSB0ZXh0dXJlIHNvdXJjZSBpcyBpbWFnZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgd2lkdGg6IDUxMixcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIGhlaWdodCwgcmVhZG9ubHkgd2hlbiB0aGUgdGV4dHVyZSBzb3VyY2UgaXMgaW1hZ2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodDogNTEyLFxuICAgIC8qKlxuICAgICAqIFRleGVsIGRhdGEgdHlwZS5cbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5VTlNJR05FRF9CWVRFfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuSEFMRl9GTE9BVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkZMT0FUfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5VTlNJR05FRF9JTlR9XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0eXBlOiBnbGVudW0uVU5TSUdORURfQllURSxcbiAgICAvKipcbiAgICAgKiBGb3JtYXQgb2YgdGV4ZWwgZGF0YVxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLlJHQkF9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5ERVBUSF9DT01QT05FTlR9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5ERVBUSF9TVEVOQ0lMfVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZm9ybWF0OiBnbGVudW0uUkdCQSxcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHdyYXAuIERlZmF1bHQgdG8gYmUgUkVQRUFULlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkNMQU1QX1RPX0VER0V9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5SRVBFQVR9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5NSVJST1JFRF9SRVBFQVR9XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB3cmFwUzogZ2xlbnVtLlJFUEVBVCxcbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHdyYXAuIERlZmF1bHQgdG8gYmUgUkVQRUFULlxuICAgICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkNMQU1QX1RPX0VER0V9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5SRVBFQVR9XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5NSVJST1JFRF9SRVBFQVR9XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB3cmFwVDogZ2xlbnVtLlJFUEVBVCxcbiAgICAvKipcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuVGV4dHVyZS5ORUFSRVNUfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuTElORUFSfVxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkxJTkVBUl9NSVBNQVBfTkVBUkVTVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLk5FQVJFU1RfTUlQTUFQX0xJTkVBUn1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkxJTkVBUl9NSVBNQVBfTElORUFSfVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgbWluRmlsdGVyOiBnbGVudW0uTElORUFSX01JUE1BUF9MSU5FQVIsXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqICArIHtAbGluayBjbGF5LlRleHR1cmUuTkVBUkVTVH1cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5UZXh0dXJlLkxJTkVBUn1cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIG1hZ0ZpbHRlcjogZ2xlbnVtLkxJTkVBUixcbiAgICAvKipcbiAgICAgKiBJZiBlbmFibGUgbWltYXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdXNlTWlwbWFwOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogQW5pc290cm9waWMgZmlsdGVyaW5nLCBlbmFibGVkIGlmIHZhbHVlIGlzIGxhcmdlciB0aGFuIDFcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGFuaXNvdHJvcGljOiAxLFxuICAgIC8vIHBpeGVsU3RvcmVpIHBhcmFtZXRlcnMsIG5vdCBhdmFpbGFibGUgd2hlbiB0ZXh0dXJlIGlzIHVzZWQgYXMgcmVuZGVyIHRhcmdldFxuICAgIC8vIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sXG4gICAgLyoqXG4gICAgICogSWYgZmxpcCBpbiB5IGF4aXMgZm9yIGdpdmVuIGltYWdlIHNvdXJjZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBmbGlwWTogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDRcbiAgICAgKi9cbiAgICB1bnBhY2tBbGlnbm1lbnQ6IDQsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwcmVtdWx0aXBseUFscGhhOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIER5bmFtaWMgb3B0aW9uIGZvciB0ZXh0dXJlIGxpa2UgdmlkZW9cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBkeW5hbWljOiBmYWxzZSxcblxuICAgIE5QT1Q6IGZhbHNlXG59LCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgQ2FjaGUoKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuVGV4dHVyZS5wcm90b3R5cGUgKi9cbntcblxuICAgIGdldFdlYkdMVGV4dHVyZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgICAgIGNhY2hlLnVzZShyZW5kZXJlci5fX3VpZF9fKTtcblxuICAgICAgICBpZiAoY2FjaGUubWlzcygnd2ViZ2xfdGV4dHVyZScpKSB7XG4gICAgICAgICAgICAvLyBJbiBhIG5ldyBnbCBjb250ZXh0LCBjcmVhdGUgbmV3IHRleHR1cmUgYW5kIHNldCBkaXJ0eSB0cnVlXG4gICAgICAgICAgICBjYWNoZS5wdXQoJ3dlYmdsX3RleHR1cmUnLCBfZ2wuY3JlYXRlVGV4dHVyZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5keW5hbWljKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShyZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2FjaGUuaXNEaXJ0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShyZW5kZXJlcik7XG4gICAgICAgICAgICBjYWNoZS5mcmVzaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldCgnd2ViZ2xfdGV4dHVyZScpO1xuICAgIH0sXG5cbiAgICBiaW5kOiBmdW5jdGlvbiAoKSB7fSxcbiAgICB1bmJpbmQ6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgLyoqXG4gICAgICogTWFyayB0ZXh0dXJlIGlzIGRpcnR5IGFuZCB1cGRhdGUgaW4gdGhlIG5leHQgZnJhbWVcbiAgICAgKi9cbiAgICBkaXJ0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5QWxsKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHt9LFxuXG4gICAgLy8gVXBkYXRlIHRoZSBjb21tb24gcGFyYW1ldGVycyBvZiB0ZXh0dXJlXG4gICAgdXBkYXRlQ29tbW9uOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRoaXMuZmxpcFkpO1xuICAgICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGhpcy5wcmVtdWx0aXBseUFscGhhKTtcbiAgICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfQUxJR05NRU5ULCB0aGlzLnVucGFja0FsaWdubWVudCk7XG5cbiAgICAgICAgLy8gVXNlIG9mIG5vbmUtcG93ZXIgb2YgdHdvIHRleHR1cmVcbiAgICAgICAgLy8gaHR0cDovL3d3dy5raHJvbm9zLm9yZy93ZWJnbC93aWtpL1dlYkdMX2FuZF9PcGVuR0xfRGlmZmVyZW5jZXNcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBnbGVudW0uREVQVEhfQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICB0aGlzLnVzZU1pcG1hcCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNSR0JFeHQgPSByZW5kZXJlci5nZXRHTEV4dGVuc2lvbignRVhUX3NSR0InKTtcbiAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUZXh0dXJlLlNSR0IgJiYgIXNSR0JFeHQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0ID0gVGV4dHVyZS5SR0I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUZXh0dXJlLlNSR0JfQUxQSEEgJiYgIXNSR0JFeHQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0ID0gVGV4dHVyZS5SR0JBO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5OUE9UID0gIXRoaXMuaXNQb3dlck9mVHdvKCk7XG4gICAgfSxcblxuICAgIGdldEF2YWlsYWJsZVdyYXBTOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLk5QT1QpIHtcbiAgICAgICAgICAgIHJldHVybiBnbGVudW0uQ0xBTVBfVE9fRURHRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53cmFwUztcbiAgICB9LFxuICAgIGdldEF2YWlsYWJsZVdyYXBUOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLk5QT1QpIHtcbiAgICAgICAgICAgIHJldHVybiBnbGVudW0uQ0xBTVBfVE9fRURHRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53cmFwVDtcbiAgICB9LFxuICAgIGdldEF2YWlsYWJsZU1pbkZpbHRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWluRmlsdGVyID0gdGhpcy5taW5GaWx0ZXI7XG4gICAgICAgIGlmICh0aGlzLk5QT1QgfHwgIXRoaXMudXNlTWlwbWFwKSB7XG4gICAgICAgICAgICBpZiAobWluRmlsdGVyID09IGdsZW51bS5ORUFSRVNUX01JUE1BUF9ORUFSRVNUIHx8XG4gICAgICAgICAgICAgICAgbWluRmlsdGVyID09IGdsZW51bS5ORUFSRVNUX01JUE1BUF9MSU5FQVJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnbGVudW0uTkVBUkVTVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1pbkZpbHRlciA9PSBnbGVudW0uTElORUFSX01JUE1BUF9MSU5FQVIgfHxcbiAgICAgICAgICAgICAgICBtaW5GaWx0ZXIgPT0gZ2xlbnVtLkxJTkVBUl9NSVBNQVBfTkVBUkVTVFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdsZW51bS5MSU5FQVI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluRmlsdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1pbkZpbHRlcjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0QXZhaWxhYmxlTWFnRmlsdGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hZ0ZpbHRlcjtcbiAgICB9LFxuXG4gICAgbmV4dEhpZ2hlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoeCkge1xuICAgICAgICAtLXg7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMzI7IGkgPDw9IDEpIHtcbiAgICAgICAgICAgIHggPSB4IHwgeCA+PiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4ICsgMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuXG4gICAgICAgIHZhciB3ZWJnbFRleHR1cmUgPSBjYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKTtcbiAgICAgICAgaWYgKHdlYmdsVGV4dHVyZSl7XG4gICAgICAgICAgICByZW5kZXJlci5nbC5kZWxldGVUZXh0dXJlKHdlYmdsVGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FjaGUuZGVsZXRlQ29udGV4dChyZW5kZXJlci5fX3VpZF9fKTtcblxuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGVzdCBpZiBpbWFnZSBvZiB0ZXh0dXJlIGlzIHZhbGlkIGFuZCBsb2FkZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1JlbmRlcmFibGU6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgLyoqXG4gICAgICogVGVzdCBpZiB0ZXh0dXJlIHNpemUgaXMgcG93ZXIgb2YgdHdvXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICgpIHt9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHR1cmUucHJvdG90eXBlLCAnd2lkdGgnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XG4gICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dHVyZS5wcm90b3R5cGUsICdoZWlnaHQnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICB9XG59KTtcblxuLyogRGF0YVR5cGUgKi9cblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkJZVEUgPSBnbGVudW0uQllURTtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5VTlNJR05FRF9CWVRFID0gZ2xlbnVtLlVOU0lHTkVEX0JZVEU7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuU0hPUlQgPSBnbGVudW0uU0hPUlQ7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuVU5TSUdORURfU0hPUlQgPSBnbGVudW0uVU5TSUdORURfU0hPUlQ7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuSU5UID0gZ2xlbnVtLklOVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5VTlNJR05FRF9JTlQgPSBnbGVudW0uVU5TSUdORURfSU5UO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkZMT0FUID0gZ2xlbnVtLkZMT0FUO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkhBTEZfRkxPQVQgPSAweDhENjE7XG5cbi8qKlxuICogVU5TSUdORURfSU5UXzI0XzhfV0VCR0wgZm9yIFdFQkdMX2RlcHRoX3RleHR1cmUgZXh0ZW5zaW9uXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMID0gMzQwNDI7XG5cbi8qIFBpeGVsRm9ybWF0ICovXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuREVQVEhfQ09NUE9ORU5UID0gZ2xlbnVtLkRFUFRIX0NPTVBPTkVOVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5ERVBUSF9TVEVOQ0lMID0gZ2xlbnVtLkRFUFRIX1NURU5DSUw7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuQUxQSEEgPSBnbGVudW0uQUxQSEE7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuUkdCID0gZ2xlbnVtLlJHQjtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5SR0JBID0gZ2xlbnVtLlJHQkE7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTFVNSU5BTkNFID0gZ2xlbnVtLkxVTUlOQU5DRTtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5MVU1JTkFOQ0VfQUxQSEEgPSBnbGVudW0uTFVNSU5BTkNFX0FMUEhBO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9FWFRfc1JHQi9cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuU1JHQiA9IDB4OEM0MDtcbi8qKlxuICogQHNlZSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL0VYVF9zUkdCL1xuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5TUkdCX0FMUEhBID0gMHg4QzQyO1xuXG4vKiBDb21wcmVzc2VkIFRleHR1cmUgKi9cblRleHR1cmUuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCA9IDB4ODNGMDtcblRleHR1cmUuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgPSAweDgzRjE7XG5UZXh0dXJlLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUID0gMHg4M0YyO1xuVGV4dHVyZS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCA9IDB4ODNGMztcblxuLyogVGV4dHVyZU1hZ0ZpbHRlciAqL1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLk5FQVJFU1QgPSBnbGVudW0uTkVBUkVTVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5MSU5FQVIgPSBnbGVudW0uTElORUFSO1xuXG4vKiBUZXh0dXJlTWluRmlsdGVyICovXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCA9IGdsZW51bS5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5UZXh0dXJlLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCA9IGdsZW51bS5MSU5FQVJfTUlQTUFQX05FQVJFU1Q7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTkVBUkVTVF9NSVBNQVBfTElORUFSID0gZ2xlbnVtLk5FQVJFU1RfTUlQTUFQX0xJTkVBUjtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IGdsZW51bS5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuLyogVGV4dHVyZVdyYXBNb2RlICovXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuUkVQRUFUID0gZ2xlbnVtLlJFUEVBVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuVGV4dHVyZS5DTEFNUF9UT19FREdFID0gZ2xlbnVtLkNMQU1QX1RPX0VER0U7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblRleHR1cmUuTUlSUk9SRURfUkVQRUFUID0gZ2xlbnVtLk1JUlJPUkVEX1JFUEVBVDtcblxuXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlO1xuIiwiLyoqXG4gKiBTaW1wbGUgZG91YmxlIGxpbmtlZCBsaXN0LiBDb21wYXJlZCB3aXRoIGFycmF5LCBpdCBoYXMgTygxKSByZW1vdmUgb3BlcmF0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5jb3JlLkxpbmtlZExpc3RcbiAqL1xudmFyIExpbmtlZExpc3QgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5jb3JlLkxpbmtlZExpc3QuRW50cnl9XG4gICAgICovXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LmNvcmUuTGlua2VkTGlzdC5FbnRyeX1cbiAgICAgKi9cbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuXG4gICAgdGhpcy5fbGVuZ3RoID0gMDtcbn07XG5cbi8qKlxuICogSW5zZXJ0IGEgbmV3IHZhbHVlIGF0IHRoZSB0YWlsXG4gKiBAcGFyYW0gIHt9IHZhbFxuICogQHJldHVybiB7Y2xheS5jb3JlLkxpbmtlZExpc3QuRW50cnl9XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgZW50cnkgPSBuZXcgTGlua2VkTGlzdC5FbnRyeSh2YWwpO1xuICAgIHRoaXMuaW5zZXJ0RW50cnkoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbn07XG5cbi8qKlxuICogSW5zZXJ0IGEgbmV3IHZhbHVlIGF0IGlkeFxuICogQHBhcmFtIHtudW1iZXJ9IGlkeFxuICogQHBhcmFtICB7fSB2YWxcbiAqIEByZXR1cm4ge2NsYXkuY29yZS5MaW5rZWRMaXN0LkVudHJ5fVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5pbnNlcnRBdCA9IGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5leHQgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGN1cnNvciA9IDA7XG4gICAgd2hpbGUgKG5leHQgJiYgY3Vyc29yICE9IGlkeCkge1xuICAgICAgICBuZXh0ID0gbmV4dC5uZXh0O1xuICAgICAgICBjdXJzb3IrKztcbiAgICB9XG4gICAgaWYgKG5leHQpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gbmV3IExpbmtlZExpc3QuRW50cnkodmFsKTtcbiAgICAgICAgdmFyIHByZXYgPSBuZXh0LnByZXY7XG4gICAgICAgIGlmICghcHJldikgeyAvL25leHQgaXMgaGVhZFxuICAgICAgICAgICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5LnByZXYgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5Lm5leHQgPSBuZXh0O1xuICAgICAgICBuZXh0LnByZXYgPSBlbnRyeTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHZhbCk7XG4gICAgfVxufTtcblxuTGlua2VkTGlzdC5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlRW50cnkgPSBmdW5jdGlvbiAodmFsLCBuZXh0KSB7XG4gICAgdmFyIGVudHJ5ID0gbmV3IExpbmtlZExpc3QuRW50cnkodmFsKTtcbiAgICB2YXIgcHJldiA9IG5leHQucHJldjtcbiAgICBpZiAoIXByZXYpIHsgLy9uZXh0IGlzIGhlYWRcbiAgICAgICAgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwcmV2Lm5leHQgPSBlbnRyeTtcbiAgICAgICAgZW50cnkucHJldiA9IHByZXY7XG4gICAgfVxuICAgIGVudHJ5Lm5leHQgPSBuZXh0O1xuICAgIG5leHQucHJldiA9IGVudHJ5O1xuXG4gICAgdGhpcy5fbGVuZ3RoKys7XG59O1xuXG4vKipcbiAqIEluc2VydCBhbiBlbnRyeSBhdCB0aGUgdGFpbFxuICogQHBhcmFtICB7Y2xheS5jb3JlLkxpbmtlZExpc3QuRW50cnl9IGVudHJ5XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmluc2VydEVudHJ5ID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gZW50cnk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O1xuICAgICAgICBlbnRyeS5wcmV2ID0gdGhpcy50YWlsO1xuICAgICAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoKys7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBlbnRyeS5cbiAqIEBwYXJhbSAge2NsYXkuY29yZS5MaW5rZWRMaXN0LkVudHJ5fSBlbnRyeVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICB2YXIgcHJldiA9IGVudHJ5LnByZXY7XG4gICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYubmV4dCA9IG5leHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJcyBoZWFkXG4gICAgICAgIHRoaXMuaGVhZCA9IG5leHQ7XG4gICAgfVxuICAgIGlmIChuZXh0KSB7XG4gICAgICAgIG5leHQucHJldiA9IHByZXY7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJcyB0YWlsXG4gICAgICAgIHRoaXMudGFpbCA9IHByZXY7XG4gICAgfVxuICAgIGVudHJ5Lm5leHQgPSBlbnRyeS5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLl9sZW5ndGgtLTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGVudHJ5IGF0IGluZGV4LlxuICogQHBhcmFtICB7bnVtYmVyfSBpZHhcbiAqIEByZXR1cm4ge31cbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUucmVtb3ZlQXQgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VyciA9IHRoaXMuaGVhZDtcbiAgICB2YXIgY3Vyc29yID0gMDtcbiAgICB3aGlsZSAoY3VyciAmJiBjdXJzb3IgIT0gaWR4KSB7XG4gICAgICAgIGN1cnIgPSBjdXJyLm5leHQ7XG4gICAgICAgIGN1cnNvcisrO1xuICAgIH1cbiAgICBpZiAoY3Vycikge1xuICAgICAgICB0aGlzLnJlbW92ZShjdXJyKTtcbiAgICAgICAgcmV0dXJuIGN1cnIudmFsdWU7XG4gICAgfVxufTtcbi8qKlxuICogR2V0IGhlYWQgdmFsdWVcbiAqIEByZXR1cm4ge31cbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuZ2V0SGVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5oZWFkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWQudmFsdWU7XG4gICAgfVxufTtcbi8qKlxuICogR2V0IHRhaWwgdmFsdWVcbiAqIEByZXR1cm4ge31cbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuZ2V0VGFpbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy50YWlsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhaWwudmFsdWU7XG4gICAgfVxufTtcbi8qKlxuICogR2V0IHZhbHVlIGF0IGlkeFxuICogQHBhcmFtIHtudW1iZXJ9IGlkeFxuICogQHJldHVybiB7fVxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5nZXRBdCA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjdXJyID0gdGhpcy5oZWFkO1xuICAgIHZhciBjdXJzb3IgPSAwO1xuICAgIHdoaWxlIChjdXJyICYmIGN1cnNvciAhPSBpZHgpIHtcbiAgICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgfVxuICAgIHJldHVybiBjdXJyLnZhbHVlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHt9IHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgY3VyciA9IHRoaXMuaGVhZDtcbiAgICB2YXIgY3Vyc29yID0gMDtcbiAgICB3aGlsZSAoY3Vycikge1xuICAgICAgICBpZiAoY3Vyci52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJzb3I7XG4gICAgICAgIH1cbiAgICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xufTtcblxuLyoqXG4gKiBJZiBsaXN0IGlzIGVtcHR5XG4gKi9cbkxpbmtlZExpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xlbmd0aCA9PT0gMDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0gIHt9IGNvbnRleHRcbiAqL1xuTGlua2VkTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYiwgY29udGV4dCkge1xuICAgIHZhciBjdXJyID0gdGhpcy5oZWFkO1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBoYXZlQ29udGV4dCA9IHR5cGVvZihjb250ZXh0KSAhPSAndW5kZWZpbmVkJztcbiAgICB3aGlsZSAoY3Vycikge1xuICAgICAgICBpZiAoaGF2ZUNvbnRleHQpIHtcbiAgICAgICAgICAgIGNiLmNhbGwoY29udGV4dCwgY3Vyci52YWx1ZSwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNiKGN1cnIudmFsdWUsIGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VyciA9IGN1cnIubmV4dDtcbiAgICAgICAgaWR4Kys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgbGlzdFxuICovXG5MaW5rZWRMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRhaWwgPSB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMuX2xlbmd0aCA9IDA7XG59O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHt9IHZhbFxuICovXG5MaW5rZWRMaXN0LkVudHJ5ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHt9XG4gICAgICovXG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LmNvcmUuTGlua2VkTGlzdC5FbnRyeX1cbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkuY29yZS5MaW5rZWRMaXN0LkVudHJ5fVxuICAgICAqL1xuICAgIHRoaXMucHJldiA9IG51bGw7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMaW5rZWRMaXN0O1xuIiwiaW1wb3J0IExpbmtlZExpc3QgZnJvbSAnLi9MaW5rZWRMaXN0JztcblxuLyoqXG4gKiBMUlUgQ2FjaGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkuY29yZS5MUlVcbiAqL1xudmFyIExSVSA9IGZ1bmN0aW9uKG1heFNpemUpIHtcblxuICAgIHRoaXMuX2xpc3QgPSBuZXcgTGlua2VkTGlzdCgpO1xuXG4gICAgdGhpcy5fbWFwID0ge307XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZSB8fCAxMDtcbn07XG5cbi8qKlxuICogU2V0IGNhY2hlIG1heCBzaXplXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG5MUlUucHJvdG90eXBlLnNldE1heFNpemUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5fbWF4U2l6ZSA9IHNpemU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0gIHt9IHZhbHVlXG4gKi9cbkxSVS5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YodGhpcy5fbWFwW2tleV0pID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLl9saXN0Lmxlbmd0aCgpO1xuICAgICAgICBpZiAobGVuID49IHRoaXMuX21heFNpemUgJiYgbGVuID4gMCkge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkXG4gICAgICAgICAgICB2YXIgbGVhc3RVc2VkRW50cnkgPSB0aGlzLl9saXN0LmhlYWQ7XG4gICAgICAgICAgICB0aGlzLl9saXN0LnJlbW92ZShsZWFzdFVzZWRFbnRyeSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwW2xlYXN0VXNlZEVudHJ5LmtleV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9saXN0Lmluc2VydCh2YWx1ZSk7XG4gICAgICAgIGVudHJ5LmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5fbWFwW2tleV0gPSBlbnRyeTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHt9XG4gKi9cbkxSVS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwW2tleV07XG4gICAgaWYgKHR5cGVvZihlbnRyeSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gUHV0IHRoZSBsYXRlc3QgdXNlZCBlbnRyeSBpbiB0aGUgdGFpbFxuICAgICAgICBpZiAoZW50cnkgIT09IHRoaXMuX2xpc3QudGFpbCkge1xuICAgICAgICAgICAgdGhpcy5fbGlzdC5yZW1vdmUoZW50cnkpO1xuICAgICAgICAgICAgdGhpcy5fbGlzdC5pbnNlcnRFbnRyeShlbnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cbkxSVS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwW2tleV07XG4gICAgaWYgKHR5cGVvZihlbnRyeSkgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX21hcFtrZXldO1xuICAgICAgICB0aGlzLl9saXN0LnJlbW92ZShlbnRyeSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgY2FjaGVcbiAqL1xuTFJVLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpc3QuY2xlYXIoKTtcbiAgICB0aGlzLl9tYXAgPSB7fTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExSVTtcbiIsImltcG9ydCBMUlUgZnJvbSAnLi4vY29yZS9MUlUnO1xuXG52YXIgY29sb3JVdGlsID0ge307XG5cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgICAndHJhbnNwYXJlbnQnOiBbMCwwLDAsMF0sICdhbGljZWJsdWUnOiBbMjQwLDI0OCwyNTUsMV0sXG4gICAgJ2FudGlxdWV3aGl0ZSc6IFsyNTAsMjM1LDIxNSwxXSwgJ2FxdWEnOiBbMCwyNTUsMjU1LDFdLFxuICAgICdhcXVhbWFyaW5lJzogWzEyNywyNTUsMjEyLDFdLCAnYXp1cmUnOiBbMjQwLDI1NSwyNTUsMV0sXG4gICAgJ2JlaWdlJzogWzI0NSwyNDUsMjIwLDFdLCAnYmlzcXVlJzogWzI1NSwyMjgsMTk2LDFdLFxuICAgICdibGFjayc6IFswLDAsMCwxXSwgJ2JsYW5jaGVkYWxtb25kJzogWzI1NSwyMzUsMjA1LDFdLFxuICAgICdibHVlJzogWzAsMCwyNTUsMV0sICdibHVldmlvbGV0JzogWzEzOCw0MywyMjYsMV0sXG4gICAgJ2Jyb3duJzogWzE2NSw0Miw0MiwxXSwgJ2J1cmx5d29vZCc6IFsyMjIsMTg0LDEzNSwxXSxcbiAgICAnY2FkZXRibHVlJzogWzk1LDE1OCwxNjAsMV0sICdjaGFydHJldXNlJzogWzEyNywyNTUsMCwxXSxcbiAgICAnY2hvY29sYXRlJzogWzIxMCwxMDUsMzAsMV0sICdjb3JhbCc6IFsyNTUsMTI3LDgwLDFdLFxuICAgICdjb3JuZmxvd2VyYmx1ZSc6IFsxMDAsMTQ5LDIzNywxXSwgJ2Nvcm5zaWxrJzogWzI1NSwyNDgsMjIwLDFdLFxuICAgICdjcmltc29uJzogWzIyMCwyMCw2MCwxXSwgJ2N5YW4nOiBbMCwyNTUsMjU1LDFdLFxuICAgICdkYXJrYmx1ZSc6IFswLDAsMTM5LDFdLCAnZGFya2N5YW4nOiBbMCwxMzksMTM5LDFdLFxuICAgICdkYXJrZ29sZGVucm9kJzogWzE4NCwxMzQsMTEsMV0sICdkYXJrZ3JheSc6IFsxNjksMTY5LDE2OSwxXSxcbiAgICAnZGFya2dyZWVuJzogWzAsMTAwLDAsMV0sICdkYXJrZ3JleSc6IFsxNjksMTY5LDE2OSwxXSxcbiAgICAnZGFya2toYWtpJzogWzE4OSwxODMsMTA3LDFdLCAnZGFya21hZ2VudGEnOiBbMTM5LDAsMTM5LDFdLFxuICAgICdkYXJrb2xpdmVncmVlbic6IFs4NSwxMDcsNDcsMV0sICdkYXJrb3JhbmdlJzogWzI1NSwxNDAsMCwxXSxcbiAgICAnZGFya29yY2hpZCc6IFsxNTMsNTAsMjA0LDFdLCAnZGFya3JlZCc6IFsxMzksMCwwLDFdLFxuICAgICdkYXJrc2FsbW9uJzogWzIzMywxNTAsMTIyLDFdLCAnZGFya3NlYWdyZWVuJzogWzE0MywxODgsMTQzLDFdLFxuICAgICdkYXJrc2xhdGVibHVlJzogWzcyLDYxLDEzOSwxXSwgJ2RhcmtzbGF0ZWdyYXknOiBbNDcsNzksNzksMV0sXG4gICAgJ2RhcmtzbGF0ZWdyZXknOiBbNDcsNzksNzksMV0sICdkYXJrdHVycXVvaXNlJzogWzAsMjA2LDIwOSwxXSxcbiAgICAnZGFya3Zpb2xldCc6IFsxNDgsMCwyMTEsMV0sICdkZWVwcGluayc6IFsyNTUsMjAsMTQ3LDFdLFxuICAgICdkZWVwc2t5Ymx1ZSc6IFswLDE5MSwyNTUsMV0sICdkaW1ncmF5JzogWzEwNSwxMDUsMTA1LDFdLFxuICAgICdkaW1ncmV5JzogWzEwNSwxMDUsMTA1LDFdLCAnZG9kZ2VyYmx1ZSc6IFszMCwxNDQsMjU1LDFdLFxuICAgICdmaXJlYnJpY2snOiBbMTc4LDM0LDM0LDFdLCAnZmxvcmFsd2hpdGUnOiBbMjU1LDI1MCwyNDAsMV0sXG4gICAgJ2ZvcmVzdGdyZWVuJzogWzM0LDEzOSwzNCwxXSwgJ2Z1Y2hzaWEnOiBbMjU1LDAsMjU1LDFdLFxuICAgICdnYWluc2Jvcm8nOiBbMjIwLDIyMCwyMjAsMV0sICdnaG9zdHdoaXRlJzogWzI0OCwyNDgsMjU1LDFdLFxuICAgICdnb2xkJzogWzI1NSwyMTUsMCwxXSwgJ2dvbGRlbnJvZCc6IFsyMTgsMTY1LDMyLDFdLFxuICAgICdncmF5JzogWzEyOCwxMjgsMTI4LDFdLCAnZ3JlZW4nOiBbMCwxMjgsMCwxXSxcbiAgICAnZ3JlZW55ZWxsb3cnOiBbMTczLDI1NSw0NywxXSwgJ2dyZXknOiBbMTI4LDEyOCwxMjgsMV0sXG4gICAgJ2hvbmV5ZGV3JzogWzI0MCwyNTUsMjQwLDFdLCAnaG90cGluayc6IFsyNTUsMTA1LDE4MCwxXSxcbiAgICAnaW5kaWFucmVkJzogWzIwNSw5Miw5MiwxXSwgJ2luZGlnbyc6IFs3NSwwLDEzMCwxXSxcbiAgICAnaXZvcnknOiBbMjU1LDI1NSwyNDAsMV0sICdraGFraSc6IFsyNDAsMjMwLDE0MCwxXSxcbiAgICAnbGF2ZW5kZXInOiBbMjMwLDIzMCwyNTAsMV0sICdsYXZlbmRlcmJsdXNoJzogWzI1NSwyNDAsMjQ1LDFdLFxuICAgICdsYXduZ3JlZW4nOiBbMTI0LDI1MiwwLDFdLCAnbGVtb25jaGlmZm9uJzogWzI1NSwyNTAsMjA1LDFdLFxuICAgICdsaWdodGJsdWUnOiBbMTczLDIxNiwyMzAsMV0sICdsaWdodGNvcmFsJzogWzI0MCwxMjgsMTI4LDFdLFxuICAgICdsaWdodGN5YW4nOiBbMjI0LDI1NSwyNTUsMV0sICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IFsyNTAsMjUwLDIxMCwxXSxcbiAgICAnbGlnaHRncmF5JzogWzIxMSwyMTEsMjExLDFdLCAnbGlnaHRncmVlbic6IFsxNDQsMjM4LDE0NCwxXSxcbiAgICAnbGlnaHRncmV5JzogWzIxMSwyMTEsMjExLDFdLCAnbGlnaHRwaW5rJzogWzI1NSwxODIsMTkzLDFdLFxuICAgICdsaWdodHNhbG1vbic6IFsyNTUsMTYwLDEyMiwxXSwgJ2xpZ2h0c2VhZ3JlZW4nOiBbMzIsMTc4LDE3MCwxXSxcbiAgICAnbGlnaHRza3libHVlJzogWzEzNSwyMDYsMjUwLDFdLCAnbGlnaHRzbGF0ZWdyYXknOiBbMTE5LDEzNiwxNTMsMV0sXG4gICAgJ2xpZ2h0c2xhdGVncmV5JzogWzExOSwxMzYsMTUzLDFdLCAnbGlnaHRzdGVlbGJsdWUnOiBbMTc2LDE5NiwyMjIsMV0sXG4gICAgJ2xpZ2h0eWVsbG93JzogWzI1NSwyNTUsMjI0LDFdLCAnbGltZSc6IFswLDI1NSwwLDFdLFxuICAgICdsaW1lZ3JlZW4nOiBbNTAsMjA1LDUwLDFdLCAnbGluZW4nOiBbMjUwLDI0MCwyMzAsMV0sXG4gICAgJ21hZ2VudGEnOiBbMjU1LDAsMjU1LDFdLCAnbWFyb29uJzogWzEyOCwwLDAsMV0sXG4gICAgJ21lZGl1bWFxdWFtYXJpbmUnOiBbMTAyLDIwNSwxNzAsMV0sICdtZWRpdW1ibHVlJzogWzAsMCwyMDUsMV0sXG4gICAgJ21lZGl1bW9yY2hpZCc6IFsxODYsODUsMjExLDFdLCAnbWVkaXVtcHVycGxlJzogWzE0NywxMTIsMjE5LDFdLFxuICAgICdtZWRpdW1zZWFncmVlbic6IFs2MCwxNzksMTEzLDFdLCAnbWVkaXVtc2xhdGVibHVlJzogWzEyMywxMDQsMjM4LDFdLFxuICAgICdtZWRpdW1zcHJpbmdncmVlbic6IFswLDI1MCwxNTQsMV0sICdtZWRpdW10dXJxdW9pc2UnOiBbNzIsMjA5LDIwNCwxXSxcbiAgICAnbWVkaXVtdmlvbGV0cmVkJzogWzE5OSwyMSwxMzMsMV0sICdtaWRuaWdodGJsdWUnOiBbMjUsMjUsMTEyLDFdLFxuICAgICdtaW50Y3JlYW0nOiBbMjQ1LDI1NSwyNTAsMV0sICdtaXN0eXJvc2UnOiBbMjU1LDIyOCwyMjUsMV0sXG4gICAgJ21vY2Nhc2luJzogWzI1NSwyMjgsMTgxLDFdLCAnbmF2YWpvd2hpdGUnOiBbMjU1LDIyMiwxNzMsMV0sXG4gICAgJ25hdnknOiBbMCwwLDEyOCwxXSwgJ29sZGxhY2UnOiBbMjUzLDI0NSwyMzAsMV0sXG4gICAgJ29saXZlJzogWzEyOCwxMjgsMCwxXSwgJ29saXZlZHJhYic6IFsxMDcsMTQyLDM1LDFdLFxuICAgICdvcmFuZ2UnOiBbMjU1LDE2NSwwLDFdLCAnb3JhbmdlcmVkJzogWzI1NSw2OSwwLDFdLFxuICAgICdvcmNoaWQnOiBbMjE4LDExMiwyMTQsMV0sICdwYWxlZ29sZGVucm9kJzogWzIzOCwyMzIsMTcwLDFdLFxuICAgICdwYWxlZ3JlZW4nOiBbMTUyLDI1MSwxNTIsMV0sICdwYWxldHVycXVvaXNlJzogWzE3NSwyMzgsMjM4LDFdLFxuICAgICdwYWxldmlvbGV0cmVkJzogWzIxOSwxMTIsMTQ3LDFdLCAncGFwYXlhd2hpcCc6IFsyNTUsMjM5LDIxMywxXSxcbiAgICAncGVhY2hwdWZmJzogWzI1NSwyMTgsMTg1LDFdLCAncGVydSc6IFsyMDUsMTMzLDYzLDFdLFxuICAgICdwaW5rJzogWzI1NSwxOTIsMjAzLDFdLCAncGx1bSc6IFsyMjEsMTYwLDIyMSwxXSxcbiAgICAncG93ZGVyYmx1ZSc6IFsxNzYsMjI0LDIzMCwxXSwgJ3B1cnBsZSc6IFsxMjgsMCwxMjgsMV0sXG4gICAgJ3JlZCc6IFsyNTUsMCwwLDFdLCAncm9zeWJyb3duJzogWzE4OCwxNDMsMTQzLDFdLFxuICAgICdyb3lhbGJsdWUnOiBbNjUsMTA1LDIyNSwxXSwgJ3NhZGRsZWJyb3duJzogWzEzOSw2OSwxOSwxXSxcbiAgICAnc2FsbW9uJzogWzI1MCwxMjgsMTE0LDFdLCAnc2FuZHlicm93bic6IFsyNDQsMTY0LDk2LDFdLFxuICAgICdzZWFncmVlbic6IFs0NiwxMzksODcsMV0sICdzZWFzaGVsbCc6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgICAnc2llbm5hJzogWzE2MCw4Miw0NSwxXSwgJ3NpbHZlcic6IFsxOTIsMTkyLDE5MiwxXSxcbiAgICAnc2t5Ymx1ZSc6IFsxMzUsMjA2LDIzNSwxXSwgJ3NsYXRlYmx1ZSc6IFsxMDYsOTAsMjA1LDFdLFxuICAgICdzbGF0ZWdyYXknOiBbMTEyLDEyOCwxNDQsMV0sICdzbGF0ZWdyZXknOiBbMTEyLDEyOCwxNDQsMV0sXG4gICAgJ3Nub3cnOiBbMjU1LDI1MCwyNTAsMV0sICdzcHJpbmdncmVlbic6IFswLDI1NSwxMjcsMV0sXG4gICAgJ3N0ZWVsYmx1ZSc6IFs3MCwxMzAsMTgwLDFdLCAndGFuJzogWzIxMCwxODAsMTQwLDFdLFxuICAgICd0ZWFsJzogWzAsMTI4LDEyOCwxXSwgJ3RoaXN0bGUnOiBbMjE2LDE5MSwyMTYsMV0sXG4gICAgJ3RvbWF0byc6IFsyNTUsOTksNzEsMV0sICd0dXJxdW9pc2UnOiBbNjQsMjI0LDIwOCwxXSxcbiAgICAndmlvbGV0JzogWzIzOCwxMzAsMjM4LDFdLCAnd2hlYXQnOiBbMjQ1LDIyMiwxNzksMV0sXG4gICAgJ3doaXRlJzogWzI1NSwyNTUsMjU1LDFdLCAnd2hpdGVzbW9rZSc6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgICAneWVsbG93JzogWzI1NSwyNTUsMCwxXSwgJ3llbGxvd2dyZWVuJzogWzE1NCwyMDUsNTAsMV1cbn07XG5cbmZ1bmN0aW9uIGNsYW1wQ3NzQnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICAgIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gICAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcENzc0FuZ2xlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAzNjAuXG4gICAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDM2MCA/IDM2MCA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wQ3NzRmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VDc3NJbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgICBpZiAoc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHN0ci5sZW5ndGggLSAxKSA9PT0gJyUnKSB7XG4gICAgICAgIHJldHVybiBjbGFtcENzc0J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYW1wQ3NzQnl0ZShwYXJzZUludChzdHIsIDEwKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3NzRmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgIGlmIChzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQoc3RyLmxlbmd0aCAtIDEpID09PSAnJScpIHtcbiAgICAgICAgcmV0dXJuIGNsYW1wQ3NzRmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYW1wQ3NzRmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzSHVlVG9SZ2IobTEsIG0yLCBoKSB7XG4gICAgaWYgKGggPCAwKSB7XG4gICAgICAgIGggKz0gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaCA+IDEpIHtcbiAgICAgICAgaCAtPSAxO1xuICAgIH1cblxuICAgIGlmIChoICogNiA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gICAgfVxuICAgIGlmIChoICogMiA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG0yO1xuICAgIH1cbiAgICBpZiAoaCAqIDMgPCAyKSB7XG4gICAgICAgIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gICAgfVxuICAgIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gbGVycE51bWJlcihhLCBiLCBwKSB7XG4gICAgcmV0dXJuIGEgKyAoYiAtIGEpICogcDtcbn1cblxuZnVuY3Rpb24gc2V0UmdiYShvdXQsIHIsIGcsIGIsIGEpIHtcbiAgICBvdXRbMF0gPSByOyBvdXRbMV0gPSBnOyBvdXRbMl0gPSBiOyBvdXRbM10gPSBhO1xuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBjb3B5UmdiYShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdOyBvdXRbMV0gPSBhWzFdOyBvdXRbMl0gPSBhWzJdOyBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbnZhciBjb2xvckNhY2hlID0gbmV3IExSVSgyMCk7XG52YXIgbGFzdFJlbW92ZWRBcnIgPSBudWxsO1xuXG5mdW5jdGlvbiBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKSB7XG4gICAgLy8gUmV1c2UgcmVtb3ZlZCBhcnJheVxuICAgIGlmIChsYXN0UmVtb3ZlZEFycikge1xuICAgICAgICBjb3B5UmdiYShsYXN0UmVtb3ZlZEFyciwgcmdiYUFycik7XG4gICAgfVxuICAgIGxhc3RSZW1vdmVkQXJyID0gY29sb3JDYWNoZS5wdXQoY29sb3JTdHIsIGxhc3RSZW1vdmVkQXJyIHx8IChyZ2JhQXJyLnNsaWNlKCkpKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTdHJcbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IG91dFxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnpyZW5kZXIvdXRpbC9jb2xvclxuICovXG5jb2xvclV0aWwucGFyc2UgPSBmdW5jdGlvbiAoY29sb3JTdHIsIHJnYmFBcnIpIHtcbiAgICBpZiAoIWNvbG9yU3RyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmdiYUFyciA9IHJnYmFBcnIgfHwgW107XG5cbiAgICB2YXIgY2FjaGVkID0gY29sb3JDYWNoZS5nZXQoY29sb3JTdHIpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGNvcHlSZ2JhKHJnYmFBcnIsIGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gY29sb3JTdHIgbWF5IGJlIG5vdCBzdHJpbmdcbiAgICBjb2xvclN0ciA9IGNvbG9yU3RyICsgJyc7XG4gICAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gICAgdmFyIHN0ciA9IGNvbG9yU3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gICAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkge1xuICAgICAgICBjb3B5UmdiYShyZ2JhQXJyLCBrQ1NTQ29sb3JUYWJsZVtzdHJdKTtcbiAgICAgICAgcHV0VG9DYWNoZShjb2xvclN0ciwgcmdiYUFycik7XG4gICAgICAgIHJldHVybiByZ2JhQXJyO1xuICAgIH1cblxuICAgIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICAgIGlmIChzdHIuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHtcbiAgICAgICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsIDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIENvdmVycyBOYU4uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsXG4gICAgICAgICAgICAgICAgKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKTtcbiAgICAgICAgICAgIHJldHVybiByZ2JhQXJyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHtcbiAgICAgICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsIDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgIC8vIENvdmVycyBOYU4uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsXG4gICAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHB1dFRvQ2FjaGUoY29sb3JTdHIsIHJnYmFBcnIpO1xuICAgICAgICAgICAgcmV0dXJuIHJnYmFBcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICAgICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3AgKyAxLCBlcCAtIChvcCArIDEpKS5zcGxpdCgnLCcpO1xuICAgICAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICAgICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmdiYShyZ2JhQXJyLCAwLCAwLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbHBoYSA9IHBhcnNlQ3NzRmxvYXQocGFyYW1zLnBvcCgpKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICAgICAgICBjYXNlICdyZ2InOlxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFJnYmEocmdiYUFyciwgMCwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0UmdiYShyZ2JhQXJyLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNzc0ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNzc0ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNzc0ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgICAgICBhbHBoYVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcHV0VG9DYWNoZShjb2xvclN0ciwgcmdiYUFycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJnYmFBcnI7XG4gICAgICAgICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRSZ2JhKHJnYmFBcnIsIDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmFtc1szXSA9IHBhcnNlQ3NzRmxvYXQocGFyYW1zWzNdKTtcbiAgICAgICAgICAgICAgICBoc2xhMnJnYmEocGFyYW1zLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmdiYUFycjtcbiAgICAgICAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmdiYShyZ2JhQXJyLCAwLCAwLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoc2xhMnJnYmEocGFyYW1zLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICBwdXRUb0NhY2hlKGNvbG9yU3RyLCByZ2JhQXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmdiYUFycjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UmdiYShyZ2JhQXJyLCAwLCAwLCAwLCAxKTtcbiAgICByZXR1cm47XG59O1xuXG5jb2xvclV0aWwucGFyc2VUb0Zsb2F0ID0gZnVuY3Rpb24gKGNvbG9yU3RyLCByZ2JhQXJyKSB7XG4gICAgcmdiYUFyciA9IGNvbG9yVXRpbC5wYXJzZShjb2xvclN0ciwgcmdiYUFycik7XG4gICAgaWYgKCFyZ2JhQXJyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmdiYUFyclswXSAvPSAyNTU7XG4gICAgcmdiYUFyclsxXSAvPSAyNTU7XG4gICAgcmdiYUFyclsyXSAvPSAyNTU7XG4gICAgcmV0dXJuIHJnYmFBcnI7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gaHNsYVxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmdiYVxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IHJnYmFcbiAqL1xuZnVuY3Rpb24gaHNsYTJyZ2JhKGhzbGEsIHJnYmEpIHtcbiAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQoaHNsYVswXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgdmFyIHMgPSBwYXJzZUNzc0Zsb2F0KGhzbGFbMV0pO1xuICAgIHZhciBsID0gcGFyc2VDc3NGbG9hdChoc2xhWzJdKTtcbiAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuXG4gICAgcmdiYSA9IHJnYmEgfHwgW107XG4gICAgc2V0UmdiYShyZ2JhLFxuICAgICAgICBjbGFtcENzc0J5dGUoY3NzSHVlVG9SZ2IobTEsIG0yLCBoICsgMSAvIDMpICogMjU1KSxcbiAgICAgICAgY2xhbXBDc3NCeXRlKGNzc0h1ZVRvUmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICBjbGFtcENzc0J5dGUoY3NzSHVlVG9SZ2IobTEsIG0yLCBoIC0gMSAvIDMpICogMjU1KSxcbiAgICAgICAgMVxuICAgICk7XG5cbiAgICBpZiAoaHNsYS5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgcmdiYVszXSA9IGhzbGFbM107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gcmdiYVxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IGhzbGFcbiAqL1xuZnVuY3Rpb24gcmdiYTJoc2xhKHJnYmEpIHtcbiAgICBpZiAoIXJnYmEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJHQiBmcm9tIDAgdG8gMjU1XG4gICAgdmFyIFIgPSByZ2JhWzBdIC8gMjU1O1xuICAgIHZhciBHID0gcmdiYVsxXSAvIDI1NTtcbiAgICB2YXIgQiA9IHJnYmFbMl0gLyAyNTU7XG5cbiAgICB2YXIgdk1pbiA9IE1hdGgubWluKFIsIEcsIEIpOyAvLyBNaW4uIHZhbHVlIG9mIFJHQlxuICAgIHZhciB2TWF4ID0gTWF0aC5tYXgoUiwgRywgQik7IC8vIE1heC4gdmFsdWUgb2YgUkdCXG4gICAgdmFyIGRlbHRhID0gdk1heCAtIHZNaW47IC8vIERlbHRhIFJHQiB2YWx1ZVxuXG4gICAgdmFyIEwgPSAodk1heCArIHZNaW4pIC8gMjtcbiAgICB2YXIgSDtcbiAgICB2YXIgUztcbiAgICAvLyBIU0wgcmVzdWx0cyBmcm9tIDAgdG8gMVxuICAgIGlmIChkZWx0YSA9PT0gMCkge1xuICAgICAgICBIID0gMDtcbiAgICAgICAgUyA9IDA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoTCA8IDAuNSkge1xuICAgICAgICAgICAgUyA9IGRlbHRhIC8gKHZNYXggKyB2TWluKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFMgPSBkZWx0YSAvICgyIC0gdk1heCAtIHZNaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRlbHRhUiA9ICgoKHZNYXggLSBSKSAvIDYpICsgKGRlbHRhIC8gMikpIC8gZGVsdGE7XG4gICAgICAgIHZhciBkZWx0YUcgPSAoKCh2TWF4IC0gRykgLyA2KSArIChkZWx0YSAvIDIpKSAvIGRlbHRhO1xuICAgICAgICB2YXIgZGVsdGFCID0gKCgodk1heCAtIEIpIC8gNikgKyAoZGVsdGEgLyAyKSkgLyBkZWx0YTtcblxuICAgICAgICBpZiAoUiA9PT0gdk1heCkge1xuICAgICAgICAgICAgSCA9IGRlbHRhQiAtIGRlbHRhRztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChHID09PSB2TWF4KSB7XG4gICAgICAgICAgICBIID0gKDEgLyAzKSArIGRlbHRhUiAtIGRlbHRhQjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChCID09PSB2TWF4KSB7XG4gICAgICAgICAgICBIID0gKDIgLyAzKSArIGRlbHRhRyAtIGRlbHRhUjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChIIDwgMCkge1xuICAgICAgICAgICAgSCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEggPiAxKSB7XG4gICAgICAgICAgICBIIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaHNsYSA9IFtIICogMzYwLCBTLCBMXTtcblxuICAgIGlmIChyZ2JhWzNdICE9IG51bGwpIHtcbiAgICAgICAgaHNsYS5wdXNoKHJnYmFbM10pO1xuICAgIH1cblxuICAgIHJldHVybiBoc2xhO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnpyZW5kZXIvdXRpbC9jb2xvclxuICovXG5jb2xvclV0aWwubGlmdCA9IGZ1bmN0aW9uIChjb2xvciwgbGV2ZWwpIHtcbiAgICB2YXIgY29sb3JBcnIgPSBjb2xvclV0aWwucGFyc2UoY29sb3IpO1xuICAgIGlmIChjb2xvckFycikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbG9yQXJyW2ldID0gY29sb3JBcnJbaV0gKiAoMSAtIGxldmVsKSB8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2xvckFycltpXSA9ICgoMjU1IC0gY29sb3JBcnJbaV0pICogbGV2ZWwgKyBjb2xvckFycltpXSkgfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclV0aWwuc3RyaW5naWZ5KGNvbG9yQXJyLCBjb2xvckFyci5sZW5ndGggPT09IDQgPyAncmdiYScgOiAncmdiJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICogQHJldHVybiB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTp6cmVuZGVyL3V0aWwvY29sb3JcbiAqL1xuY29sb3JVdGlsLnRvSGV4ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIGNvbG9yQXJyID0gY29sb3JVdGlsLnBhcnNlKGNvbG9yKTtcbiAgICBpZiAoY29sb3JBcnIpIHtcbiAgICAgICAgcmV0dXJuICgoMSA8PCAyNCkgKyAoY29sb3JBcnJbMF0gPDwgMTYpICsgKGNvbG9yQXJyWzFdIDw8IDgpICsgKCtjb2xvckFyclsyXSkpLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcbiAgICB9XG59XG5cbi8qKlxuICogTWFwIHZhbHVlIHRvIGNvbG9yLiBGYXN0ZXIgdGhhbiBsZXJwIG1ldGhvZHMgYmVjYXVzZSBjb2xvciBpcyByZXByZXNlbnRlZCBieSByZ2JhIGFycmF5LlxuICogQHBhcmFtIHtudW1iZXJ9IG5vcm1hbGl6ZWRWYWx1ZSBBIGZsb2F0IGJldHdlZW4gMCBhbmQgMS5cbiAqIEBwYXJhbSB7QXJyYXkuPEFycmF5LjxudW1iZXI+Pn0gY29sb3JzIExpc3Qgb2YgcmdiYSBjb2xvciBhcnJheVxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gW291dF0gTWFwcGVkIGdiYSBjb2xvciBhcnJheVxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IHdpbGwgYmUgbnVsbC91bmRlZmluZWQgaWYgaW5wdXQgaWxsZWdhbC5cbiAqL1xuY29sb3JVdGlsLmZhc3RMZXJwID0gZnVuY3Rpb24gKG5vcm1hbGl6ZWRWYWx1ZSwgY29sb3JzLCBvdXQpIHtcbiAgICBpZiAoIShjb2xvcnMgJiYgY29sb3JzLmxlbmd0aClcbiAgICAgICAgfHwgIShub3JtYWxpemVkVmFsdWUgPj0gMCAmJiBub3JtYWxpemVkVmFsdWUgPD0gMSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG91dCA9IG91dCB8fCBbXTtcblxuICAgIHZhciB2YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZSAqIChjb2xvcnMubGVuZ3RoIC0gMSk7XG4gICAgdmFyIGxlZnRJbmRleCA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIHZhciByaWdodEluZGV4ID0gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICB2YXIgbGVmdENvbG9yID0gY29sb3JzW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0Q29sb3IgPSBjb2xvcnNbcmlnaHRJbmRleF07XG4gICAgdmFyIGR2ID0gdmFsdWUgLSBsZWZ0SW5kZXg7XG4gICAgb3V0WzBdID0gY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzBdLCByaWdodENvbG9yWzBdLCBkdikpO1xuICAgIG91dFsxXSA9IGNsYW1wQ3NzQnl0ZShsZXJwTnVtYmVyKGxlZnRDb2xvclsxXSwgcmlnaHRDb2xvclsxXSwgZHYpKTtcbiAgICBvdXRbMl0gPSBjbGFtcENzc0J5dGUobGVycE51bWJlcihsZWZ0Q29sb3JbMl0sIHJpZ2h0Q29sb3JbMl0sIGR2KSk7XG4gICAgb3V0WzNdID0gY2xhbXBDc3NGbG9hdChsZXJwTnVtYmVyKGxlZnRDb2xvclszXSwgcmlnaHRDb2xvclszXSwgZHYpKTtcblxuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuY29sb3JVdGlsLmZhc3RNYXBUb0NvbG9yID0gY29sb3JVdGlsLmZhc3RMZXJwO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBub3JtYWxpemVkVmFsdWUgQSBmbG9hdCBiZXR3ZWVuIDAgYW5kIDEuXG4gKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBjb2xvcnMgQ29sb3IgbGlzdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGZ1bGxPdXRwdXQgRGVmYXVsdCBmYWxzZS5cbiAqIEByZXR1cm4geyhzdHJpbmd8T2JqZWN0KX0gUmVzdWx0IGNvbG9yLiBJZiBmdWxsT3V0cHV0LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NvbG9yOiAuLi4sIGxlZnRJbmRleDogLi4uLCByaWdodEluZGV4OiAuLi4sIHZhbHVlOiAuLi59LFxuICogQG1lbWJlck9mIG1vZHVsZTp6cmVuZGVyL3V0aWwvY29sb3JcbiAqL1xuY29sb3JVdGlsLmxlcnAgPSBmdW5jdGlvbiAobm9ybWFsaXplZFZhbHVlLCBjb2xvcnMsIGZ1bGxPdXRwdXQpIHtcbiAgICBpZiAoIShjb2xvcnMgJiYgY29sb3JzLmxlbmd0aClcbiAgICAgICAgfHwgIShub3JtYWxpemVkVmFsdWUgPj0gMCAmJiBub3JtYWxpemVkVmFsdWUgPD0gMSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZSAqIChjb2xvcnMubGVuZ3RoIC0gMSk7XG4gICAgdmFyIGxlZnRJbmRleCA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgIHZhciByaWdodEluZGV4ID0gTWF0aC5jZWlsKHZhbHVlKTtcbiAgICB2YXIgbGVmdENvbG9yID0gY29sb3JVdGlsLnBhcnNlKGNvbG9yc1tsZWZ0SW5kZXhdKTtcbiAgICB2YXIgcmlnaHRDb2xvciA9IGNvbG9yVXRpbC5wYXJzZShjb2xvcnNbcmlnaHRJbmRleF0pO1xuICAgIHZhciBkdiA9IHZhbHVlIC0gbGVmdEluZGV4O1xuXG4gICAgdmFyIGNvbG9yID0gY29sb3JVdGlsLnN0cmluZ2lmeShcbiAgICAgICAgW1xuICAgICAgICAgICAgY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzBdLCByaWdodENvbG9yWzBdLCBkdikpLFxuICAgICAgICAgICAgY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzFdLCByaWdodENvbG9yWzFdLCBkdikpLFxuICAgICAgICAgICAgY2xhbXBDc3NCeXRlKGxlcnBOdW1iZXIobGVmdENvbG9yWzJdLCByaWdodENvbG9yWzJdLCBkdikpLFxuICAgICAgICAgICAgY2xhbXBDc3NGbG9hdChsZXJwTnVtYmVyKGxlZnRDb2xvclszXSwgcmlnaHRDb2xvclszXSwgZHYpKVxuICAgICAgICBdLFxuICAgICAgICAncmdiYSdcbiAgICApO1xuXG4gICAgcmV0dXJuIGZ1bGxPdXRwdXRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjb2xvcjogY29sb3IsXG4gICAgICAgICAgICBsZWZ0SW5kZXg6IGxlZnRJbmRleCxcbiAgICAgICAgICAgIHJpZ2h0SW5kZXg6IHJpZ2h0SW5kZXgsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfVxuICAgICAgICA6IGNvbG9yO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmNvbG9yVXRpbC5tYXBUb0NvbG9yID0gY29sb3JVdGlsLmxlcnA7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gKiBAcGFyYW0ge251bWJlcj19IGggMCB+IDM2MCwgaWdub3JlIHdoZW4gbnVsbC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gcyAwIH4gMSwgaWdub3JlIHdoZW4gbnVsbC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gbCAwIH4gMSwgaWdub3JlIHdoZW4gbnVsbC5cbiAqIEByZXR1cm4ge3N0cmluZ30gQ29sb3Igc3RyaW5nIGluIHJnYmEgZm9ybWF0LlxuICogQG1lbWJlck9mIG1vZHVsZTp6cmVuZGVyL3V0aWwvY29sb3JcbiAqL1xuY29sb3JVdGlsLm1vZGlmeUhTTCA9IGZ1bmN0aW9uIChjb2xvciwgaCwgcywgbCkge1xuICAgIGNvbG9yID0gY29sb3JVdGlsLnBhcnNlKGNvbG9yKTtcblxuICAgIGlmIChjb2xvcikge1xuICAgICAgICBjb2xvciA9IHJnYmEyaHNsYShjb2xvcik7XG4gICAgICAgIGggIT0gbnVsbCAmJiAoY29sb3JbMF0gPSBjbGFtcENzc0FuZ2xlKGgpKTtcbiAgICAgICAgcyAhPSBudWxsICYmIChjb2xvclsxXSA9IHBhcnNlQ3NzRmxvYXQocykpO1xuICAgICAgICBsICE9IG51bGwgJiYgKGNvbG9yWzJdID0gcGFyc2VDc3NGbG9hdChsKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbG9yVXRpbC5zdHJpbmdpZnkoaHNsYTJyZ2JhKGNvbG9yKSwgJ3JnYmEnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gKiBAcGFyYW0ge251bWJlcj19IGFscGhhIDAgfiAxXG4gKiBAcmV0dXJuIHtzdHJpbmd9IENvbG9yIHN0cmluZyBpbiByZ2JhIGZvcm1hdC5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6enJlbmRlci91dGlsL2NvbG9yXG4gKi9cbmNvbG9yVXRpbC5tb2RpZnlBbHBoYSA9IGZ1bmN0aW9uIChjb2xvciwgYWxwaGEpIHtcbiAgICBjb2xvciA9IGNvbG9yVXRpbC5wYXJzZShjb2xvcik7XG5cbiAgICBpZiAoY29sb3IgJiYgYWxwaGEgIT0gbnVsbCkge1xuICAgICAgICBjb2xvclszXSA9IGNsYW1wQ3NzRmxvYXQoYWxwaGEpO1xuICAgICAgICByZXR1cm4gY29sb3JVdGlsLnN0cmluZ2lmeShjb2xvciwgJ3JnYmEnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyQ29sb3IgbGlrZSBbMTIsMzMsNDQsMC40XVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgJ3JnYmEnLCAnaHN2YScsIC4uLlxuICogQHJldHVybiB7c3RyaW5nfSBSZXN1bHQgY29sb3IuIChJZiBpbnB1dCBpbGxlZ2FsLCByZXR1cm4gdW5kZWZpbmVkKS5cbiAqL1xuY29sb3JVdGlsLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChhcnJDb2xvciwgdHlwZSkge1xuICAgIGlmICghYXJyQ29sb3IgfHwgIWFyckNvbG9yLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjb2xvclN0ciA9IGFyckNvbG9yWzBdICsgJywnICsgYXJyQ29sb3JbMV0gKyAnLCcgKyBhcnJDb2xvclsyXTtcbiAgICBpZiAodHlwZSA9PT0gJ3JnYmEnIHx8IHR5cGUgPT09ICdoc3ZhJyB8fCB0eXBlID09PSAnaHNsYScpIHtcbiAgICAgICAgY29sb3JTdHIgKz0gJywnICsgYXJyQ29sb3JbM107XG4gICAgfVxuICAgIHJldHVybiB0eXBlICsgJygnICsgY29sb3JTdHIgKyAnKSc7XG59O1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29sb3JVdGlsOyIsImltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vVGV4dHVyZSc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5pbXBvcnQgY29sb3JVdGlsIGZyb20gJy4vY29yZS9jb2xvcic7XG52YXIgcGFyc2VDb2xvciA9IGNvbG9yVXRpbC5wYXJzZVRvRmxvYXQ7XG5cbnZhciBwcm9ncmFtS2V5Q2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmaW5lQ29kZShkZWZpbmVzLCBsaWdodHNOdW1iZXJzLCBlbmFibGVkVGV4dHVyZXMpIHtcbiAgICB2YXIgZGVmaW5lS2V5cyA9IE9iamVjdC5rZXlzKGRlZmluZXMpO1xuICAgIGRlZmluZUtleXMuc29ydCgpO1xuICAgIHZhciBkZWZpbmVTdHIgPSBbXTtcbiAgICAvLyBDdXN0b20gRGVmaW5lc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmaW5lS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gZGVmaW5lS2V5c1tpXTtcbiAgICAgICAgdmFyIHZhbHVlID0gZGVmaW5lc1trZXldO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlZmluZVN0ci5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGRlZmluZVN0ci5wdXNoKGtleSArICcgJyArIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVTdHIuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldFByb2dyYW1LZXkodmVydGV4RGVmaW5lcywgZnJhZ21lbnREZWZpbmVzLCBlbmFibGVkVGV4dHVyZXMpIHtcbiAgICBlbmFibGVkVGV4dHVyZXMuc29ydCgpO1xuICAgIHZhciBkZWZpbmVTdHIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuYWJsZWRUZXh0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3ltYm9sID0gZW5hYmxlZFRleHR1cmVzW2ldO1xuICAgICAgICBkZWZpbmVTdHIucHVzaChzeW1ib2wpO1xuICAgIH1cbiAgICB2YXIga2V5ID0gZ2V0RGVmaW5lQ29kZSh2ZXJ0ZXhEZWZpbmVzKSArICdcXG4nXG4gICAgICAgICsgZ2V0RGVmaW5lQ29kZShmcmFnbWVudERlZmluZXMpICsgJ1xcbidcbiAgICAgICAgKyBkZWZpbmVTdHIuam9pbignXFxuJyk7XG5cbiAgICBpZiAocHJvZ3JhbUtleUNhY2hlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW1LZXlDYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHZhciBpZCA9IHV0aWwuZ2VuR1VJRCgpO1xuICAgIHByb2dyYW1LZXlDYWNoZVtrZXldID0gaWQ7XG4gICAgcmV0dXJuIGlkO1xufVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lk1hdGVyaWFsXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgTWF0ZXJpYWwgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5NYXRlcmlhbCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgLy8gdW5pZm9ybXM6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlNoYWRlcn1cbiAgICAgICAgICovXG4gICAgICAgIC8vIHNoYWRlcjogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBkZXB0aFRlc3Q6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwdGhNYXNrOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zcGFyZW50OiBmYWxzZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsZW5kIGZ1bmMgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBtYXRlcmlhbFxuICAgICAgICAgKiBoYXZlIGN1c3RvbSBibGVuZGluZ1xuICAgICAgICAgKiBUaGUgZ2wgY29udGV4dCB3aWxsIGJlIHRoZSBvbmx5IGFyZ3VtZW50IHBhc3NlZCBpbiB0aG8gdGhlXG4gICAgICAgICAqIGJsZW5kIGZ1bmN0aW9uXG4gICAgICAgICAqIERldGFpbCBvZiBibGVuZCBmdW5jdGlvbiBpbiBXZWJHTDpcbiAgICAgICAgICogaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL3NwZWNzLzIuMC9lc19mdWxsX3NwZWNfMi4wLjI1LnBkZlxuICAgICAgICAgKlxuICAgICAgICAgKiBFeGFtcGxlIDpcbiAgICAgICAgICogZnVuY3Rpb24oX2dsKSB7XG4gICAgICAgICAqICBfZ2wuYmxlbmRFcXVhdGlvbihfZ2wuRlVOQ19BREQpO1xuICAgICAgICAgKiAgX2dsLmJsZW5kRnVuYyhfZ2wuU1JDX0FMUEhBLCBfZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgICAqIH1cbiAgICAgICAgICovXG4gICAgICAgIGJsZW5kOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB1cGRhdGUgdGV4dHVyZSBzdGF0dXMgYXV0b21hdGljYWxseS5cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9VcGRhdGVUZXh0dXJlU3RhdHVzOiB0cnVlLFxuXG4gICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgdmVydGV4RGVmaW5lczoge30sXG4gICAgICAgIGZyYWdtZW50RGVmaW5lczoge30sXG4gICAgICAgIF90ZXh0dXJlU3RhdHVzOiB7fSxcblxuICAgICAgICAvLyBzaGFkb3dUcmFuc3BhcmVudE1hcCA6IG51bGxcblxuICAgICAgICAvLyBQRU5ESU5HIGVuYWJsZSB0aGUgdW5pZm9ybSB0aGF0IG9ubHkgdXNlZCBpbiBzaGFkZXIuXG4gICAgICAgIF9lbmFibGVkVW5pZm9ybXM6IG51bGwsXG4gICAgfTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMubmFtZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSAnTUFURVJJQUxfJyArIHRoaXMuX191aWRfXztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaGFkZXIpIHtcbiAgICAgICAgLy8gS2VlcCBzdGF0dXMsIG1haW5seSBwcmVzZXQgdW5pZm9ybXMsIHZlcnRleERlZmluZXMgYW5kIGZyYWdtZW50RGVmaW5lc1xuICAgICAgICB0aGlzLmF0dGFjaFNoYWRlcih0aGlzLnNoYWRlciwgdHJ1ZSk7XG4gICAgfVxufSxcbi8qKiBAbGVuZHMgY2xheS5NYXRlcmlhbC5wcm90b3R5cGUgKi9cbntcbiAgICBwcmVjaXNpb246ICdoaWdocCcsXG5cbiAgICBiaW5kOiBmdW5jdGlvbihyZW5kZXJlciwgcHJvZ3JhbSwgcHJldk1hdGVyaWFsLCBwcmV2UHJvZ3JhbSkge1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIC8vIFBFTkRJTkcgU2FtZSB0ZXh0dXJlIGluIGRpZmZlcmVudCBtYXRlcmlhbCB0YWtlIGRpZmZlcmVudCBzbG90P1xuXG4gICAgICAgIC8vIE1heSB1c2Ugc2hhZGVyIG9mIG90aGVyIG1hdGVyaWFsIGlmIHNoYWRlciBjb2RlIGFyZSBzYW1lXG5cbiAgICAgICAgLy8gdmFyIHNhbWVQcm9ncmFtID0gcHJldlByb2dyYW0gPT09IHByb2dyYW07XG5cbiAgICAgICAgdmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IHByb2dyYW0uY3VycmVudFRleHR1cmVTbG90KCk7XG5cbiAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCB0aGlzLl9lbmFibGVkVW5pZm9ybXMubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSB0aGlzLl9lbmFibGVkVW5pZm9ybXNbdV07XG4gICAgICAgICAgICB2YXIgdW5pZm9ybVZhbHVlID0gdGhpcy51bmlmb3Jtc1tzeW1ib2xdLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm1WYWx1ZSBpbnN0YW5jZW9mIFRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCBzbG90XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlLl9fc2xvdCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bmlmb3JtVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1WYWx1ZVtpXSBpbnN0YW5jZW9mIFRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZVtpXS5fX3Nsb3QgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdW5pZm9ybXNcbiAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCB0aGlzLl9lbmFibGVkVW5pZm9ybXMubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSB0aGlzLl9lbmFibGVkVW5pZm9ybXNbdV07XG4gICAgICAgICAgICB2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbc3ltYm9sXTtcbiAgICAgICAgICAgIHZhciB1bmlmb3JtVmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuICAgICAgICAgICAgLy8gUEVORElOR1xuICAgICAgICAgICAgLy8gV2hlbiBiaW5kaW5nIHR3byBtYXRlcmlhbHMgd2l0aCB0aGUgc2FtZSBzaGFkZXJcbiAgICAgICAgICAgIC8vIE1hbnkgdW5pZm9ybXMgd2lsbCBiZSBiZSBzZXQgdHdpY2UgZXZlbiBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgdmFsdWVcbiAgICAgICAgICAgIC8vIFNvIGFkZCBhIGV2YWx1YXRpb24gdG8gc2VlIGlmIHRoZSB1bmlmb3JtIGlzIHJlYWxseSBuZWVkZWQgdG8gYmUgc2V0XG4gICAgICAgICAgICAvLyBpZiAocHJldk1hdGVyaWFsICYmIHNhbWVTaGFkZXIpIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAocHJldk1hdGVyaWFsLnVuaWZvcm1zW3N5bWJvbF0udmFsdWUgPT09IHVuaWZvcm1WYWx1ZSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIGlmICh1bmlmb3JtVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBBc3N1bWUgbWF0ZXJpYWwgd2l0aCBzYW1lIHNoYWRlciBoYXZlIHNhbWUgb3JkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAvLyBPciBpZiBkaWZmZXJlbnQgbWF0ZXJpYWwgdXNlIHNhbWUgdGV4dHVyZXMsXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNsb3Qgd2lsbCBiZSBkaWZmZXJlbnQgYW5kIHN0aWxsIHNraXBwZWQgYmVjYXVzZSBvcHRpbWl6YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNsb3QgPSBwcm9ncmFtLmN1cnJlbnRUZXh0dXJlU2xvdCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gcHJvZ3JhbS5zZXRVbmlmb3JtKF9nbCwgJzFpJywgc3ltYm9sLCBzbG90KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgeyAvLyBUZXh0dXJlIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIG9jY3VweSB0aGUgc2xvdCB0byBtYWtlIHN1cmUgc2FtZSB0ZXh0dXJlIGluIGRpZmZlcmVudCBtYXRlcmlhbHMgaGF2ZSBzYW1lIHNsb3QuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnRha2VDdXJyZW50VGV4dHVyZVNsb3QocmVuZGVyZXIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5pZm9ybVZhbHVlIGluc3RhbmNlb2YgVGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtVmFsdWUuX19zbG90IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2xvdCA9IHByb2dyYW0uY3VycmVudFRleHR1cmVTbG90KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBwcm9ncmFtLnNldFVuaWZvcm0oX2dsLCAnMWknLCBzeW1ib2wsIHNsb3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcykgeyAvLyBUZXh0dXJlIHVuaWZvcm0gaXMgbm90IGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0udGFrZUN1cnJlbnRUZXh0dXJlU2xvdChyZW5kZXJlciwgdW5pZm9ybVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlLl9fc2xvdCA9IHNsb3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIHVuaWZvcm0gdXNlIHNhbWUgdGV4dHVyZS4uXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShfZ2wsICcxaScsIHN5bWJvbCwgdW5pZm9ybVZhbHVlLl9fc2xvdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1WYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgQXJyYXlcbiAgICAgICAgICAgICAgICB2YXIgZXhhbXBsZVZhbHVlID0gdW5pZm9ybVZhbHVlWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4YW1wbGVWYWx1ZSBpbnN0YW5jZW9mIFRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9ncmFtLmhhc1VuaWZvcm0oc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5pZm9ybVZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHVuaWZvcm1WYWx1ZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUuX19zbG90IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzbG90ID0gcHJvZ3JhbS5jdXJyZW50VGV4dHVyZVNsb3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChzbG90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnRha2VDdXJyZW50VGV4dHVyZVNsb3QocmVuZGVyZXIsIHRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuX19zbG90ID0gc2xvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRleHR1cmUuX19zbG90KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShfZ2wsICcxaXYnLCBzeW1ib2wsIGFycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oX2dsLCB1bmlmb3JtLnR5cGUsIHN5bWJvbCwgdW5pZm9ybVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShfZ2wsIHVuaWZvcm0udHlwZSwgc3ltYm9sLCB1bmlmb3JtVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmUgc2xvdCBtYXliZSB1c2VkIG91dCBvZiBtYXRlcmlhbC5cbiAgICAgICAgcHJvZ3JhbS5yZXNldFRleHR1cmVTbG90KGN1cnJlbnRUZXh0dXJlU2xvdCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBtYXRlcmlhbCB1bmlmb3JtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgbWF0LnNldFVuaWZvcm0oJ2NvbG9yJywgWzEsIDEsIDEsIDFdKTtcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHBhcmFtIHtudW1iZXJ8YXJyYXl8Y2xheS5UZXh0dXJlfEFycmF5QnVmZmVyVmlld30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRVbmlmb3JtOiBmdW5jdGlvbiAoc3ltYm9sLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmlmb3JtIHZhbHVlIFwiJyArIHN5bWJvbCArICdcIiBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHVuaWZvcm0pIHtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcGFyc2UgYXMgYSBjb2xvci4gSW52YWxpZCBjb2xvciBzdHJpbmcgd2lsbCByZXR1cm4gbnVsbC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlQ29sb3IodmFsdWUpIHx8IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1bmlmb3JtLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVUZXh0dXJlU3RhdHVzICYmIHVuaWZvcm0udHlwZSA9PT0gJ3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlVGV4dHVyZShzeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlVGV4dHVyZShzeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAgICovXG4gICAgc2V0VW5pZm9ybXM6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICB0aGlzLnNldFVuaWZvcm0oa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIC8qKlxuICAgIC8vICAqIEVuYWJsZSBhIHVuaWZvcm1cbiAgICAvLyAgKiBJdCBvbmx5IGhhdmUgZWZmZWN0IG9uIHRoZSB1bmlmb3JtIGV4aXN0cyBpbiBzaGFkZXIuXG4gICAgLy8gICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAvLyAgKi9cbiAgICAvLyBlbmFibGVVbmlmb3JtOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLnVuaWZvcm1zW3N5bWJvbF0gJiYgIXRoaXMuaXNVbmlmb3JtRW5hYmxlZChzeW1ib2wpKSB7XG4gICAgLy8gICAgICAgICB0aGlzLl9lbmFibGVkVW5pZm9ybXMucHVzaChzeW1ib2wpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcblxuICAgIC8vIC8qKlxuICAgIC8vICAqIERpc2FibGUgYSB1bmlmb3JtXG4gICAgLy8gICogSXQgd2lsbCBub3QgYWZmZWN0IHRoZSB1bmlmb3JtIHN0YXRlIGluIHRoZSBzaGFkZXIuIEJlY2F1c2UgdGhlIHNoYWRlciB1bmlmb3JtcyBpcyBwYXJzZWQgZnJvbSBzaGFkZXIgY29kZSB3aXRoIG5haXZlIHJlZ2V4LiBXaGVuIHVzaW5nIG1pY3JvIHRvIGRpc2FibGUgc29tZSB1bmlmb3JtcyBpbiB0aGUgc2hhZGVyLiBJdCB3aWxsIHN0aWxsIHRyeSB0byBzZXQgdGhlc2UgdW5pZm9ybXMgaW4gZWFjaCByZW5kZXJpbmcgcGFzcy4gV2UgY2FuIGRpc2FibGUgdGhlc2UgdW5pZm9ybXMgbWFudWFsbHkgaWYgd2UgbmVlZCB0aGlzIGJpdCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4gTW9zdGx5IHdlIGNhbiBzaW1wbHkgaWdub3JlIGl0LlxuICAgIC8vICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgLy8gICovXG4gICAgLy8gZGlzYWJsZVVuaWZvcm06IGZ1bmN0aW9uIChzeW1ib2wpIHtcbiAgICAvLyAgICAgdmFyIGlkeCA9IHRoaXMuX2VuYWJsZWRVbmlmb3Jtcy5pbmRleE9mKHN5bWJvbCk7XG4gICAgLy8gICAgIGlmIChpZHggPj0gMCkge1xuICAgIC8vICAgICAgICAgdGhpcy5fZW5hYmxlZFVuaWZvcm1zLnNwbGljZShpZHgsIDEpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gIHN5bWJvbFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNVbmlmb3JtRW5hYmxlZDogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZFVuaWZvcm1zLmluZGV4T2Yoc3ltYm9sKSA+PSAwO1xuICAgIH0sXG5cbiAgICBnZXRFbmFibGVkVW5pZm9ybXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWRVbmlmb3JtcztcbiAgICB9LFxuICAgIGdldFRleHR1cmVVbmlmb3JtczogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dHVyZVVuaWZvcm1zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBvZiBzZXRVbmlmb3JtIGFuZCBzZXRVbmlmb3Jtc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fHN0cmluZ30gc3ltYm9sXG4gICAgICogQHBhcmFtIHtudW1iZXJ8YXJyYXl8Y2xheS5UZXh0dXJlfEFycmF5QnVmZmVyVmlld30gW3ZhbHVlXVxuICAgICAqL1xuICAgIHNldDogZnVuY3Rpb24gKHN5bWJvbCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZihzeW1ib2wpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHN5bWJvbCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBzeW1ib2xba2V5XTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFVuaWZvcm0oa2V5LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRVbmlmb3JtKHN5bWJvbCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdW5pZm9ybSB2YWx1ZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHJldHVybiB7bnVtYmVyfGFycmF5fGNsYXkuVGV4dHVyZXxBcnJheUJ1ZmZlclZpZXd9XG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIHZhciB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1tzeW1ib2xdO1xuICAgICAgICBpZiAodW5pZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuaWZvcm0udmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEF0dGFjaCBhIHNoYWRlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSAge2NsYXkuU2hhZGVyfSBzaGFkZXJcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBrZWVwU3RhdHVzIElmIHRyeSB0byBrZWVwIHVuaWZvcm0gYW5kIHRleHR1cmVcbiAgICAgKi9cbiAgICBhdHRhY2hTaGFkZXI6IGZ1bmN0aW9uKHNoYWRlciwga2VlcFN0YXR1cykge1xuICAgICAgICB2YXIgb3JpZ2luYWxVbmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XG5cbiAgICAgICAgLy8gSWdub3JlIGlmIHVuaWZvcm0gY2FuIHVzZSBpbiBzaGFkZXIuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSBzaGFkZXIuY3JlYXRlVW5pZm9ybXMoKTtcbiAgICAgICAgdGhpcy5zaGFkZXIgPSBzaGFkZXI7XG5cbiAgICAgICAgdmFyIHVuaWZvcm1zID0gdGhpcy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5fZW5hYmxlZFVuaWZvcm1zID0gT2JqZWN0LmtleXModW5pZm9ybXMpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdW5pZm9ybXMgYXJlIHNldCBpbiBzYW1lIG9yZGVyIHRvIGF2b2lkIHRleHR1cmUgc2xvdCB3cm9uZ1xuICAgICAgICB0aGlzLl9lbmFibGVkVW5pZm9ybXMuc29ydCgpO1xuICAgICAgICB0aGlzLl90ZXh0dXJlVW5pZm9ybXMgPSB0aGlzLl9lbmFibGVkVW5pZm9ybXMuZmlsdGVyKGZ1bmN0aW9uICh1bmlmb3JtTmFtZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnVuaWZvcm1zW3VuaWZvcm1OYW1lXS50eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICd0JyB8fCB0eXBlID09PSAndHYnO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB2YXIgb3JpZ2luYWxWZXJ0ZXhEZWZpbmVzID0gdGhpcy52ZXJ0ZXhEZWZpbmVzO1xuICAgICAgICB2YXIgb3JpZ2luYWxGcmFnbWVudERlZmluZXMgPSB0aGlzLmZyYWdtZW50RGVmaW5lcztcblxuICAgICAgICB0aGlzLnZlcnRleERlZmluZXMgPSB1dGlsLmNsb25lKHNoYWRlci52ZXJ0ZXhEZWZpbmVzKTtcbiAgICAgICAgdGhpcy5mcmFnbWVudERlZmluZXMgPSB1dGlsLmNsb25lKHNoYWRlci5mcmFnbWVudERlZmluZXMpO1xuXG4gICAgICAgIGlmIChrZWVwU3RhdHVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gb3JpZ2luYWxVbmlmb3Jtcykge1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3Jtc1tzeW1ib2xdKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW3N5bWJvbF0udmFsdWUgPSBvcmlnaW5hbFVuaWZvcm1zW3N5bWJvbF0udmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1dGlsLmRlZmF1bHRzKHRoaXMudmVydGV4RGVmaW5lcywgb3JpZ2luYWxWZXJ0ZXhEZWZpbmVzKTtcbiAgICAgICAgICAgIHV0aWwuZGVmYXVsdHModGhpcy5mcmFnbWVudERlZmluZXMsIG9yaWdpbmFsRnJhZ21lbnREZWZpbmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0dXJlU3RhdHVzID0ge307XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzaGFkZXIudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRleHR1cmVTdGF0dXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBzaGFkZXJUeXBlOiBzaGFkZXIudGV4dHVyZXNba2V5XS5zaGFkZXJUeXBlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHNoYWRlci50ZXh0dXJlc1trZXldLnR5cGUsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogKGtlZXBTdGF0dXMgJiYgdGhpcy5fdGV4dHVyZVN0YXR1c1trZXldKSA/IHRoaXMuX3RleHR1cmVTdGF0dXNba2V5XS5lbmFibGVkIDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZXh0dXJlU3RhdHVzID0gdGV4dHVyZVN0YXR1cztcblxuICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gJyc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IG1hdGVyaWFsIGFuZCBrZWVwIHVuaWZvcm1zLCBzaGFkZXIgd2lsbCBub3QgYmUgY2xvbmVkXG4gICAgICogQHJldHVybiB7Y2xheS5NYXRlcmlhbH1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBzaGFkZXI6IHRoaXMuc2hhZGVyXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgbWF0ZXJpYWwudW5pZm9ybXNbc3ltYm9sXS52YWx1ZSA9IHRoaXMudW5pZm9ybXNbc3ltYm9sXS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRlcmlhbC5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcbiAgICAgICAgbWF0ZXJpYWwuZGVwdGhNYXNrID0gdGhpcy5kZXB0aE1hc2s7XG4gICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcbiAgICAgICAgbWF0ZXJpYWwuYmxlbmQgPSB0aGlzLmJsZW5kO1xuXG4gICAgICAgIG1hdGVyaWFsLnZlcnRleERlZmluZXMgPSB1dGlsLmNsb25lKHRoaXMudmVydGV4RGVmaW5lcyk7XG4gICAgICAgIG1hdGVyaWFsLmZyYWdtZW50RGVmaW5lcyA9IHV0aWwuY2xvbmUodGhpcy5mcmFnbWVudERlZmluZXMpO1xuICAgICAgICBtYXRlcmlhbC5lbmFibGVUZXh0dXJlKHRoaXMuZ2V0RW5hYmxlZFRleHR1cmVzKCkpO1xuICAgICAgICBtYXRlcmlhbC5wcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbjtcblxuICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhICNkZWZpbmUgbWFjcm8gaW4gc2hhZGVyIGNvZGVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHNoYWRlclR5cGUgQ2FuIGJlIHZlcnRleCwgZnJhZ21lbnQgb3IgYm90aFxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbdmFsXVxuICAgICAqL1xuICAgIGRlZmluZTogZnVuY3Rpb24gKHNoYWRlclR5cGUsIHN5bWJvbCwgdmFsKSB7XG4gICAgICAgIHZhciB2ZXJ0ZXhEZWZpbmVzID0gdGhpcy52ZXJ0ZXhEZWZpbmVzO1xuICAgICAgICB2YXIgZnJhZ21lbnREZWZpbmVzID0gdGhpcy5mcmFnbWVudERlZmluZXM7XG4gICAgICAgIGlmIChzaGFkZXJUeXBlICE9PSAndmVydGV4JyAmJiBzaGFkZXJUeXBlICE9PSAnZnJhZ21lbnQnICYmIHNoYWRlclR5cGUgIT09ICdib3RoJ1xuICAgICAgICAgICAgJiYgYXJndW1lbnRzLmxlbmd0aCA8IDNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBzaGFkZXJUeXBlIGRlZmF1bHQgdG8gYmUgJ2JvdGgnXG4gICAgICAgICAgICB2YWwgPSBzeW1ib2w7XG4gICAgICAgICAgICBzeW1ib2wgPSBzaGFkZXJUeXBlO1xuICAgICAgICAgICAgc2hhZGVyVHlwZSA9ICdib3RoJztcbiAgICAgICAgfVxuICAgICAgICB2YWwgPSB2YWwgIT0gbnVsbCA/IHZhbCA6IG51bGw7XG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSAndmVydGV4JyB8fCBzaGFkZXJUeXBlID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgIGlmICh2ZXJ0ZXhEZWZpbmVzW3N5bWJvbF0gIT09IHZhbCkge1xuICAgICAgICAgICAgICAgIHZlcnRleERlZmluZXNbc3ltYm9sXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIGRpcnR5XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSAnZnJhZ21lbnQnIHx8IHNoYWRlclR5cGUgPT09ICdib3RoJykge1xuICAgICAgICAgICAgaWYgKGZyYWdtZW50RGVmaW5lc1tzeW1ib2xdICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudERlZmluZXNbc3ltYm9sXSA9IHZhbDtcbiAgICAgICAgICAgICAgICBpZiAoc2hhZGVyVHlwZSAhPT0gJ2JvdGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyYW1LZXkgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgI2RlZmluZSBtYWNybyBpbiBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc2hhZGVyVHlwZSBDYW4gYmUgdmVydGV4LCBmcmFnbWVudCBvciBib3RoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKi9cbiAgICB1bmRlZmluZTogZnVuY3Rpb24gKHNoYWRlclR5cGUsIHN5bWJvbCkge1xuICAgICAgICBpZiAoc2hhZGVyVHlwZSAhPT0gJ3ZlcnRleCcgJiYgc2hhZGVyVHlwZSAhPT0gJ2ZyYWdtZW50JyAmJiBzaGFkZXJUeXBlICE9PSAnYm90aCdcbiAgICAgICAgICAgICYmIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gc2hhZGVyVHlwZSBkZWZhdWx0IHRvIGJlICdib3RoJ1xuICAgICAgICAgICAgc3ltYm9sID0gc2hhZGVyVHlwZTtcbiAgICAgICAgICAgIHNoYWRlclR5cGUgPSAnYm90aCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRlclR5cGUgPT09ICd2ZXJ0ZXgnIHx8IHNoYWRlclR5cGUgPT09ICdib3RoJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKCd2ZXJ0ZXgnLCBzeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudmVydGV4RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgZGlydHlcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRlclR5cGUgPT09ICdmcmFnbWVudCcgfHwgc2hhZGVyVHlwZSA9PT0gJ2JvdGgnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQoJ2ZyYWdtZW50Jywgc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZyYWdtZW50RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICAgICAgICAgIGlmIChzaGFkZXJUeXBlICE9PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBtYWNybyBpcyBkZWZpbmVkIGluIHNoYWRlci5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHNoYWRlclR5cGUgQ2FuIGJlIHZlcnRleCwgZnJhZ21lbnQgb3IgYm90aFxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICovXG4gICAgaXNEZWZpbmVkOiBmdW5jdGlvbiAoc2hhZGVyVHlwZSwgc3ltYm9sKSB7XG4gICAgICAgIC8vIFBFTkRJTkcgaGFzT3duUHJvcGVydHkgP1xuICAgICAgICBzd2l0Y2ggKHNoYWRlclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnRleCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4RGVmaW5lc1tzeW1ib2xdICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYXNlICdmcmFnbWVudCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJhZ21lbnREZWZpbmVzW3N5bWJvbF0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IG1hY3JvIHZhbHVlIGRlZmluZWQgaW4gc2hhZGVyLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc2hhZGVyVHlwZSBDYW4gYmUgdmVydGV4LCBmcmFnbWVudCBvciBib3RoXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKi9cbiAgICBnZXREZWZpbmU6IGZ1bmN0aW9uIChzaGFkZXJUeXBlLCBzeW1ib2wpIHtcbiAgICAgICAgc3dpdGNoKHNoYWRlclR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZlcnRleCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICAgICAgY2FzZSAnZnJhZ21lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYWdtZW50RGVmaW5lc1tzeW1ib2xdO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmFibGUgYSB0ZXh0dXJlLCBhY3R1YWxseSBpdCB3aWxsIGFkZCBhICNkZWZpbmUgbWFjcm8gaW4gdGhlIHNoYWRlciBjb2RlXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIHRleHR1cmUgc3ltYm9sIGlzIGRpZmZ1c2VNYXAsIGl0IHdpbGwgYWRkIGEgbGluZSBgI2RlZmluZSBESUZGVVNFTUFQX0VOQUJMRURgIGluIHRoZSBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc3ltYm9sXG4gICAgICovXG4gICAgZW5hYmxlVGV4dHVyZTogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzeW1ib2wpKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlVGV4dHVyZShzeW1ib2xbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3RleHR1cmVTdGF0dXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdmFyIGlzRW5hYmxlZCA9IHN0YXR1cy5lbmFibGVkO1xuICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmFibGUgYWxsIHRleHR1cmVzIHVzZWQgaW4gdGhlIHNoYWRlclxuICAgICAqL1xuICAgIGVuYWJsZVRleHR1cmVzQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlU3RhdHVzID0gdGhpcy5fdGV4dHVyZVN0YXR1cztcbiAgICAgICAgZm9yICh2YXIgc3ltYm9sIGluIHRleHR1cmVTdGF0dXMpIHtcbiAgICAgICAgICAgIHRleHR1cmVTdGF0dXNbc3ltYm9sXS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Byb2dyYW1LZXkgPSAnJztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgYSB0ZXh0dXJlLCBpdCByZW1vdmUgYSAjZGVmaW5lIG1hY3JvIGluIHRoZSBzaGFkZXJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHN5bWJvbFxuICAgICAqL1xuICAgIGRpc2FibGVUZXh0dXJlOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN5bWJvbCkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlVGV4dHVyZShzeW1ib2xbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuX3RleHR1cmVTdGF0dXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdmFyIGlzRGlzYWJsZWQgPSAhIHN0YXR1cy5lbmFibGVkO1xuICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERpc2FibGUgYWxsIHRleHR1cmVzIHVzZWQgaW4gdGhlIHNoYWRlclxuICAgICAqL1xuICAgIGRpc2FibGVUZXh0dXJlc0FsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGV4dHVyZVN0YXR1cyA9IHRoaXMuX3RleHR1cmVTdGF0dXM7XG4gICAgICAgIGZvciAodmFyIHN5bWJvbCBpbiB0ZXh0dXJlU3RhdHVzKSB7XG4gICAgICAgICAgICB0ZXh0dXJlU3RhdHVzW3N5bWJvbF0uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJvZ3JhbUtleSA9ICcnO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogSWYgdGV4dHVyZSBvZiBnaXZlbiB0eXBlIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSAgc3ltYm9sXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1RleHR1cmVFbmFibGVkOiBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlU3RhdHVzID0gdGhpcy5fdGV4dHVyZVN0YXR1cztcbiAgICAgICAgcmV0dXJuICEhdGV4dHVyZVN0YXR1c1tzeW1ib2xdXG4gICAgICAgICAgICAmJiB0ZXh0dXJlU3RhdHVzW3N5bWJvbF0uZW5hYmxlZDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBlbmFibGVkIHRleHR1cmVzXG4gICAgICogQHJldHVybiB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RW5hYmxlZFRleHR1cmVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbmFibGVkVGV4dHVyZXMgPSBbXTtcbiAgICAgICAgdmFyIHRleHR1cmVTdGF0dXMgPSB0aGlzLl90ZXh0dXJlU3RhdHVzO1xuICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGV4dHVyZVN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHRleHR1cmVTdGF0dXNbc3ltYm9sXS5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZFRleHR1cmVzLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5hYmxlZFRleHR1cmVzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYXJrIGRlZmluZXMgYXJlIHVwZGF0ZWQuXG4gICAgICovXG4gICAgZGlydHlEZWZpbmVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyYW1LZXkgPSAnJztcbiAgICB9XG59KTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXRlcmlhbC5wcm90b3R5cGUsICdzaGFkZXInLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRlciB8fCBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdZb3UgbmVlZCB0byB1c2UgYXR0YWNoU2hhZGVyIHRvIHNldCB0aGUgc2hhZGVyLicpO1xuICAgICAgICAgICAgdGhpcy5fc2hhZGVyID0gdmFsO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWF0ZXJpYWwucHJvdG90eXBlLCAncHJvZ3JhbUtleScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Byb2dyYW1LZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmFtS2V5ID0gZ2V0UHJvZ3JhbUtleShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhEZWZpbmVzLCB0aGlzLmZyYWdtZW50RGVmaW5lcywgdGhpcy5nZXRFbmFibGVkVGV4dHVyZXMoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbUtleTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRlcmlhbDtcbiIsImltcG9ydCB2ZW5kb3IgZnJvbSAnLi4vY29yZS92ZW5kb3InO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vY29yZS9CYXNlJztcblxudmFyIFNIQURFUl9TVEFURV9UT19FTkFCTEUgPSAxO1xudmFyIFNIQURFUl9TVEFURV9LRUVQX0VOQUJMRSA9IDI7XG52YXIgU0hBREVSX1NUQVRFX1BFTkRJTkcgPSAzO1xuXG4vLyBFbmFibGUgYXR0cmlidXRlIG9wZXJhdGlvbiBpcyBnbG9iYWwgdG8gYWxsIHByb2dyYW1zXG4vLyBIZXJlIHNhdmVkIHRoZSBsaXN0IG9mIGFsbCBlbmFibGVkIGF0dHJpYnV0ZSBpbmRleFxuLy8gaHR0cDovL3d3dy5tamJzaGF3LmNvbS8yMDEzLzAzL3dlYmdsLWZpeGluZy1pbnZhbGlkb3BlcmF0aW9uLmh0bWxcbnZhciBlbmFibGVkQXR0cmlidXRlTGlzdCA9IHt9O1xuXG4vLyBzb21lIHV0aWwgZnVuY3Rpb25zXG5mdW5jdGlvbiBhZGRMaW5lTnVtYmVycyhzdHJpbmcpIHtcbiAgICB2YXIgY2h1bmtzID0gc3RyaW5nLnNwbGl0KCdcXG4nKTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWw7IGkgKyspIHtcbiAgICAgICAgLy8gQ2hyb21lIHJlcG9ydHMgc2hhZGVyIGVycm9ycyBvbiBsaW5lc1xuICAgICAgICAvLyBzdGFydGluZyBjb3VudGluZyBmcm9tIDFcbiAgICAgICAgY2h1bmtzW2ldID0gKGkgKyAxKSArICc6ICcgKyBjaHVua3NbaV07XG4gICAgfVxuICAgIHJldHVybiBjaHVua3Muam9pbignXFxuJyk7XG59XG5cbi8vIFJldHVybiB0cnVlIG9yIGVycm9yIG1zZyBpZiBlcnJvciBoYXBwZW5lZFxuZnVuY3Rpb24gY2hlY2tTaGFkZXJFcnJvck1zZyhfZ2wsIHNoYWRlciwgc2hhZGVyU3RyaW5nKSB7XG4gICAgaWYgKCFfZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgX2dsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICByZXR1cm4gW19nbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlciksIGFkZExpbmVOdW1iZXJzKHNoYWRlclN0cmluZyldLmpvaW4oJ1xcbicpO1xuICAgIH1cbn1cblxudmFyIEdMUHJvZ3JhbSA9IEJhc2UuZXh0ZW5kKHtcblxuICAgIHVuaWZvcm1TZW1hbnRpY3M6IHt9LFxuICAgIGF0dHJpYnV0ZXM6IHt9XG5cbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9sb2NhdGlvbnMgPSB7fTtcblxuICAgIHRoaXMuX3RleHR1cmVTbG90ID0gMDtcblxuICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsO1xufSwge1xuXG4gICAgYmluZDogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVTbG90ID0gMDtcbiAgICAgICAgcmVuZGVyZXIuZ2wudXNlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtKTtcbiAgICB9LFxuXG4gICAgaGFzVW5pZm9ybTogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB2YXIgbG9jYXRpb24gPSB0aGlzLl9sb2NhdGlvbnNbc3ltYm9sXTtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uICE9PSBudWxsICYmIGxvY2F0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHVzZVRleHR1cmVTbG90OiBmdW5jdGlvbiAocmVuZGVyZXIsIHRleHR1cmUsIHNsb3QpIHtcbiAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmdsLmFjdGl2ZVRleHR1cmUocmVuZGVyZXIuZ2wuVEVYVFVSRTAgKyBzbG90KTtcbiAgICAgICAgICAgIC8vIE1heWJlIHRleHR1cmUgaXMgbm90IGxvYWRlZCB5ZXQ7XG4gICAgICAgICAgICBpZiAodGV4dHVyZS5pc1JlbmRlcmFibGUoKSkge1xuICAgICAgICAgICAgICAgIHRleHR1cmUuYmluZChyZW5kZXJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBCaW5kIHRleHR1cmUgdG8gbnVsbFxuICAgICAgICAgICAgICAgIHRleHR1cmUudW5iaW5kKHJlbmRlcmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dHVyZVNsb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHR1cmVTbG90O1xuICAgIH0sXG5cbiAgICByZXNldFRleHR1cmVTbG90OiBmdW5jdGlvbiAoc2xvdCkge1xuICAgICAgICB0aGlzLl90ZXh0dXJlU2xvdCA9IHNsb3QgfHwgMDtcbiAgICB9LFxuXG4gICAgdGFrZUN1cnJlbnRUZXh0dXJlU2xvdDogZnVuY3Rpb24gKHJlbmRlcmVyLCB0ZXh0dXJlKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlU2xvdCA9IHRoaXMuX3RleHR1cmVTbG90O1xuXG4gICAgICAgIHRoaXMudXNlVGV4dHVyZVNsb3QocmVuZGVyZXIsIHRleHR1cmUsIHRleHR1cmVTbG90KTtcblxuICAgICAgICB0aGlzLl90ZXh0dXJlU2xvdCsrO1xuXG4gICAgICAgIHJldHVybiB0ZXh0dXJlU2xvdDtcbiAgICB9LFxuXG4gICAgc2V0VW5pZm9ybTogZnVuY3Rpb24gKF9nbCwgdHlwZSwgc3ltYm9sLCB2YWx1ZSkge1xuICAgICAgICB2YXIgbG9jYXRpb25NYXAgPSB0aGlzLl9sb2NhdGlvbnM7XG4gICAgICAgIHZhciBsb2NhdGlvbiA9IGxvY2F0aW9uTWFwW3N5bWJvbF07XG4gICAgICAgIC8vIFVuaWZvcm0gaXMgbm90IGV4aXN0ZWQgaW4gdGhlIHNoYWRlclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbTQnOlxuICAgICAgICAgICAgICAgIC8vIFRoZSBtYXRyaXggbXVzdCBiZSBjcmVhdGVkIGJ5IGdsbWF0cml4IGFuZCBjYW4gcGFzcyBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJpJzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTJpKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgIF9nbC51bmlmb3JtMmYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczaSc6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm0zaShsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm0zZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0aSc6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm00aShsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGYnOlxuICAgICAgICAgICAgICAgIF9nbC51bmlmb3JtNGYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFpJzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm0xZihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWZ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTFmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWl2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMml2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTJpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmZ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTJmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2l2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2Z2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTNmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGl2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTRpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGZ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybTRmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbTInOlxuICAgICAgICAgICAgY2FzZSAnbTJ2JzpcbiAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ20zJzpcbiAgICAgICAgICAgIGNhc2UgJ20zdic6XG4gICAgICAgICAgICAgICAgX2dsLnVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtNHYnOlxuICAgICAgICAgICAgICAgIC8vIFJhdyB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheSh2YWx1ZS5sZW5ndGggKiAxNik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbY3Vyc29yKytdID0gaXRlbVtqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIGFycmF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiB2ZW5kb3IuRmxvYXQzMkFycmF5KSB7ICAgLy8gQXJyYXlCdWZmZXJWaWV3XG4gICAgICAgICAgICAgICAgICAgIF9nbC51bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgc2V0VW5pZm9ybU9mU2VtYW50aWM6IGZ1bmN0aW9uIChfZ2wsIHNlbWFudGljLCB2YWwpIHtcbiAgICAgICAgdmFyIHNlbWFudGljSW5mbyA9IHRoaXMudW5pZm9ybVNlbWFudGljc1tzZW1hbnRpY107XG4gICAgICAgIGlmIChzZW1hbnRpY0luZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFVuaWZvcm0oX2dsLCBzZW1hbnRpY0luZm8udHlwZSwgc2VtYW50aWNJbmZvLnN5bWJvbCwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8vIFVzZWQgZm9yIGNyZWF0aW5nIFZBT1xuICAgIC8vIEVuYWJsZSB0aGUgYXR0cmlidXRlcyBwYXNzZWQgaW4gYW5kIGRpc2FibGUgdGhlIHJlc3RcbiAgICAvLyBFeGFtcGxlIFVzYWdlOlxuICAgIC8vIGVuYWJsZUF0dHJpYnV0ZXMocmVuZGVyZXIsIFtcInBvc2l0aW9uXCIsIFwidGV4Y29vcmRzXCJdKVxuICAgIGVuYWJsZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uIChyZW5kZXJlciwgYXR0cmliTGlzdCwgdmFvKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLl9wcm9ncmFtO1xuXG4gICAgICAgIHZhciBsb2NhdGlvbk1hcCA9IHRoaXMuX2xvY2F0aW9ucztcblxuICAgICAgICB2YXIgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHQ7XG4gICAgICAgIGlmICh2YW8pIHtcbiAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVMaXN0SW5Db250ZXh0ID0gdmFvLl9fZW5hYmxlZEF0dHJpYnV0ZUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmFibGVkQXR0cmlidXRlTGlzdEluQ29udGV4dCA9IGVuYWJsZWRBdHRyaWJ1dGVMaXN0W3JlbmRlcmVyLl9fdWlkX19dO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEluIHZlcnRleCBhcnJheSBvYmplY3QgY29udGV4dFxuICAgICAgICAgICAgLy8gUEVORElORyBFYWNoIHZhbyBvYmplY3QgbmVlZHMgdG8gZW5hYmxlIGF0dHJpYnV0ZXMgYWdhaW4/XG4gICAgICAgICAgICBpZiAodmFvKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgPSB2YW8uX19lbmFibGVkQXR0cmlidXRlTGlzdFxuICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgPSBlbmFibGVkQXR0cmlidXRlTGlzdFtyZW5kZXJlci5fX3VpZF9fXVxuICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBsb2NhdGlvbkxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3ltYm9sID0gYXR0cmliTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdHRyaWJ1dGVzW3N5bWJvbF0pIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbkxpc3RbaV0gPSAtMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9IGxvY2F0aW9uTWFwW3N5bWJvbF07XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gX2dsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgLy8gQXR0cmliIGxvY2F0aW9uIGlzIGEgbnVtYmVyIGZyb20gMCB0byAuLi5cbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uTGlzdFtpXSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYXRpb25NYXBbc3ltYm9sXSA9IGxvY2F0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYXRpb25MaXN0W2ldID0gbG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmICghZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRbbG9jYXRpb25dKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRbbG9jYXRpb25dID0gU0hBREVSX1NUQVRFX1RPX0VOQUJMRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVMaXN0SW5Db250ZXh0W2xvY2F0aW9uXSA9IFNIQURFUl9TVEFURV9LRUVQX0VOQUJMRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN3aXRjaChlbmFibGVkQXR0cmlidXRlTGlzdEluQ29udGV4dFtpXSl7XG4gICAgICAgICAgICAgICAgY2FzZSBTSEFERVJfU1RBVEVfVE9fRU5BQkxFOlxuICAgICAgICAgICAgICAgICAgICBfZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaSk7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRBdHRyaWJ1dGVMaXN0SW5Db250ZXh0W2ldID0gU0hBREVSX1NUQVRFX1BFTkRJTkc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgU0hBREVSX1NUQVRFX0tFRVBfRU5BQkxFOlxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkQXR0cmlidXRlTGlzdEluQ29udGV4dFtpXSA9IFNIQURFUl9TVEFURV9QRU5ESU5HO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAvLyBFeHBpcmVkXG4gICAgICAgICAgICAgICAgY2FzZSBTSEFERVJfU1RBVEVfUEVORElORzpcbiAgICAgICAgICAgICAgICAgICAgX2dsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKTtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEF0dHJpYnV0ZUxpc3RJbkNvbnRleHRbaV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhdGlvbkxpc3Q7XG4gICAgfSxcblxuICAgIGJ1aWxkUHJvZ3JhbTogZnVuY3Rpb24gKF9nbCwgc2hhZGVyLCB2ZXJ0ZXhTaGFkZXJDb2RlLCBmcmFnbWVudFNoYWRlckNvZGUpIHtcbiAgICAgICAgdmFyIHZlcnRleFNoYWRlciA9IF9nbC5jcmVhdGVTaGFkZXIoX2dsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgcHJvZ3JhbSA9IF9nbC5jcmVhdGVQcm9ncmFtKCk7XG5cbiAgICAgICAgX2dsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNoYWRlckNvZGUpO1xuICAgICAgICBfZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuXG4gICAgICAgIHZhciBmcmFnbWVudFNoYWRlciA9IF9nbC5jcmVhdGVTaGFkZXIoX2dsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgICAgIF9nbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U2hhZGVyQ29kZSk7XG4gICAgICAgIF9nbC5jb21waWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICB2YXIgbXNnID0gY2hlY2tTaGFkZXJFcnJvck1zZyhfZ2wsIHZlcnRleFNoYWRlciwgdmVydGV4U2hhZGVyQ29kZSk7XG4gICAgICAgIGlmIChtc2cpIHtcbiAgICAgICAgICAgIHJldHVybiBtc2c7XG4gICAgICAgIH1cbiAgICAgICAgbXNnID0gY2hlY2tTaGFkZXJFcnJvck1zZyhfZ2wsIGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlckNvZGUpO1xuICAgICAgICBpZiAobXNnKSB7XG4gICAgICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBfZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgLy8gRm9yY2UgdGhlIHBvc2l0aW9uIGJpbmQgdG8gbG9jYXRpb24gMDtcbiAgICAgICAgaWYgKHNoYWRlci5hdHRyaWJ1dGVTZW1hbnRpY3NbJ1BPU0lUSU9OJ10pIHtcbiAgICAgICAgICAgIF9nbC5iaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgMCwgc2hhZGVyLmF0dHJpYnV0ZVNlbWFudGljc1snUE9TSVRJT04nXS5zeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRWxzZSBjaG9vc2UgYW4gYXR0cmlidXRlIGFuZCBiaW5kIHRvIGxvY2F0aW9uIDA7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICBfZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIDAsIGtleXNbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICghX2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgX2dsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICAgICAgcmV0dXJuICdDb3VsZCBub3QgbGluayBwcm9ncmFtXFxuJyArICdWQUxJREFURV9TVEFUVVM6ICcgKyBfZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBfZ2wuVkFMSURBVEVfU1RBVFVTKSArICcsIGdsIGVycm9yIFsnICsgX2dsLmdldEVycm9yKCkgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB1bmlmb3JtIGxvY2F0aW9uc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNoYWRlci51bmlmb3Jtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHVuaWZvcm1TeW1ib2wgPSBzaGFkZXIudW5pZm9ybXNbaV07XG4gICAgICAgICAgICB0aGlzLl9sb2NhdGlvbnNbdW5pZm9ybVN5bWJvbF0gPSBfZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1TeW1ib2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBfZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTtcblxuICAgICAgICAvLyBTYXZlIGNvZGUuXG4gICAgICAgIHRoaXMudmVydGV4Q29kZSA9IHZlcnRleFNoYWRlckNvZGU7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRDb2RlID0gZnJhZ21lbnRTaGFkZXJDb2RlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBHTFByb2dyYW07IiwiaW1wb3J0IEdMUHJvZ3JhbSBmcm9tICcuL0dMUHJvZ3JhbSc7XG5cbnZhciBsb29wUmVnZXggPSAvZm9yXFxzKj9cXChpbnRcXHMqP19pZHhfXFxzKlxcPVxccyooW1xcdy1dKylcXDtcXHMqX2lkeF9cXHMqPFxccyooW1xcdy1dKyk7XFxzKl9pZHhfXFxzKlxcK1xcK1xccypcXClcXHMqXFx7XFx7KFtcXHNcXFNdKz8pKD89XFx9XFx9KVxcfVxcfS9nO1xuXG5mdW5jdGlvbiB1bnJvbGxMb29wKHNoYWRlclN0ciwgZGVmaW5lcywgbGlnaHRzTnVtYmVycykge1xuICAgIC8vIExvb3AgdW5yb2xsIGZyb20gdGhyZWUuanMsIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvYmxvYi9tYXN0ZXIvc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFByb2dyYW0uanMjTDE3NVxuICAgIC8vIEluIHNvbWUgY2FzZSBsaWtlIHNoYWRvd01hcCBpbiBsb29wIHVzZSAnaScgdG8gaW5kZXggdmFsdWUgbXVjaCBzbG93ZXIuXG5cbiAgICAvLyBMb29wIHVzZSBfaWR4XyBhbmQgaW5jcmVhc2VkIHdpdGggX2lkeF8rKyB3aWxsIGJlIHVucm9sbGVkXG4gICAgLy8gVXNlIHt7IH19IHRvIG1hdGNoIHRoZSBwYWlyIHNvIHRoZSBpZiBzdGF0ZW1lbnQgd2lsbCBub3QgYmUgYWZmZWN0ZWRcbiAgICAvLyBXcml0ZSBsaWtlIGZvbGxvd2luZ1xuICAgIC8vIGZvciAoaW50IF9pZHhfID0gMDsgX2lkeF8gPCA0OyBfaWR4XysrKSB7e1xuICAgIC8vICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZTJEKHRleHR1cmVzW19pZHhfXSwgdXYpLnJnYjtcbiAgICAvLyB9fVxuICAgIGZ1bmN0aW9uIHJlcGxhY2UobWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQpIHtcbiAgICAgICAgdmFyIHVucm9sbCA9ICcnO1xuICAgICAgICAvLyBUcnkgdG8gdHJlYXQgYXMgZGVmaW5lXG4gICAgICAgIGlmIChpc05hTihzdGFydCkpIHtcbiAgICAgICAgICAgIGlmIChzdGFydCBpbiBkZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBkZWZpbmVzW3N0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGlnaHROdW1iZXJEZWZpbmVzW3N0YXJ0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOYU4oZW5kKSkge1xuICAgICAgICAgICAgaWYgKGVuZCBpbiBkZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gZGVmaW5lc1tlbmRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5kID0gbGlnaHROdW1iZXJEZWZpbmVzW2VuZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyBFcnJvciBjaGVja2luZ1xuXG4gICAgICAgIGZvciAodmFyIGlkeCA9IHBhcnNlSW50KHN0YXJ0KTsgaWR4IDwgcGFyc2VJbnQoZW5kKTsgaWR4KyspIHtcbiAgICAgICAgICAgIC8vIFBFTkRJTkcgQWRkIHNjb3BlP1xuICAgICAgICAgICAgdW5yb2xsICs9ICd7J1xuICAgICAgICAgICAgICAgICsgc25pcHBldFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvZmxvYXRcXHMqXFwoXFxzKl9pZHhfXFxzKlxcKS9nLCBpZHgudG9GaXhlZCgxKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL19pZHhfL2csIGlkeClcbiAgICAgICAgICAgICsgJ30nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVucm9sbDtcbiAgICB9XG5cbiAgICB2YXIgbGlnaHROdW1iZXJEZWZpbmVzID0ge307XG4gICAgZm9yICh2YXIgbGlnaHRUeXBlIGluIGxpZ2h0c051bWJlcnMpIHtcbiAgICAgICAgbGlnaHROdW1iZXJEZWZpbmVzW2xpZ2h0VHlwZSArICdfQ09VTlQnXSA9IGxpZ2h0c051bWJlcnNbbGlnaHRUeXBlXTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRlclN0ci5yZXBsYWNlKGxvb3BSZWdleCwgcmVwbGFjZSk7XG59XG5cbmZ1bmN0aW9uIGdldERlZmluZUNvZGUoZGVmaW5lcywgbGlnaHRzTnVtYmVycywgZW5hYmxlZFRleHR1cmVzKSB7XG4gICAgdmFyIGRlZmluZVN0ciA9IFtdO1xuICAgIGlmIChsaWdodHNOdW1iZXJzKSB7XG4gICAgICAgIGZvciAodmFyIGxpZ2h0VHlwZSBpbiBsaWdodHNOdW1iZXJzKSB7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBsaWdodHNOdW1iZXJzW2xpZ2h0VHlwZV07XG4gICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lU3RyLnB1c2goJyNkZWZpbmUgJyArIGxpZ2h0VHlwZS50b1VwcGVyQ2FzZSgpICsgJ19DT1VOVCAnICsgY291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbmFibGVkVGV4dHVyZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmFibGVkVGV4dHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBlbmFibGVkVGV4dHVyZXNbaV07XG4gICAgICAgICAgICBkZWZpbmVTdHIucHVzaCgnI2RlZmluZSAnICsgc3ltYm9sLnRvVXBwZXJDYXNlKCkgKyAnX0VOQUJMRUQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDdXN0b20gRGVmaW5lc1xuICAgIGZvciAodmFyIHN5bWJvbCBpbiBkZWZpbmVzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlZmluZXNbc3ltYm9sXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWZpbmVTdHIucHVzaCgnI2RlZmluZSAnICsgc3ltYm9sKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgZGVmaW5lU3RyLnB1c2goJyNkZWZpbmUgJyArIHN5bWJvbCArICcgJyArIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVTdHIuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldEV4dGVuc2lvbkNvZGUoZXh0cykge1xuICAgIC8vIEV4dGVuc2lvbiBkZWNsYXJhdGlvbiBtdXN0IGJlZm9yZSBhbGwgbm9uLXByZXByb2Nlc3NvciBjb2Rlc1xuICAgIC8vIFRPRE8gdmVydGV4ID8gZXh0ZW5zaW9uIGVudW0gP1xuICAgIHZhciBleHRlbnNpb25TdHIgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXh0ZW5zaW9uU3RyLnB1c2goJyNleHRlbnNpb24gR0xfJyArIGV4dHNbaV0gKyAnIDogZW5hYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25TdHIuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGdldFByZWNpc2lvbkNvZGUocHJlY2lzaW9uKSB7XG4gICAgcmV0dXJuIFsncHJlY2lzaW9uJywgcHJlY2lzaW9uLCAnZmxvYXQnXS5qb2luKCcgJykgKyAnO1xcbidcbiAgICAgICAgKyBbJ3ByZWNpc2lvbicsIHByZWNpc2lvbiwgJ2ludCddLmpvaW4oJyAnKSArICc7XFxuJ1xuICAgICAgICAvLyBkZXB0aCB0ZXh0dXJlIG1heSBoYXZlIHByZWNpc2lvbiBwcm9ibGVtIG9uIGlPUyBkZXZpY2UuXG4gICAgICAgICsgWydwcmVjaXNpb24nLCBwcmVjaXNpb24sICdzYW1wbGVyMkQnXS5qb2luKCcgJykgKyAnO1xcbic7XG59XG5cbmZ1bmN0aW9uIFByb2dyYW1NYW5hZ2VyKHJlbmRlcmVyKSB7XG4gICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICB0aGlzLl9jYWNoZSA9IHt9O1xufVxuXG5Qcm9ncmFtTWFuYWdlci5wcm90b3R5cGUuZ2V0UHJvZ3JhbSA9IGZ1bmN0aW9uIChyZW5kZXJhYmxlLCBtYXRlcmlhbCwgc2NlbmUpIHtcbiAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcblxuICAgIHZhciBrZXkgPSAncycgKyBtYXRlcmlhbC5zaGFkZXIuc2hhZGVySUQgKyAnbScgKyBtYXRlcmlhbC5wcm9ncmFtS2V5O1xuICAgIGlmIChzY2VuZSkge1xuICAgICAgICBrZXkgKz0gJ3NlJyArIHNjZW5lLmdldFByb2dyYW1LZXkocmVuZGVyYWJsZS5saWdodEdyb3VwKTtcbiAgICB9XG4gICAgaWYgKHJlbmRlcmFibGUuaXNTa2lubmVkTWVzaCgpKSB7XG4gICAgICAgIGtleSArPSAnLCcgKyByZW5kZXJhYmxlLmpvaW50cy5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBwcm9ncmFtID0gY2FjaGVba2V5XTtcblxuICAgIGlmIChwcm9ncmFtKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIHZhciBsaWdodHNOdW1iZXJzID0gc2NlbmUgPyBzY2VuZS5nZXRMaWdodHNOdW1iZXJzKHJlbmRlcmFibGUubGlnaHRHcm91cCkgOiB7fTtcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcbiAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgdmFyIGVuYWJsZWRUZXh0dXJlcyA9IG1hdGVyaWFsLmdldEVuYWJsZWRUZXh0dXJlcygpO1xuICAgIHZhciBza2luRGVmaW5lQ29kZSA9ICcnO1xuICAgIGlmIChyZW5kZXJhYmxlLmlzU2tpbm5lZE1lc2goKSkge1xuICAgICAgICAvLyBUT0RPIEFkZCBza2lubmluZyBjb2RlP1xuICAgICAgICBza2luRGVmaW5lQ29kZSA9ICdcXG4nICsgZ2V0RGVmaW5lQ29kZSh7XG4gICAgICAgICAgICBTS0lOTklORzogbnVsbCxcbiAgICAgICAgICAgIEpPSU5UX0NPVU5UOiByZW5kZXJhYmxlLmpvaW50cy5sZW5ndGhcbiAgICAgICAgfSkgKyAnXFxuJztcbiAgICB9XG4gICAgLy8gVE9ETyBPcHRpbWl6ZSBrZXkgZ2VuZXJhdGlvblxuICAgIC8vIFZFUlRFWFxuICAgIHZhciB2ZXJ0ZXhEZWZpbmVTdHIgPSBza2luRGVmaW5lQ29kZSArIGdldERlZmluZUNvZGUobWF0ZXJpYWwudmVydGV4RGVmaW5lcywgbGlnaHRzTnVtYmVycywgZW5hYmxlZFRleHR1cmVzKTtcbiAgICAvLyBGUkFHTUVOVFxuICAgIHZhciBmcmFnbWVudERlZmluZVN0ciA9IHNraW5EZWZpbmVDb2RlICsgZ2V0RGVmaW5lQ29kZShtYXRlcmlhbC5mcmFnbWVudERlZmluZXMsIGxpZ2h0c051bWJlcnMsIGVuYWJsZWRUZXh0dXJlcyk7XG5cbiAgICB2YXIgdmVydGV4Q29kZSA9IHZlcnRleERlZmluZVN0ciArICdcXG4nICsgbWF0ZXJpYWwuc2hhZGVyLnZlcnRleDtcbiAgICB2YXIgZnJhZ21lbnRDb2RlID0gZ2V0RXh0ZW5zaW9uQ29kZShbXG4gICAgICAgICAgICAvLyBUT0RPIE5vdCBoYXJkIGNvZGVkXG4gICAgICAgICAgICAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyxcbiAgICAgICAgICAgICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJ1xuICAgICAgICBdKSArICdcXG4nXG4gICAgICAgICAgICArIGdldFByZWNpc2lvbkNvZGUobWF0ZXJpYWwucHJlY2lzaW9uKSArICdcXG4nXG4gICAgICAgICAgICArIGZyYWdtZW50RGVmaW5lU3RyICsgJ1xcbicgKyBtYXRlcmlhbC5zaGFkZXIuZnJhZ21lbnQ7XG5cbiAgICB2YXIgZmluYWxWZXJ0ZXhDb2RlID0gdW5yb2xsTG9vcCh2ZXJ0ZXhDb2RlLCBtYXRlcmlhbC52ZXJ0ZXhEZWZpbmVzLCBsaWdodHNOdW1iZXJzKTtcbiAgICB2YXIgZmluYWxGcmFnbWVudENvZGUgPSB1bnJvbGxMb29wKGZyYWdtZW50Q29kZSwgbWF0ZXJpYWwuZnJhZ21lbnREZWZpbmVzLCBsaWdodHNOdW1iZXJzKTtcblxuICAgIHZhciBwcm9ncmFtID0gbmV3IEdMUHJvZ3JhbSgpO1xuICAgIHByb2dyYW0udW5pZm9ybVNlbWFudGljcyA9IG1hdGVyaWFsLnNoYWRlci51bmlmb3JtU2VtYW50aWNzO1xuICAgIHByb2dyYW0uYXR0cmlidXRlcyA9IG1hdGVyaWFsLnNoYWRlci5hdHRyaWJ1dGVzO1xuICAgIHZhciBlcnJvck1zZyA9IHByb2dyYW0uYnVpbGRQcm9ncmFtKF9nbCwgbWF0ZXJpYWwuc2hhZGVyLCBmaW5hbFZlcnRleENvZGUsIGZpbmFsRnJhZ21lbnRDb2RlKTtcbiAgICBwcm9ncmFtLl9fZXJyb3IgPSBlcnJvck1zZztcblxuICAgIGNhY2hlW2tleV0gPSBwcm9ncmFtO1xuXG4gICAgcmV0dXJuIHByb2dyYW07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtTWFuYWdlcjsiLCIvKipcbiAqIE1haW5seSBkbyB0aGUgcGFyc2UgYW5kIGNvbXBpbGUgb2Ygc2hhZGVyIHN0cmluZ1xuICogU3VwcG9ydCBzaGFkZXIgY29kZSBjaHVuayBpbXBvcnQgYW5kIGV4cG9ydFxuICogU3VwcG9ydCBzaGFkZXIgc2VtYW50aWNzXG4gKiBodHRwOi8vd3d3Lm52aWRpYS5jb20vb2JqZWN0L3VzaW5nX3Nhcy5odG1sXG4gKiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2NvbGxhZGEyanNvbi9pc3N1ZXMvNDVcbiAqXG4gKiBUT0RPOiBVc2UgZXRwbCBvciBvdGhlciBzdHJpbmcgdGVtcGxhdGUgZW5naW5lXG4gKi9cbmltcG9ydCB1dGlsIGZyb20gJy4vY29yZS91dGlsJztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDIgPSBnbE1hdHJpeC5tYXQyO1xudmFyIG1hdDMgPSBnbE1hdHJpeC5tYXQzO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xuXG52YXIgdW5pZm9ybVJlZ2V4ID0gL3VuaWZvcm1cXHMrKGJvb2x8ZmxvYXR8aW50fHZlYzJ8dmVjM3x2ZWM0fGl2ZWMyfGl2ZWMzfGl2ZWM0fG1hdDJ8bWF0M3xtYXQ0fHNhbXBsZXIyRHxzYW1wbGVyQ3ViZSlcXHMrKFtcXHdcXCxdKyk/KFxcWy4qP1xcXSk/XFxzKig6XFxzKihbXFxTXFxzXSs/KSk/Oy9nO1xudmFyIGF0dHJpYnV0ZVJlZ2V4ID0gL2F0dHJpYnV0ZVxccysoZmxvYXR8aW50fHZlYzJ8dmVjM3x2ZWM0KVxccysoXFx3KilcXHMqKDpcXHMqKFxcdyspKT87L2c7XG52YXIgZGVmaW5lUmVnZXggPSAvI2RlZmluZVxccysoXFx3Kyk/KFxccytbXFx3LS5dKyk/XFxzKjs/XFxzKlxcbi9nO1xuXG52YXIgdW5pZm9ybVR5cGVNYXAgPSB7XG4gICAgJ2Jvb2wnOiAnMWknLFxuICAgICdpbnQnOiAnMWknLFxuICAgICdzYW1wbGVyMkQnOiAndCcsXG4gICAgJ3NhbXBsZXJDdWJlJzogJ3QnLFxuICAgICdmbG9hdCc6ICcxZicsXG4gICAgJ3ZlYzInOiAnMmYnLFxuICAgICd2ZWMzJzogJzNmJyxcbiAgICAndmVjNCc6ICc0ZicsXG4gICAgJ2l2ZWMyJzogJzJpJyxcbiAgICAnaXZlYzMnOiAnM2knLFxuICAgICdpdmVjNCc6ICc0aScsXG4gICAgJ21hdDInOiAnbTInLFxuICAgICdtYXQzJzogJ20zJyxcbiAgICAnbWF0NCc6ICdtNCdcbn07XG5cbnZhciB1bmlmb3JtVmFsdWVDb25zdHJ1Y3RvciA9IHtcbiAgICAnYm9vbCc6IGZ1bmN0aW9uICgpIHtyZXR1cm4gdHJ1ZTt9LFxuICAgICdpbnQnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIDA7fSxcbiAgICAnZmxvYXQnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIDA7fSxcbiAgICAnc2FtcGxlcjJEJzogZnVuY3Rpb24gKCkge3JldHVybiBudWxsO30sXG4gICAgJ3NhbXBsZXJDdWJlJzogZnVuY3Rpb24gKCkge3JldHVybiBudWxsO30sXG5cbiAgICAndmVjMic6IGZ1bmN0aW9uICgpIHtyZXR1cm4gWzAsIDBdO30sXG4gICAgJ3ZlYzMnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIFswLCAwLCAwXTt9LFxuICAgICd2ZWM0JzogZnVuY3Rpb24gKCkge3JldHVybiBbMCwgMCwgMCwgMF07fSxcblxuICAgICdpdmVjMic6IGZ1bmN0aW9uICgpIHtyZXR1cm4gWzAsIDBdO30sXG4gICAgJ2l2ZWMzJzogZnVuY3Rpb24gKCkge3JldHVybiBbMCwgMCwgMF07fSxcbiAgICAnaXZlYzQnOiBmdW5jdGlvbiAoKSB7cmV0dXJuIFswLCAwLCAwLCAwXTt9LFxuXG4gICAgJ21hdDInOiBmdW5jdGlvbiAoKSB7cmV0dXJuIG1hdDIuY3JlYXRlKCk7fSxcbiAgICAnbWF0Myc6IGZ1bmN0aW9uICgpIHtyZXR1cm4gbWF0My5jcmVhdGUoKTt9LFxuICAgICdtYXQ0JzogZnVuY3Rpb24gKCkge3JldHVybiBtYXQ0LmNyZWF0ZSgpO30sXG5cbiAgICAnYXJyYXknOiBmdW5jdGlvbiAoKSB7cmV0dXJuIFtdO31cbn07XG5cbnZhciBhdHRyaWJ1dGVTZW1hbnRpY3MgPSBbXG4gICAgJ1BPU0lUSU9OJyxcbiAgICAnTk9STUFMJyxcbiAgICAnQklOT1JNQUwnLFxuICAgICdUQU5HRU5UJyxcbiAgICAnVEVYQ09PUkQnLFxuICAgICdURVhDT09SRF8wJyxcbiAgICAnVEVYQ09PUkRfMScsXG4gICAgJ0NPTE9SJyxcbiAgICAvLyBTa2lubmluZ1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uL1JFQURNRS5tZCNzZW1hbnRpY3NcbiAgICAnSk9JTlQnLFxuICAgICdXRUlHSFQnXG5dO1xudmFyIHVuaWZvcm1TZW1hbnRpY3MgPSBbXG4gICAgJ1NLSU5fTUFUUklYJyxcbiAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCB2aWV3cG9ydFxuICAgICdWSUVXUE9SVF9TSVpFJyxcbiAgICAnVklFV1BPUlQnLFxuICAgICdERVZJQ0VQSVhFTFJBVElPJyxcbiAgICAvLyBXaW5kb3cgc2l6ZSBmb3Igd2luZG93IHJlbGF0aXZlIGNvb3JkaW5hdGVcbiAgICAvLyBodHRwczovL3d3dy5vcGVuZ2wub3JnL3Nkay9kb2NzL21hbi9odG1sL2dsX0ZyYWdDb29yZC54aHRtbFxuICAgICdXSU5ET1dfU0laRScsXG4gICAgLy8gSW5mb21hdGlvbiBhYm91dCBjYW1lcmFcbiAgICAnTkVBUicsXG4gICAgJ0ZBUicsXG4gICAgLy8gVGltZVxuICAgICdUSU1FJ1xuXTtcbnZhciBtYXRyaXhTZW1hbnRpY3MgPSBbXG4gICAgJ1dPUkxEJyxcbiAgICAnVklFVycsXG4gICAgJ1BST0pFQ1RJT04nLFxuICAgICdXT1JMRFZJRVcnLFxuICAgICdWSUVXUFJPSkVDVElPTicsXG4gICAgJ1dPUkxEVklFV1BST0pFQ1RJT04nLFxuICAgICdXT1JMRElOVkVSU0UnLFxuICAgICdWSUVXSU5WRVJTRScsXG4gICAgJ1BST0pFQ1RJT05JTlZFUlNFJyxcbiAgICAnV09STERWSUVXSU5WRVJTRScsXG4gICAgJ1ZJRVdQUk9KRUNUSU9OSU5WRVJTRScsXG4gICAgJ1dPUkxEVklFV1BST0pFQ1RJT05JTlZFUlNFJyxcbiAgICAnV09STERUUkFOU1BPU0UnLFxuICAgICdWSUVXVFJBTlNQT1NFJyxcbiAgICAnUFJPSkVDVElPTlRSQU5TUE9TRScsXG4gICAgJ1dPUkxEVklFV1RSQU5TUE9TRScsXG4gICAgJ1ZJRVdQUk9KRUNUSU9OVFJBTlNQT1NFJyxcbiAgICAnV09STERWSUVXUFJPSkVDVElPTlRSQU5TUE9TRScsXG4gICAgJ1dPUkxESU5WRVJTRVRSQU5TUE9TRScsXG4gICAgJ1ZJRVdJTlZFUlNFVFJBTlNQT1NFJyxcbiAgICAnUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0UnLFxuICAgICdXT1JMRFZJRVdJTlZFUlNFVFJBTlNQT1NFJyxcbiAgICAnVklFV1BST0pFQ1RJT05JTlZFUlNFVFJBTlNQT1NFJyxcbiAgICAnV09STERWSUVXUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0UnXG5dO1xuXG5cbnZhciBzaGFkZXJJRENhY2hlID0ge307XG52YXIgc2hhZGVyQ29kZUNhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldFNoYWRlcklEKHZlcnRleCwgZnJhZ21lbnQpIHtcbiAgICB2YXIga2V5ID0gJ3ZlcnRleDonICsgdmVydGV4ICsgJ2ZyYWdtZW50OicgKyBmcmFnbWVudDtcbiAgICBpZiAoc2hhZGVySURDYWNoZVtrZXldKSB7XG4gICAgICAgIHJldHVybiBzaGFkZXJJRENhY2hlW2tleV07XG4gICAgfVxuICAgIHZhciBpZCA9IHV0aWwuZ2VuR1VJRCgpO1xuICAgIHNoYWRlcklEQ2FjaGVba2V5XSA9IGlkO1xuXG4gICAgc2hhZGVyQ29kZUNhY2hlW2lkXSA9IHtcbiAgICAgICAgdmVydGV4OiB2ZXJ0ZXgsXG4gICAgICAgIGZyYWdtZW50OiBmcmFnbWVudFxuICAgIH07XG5cbiAgICByZXR1cm4gaWQ7XG59XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICogQGFsaWFzIGNsYXkuU2hhZGVyXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGhvbmcgc2hhZGVyXG4gKiB2YXIgc2hhZGVyID0gbmV3IGNsYXkuU2hhZGVyKFxuICogICAgICBjbGF5LlNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmQudmVydGV4JyksXG4gKiAgICAgIGNsYXkuU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZC5mcmFnbWVudCcpXG4gKiApO1xuICovXG5mdW5jdGlvbiBTaGFkZXIodmVydGV4LCBmcmFnbWVudCkge1xuICAgIC8vIEZpcnN0IGFyZ3VtZW50IGNhbiBiZSB7IHZlcnRleCwgZnJhZ21lbnQgfVxuICAgIGlmICh0eXBlb2YgdmVydGV4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmcmFnbWVudCA9IHZlcnRleC5mcmFnbWVudDtcbiAgICAgICAgdmVydGV4ID0gdmVydGV4LnZlcnRleDtcbiAgICB9XG5cbiAgICB0aGlzLl9zaGFkZXJJRCA9IGdldFNoYWRlcklEKHZlcnRleCwgZnJhZ21lbnQpO1xuXG4gICAgdGhpcy5fdmVydGV4Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydCh2ZXJ0ZXgpO1xuICAgIHRoaXMuX2ZyYWdtZW50Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydChmcmFnbWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmF0dHJpYnV0ZVNlbWFudGljcyA9IHt9O1xuICAgIC8qKlxuICAgICAqIEByZWFkT25seVxuICAgICAqL1xuICAgIHRoaXMubWF0cml4U2VtYW50aWNzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy51bmlmb3JtU2VtYW50aWNzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy5tYXRyaXhTZW1hbnRpY0tleXMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnVuaWZvcm1UZW1wbGF0ZXMgPSB7fTtcbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAvKipcbiAgICAgKiBAcmVhZE9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnRleHR1cmVzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy52ZXJ0ZXhEZWZpbmVzID0ge307XG4gICAgLyoqXG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgdGhpcy5mcmFnbWVudERlZmluZXMgPSB7fTtcblxuICAgIHRoaXMuX3BhcnNlQXR0cmlidXRlcygpO1xuICAgIHRoaXMuX3BhcnNlVW5pZm9ybXMoKTtcbiAgICB0aGlzLl9wYXJzZURlZmluZXMoKTtcbn1cblxuU2hhZGVyLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBTaGFkZXIsXG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdW5pZm9ybSBpbnN0YW5jZSBmb3IgbWF0ZXJpYWxcbiAgICBjcmVhdGVVbmlmb3JtczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdW5pZm9ybXMgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gdGhpcy51bmlmb3JtVGVtcGxhdGVzKXtcbiAgICAgICAgICAgIHZhciB1bmlmb3JtVHBsID0gdGhpcy51bmlmb3JtVGVtcGxhdGVzW3N5bWJvbF07XG4gICAgICAgICAgICB1bmlmb3Jtc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IHVuaWZvcm1UcGwudHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVRwbC52YWx1ZSgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zO1xuICAgIH0sXG5cbiAgICBfcGFyc2VJbXBvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmVydGV4Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydCh0aGlzLnZlcnRleCk7XG4gICAgICAgIHRoaXMuX2ZyYWdtZW50Q29kZSA9IFNoYWRlci5wYXJzZUltcG9ydCh0aGlzLmZyYWdtZW50KTtcbiAgICB9LFxuXG4gICAgX3BhcnNlVW5pZm9ybXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVuaWZvcm1zID0ge307XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHNoYWRlclR5cGUgPSAndmVydGV4JztcbiAgICAgICAgdGhpcy5fdW5pZm9ybUxpc3QgPSBbXTtcblxuICAgICAgICB0aGlzLl92ZXJ0ZXhDb2RlID0gdGhpcy5fdmVydGV4Q29kZS5yZXBsYWNlKHVuaWZvcm1SZWdleCwgX3VuaWZvcm1QYXJzZXIpO1xuICAgICAgICBzaGFkZXJUeXBlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRDb2RlID0gdGhpcy5fZnJhZ21lbnRDb2RlLnJlcGxhY2UodW5pZm9ybVJlZ2V4LCBfdW5pZm9ybVBhcnNlcik7XG5cbiAgICAgICAgc2VsZi5tYXRyaXhTZW1hbnRpY0tleXMgPSBPYmplY3Qua2V5cyh0aGlzLm1hdHJpeFNlbWFudGljcyk7XG5cbiAgICAgICAgZnVuY3Rpb24gX3VuaWZvcm1QYXJzZXIoc3RyLCB0eXBlLCBzeW1ib2wsIGlzQXJyYXksIHNlbWFudGljV3JhcHBlciwgc2VtYW50aWMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlICYmIHN5bWJvbCkge1xuICAgICAgICAgICAgICAgIHZhciB1bmlmb3JtVHlwZSA9IHVuaWZvcm1UeXBlTWFwW3R5cGVdO1xuICAgICAgICAgICAgICAgIHZhciBpc0NvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZUZ1bmM7XG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3VuaWZvcm1MaXN0LnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnIHx8IHR5cGUgPT09ICdzYW1wbGVyQ3ViZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgaXMgZGVmYXVsdCBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0dXJlc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGU6IHNoYWRlclR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybVR5cGUgKz0gJ3YnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZW1hbnRpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGlzIG9ubHkgZm9yIFNLSU5fTUFUUklYXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlU2VtYW50aWNzLmluZGV4T2Yoc2VtYW50aWMpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZVNlbWFudGljc1tzZW1hbnRpY10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB1bmlmb3JtVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25maWd1cmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdHJpeFNlbWFudGljcy5pbmRleE9mKHNlbWFudGljKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzVHJhbnNwb3NlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFudGljTm9UcmFuc3Bvc2UgPSBzZW1hbnRpYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMubWF0Y2goL1RSQU5TUE9TRSQvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zcG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljTm9UcmFuc3Bvc2UgPSBzZW1hbnRpYy5zbGljZSgwLCAtOSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWF0cml4U2VtYW50aWNzW3NlbWFudGljXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHVuaWZvcm1UeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zcG9zZTogaXNUcmFuc3Bvc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljTm9UcmFuc3Bvc2U6IHNlbWFudGljTm9UcmFuc3Bvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtU2VtYW50aWNzLmluZGV4T2Yoc2VtYW50aWMpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVuaWZvcm1TZW1hbnRpY3Nbc2VtYW50aWNdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdW5pZm9ybVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdW5pZm9ybSBpcyBub3QgY29uZmlndXJhYmxlLCB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBhcHBlYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWF0ZXJpYWwgdW5pZm9ybSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbWFudGljID09PSAndW5jb25maWd1cmFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmb3JtIGhhdmUgYSBkZWZhbHV0IHZhbHVlLCBsaWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaWZvcm0gdmVjMyBjb2xvcjogWzEsIDEsIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVGdW5jID0gc2VsZi5fcGFyc2VEZWZhdWx0VmFsdWUodHlwZSwgc2VtYW50aWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmF1bHRWYWx1ZUZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rb3duIHNlbWFudGljIFwiJyArIHNlbWFudGljICsgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hbnRpYyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHVuaWZvcm1UeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpc0FycmF5ID8gdW5pZm9ybVZhbHVlQ29uc3RydWN0b3JbJ2FycmF5J10gOiAoZGVmYXVsdFZhbHVlRnVuYyB8fCB1bmlmb3JtVmFsdWVDb25zdHJ1Y3Rvclt0eXBlXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYW50aWM6IHNlbWFudGljIHx8IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsndW5pZm9ybScsIHR5cGUsIHN5bWJvbCwgaXNBcnJheV0uam9pbignICcpICsgJztcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51bmlmb3JtVGVtcGxhdGVzID0gdW5pZm9ybXM7XG4gICAgfSxcblxuICAgIF9wYXJzZURlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKHR5cGUsIHN0cikge1xuICAgICAgICB2YXIgYXJyYXlSZWdleCA9IC9cXFtcXHMqKC4qKVxccypcXF0vO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZlYzInIHx8IHR5cGUgPT09ICd2ZWMzJyB8fCB0eXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgIHZhciBhcnJheVN0ciA9IGFycmF5UmVnZXguZXhlYyhzdHIpWzFdO1xuICAgICAgICAgICAgaWYgKGFycmF5U3RyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IGFycmF5U3RyLnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHZlbmRvci5GbG9hdDMyQXJyYXkoYXJyKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYm9vbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2ludCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9wYXJzZUF0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl92ZXJ0ZXhDb2RlID0gdGhpcy5fdmVydGV4Q29kZS5yZXBsYWNlKGF0dHJpYnV0ZVJlZ2V4LCBfYXR0cmlidXRlUGFyc2VyKTtcblxuICAgICAgICBmdW5jdGlvbiBfYXR0cmlidXRlUGFyc2VyKHN0ciwgdHlwZSwgc3ltYm9sLCBzZW1hbnRpY1dyYXBwZXIsIHNlbWFudGljKSB7XG4gICAgICAgICAgICBpZiAodHlwZSAmJiBzeW1ib2wpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IDE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZlYzQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndmVjMyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2ZWMyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tzeW1ib2xdID0ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYW4gb25seSBiZSBmbG9hdFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBzaXplLFxuICAgICAgICAgICAgICAgICAgICBzZW1hbnRpYzogc2VtYW50aWMgfHwgbnVsbFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNlbWFudGljcy5pbmRleE9mKHNlbWFudGljKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rb3duIHNlbWFudGljIFwiJyArIHNlbWFudGljICsgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZVNlbWFudGljc1tzZW1hbnRpY10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFsnYXR0cmlidXRlJywgdHlwZSwgc3ltYm9sXS5qb2luKCcgJykgKyAnO1xcbic7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgIH0sXG5cbiAgICBfcGFyc2VEZWZpbmVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHNoYWRlclR5cGUgPSAndmVydGV4JztcbiAgICAgICAgdGhpcy5fdmVydGV4Q29kZSA9IHRoaXMuX3ZlcnRleENvZGUucmVwbGFjZShkZWZpbmVSZWdleCwgX2RlZmluZVBhcnNlcik7XG4gICAgICAgIHNoYWRlclR5cGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB0aGlzLl9mcmFnbWVudENvZGUgPSB0aGlzLl9mcmFnbWVudENvZGUucmVwbGFjZShkZWZpbmVSZWdleCwgX2RlZmluZVBhcnNlcik7XG5cbiAgICAgICAgZnVuY3Rpb24gX2RlZmluZVBhcnNlcihzdHIsIHN5bWJvbCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBkZWZpbmVzID0gc2hhZGVyVHlwZSA9PT0gJ3ZlcnRleCcgPyBzZWxmLnZlcnRleERlZmluZXMgOiBzZWxmLmZyYWdtZW50RGVmaW5lcztcbiAgICAgICAgICAgIGlmICghZGVmaW5lc1tzeW1ib2xdKSB7IC8vIEhhdmVuJ3QgYmVlbiBkZWZpbmVkIGJ5IHVzZXJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzW3N5bWJvbF0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXNbc3ltYm9sXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVzW3N5bWJvbF0gPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY2FuIHBhcnNlIHRvIGZsb2F0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IChpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgPyB2YWx1ZS50cmltKCkgOiBwYXJzZUZsb2F0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgYSBuZXcgc2hhZGVyXG4gICAgICogQHJldHVybiB7Y2xheS5TaGFkZXJ9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvZGUgPSBzaGFkZXJDb2RlQ2FjaGVbdGhpcy5fc2hhZGVySURdO1xuICAgICAgICB2YXIgc2hhZGVyID0gbmV3IFNoYWRlcihjb2RlLnZlcnRleCwgY29kZS5mcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBzaGFkZXI7XG4gICAgfVxufTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTaGFkZXIucHJvdG90eXBlLCAnc2hhZGVySUQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRlcklEO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNoYWRlci5wcm90b3R5cGUsICd2ZXJ0ZXgnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnRleENvZGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2hhZGVyLnByb3RvdHlwZSwgJ2ZyYWdtZW50Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFnbWVudENvZGU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2hhZGVyLnByb3RvdHlwZSwgJ3VuaWZvcm1zJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bmlmb3JtTGlzdDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG52YXIgaW1wb3J0UmVnZXggPSAvKEBpbXBvcnQpXFxzKihbMC05YS16QS1aX1xcLVxcLl0qKS9nO1xuU2hhZGVyLnBhcnNlSW1wb3J0ID0gZnVuY3Rpb24gKHNoYWRlclN0cikge1xuICAgIHNoYWRlclN0ciA9IHNoYWRlclN0ci5yZXBsYWNlKGltcG9ydFJlZ2V4LCBmdW5jdGlvbiAoc3RyLCBpbXBvcnRTeW1ib2wsIGltcG9ydE5hbWUpIHtcbiAgICAgICAgdmFyIHN0ciA9IFNoYWRlci5zb3VyY2UoaW1wb3J0TmFtZSk7XG4gICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlXG4gICAgICAgICAgICByZXR1cm4gU2hhZGVyLnBhcnNlSW1wb3J0KHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTaGFkZXIgY2h1bmsgXCInICsgaW1wb3J0TmFtZSArICdcIiBub3QgZXhpc3RlZCBpbiBsaWJyYXJ5Jyk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2hhZGVyU3RyO1xufTtcblxudmFyIGV4cG9ydFJlZ2V4ID0gLyhAZXhwb3J0KVxccyooWzAtOWEtekEtWl9cXC1cXC5dKilcXHMqXFxuKFtcXHNcXFNdKj8pQGVuZC9nO1xuXG4vKipcbiAqIEltcG9ydCBzaGFkZXIgc291cmNlXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNoYWRlclN0clxuICogQG1lbWJlck9mIGNsYXkuU2hhZGVyXG4gKi9cblNoYWRlclsnaW1wb3J0J10gPSBmdW5jdGlvbiAoc2hhZGVyU3RyKSB7XG4gICAgc2hhZGVyU3RyLnJlcGxhY2UoZXhwb3J0UmVnZXgsIGZ1bmN0aW9uIChzdHIsIGV4cG9ydFN5bWJvbCwgZXhwb3J0TmFtZSwgY29kZSkge1xuICAgICAgICB2YXIgY29kZSA9IGNvZGUucmVwbGFjZSgvKF5bXFxzXFx0XFx4YTBcXHUzMDAwXSspfChbXFx1MzAwMFxceGEwXFxzXFx0XStcXHgyNCkvZywgJycpO1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gZXhwb3J0TmFtZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgdmFyIG9iaiA9IFNoYWRlci5jb2RlcztcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IHBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBwYXJ0c1tpKytdO1xuICAgICAgICAgICAgICAgIGlmICghb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgIG9ialtrZXldID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogTGlicmFyeSB0byBzdG9yZSBhbGwgdGhlIGxvYWRlZCBzaGFkZXIgY29kZXNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcmVhZE9ubHlcbiAqIEBtZW1iZXJPZiBjbGF5LlNoYWRlclxuICovXG5TaGFkZXIuY29kZXMgPSB7fTtcblxuLyoqXG4gKiBHZXQgc2hhZGVyIHNvdXJjZVxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblNoYWRlci5zb3VyY2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICB2YXIgb2JqID0gU2hhZGVyLmNvZGVzO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob2JqICYmIGkgPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHBhcnRzW2krK107XG4gICAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gRklYTUUgVXNlIGRlZmF1bHQgaW5zdGVhZFxuICAgICAgICBjb25zb2xlLmVycm9yKCdTaGFkZXIgXCInICsgbmFtZSArICdcIiBub3QgZXhpc3RlZCBpbiBsaWJyYXJ5Jyk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNoYWRlcjtcbiIsImV4cG9ydCBkZWZhdWx0IFwidmVjMyBjYWxjQW1iaWVudFNITGlnaHQoaW50IGlkeCwgdmVjMyBOKSB7XFxuICAgIGludCBvZmZzZXQgPSA5ICogaWR4O1xcbiAgICByZXR1cm4gYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbMF1cXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbMV0gKiBOLnhcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbMl0gKiBOLnlcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbM10gKiBOLnpcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbNF0gKiBOLnggKiBOLnpcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbNV0gKiBOLnogKiBOLnlcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbNl0gKiBOLnkgKiBOLnhcXG4gICAgICAgICsgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHNbN10gKiAoMy4wICogTi56ICogTi56IC0gMS4wKVxcbiAgICAgICAgKyBhbWJpZW50U0hMaWdodENvZWZmaWNpZW50c1s4XSAqIChOLnggKiBOLnggLSBOLnkgKiBOLnkpO1xcbn1cIjtcbiIsImltcG9ydCBjYWxjQW1iaWVudFNITGlnaHRFc3NsIGZyb20gJy4vY2FsY0FtYmllbnRTSExpZ2h0Lmdsc2wuanMnO1xuXG52YXIgdW5pZm9ybVZlYzNQcmVmaXggPSAndW5pZm9ybSB2ZWMzICc7XG52YXIgdW5pZm9ybUZsb2F0UHJlZml4ID0gJ3VuaWZvcm0gZmxvYXQgJztcbnZhciBleHBvcnRIZWFkZXJQcmVmaXggPSAnQGV4cG9ydCBjbGF5LmhlYWRlci4nO1xudmFyIGV4cG9ydEVuZCA9ICdAZW5kJztcbnZhciB1bmNvbmZpZ3VyYWJsZSA9ICc6dW5jb25maWd1cmFibGU7JztcbmV4cG9ydCBkZWZhdWx0IFtcbiAgICBleHBvcnRIZWFkZXJQcmVmaXggKyAnZGlyZWN0aW9uYWxfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2RpcmVjdGlvbmFsTGlnaHREaXJlY3Rpb25bRElSRUNUSU9OQUxfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2RpcmVjdGlvbmFsTGlnaHRDb2xvcltESVJFQ1RJT05BTF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kLFxuXG4gICAgZXhwb3J0SGVhZGVyUHJlZml4ICsgJ2FtYmllbnRfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2FtYmllbnRMaWdodENvbG9yW0FNQklFTlRfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIGV4cG9ydEVuZCxcblxuICAgIGV4cG9ydEhlYWRlclByZWZpeCArICdhbWJpZW50X3NoX2xpZ2h0JyxcbiAgICB1bmlmb3JtVmVjM1ByZWZpeCArICdhbWJpZW50U0hMaWdodENvbG9yW0FNQklFTlRfU0hfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2FtYmllbnRTSExpZ2h0Q29lZmZpY2llbnRzW0FNQklFTlRfU0hfTElHSFRfQ09VTlQgKiA5XScgKyB1bmNvbmZpZ3VyYWJsZSxcbiAgICBjYWxjQW1iaWVudFNITGlnaHRFc3NsLFxuICAgIGV4cG9ydEVuZCxcblxuICAgIGV4cG9ydEhlYWRlclByZWZpeCArICdhbWJpZW50X2N1YmVtYXBfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ2FtYmllbnRDdWJlbWFwTGlnaHRDb2xvcltBTUJJRU5UX0NVQkVNQVBfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgICd1bmlmb3JtIHNhbXBsZXJDdWJlIGFtYmllbnRDdWJlbWFwTGlnaHRDdWJlbWFwW0FNQklFTlRfQ1VCRU1BUF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgJ3VuaWZvcm0gc2FtcGxlcjJEIGFtYmllbnRDdWJlbWFwTGlnaHRCUkRGTG9va3VwW0FNQklFTlRfQ1VCRU1BUF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kLFxuXG4gICAgZXhwb3J0SGVhZGVyUHJlZml4ICsgJ3BvaW50X2xpZ2h0JyxcbiAgICB1bmlmb3JtVmVjM1ByZWZpeCArICdwb2ludExpZ2h0UG9zaXRpb25bUE9JTlRfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1GbG9hdFByZWZpeCArICdwb2ludExpZ2h0UmFuZ2VbUE9JTlRfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ3BvaW50TGlnaHRDb2xvcltQT0lOVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kLFxuXG4gICAgZXhwb3J0SGVhZGVyUHJlZml4ICsgJ3Nwb3RfbGlnaHQnLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ3Nwb3RMaWdodFBvc2l0aW9uW1NQT1RfTElHSFRfQ09VTlRdJyArIHVuY29uZmlndXJhYmxlLFxuICAgIHVuaWZvcm1WZWMzUHJlZml4ICsgJ3Nwb3RMaWdodERpcmVjdGlvbltTUE9UX0xJR0hUX0NPVU5UXScgKyB1bmNvbmZpZ3VyYWJsZSxcbiAgICB1bmlmb3JtRmxvYXRQcmVmaXggKyAnc3BvdExpZ2h0UmFuZ2VbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybUZsb2F0UHJlZml4ICsgJ3Nwb3RMaWdodFVtYnJhQW5nbGVDb3NpbmVbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybUZsb2F0UHJlZml4ICsgJ3Nwb3RMaWdodFBlbnVtYnJhQW5nbGVDb3NpbmVbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybUZsb2F0UHJlZml4ICsgJ3Nwb3RMaWdodEZhbGxvZmZGYWN0b3JbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgdW5pZm9ybVZlYzNQcmVmaXggKyAnc3BvdExpZ2h0Q29sb3JbU1BPVF9MSUdIVF9DT1VOVF0nICsgdW5jb25maWd1cmFibGUsXG4gICAgZXhwb3J0RW5kXG5dLmpvaW4oJ1xcbicpO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkucHJlei52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG5AaW1wb3J0IGNsYXkuY2h1bmsuc2tpbm5pbmdfaGVhZGVyXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzMgc2tpbm5lZFBvc2l0aW9uID0gcG9zaXRpb247XFxuI2lmZGVmIFNLSU5OSU5HXFxuICAgIEBpbXBvcnQgY2xheS5jaHVuay5za2luX21hdHJpeFxcbiAgICBza2lubmVkUG9zaXRpb24gPSAoc2tpbk1hdHJpeFdTICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5wcmV6LmZyYWdtZW50XFxudm9pZCBtYWluKClcXG57XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcXG59XFxuQGVuZFwiO1xuIiwiLy8gVE9ETyBSZXNvdXJjZXMgbGlrZSBzaGFkZXIsIHRleHR1cmUsIGdlb21ldHJ5IHJlZmVyZW5jZSBtYW5hZ2VtZW50XG4vLyBUcmFjZSBhbmQgZmluZCBvdXQgd2hpY2ggc2hhZGVyLCB0ZXh0dXJlLCBnZW9tZXRyeSBjYW4gYmUgZGVzdHJveWVkXG5pbXBvcnQgQmFzZSBmcm9tICcuL2NvcmUvQmFzZSc7XG5pbXBvcnQgR0xJbmZvIGZyb20gJy4vY29yZS9HTEluZm8nO1xuaW1wb3J0IGdsZW51bSBmcm9tICcuL2NvcmUvZ2xlbnVtJztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi9tYXRoL0JvdW5kaW5nQm94JztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL01hdGVyaWFsJztcbmltcG9ydCBWZWN0b3IyIGZyb20gJy4vbWF0aC9WZWN0b3IyJztcbmltcG9ydCBQcm9ncmFtTWFuYWdlciBmcm9tICcuL2dwdS9Qcm9ncmFtTWFuYWdlcic7XG5cbi8vIExpZ2h0IGhlYWRlclxuaW1wb3J0IFNoYWRlciBmcm9tICcuL1NoYWRlcic7XG5cbmltcG9ydCBsaWdodFNoYWRlciBmcm9tICcuL3NoYWRlci9zb3VyY2UvaGVhZGVyL2xpZ2h0JztcbmltcG9ydCBwcmV6RXNzbCBmcm9tICcuL3NoYWRlci9zb3VyY2UvcHJlei5nbHNsLmpzJztcblNoYWRlclsnaW1wb3J0J10obGlnaHRTaGFkZXIpO1xuU2hhZGVyWydpbXBvcnQnXShwcmV6RXNzbCk7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuL2RlcC9nbG1hdHJpeCc7XG52YXIgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbnZhciBtYXQ0Q3JlYXRlID0gbWF0NC5jcmVhdGU7XG5cbnZhciBlcnJvclNoYWRlciA9IHt9O1xuXG5mdW5jdGlvbiBkZWZhdWx0R2V0TWF0ZXJpYWwocmVuZGVyYWJsZSkge1xuICAgIHJldHVybiByZW5kZXJhYmxlLm1hdGVyaWFsO1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5SZW5kZXJlclxuICovXG52YXIgUmVuZGVyZXIgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5SZW5kZXJlciMgKi8ge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgY2FudmFzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW52YXMgd2lkdGgsIHNldCBieSByZXNpemUgbWV0aG9kXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICBfd2lkdGg6IDEwMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FudmFzIHdpZHRoLCBzZXQgYnkgcmVzaXplIG1ldGhvZFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX2hlaWdodDogMTAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXZpY2UgcGl4ZWwgcmF0aW8sIHNldCBieSBzZXREZXZpY2VQaXhlbFJhdGlvIG1ldGhvZFxuICAgICAgICAgKiBTcGVjaWFsbHkgZm9yIGhpZ2ggZGVmaW5hdGlvbiBkaXNwbGF5XG4gICAgICAgICAqIEBzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy93ZWJnbC93aWtpL0hhbmRsaW5nSGlnaERQSVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMS4wLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDbGVhciBjb2xvclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckNvbG9yOiBbMC4wLCAwLjAsIDAuMCwgMC4wXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmYXVsdDpcbiAgICAgICAgICogICAgIF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQgfCBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckJpdDogMTc2NjQsXG5cbiAgICAgICAgLy8gU2V0dGluZ3Mgd2hlbiBnZXR0aW5nIGNvbnRleHRcbiAgICAgICAgLy8gaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9zcGVjcy9sYXRlc3QvIzIuNFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBlbmFibGUgYWxwaGEsIGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGFscGhhOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgZW5hYmxlIGRlcHRoIGJ1ZmZlciwgZGVmYXVsdCB0cnVlXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwdGg6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBlbmFibGUgc3RlbmNpbCBidWZmZXIsIGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBzdGVuY2lsOiBmYWxzZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZSBhbnRpYWxpYXMsIGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGFudGlhbGlhczogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZSBwcmVtdWx0aXBsaWVkIGFscGhhLCBkZWZhdWx0IHRydWVcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBwcmVzZXJ2ZSBkcmF3aW5nIGJ1ZmZlciwgZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2UsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aHJvdyBjb250ZXh0IGVycm9yLCB1c3VhbGx5IHR1cm5lZCBvbiBpbiBkZWJ1ZyBtb2RlXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhyb3dFcnJvcjogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdlYkdMIENvbnRleHQgY3JlYXRlZCBmcm9tIGdpdmVuIGNhbnZhc1xuICAgICAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fVxuICAgICAgICAgKi9cbiAgICAgICAgZ2w6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW5kZXJlciB2aWV3cG9ydCwgcmVhZC1vbmx5LCBjYW4gYmUgc2V0IGJ5IHNldFZpZXdwb3J0IG1ldGhvZFxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdmlld3BvcnQ6IHt9LFxuXG4gICAgICAgIC8vIFNldCBieSBGcmFtZUJ1ZmZlciNiaW5kXG4gICAgICAgIF9fY3VycmVudEZyYW1lQnVmZmVyOiBudWxsLFxuXG4gICAgICAgIF92aWV3cG9ydFN0YWNrOiBbXSxcbiAgICAgICAgX2NsZWFyU3RhY2s6IFtdLFxuXG4gICAgICAgIF9zY2VuZVJlbmRlcmluZzogbnVsbFxuICAgIH07XG59LCBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgfVxuICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICB0cnkge1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIGFscGhhOiB0aGlzLmFscGhhLFxuICAgICAgICAgICAgZGVwdGg6IHRoaXMuZGVwdGgsXG4gICAgICAgICAgICBzdGVuY2lsOiB0aGlzLnN0ZW5jaWwsXG4gICAgICAgICAgICBhbnRpYWxpYXM6IHRoaXMuYW50aWFsaWFzLFxuICAgICAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhOiB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0cylcbiAgICAgICAgICAgIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBvcHRzKTtcblxuICAgICAgICBpZiAoIXRoaXMuZ2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ2xpbmZvID0gbmV3IEdMSW5mbyh0aGlzLmdsKTtcblxuICAgICAgICBpZiAodGhpcy5nbC50YXJnZXRSZW5kZXJlcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWxyZWFkeSBjcmVhdGVkIGEgcmVuZGVyZXInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLnRhcmdldFJlbmRlcmVyID0gdGhpcztcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgQ29udGV4dCAnICsgZTtcbiAgICB9XG5cbiAgICAvLyBJbml0IG1hbmFnZXJzXG4gICAgdGhpcy5fcHJvZ3JhbU1nciA9IG5ldyBQcm9ncmFtTWFuYWdlcih0aGlzKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuUmVuZGVyZXIucHJvdG90eXBlLiAqKi9cbntcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGNhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAgICAgKi9cbiAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgICAvLyBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3dlYmdsL3dpa2kvSGFuZGxpbmdIaWdoRFBJXG4gICAgICAgIC8vIHNldCB0aGUgZGlzcGxheSBzaXplIG9mIHRoZSBjYW52YXMuXG4gICAgICAgIHZhciBkcHIgPSB0aGlzLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIC8vIHNldCB0aGUgc2l6ZSBvZiB0aGUgZHJhd2luZ0J1ZmZlclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBkcHI7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogZHByO1xuXG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSBjYW52YXMud2lkdGggLyBkcHI7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBjYW52YXMuaGVpZ2h0IC8gZHByO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3cG9ydCgwLCAwLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHJlbmRlcmVyIHdpZHRoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldFdpZHRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHJlbmRlcmVyIGhlaWdodFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHZpZXdwb3J0IGFzcGVjdCxcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0Vmlld3BvcnRBc3BlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICAgICAgcmV0dXJuIHZpZXdwb3J0LndpZHRoIC8gdmlld3BvcnQuaGVpZ2h0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGV2aWNlUGl4ZWxSYXRpb1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgICovXG4gICAgc2V0RGV2aWNlUGl4ZWxSYXRpbzogZnVuY3Rpb24oZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICB0aGlzLmRldmljZVBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnJlc2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGRldmljZVBpeGVsUmF0aW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGV2aWNlUGl4ZWxSYXRpb1xuICAgICAqL1xuICAgIGdldERldmljZVBpeGVsUmF0aW86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IFdlYkdMIGV4dGVuc2lvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAqL1xuICAgIGdldEdMRXh0ZW5zaW9uOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2xpbmZvLmdldEV4dGVuc2lvbihuYW1lKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IFdlYkdMIHBhcmFtZXRlclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7Kn1cbiAgICAgKi9cbiAgICBnZXRHTFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dsaW5mby5nZXRQYXJhbWV0ZXIobmFtZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCByZW5kZXJpbmcgdmlld3BvcnRcbiAgICAgKiBAcGFyYW0ge251bWJlcnxPYmplY3R9IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF1cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF1cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RldmljZVBpeGVsUmF0aW9dXG4gICAgICogICAgICAgIERlZmF1bHRseSB1c2UgdGhlIHJlbmRlcmVyZSBkZXZpY2VQaXhlbFJhdGlvXG4gICAgICogICAgICAgIEl0IG5lZWRzIHRvIGJlIDEgd2hlbiBzZXRWaWV3cG9ydCBpcyBjYWxsZWQgYnkgZnJhbWVCdWZmZXJcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogIHNldFZpZXdwb3J0KDAsMCx3aWR0aCxoZWlnaHQsMSlcbiAgICAgKiAgc2V0Vmlld3BvcnQoe1xuICAgICAqICAgICAgeDogMCxcbiAgICAgKiAgICAgIHk6IDAsXG4gICAgICogICAgICB3aWR0aDogd2lkdGgsXG4gICAgICogICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgKiAgICAgIGRldmljZVBpeGVsUmF0aW86IDFcbiAgICAgKiAgfSlcbiAgICAgKi9cbiAgICBzZXRWaWV3cG9ydDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGRwcikge1xuXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZhciBvYmogPSB4O1xuXG4gICAgICAgICAgICB4ID0gb2JqLng7XG4gICAgICAgICAgICB5ID0gb2JqLnk7XG4gICAgICAgICAgICB3aWR0aCA9IG9iai53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IG9iai5oZWlnaHQ7XG4gICAgICAgICAgICBkcHIgPSBvYmouZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBkcHIgPSBkcHIgfHwgdGhpcy5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoXG4gICAgICAgICAgICB4ICogZHByLCB5ICogZHByLCB3aWR0aCAqIGRwciwgaGVpZ2h0ICogZHByXG4gICAgICAgICk7XG4gICAgICAgIC8vIFVzZSBhIGZyZXNoIG5ldyBvYmplY3QsIG5vdCB3cml0ZSBwcm9wZXJ0eS5cbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiBkcHJcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHVzaCBjdXJyZW50IHZpZXdwb3J0IGludG8gYSBzdGFja1xuICAgICAqL1xuICAgIHNhdmVWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl92aWV3cG9ydFN0YWNrLnB1c2godGhpcy52aWV3cG9ydCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBvcCB2aWV3cG9ydCBmcm9tIHN0YWNrLCByZXN0b3JlIGluIHRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIHJlc3RvcmVWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdmlld3BvcnRTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZpZXdwb3J0KHRoaXMuX3ZpZXdwb3J0U3RhY2sucG9wKCkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFB1c2ggY3VycmVudCBjbGVhciBpbnRvIGEgc3RhY2tcbiAgICAgKi9cbiAgICBzYXZlQ2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIGNsZWFyQml0OiB0aGlzLmNsZWFyQml0LFxuICAgICAgICAgICAgY2xlYXJDb2xvcjogdGhpcy5jbGVhckNvbG9yXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQb3AgY2xlYXIgZnJvbSBzdGFjaywgcmVzdG9yZSBpbiB0aGUgcmVuZGVyZXJcbiAgICAgKi9cbiAgICByZXN0b3JlQ2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsZWFyU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIG9wdCA9IHRoaXMuX2NsZWFyU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ29sb3IgPSBvcHQuY2xlYXJDb2xvcjtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJCaXQgPSBvcHQuY2xlYXJCaXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZFNjZW5lUmVuZGVyaW5nOiBmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgdGhpcy5fc2NlbmVSZW5kZXJpbmcgPSBzY2VuZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIHRoZSBzY2VuZSBpbiBjYW1lcmEgdG8gdGhlIHNjcmVlbiBvciBiaW5kZWQgb2ZmbGluZSBmcmFtZWJ1ZmZlclxuICAgICAqIEBwYXJhbSAge2NsYXkuU2NlbmV9ICAgICAgIHNjZW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5DYW1lcmF9ICAgICAgY2FtZXJhXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgIFtub3RVcGRhdGVTY2VuZV0gSWYgbm90IGNhbGwgdGhlIHNjZW5lLnVwZGF0ZSBtZXRob2RzIGluIHRoZSByZW5kZXJpbmcsIGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICBbcHJlWl0gICAgICAgICAgIElmIHVzZSBwcmVaIG9wdGltaXphdGlvbiwgZGVmYXVsdCBmYWxzZVxuICAgICAqIEByZXR1cm4ge0lSZW5kZXJJbmZvfVxuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24oc2NlbmUsIGNhbWVyYSwgbm90VXBkYXRlU2NlbmUsIHByZVopIHtcbiAgICAgICAgdmFyIF9nbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XG5cbiAgICAgICAgaWYgKHRoaXMuY2xlYXJCaXQpIHtcblxuICAgICAgICAgICAgLy8gTXVzdCBzZXQgZGVwdGggYW5kIGNvbG9yIG1hc2sgdHJ1ZSBiZWZvcmUgY2xlYXJcbiAgICAgICAgICAgIF9nbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBfZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICAgICAgdmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICAgICAgICAgIHZhciBuZWVkc1NjaXNzb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciB2aWV3cG9ydERwciA9IHZpZXdwb3J0LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICBpZiAodmlld3BvcnQud2lkdGggIT09IHRoaXMuX3dpZHRoIHx8IHZpZXdwb3J0LmhlaWdodCAhPT0gdGhpcy5faGVpZ2h0XG4gICAgICAgICAgICAgICAgfHwgKHZpZXdwb3J0RHByICYmIHZpZXdwb3J0RHByICE9PSB0aGlzLmRldmljZVBpeGVsUmF0aW8pXG4gICAgICAgICAgICAgICAgfHwgdmlld3BvcnQueCB8fCB2aWV3cG9ydC55XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBuZWVkc1NjaXNzb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTE1NDQ2MDgvaG93LXRvLWNsZWFyLWEtcmVjdGFuZ2xlLWFyZWEtaW4td2ViZ2xcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgICAgIF9nbC5lbmFibGUoX2dsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgICAgICAgICAgX2dsLnNjaXNzb3Iodmlld3BvcnQueCAqIHZpZXdwb3J0RHByLCB2aWV3cG9ydC55ICogdmlld3BvcnREcHIsIHZpZXdwb3J0LndpZHRoICogdmlld3BvcnREcHIsIHZpZXdwb3J0LmhlaWdodCAqIHZpZXdwb3J0RHByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9nbC5jbGVhckNvbG9yKGNsZWFyQ29sb3JbMF0sIGNsZWFyQ29sb3JbMV0sIGNsZWFyQ29sb3JbMl0sIGNsZWFyQ29sb3JbM10pO1xuICAgICAgICAgICAgX2dsLmNsZWFyKHRoaXMuY2xlYXJCaXQpO1xuICAgICAgICAgICAgaWYgKG5lZWRzU2Npc3Nvcikge1xuICAgICAgICAgICAgICAgIF9nbC5kaXNhYmxlKF9nbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHNjZW5lIGhhdmUgYmVlbiB1cGRhdGVkIGluIHRoZSBwcmVwYXNzIGxpa2Ugc2hhZG93IG1hcFxuICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSBpdCBhZ2FpblxuICAgICAgICBpZiAoIW5vdFVwZGF0ZVNjZW5lKSB7XG4gICAgICAgICAgICBzY2VuZS51cGRhdGUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhbWVyYSA9IGNhbWVyYSB8fCBzY2VuZS5nZXRNYWluQ2FtZXJhKCk7XG4gICAgICAgIGlmICghY2FtZXJhKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW5cXCd0IGZpbmQgY2FtZXJhIGluIHRoZSBzY2VuZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgaWYgY2FtZXJhIG5vdCBtb3VudGVkIG9uIHRoZSBzY2VuZVxuICAgICAgICBpZiAoIWNhbWVyYS5nZXRTY2VuZSgpKSB7XG4gICAgICAgICAgICBjYW1lcmEudXBkYXRlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2NlbmVSZW5kZXJpbmcgPSBzY2VuZTtcblxuICAgICAgICAvLyBSZXNldCB0aGUgc2NlbmUgYm91bmRpbmcgYm94O1xuICAgICAgICBzY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWUubWluLnNldChJbmZpbml0eSwgSW5maW5pdHksIEluZmluaXR5KTtcbiAgICAgICAgc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLm1heC5zZXQoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSk7XG5cbiAgICAgICAgdmFyIG9wYXF1ZUxpc3QgPSB0aGlzLmN1bGxSZW5kZXJMaXN0KHNjZW5lLm9wYXF1ZUxpc3QsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB2YXIgdHJhbnNwYXJlbnRMaXN0ID0gdGhpcy5jdWxsUmVuZGVyTGlzdChzY2VuZS50cmFuc3BhcmVudExpc3QsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB2YXIgc2NlbmVNYXRlcmlhbCA9IHNjZW5lLm1hdGVyaWFsO1xuXG4gICAgICAgIHNjZW5lLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcicsIHRoaXMsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgICAgIC8vIFJlbmRlciBwcmUgelxuICAgICAgICBpZiAocHJlWikge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJQcmVaKG9wYXF1ZUxpc3QsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICAgICAgX2dsLmRlcHRoRnVuYyhfZ2wuTEVRVUFMKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9nbC5kZXB0aEZ1bmMoX2dsLkxFU1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBkZXB0aCBvZiB0cmFuc3BhcmVudCBsaXN0LlxuICAgICAgICB2YXIgd29ybGRWaWV3TWF0ID0gbWF0NENyZWF0ZSgpO1xuICAgICAgICB2YXIgcG9zVmlld1NwYWNlID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc3BhcmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gdHJhbnNwYXJlbnRMaXN0W2ldO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseUFmZmluZSh3b3JsZFZpZXdNYXQsIGNhbWVyYS52aWV3TWF0cml4LmFycmF5LCByZW5kZXJhYmxlLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NChwb3NWaWV3U3BhY2UsIHJlbmRlcmFibGUucG9zaXRpb24uYXJyYXksIHdvcmxkVmlld01hdCk7XG4gICAgICAgICAgICByZW5kZXJhYmxlLl9fZGVwdGggPSBwb3NWaWV3U3BhY2VbMl07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW5kZXIgb3BhcXVlIGxpc3RcbiAgICAgICAgc2NlbmUudHJpZ2dlcignYmVmb3JlcmVuZGVyOm9wYXF1ZScsIHRoaXMsIG9wYXF1ZUxpc3QpO1xuICAgICAgICB2YXIgb3BhcXVlUmVuZGVySW5mbyA9IHRoaXMucmVuZGVyUGFzcyhvcGFxdWVMaXN0LCBjYW1lcmEsIHtcbiAgICAgICAgICAgIGdldE1hdGVyaWFsOiBmdW5jdGlvbiAocmVuZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2VuZU1hdGVyaWFsIHx8IHJlbmRlcmFibGUubWF0ZXJpYWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydENvbXBhcmU6IHRoaXMub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2NlbmUudHJpZ2dlcignYWZ0ZXJyZW5kZXI6b3BhcXVlJywgdGhpcywgb3BhcXVlTGlzdCwgb3BhcXVlUmVuZGVySW5mbyk7XG4gICAgICAgIHNjZW5lLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcjp0cmFuc3BhcmVudCcsIHRoaXMsIHRyYW5zcGFyZW50TGlzdCk7XG5cbiAgICAgICAgdmFyIHRyYW5zcGFyZW50UmVuZGVySW5mbyA9IHRoaXMucmVuZGVyUGFzcyh0cmFuc3BhcmVudExpc3QsIGNhbWVyYSwge1xuICAgICAgICAgICAgZ2V0TWF0ZXJpYWw6IGZ1bmN0aW9uIChyZW5kZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjZW5lTWF0ZXJpYWwgfHwgcmVuZGVyYWJsZS5tYXRlcmlhbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3J0Q29tcGFyZTogdGhpcy50cmFuc3BhcmVudFNvcnRDb21wYXJlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNjZW5lLnRyaWdnZXIoJ2FmdGVycmVuZGVyOnRyYW5zcGFyZW50JywgdGhpcywgdHJhbnNwYXJlbnRMaXN0LCB0cmFuc3BhcmVudFJlbmRlckluZm8pO1xuICAgICAgICB2YXIgcmVuZGVySW5mbyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIG9wYXF1ZVJlbmRlckluZm8pIHtcbiAgICAgICAgICAgIHJlbmRlckluZm9bbmFtZV0gPSBvcGFxdWVSZW5kZXJJbmZvW25hbWVdICsgdHJhbnNwYXJlbnRSZW5kZXJJbmZvW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NlbmUudHJpZ2dlcignYWZ0ZXJyZW5kZXInLCB0aGlzLCBzY2VuZSwgY2FtZXJhLCByZW5kZXJJbmZvKTtcblxuICAgICAgICAvLyBDbGVhbnVwXG4gICAgICAgIHRoaXMuX3NjZW5lUmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJlbmRlckluZm87XG4gICAgfSxcblxuICAgIGdldFByb2dyYW06IGZ1bmN0aW9uIChyZW5kZXJhYmxlLCByZW5kZXJNYXRlcmlhbCwgc2NlbmUpIHtcbiAgICAgICAgcmVuZGVyTWF0ZXJpYWwgPSByZW5kZXJNYXRlcmlhbCB8fCByZW5kZXJhYmxlLm1hdGVyaWFsO1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbU1nci5nZXRQcm9ncmFtKHJlbmRlcmFibGUsIHJlbmRlck1hdGVyaWFsLCBzY2VuZSk7XG4gICAgfSxcblxuICAgIHZhbGlkYXRlUHJvZ3JhbTogZnVuY3Rpb24gKHByb2dyYW0pIHtcbiAgICAgICAgaWYgKHByb2dyYW0uX19lcnJvcikge1xuICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gcHJvZ3JhbS5fX2Vycm9yO1xuICAgICAgICAgICAgaWYgKGVycm9yU2hhZGVyW3Byb2dyYW0uX191aWRfX10pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcnJvclNoYWRlcltwcm9ncmFtLl9fdWlkX19dID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudGhyb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgZXJyb3JNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgdXBkYXRlUHJvZ3JhbXM6IGZ1bmN0aW9uIChsaXN0LCBzY2VuZSwgcGFzc0NvbmZpZykge1xuICAgICAgICB2YXIgZ2V0TWF0ZXJpYWwgPSAocGFzc0NvbmZpZyAmJiBwYXNzQ29uZmlnLmdldE1hdGVyaWFsKSB8fCBkZWZhdWx0R2V0TWF0ZXJpYWw7XG4gICAgICAgIHNjZW5lID0gc2NlbmUgfHwgbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyYWJsZSA9IGxpc3RbaV07XG4gICAgICAgICAgICB2YXIgcmVuZGVyTWF0ZXJpYWwgPSBnZXRNYXRlcmlhbC5jYWxsKHRoaXMsIHJlbmRlcmFibGUpO1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZSZW5kZXJhYmxlID0gbGlzdFtpIC0gMV07XG4gICAgICAgICAgICAgICAgdmFyIHByZXZKb2ludHNMZW4gPSBwcmV2UmVuZGVyYWJsZS5qb2ludHMgPyBwcmV2UmVuZGVyYWJsZS5qb2ludHMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnRzTGVuID0gcmVuZGVyYWJsZS5qb2ludHMubGVuZ3RoID8gcmVuZGVyYWJsZS5qb2ludHMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAvLyBLZWVwIHByb2dyYW0gbm90IGNoYW5nZSBpZiBqb2ludHMsIG1hdGVyaWFsLCBsaWdodEdyb3VwIGFyZSBzYW1lIG9mIHR3byByZW5kZXJhYmxlcy5cbiAgICAgICAgICAgICAgICBpZiAoam9pbnRzTGVuID09PSBwcmV2Sm9pbnRzTGVuXG4gICAgICAgICAgICAgICAgICAgICYmIHJlbmRlcmFibGUubWF0ZXJpYWwgPT09IHByZXZSZW5kZXJhYmxlLm1hdGVyaWFsXG4gICAgICAgICAgICAgICAgICAgICYmIHJlbmRlcmFibGUubGlnaHRHcm91cCA9PT0gcHJldlJlbmRlcmFibGUubGlnaHRHcm91cFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJhYmxlLl9fcHJvZ3JhbSA9IHByZXZSZW5kZXJhYmxlLl9fcHJvZ3JhbTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcHJvZ3JhbSA9IHRoaXMuX3Byb2dyYW1NZ3IuZ2V0UHJvZ3JhbShyZW5kZXJhYmxlLCByZW5kZXJNYXRlcmlhbCwgc2NlbmUpO1xuXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgICAgICAgICAgcmVuZGVyYWJsZS5fX3Byb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERvIGZydXN0dW0gY3VsbGluZyBvbiByZW5kZXIgbGlzdFxuICAgICAqL1xuICAgIGN1bGxSZW5kZXJMaXN0OiBmdW5jdGlvbiAobGlzdCwgc2NlbmUsIGNhbWVyYSkge1xuICAgICAgICB2YXIgY3VsbGVkUmVuZGVyTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gbGlzdFtpXTtcblxuICAgICAgICAgICAgdmFyIHdvcmxkTSA9IHJlbmRlcmFibGUuaXNTa2lubmVkTWVzaCgpID8gbWF0cmljZXMuSURFTlRJVFkgOiByZW5kZXJhYmxlLndvcmxkVHJhbnNmb3JtLmFycmF5O1xuICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gcmVuZGVyYWJsZS5nZW9tZXRyeTtcblxuICAgICAgICAgICAgbWF0NC5tdWx0aXBseUFmZmluZShtYXRyaWNlcy5XT1JMRFZJRVcsIGNhbWVyYS52aWV3TWF0cml4LmFycmF5ICwgd29ybGRNKTtcbiAgICAgICAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ0JveCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRnJ1c3R1bUN1bGxlZChcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyYWJsZSwgc2NlbmUsIGNhbWVyYSwgbWF0cmljZXMuV09STERWSUVXLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5hcnJheVxuICAgICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdWxsZWRSZW5kZXJMaXN0LnB1c2gocmVuZGVyYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VsbGVkUmVuZGVyTGlzdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc2luZ2xlIHJlbmRlcmFibGUgbGlzdCBpbiBjYW1lcmEgaW4gc2VxdWVuY2VcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyYWJsZVtdfSBsaXN0IExpc3Qgb2YgYWxsIHJlbmRlcmFibGVzLlxuICAgICAqIEBwYXJhbSB7Y2xheS5DYW1lcmF9IGNhbWVyYVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFzc0NvbmZpZ11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGFzc0NvbmZpZy5nZXRNYXRlcmlhbF0gR2V0IHJlbmRlcmFibGUgbWF0ZXJpYWwuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Bhc3NDb25maWcuYmVmb3JlUmVuZGVyXSBCZWZvcmUgcmVuZGVyIGVhY2ggcmVuZGVyYWJsZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcGFzc0NvbmZpZy5hZnRlclJlbmRlcl0gQWZ0ZXIgcmVuZGVyIGVhY2ggcmVuZGVyYWJsZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwYXNzQ29uZmlnLmlmUmVuZGVyXSBJZiByZW5kZXIgdGhlIHJlbmRlcmFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Bhc3NDb25maWcuc29ydENvbXBhcmVdIFNvcnQgY29tcGFyZSBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtJUmVuZGVySW5mb31cbiAgICAgKi9cbiAgICByZW5kZXJQYXNzOiBmdW5jdGlvbihsaXN0LCBjYW1lcmEsIHBhc3NDb25maWcpIHtcbiAgICAgICAgdmFyIHJlbmRlckluZm8gPSB7XG4gICAgICAgICAgICB0cmlhbmdsZUNvdW50OiAwLFxuICAgICAgICAgICAgdmVydGV4Q291bnQ6IDAsXG4gICAgICAgICAgICBkcmF3Q2FsbENvdW50OiAwLFxuICAgICAgICAgICAgbWVzaENvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICAgICAgICAgIHJlbmRlcmVkTWVzaENvdW50OiAwXG4gICAgICAgIH07XG4gICAgICAgIHBhc3NDb25maWcgPSBwYXNzQ29uZmlnIHx8IHt9O1xuICAgICAgICBwYXNzQ29uZmlnLmdldE1hdGVyaWFsID0gcGFzc0NvbmZpZy5nZXRNYXRlcmlhbCB8fCBkZWZhdWx0R2V0TWF0ZXJpYWw7XG4gICAgICAgIHBhc3NDb25maWcuYmVmb3JlUmVuZGVyID0gcGFzc0NvbmZpZy5iZWZvcmVSZW5kZXIgfHwgbm9vcDtcbiAgICAgICAgcGFzc0NvbmZpZy5hZnRlclJlbmRlciA9IHBhc3NDb25maWcuYWZ0ZXJSZW5kZXIgfHwgbm9vcDtcblxuICAgICAgICB0aGlzLnVwZGF0ZVByb2dyYW1zKGxpc3QsIHRoaXMuX3NjZW5lUmVuZGVyaW5nLCBwYXNzQ29uZmlnKTtcbiAgICAgICAgaWYgKHBhc3NDb25maWcuc29ydENvbXBhcmUpIHtcbiAgICAgICAgICAgIGxpc3Quc29ydChwYXNzQ29uZmlnLnNvcnRDb21wYXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvbWUgY29tbW9uIGJ1aWx0aW4gdW5pZm9ybXNcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydDtcbiAgICAgICAgdmFyIHZEcHIgPSB2aWV3cG9ydC5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB2YXIgdmlld3BvcnRVbmlmb3JtID0gW1xuICAgICAgICAgICAgdmlld3BvcnQueCAqIHZEcHIsIHZpZXdwb3J0LnkgKiB2RHByLFxuICAgICAgICAgICAgdmlld3BvcnQud2lkdGggKiB2RHByLCB2aWV3cG9ydC5oZWlnaHQgKiB2RHByXG4gICAgICAgIF07XG4gICAgICAgIHZhciB3aW5kb3dEcHIgPSB0aGlzLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHZhciB3aW5kb3dTaXplVW5pZm9ybSA9IHRoaXMuX19jdXJyZW50RnJhbWVCdWZmZXJcbiAgICAgICAgICAgID8gW3RoaXMuX19jdXJyZW50RnJhbWVCdWZmZXIuZ2V0VGV4dHVyZVdpZHRoKCksIHRoaXMuX19jdXJyZW50RnJhbWVCdWZmZXIuZ2V0VGV4dHVyZUhlaWdodCgpXVxuICAgICAgICAgICAgOiBbdGhpcy5fd2lkdGggKiB3aW5kb3dEcHIsIHRoaXMuX2hlaWdodCAqIHdpbmRvd0Rwcl07XG4gICAgICAgIC8vIERFUFJFQ0FURURcbiAgICAgICAgdmFyIHZpZXdwb3J0U2l6ZVVuaWZvcm0gPSBbXG4gICAgICAgICAgICB2aWV3cG9ydFVuaWZvcm1bMl0sIHZpZXdwb3J0VW5pZm9ybVszXVxuICAgICAgICBdO1xuICAgICAgICB2YXIgdGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQuY29weShtYXRyaWNlcy5WSUVXLCBjYW1lcmEudmlld01hdHJpeC5hcnJheSk7XG4gICAgICAgIG1hdDQuY29weShtYXRyaWNlcy5QUk9KRUNUSU9OLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5hcnJheSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMuVklFV1BST0pFQ1RJT04sIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmFycmF5LCBtYXRyaWNlcy5WSUVXKTtcbiAgICAgICAgbWF0NC5jb3B5KG1hdHJpY2VzLlZJRVdJTlZFUlNFLCBjYW1lcmEud29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICBtYXQ0LmludmVydChtYXRyaWNlcy5QUk9KRUNUSU9OSU5WRVJTRSwgbWF0cmljZXMuUFJPSkVDVElPTik7XG4gICAgICAgIG1hdDQuaW52ZXJ0KG1hdHJpY2VzLlZJRVdQUk9KRUNUSU9OSU5WRVJTRSwgbWF0cmljZXMuVklFV1BST0pFQ1RJT04pO1xuXG4gICAgICAgIHZhciBfZ2wgPSB0aGlzLmdsO1xuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLl9zY2VuZVJlbmRlcmluZztcblxuICAgICAgICB2YXIgcHJldk1hdGVyaWFsO1xuICAgICAgICB2YXIgcHJldlByb2dyYW07XG5cbiAgICAgICAgLy8gU3RhdHVzXG4gICAgICAgIHZhciBkZXB0aFRlc3QsIGRlcHRoTWFzaztcbiAgICAgICAgdmFyIGN1bGxpbmcsIGN1bGxGYWNlLCBmcm9udEZhY2U7XG4gICAgICAgIHZhciB0cmFuc3BhcmVudDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gbGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChwYXNzQ29uZmlnLmlmUmVuZGVyICYmICFwYXNzQ29uZmlnLmlmUmVuZGVyKHJlbmRlcmFibGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraW5uZWQgbWVzaCB3aWxsIHRyYW5zZm9ybWVkIHRvIGpvaW50IHNwYWNlLiBJZ25vcmUgdGhlIG1lc2ggdHJhbnNmb3JtXG4gICAgICAgICAgICB2YXIgd29ybGRNID0gcmVuZGVyYWJsZS5pc1NraW5uZWRNZXNoKCkgPyBtYXRyaWNlcy5JREVOVElUWSA6IHJlbmRlcmFibGUud29ybGRUcmFuc2Zvcm0uYXJyYXk7XG5cbiAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IHBhc3NDb25maWcuZ2V0TWF0ZXJpYWwuY2FsbCh0aGlzLCByZW5kZXJhYmxlKTtcblxuICAgICAgICAgICAgdmFyIHByb2dyYW0gPSByZW5kZXJhYmxlLl9fcHJvZ3JhbTtcbiAgICAgICAgICAgIHZhciBzaGFkZXIgPSBtYXRlcmlhbC5zaGFkZXI7XG5cbiAgICAgICAgICAgIG1hdDQuY29weShtYXRyaWNlcy5XT1JMRCwgd29ybGRNKTtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMuV09STERWSUVXUFJPSkVDVElPTiwgbWF0cmljZXMuVklFV1BST0pFQ1RJT04gLCB3b3JsZE0pO1xuICAgICAgICAgICAgaWYgKHNoYWRlci5tYXRyaXhTZW1hbnRpY3MuV09STERJTlZFUlNFIHx8XG4gICAgICAgICAgICAgICAgc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRElOVkVSU0VUUkFOU1BPU0UpIHtcbiAgICAgICAgICAgICAgICBtYXQ0LmludmVydChtYXRyaWNlcy5XT1JMRElOVkVSU0UsIHdvcmxkTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRFZJRVdJTlZFUlNFIHx8XG4gICAgICAgICAgICAgICAgc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRFZJRVdJTlZFUlNFVFJBTlNQT1NFKSB7XG4gICAgICAgICAgICAgICAgbWF0NC5pbnZlcnQobWF0cmljZXMuV09STERWSUVXSU5WRVJTRSwgbWF0cmljZXMuV09STERWSUVXKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaGFkZXIubWF0cml4U2VtYW50aWNzLldPUkxEVklFV1BST0pFQ1RJT05JTlZFUlNFIHx8XG4gICAgICAgICAgICAgICAgc2hhZGVyLm1hdHJpeFNlbWFudGljcy5XT1JMRFZJRVdQUk9KRUNUSU9OSU5WRVJTRVRSQU5TUE9TRSkge1xuICAgICAgICAgICAgICAgIG1hdDQuaW52ZXJ0KG1hdHJpY2VzLldPUkxEVklFV1BST0pFQ1RJT05JTlZFUlNFLCBtYXRyaWNlcy5XT1JMRFZJRVdQUk9KRUNUSU9OKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmVmb3JlIHJlbmRlciBob29rXG4gICAgICAgICAgICByZW5kZXJhYmxlLmJlZm9yZVJlbmRlcih0aGlzKTtcbiAgICAgICAgICAgIHBhc3NDb25maWcuYmVmb3JlUmVuZGVyLmNhbGwodGhpcywgcmVuZGVyYWJsZSwgbWF0ZXJpYWwsIHByZXZNYXRlcmlhbCk7XG5cbiAgICAgICAgICAgIHZhciBwcm9ncmFtQ2hhbmdlZCA9IHByb2dyYW0gIT09IHByZXZQcm9ncmFtO1xuICAgICAgICAgICAgaWYgKHByb2dyYW1DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IGxpZ2h0cyBudW1iZXJcbiAgICAgICAgICAgICAgICBwcm9ncmFtLmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHNvbWUgY29tbW9uIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdWSUVXUE9SVCcsIHZpZXdwb3J0VW5pZm9ybSk7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdXSU5ET1dfU0laRScsIHdpbmRvd1NpemVVbmlmb3JtKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ05FQVInLCBjYW1lcmEubmVhcik7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdGQVInLCBjYW1lcmEuZmFyKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ0RFVklDRVBJWEVMUkFUSU8nLCB2RHByKTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ1RJTUUnLCB0aW1lKTtcbiAgICAgICAgICAgICAgICAvLyBERVBSRUNBVEVEXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhfZ2wsICdWSUVXUE9SVF9TSVpFJywgdmlld3BvcnRTaXplVW5pZm9ybSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgbGlnaHRzIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBuZWVkcyBvcHRpbWl6ZWRcbiAgICAgICAgICAgICAgICBpZiAoc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUuc2V0TGlnaHRVbmlmb3Jtcyhwcm9ncmFtLCByZW5kZXJhYmxlLmxpZ2h0R3JvdXAsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSBwcmV2UHJvZ3JhbTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvZ3JhbSBjaGFuZ2VzIGFsc28gbmVlZHMgcmVzZXQgdGhlIG1hdGVyaWFscy5cbiAgICAgICAgICAgIGlmIChwcmV2TWF0ZXJpYWwgIT09IG1hdGVyaWFsIHx8IHByb2dyYW1DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLmRlcHRoVGVzdCAhPT0gZGVwdGhUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoVGVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfZ2wuZW5hYmxlKF9nbC5ERVBUSF9URVNUKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZ2wuZGlzYWJsZShfZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoVGVzdCA9IG1hdGVyaWFsLmRlcHRoVGVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLmRlcHRoTWFzayAhPT0gZGVwdGhNYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIF9nbC5kZXB0aE1hc2sobWF0ZXJpYWwuZGVwdGhNYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGhNYXNrID0gbWF0ZXJpYWwuZGVwdGhNYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF0ZXJpYWwudHJhbnNwYXJlbnQgIT09IHRyYW5zcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IF9nbC5lbmFibGUoX2dsLkJMRU5EKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZ2wuZGlzYWJsZShfZ2wuQkxFTkQpO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudCA9IG1hdGVyaWFsLnRyYW5zcGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUT0RPIGNhY2hlIGJsZW5kaW5nXG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLnRyYW5zcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRlcmlhbC5ibGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuYmxlbmQoX2dsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgYmxlbmQgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF9nbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoX2dsLkZVTkNfQURELCBfZ2wuRlVOQ19BREQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2dsLmJsZW5kRnVuY1NlcGFyYXRlKF9nbC5TUkNfQUxQSEEsIF9nbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBfZ2wuT05FLCBfZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5iaW5kKHRoaXMsIHByb2dyYW0sIHByZXZNYXRlcmlhbCwgcHJldlByb2dyYW0pO1xuICAgICAgICAgICAgICAgIHByZXZNYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbWF0cml4U2VtYW50aWNLZXlzID0gc2hhZGVyLm1hdHJpeFNlbWFudGljS2V5cztcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWF0cml4U2VtYW50aWNLZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbWFudGljID0gbWF0cml4U2VtYW50aWNLZXlzW2tdO1xuICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpY0luZm8gPSBzaGFkZXIubWF0cml4U2VtYW50aWNzW3NlbWFudGljXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0cml4ID0gbWF0cmljZXNbc2VtYW50aWNdO1xuICAgICAgICAgICAgICAgIGlmIChzZW1hbnRpY0luZm8uaXNUcmFuc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdHJpeE5vVHJhbnNwb3NlID0gbWF0cmljZXNbc2VtYW50aWNJbmZvLnNlbWFudGljTm9UcmFuc3Bvc2VdO1xuICAgICAgICAgICAgICAgICAgICBtYXQ0LnRyYW5zcG9zZShtYXRyaXgsIG1hdHJpeE5vVHJhbnNwb3NlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKF9nbCwgc2VtYW50aWNJbmZvLnR5cGUsIHNlbWFudGljSW5mby5zeW1ib2wsIG1hdHJpeCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJhYmxlLmN1bGxGYWNlICE9PSBjdWxsRmFjZSkge1xuICAgICAgICAgICAgICAgIGN1bGxGYWNlID0gcmVuZGVyYWJsZS5jdWxsRmFjZTtcbiAgICAgICAgICAgICAgICBfZ2wuY3VsbEZhY2UoY3VsbEZhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlbmRlcmFibGUuZnJvbnRGYWNlICE9PSBmcm9udEZhY2UpIHtcbiAgICAgICAgICAgICAgICBmcm9udEZhY2UgPSByZW5kZXJhYmxlLmZyb250RmFjZTtcbiAgICAgICAgICAgICAgICBfZ2wuZnJvbnRGYWNlKGZyb250RmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVuZGVyYWJsZS5jdWxsaW5nICE9PSBjdWxsaW5nKSB7XG4gICAgICAgICAgICAgICAgY3VsbGluZyA9IHJlbmRlcmFibGUuY3VsbGluZztcbiAgICAgICAgICAgICAgICBjdWxsaW5nID8gX2dsLmVuYWJsZShfZ2wuQ1VMTF9GQUNFKSA6IF9nbC5kaXNhYmxlKF9nbC5DVUxMX0ZBQ0UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb2JqZWN0UmVuZGVySW5mbyA9IHJlbmRlcmFibGUucmVuZGVyKHRoaXMsIG1hdGVyaWFsLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgaWYgKG9iamVjdFJlbmRlckluZm8pIHtcbiAgICAgICAgICAgICAgICByZW5kZXJJbmZvLnRyaWFuZ2xlQ291bnQgKz0gb2JqZWN0UmVuZGVySW5mby50cmlhbmdsZUNvdW50O1xuICAgICAgICAgICAgICAgIHJlbmRlckluZm8udmVydGV4Q291bnQgKz0gb2JqZWN0UmVuZGVySW5mby52ZXJ0ZXhDb3VudDtcbiAgICAgICAgICAgICAgICByZW5kZXJJbmZvLmRyYXdDYWxsQ291bnQgKz0gb2JqZWN0UmVuZGVySW5mby5kcmF3Q2FsbENvdW50O1xuICAgICAgICAgICAgICAgIHJlbmRlckluZm8ucmVuZGVyZWRNZXNoQ291bnQgKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFmdGVyIHJlbmRlciBob29rXG4gICAgICAgICAgICBwYXNzQ29uZmlnLmFmdGVyUmVuZGVyLmNhbGwodGhpcywgcmVuZGVyYWJsZSwgb2JqZWN0UmVuZGVySW5mbyk7XG4gICAgICAgICAgICByZW5kZXJhYmxlLmFmdGVyUmVuZGVyKHRoaXMsIG9iamVjdFJlbmRlckluZm8pO1xuXG4gICAgICAgICAgICBwcmV2UHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgcHJvZ3JhbXMgaW5jYXNlIGl0J3Mgbm90IHVwZGF0ZWQgaW4gdGhlIG90aGVyIHBhc3Nlcy5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsaXN0W2ldLl9fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVySW5mbztcbiAgICB9LFxuXG4gICAgcmVuZGVyUHJlWjogZnVuY3Rpb24gKGxpc3QsIHNjZW5lLCBjYW1lcmEpIHtcbiAgICAgICAgdmFyIF9nbCA9IHRoaXMuZ2w7XG4gICAgICAgIHZhciBwcmVaUGFzc01hdGVyaWFsID0gdGhpcy5fcHJlek1hdGVyaWFsIHx8IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5wcmV6LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnByZXouZnJhZ21lbnQnKSlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3ByZXpNYXRlcmlhbCA9IHByZVpQYXNzTWF0ZXJpYWw7XG5cbiAgICAgICAgX2dsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIF9nbC5kZXB0aE1hc2sodHJ1ZSk7XG5cbiAgICAgICAgLy8gU3RhdHVzXG4gICAgICAgIHRoaXMucmVuZGVyUGFzcyhsaXN0LCBjYW1lcmEsIHtcbiAgICAgICAgICAgIGlmUmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhcmVuZGVyYWJsZS5pZ25vcmVQcmVaO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZVpQYXNzTWF0ZXJpYWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydDogdGhpcy5vcGFxdWVTb3J0Q29tcGFyZVxuICAgICAgICB9KTtcblxuICAgICAgICBfZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICBfZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJZiBhbiBzY2VuZSBvYmplY3QgaXMgY3VsbGVkIGJ5IGNhbWVyYSBmcnVzdHVtXG4gICAgICpcbiAgICAgKiBPYmplY3QgY2FuIGJlIGEgcmVuZGVyYWJsZSBvciBhIGxpZ2h0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2NsYXkuTm9kZX0gU2NlbmUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtjbGF5LkNhbWVyYX0gY2FtZXJhXG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gd29ybGRWaWV3TWF0IHJlcHJlc2VudGVkIHdpdGggYXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBwcm9qZWN0aW9uTWF0IHJlcHJlc2VudGVkIHdpdGggYXJyYXlcbiAgICAgKi9cbiAgICBpc0ZydXN0dW1DdWxsZWQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEZydXN0dW0gY3VsbGluZ1xuICAgICAgICAvLyBodHRwOi8vd3d3LmNzZS5jaGFsbWVycy5zZS9+dWZmZS92ZmNfYmJveC5wZGZcbiAgICAgICAgdmFyIGN1bGxpbmdCb3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB2YXIgY3VsbGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBzY2VuZSwgY2FtZXJhLCB3b3JsZFZpZXdNYXQsIHByb2plY3Rpb25NYXQpIHtcbiAgICAgICAgICAgIC8vIEJvdW5kaW5nIGJveCBjYW4gYmUgYSBwcm9wZXJ0eSBvZiBvYmplY3QobGlrZSBsaWdodCkgb3IgcmVuZGVyYWJsZS5nZW9tZXRyeVxuICAgICAgICAgICAgdmFyIGdlb0JCb3ggPSBvYmplY3QuYm91bmRpbmdCb3ggfHwgb2JqZWN0Lmdlb21ldHJ5LmJvdW5kaW5nQm94O1xuICAgICAgICAgICAgY3VsbGluZ01hdHJpeC5hcnJheSA9IHdvcmxkVmlld01hdDtcbiAgICAgICAgICAgIGN1bGxpbmdCb3VuZGluZ0JveC5jb3B5KGdlb0JCb3gpO1xuICAgICAgICAgICAgY3VsbGluZ0JvdW5kaW5nQm94LmFwcGx5VHJhbnNmb3JtKGN1bGxpbmdNYXRyaXgpO1xuXG4gICAgICAgICAgICAvLyBQYXNzaW5nbHkgdXBkYXRlIHRoZSBzY2VuZSBib3VuZGluZyBib3hcbiAgICAgICAgICAgIC8vIEZJWE1FIGV4Y2x1ZGUgdmVyeSBsYXJnZSBtZXNoIGxpa2UgZ3JvdW5kIHBsYW5lIG9yIHRlcnJhaW4gP1xuICAgICAgICAgICAgLy8gRklYTUUgT25seSByZW5kZXJlcmFibGUgd2hpY2ggY2FzdCBzaGFkb3cgP1xuXG4gICAgICAgICAgICAvLyBGSVhNRSBib3VuZGluZ0JveCBiZWNvbWVzIG11Y2ggbGFyZ2VyIGFmdGVyIHRyYW5zZm9ybWQuXG4gICAgICAgICAgICBpZiAoc2NlbmUgJiYgb2JqZWN0LmlzUmVuZGVyYWJsZSgpICYmIG9iamVjdC5jYXN0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLnVuaW9uKGN1bGxpbmdCb3VuZGluZ0JveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZ25vcmUgZnJ1c3R1bSBjdWxsaW5nIGlmIG9iamVjdCBpcyBza2lubmVkIG1lc2guXG4gICAgICAgICAgICBpZiAob2JqZWN0LmZydXN0dW1DdWxsaW5nICYmICFvYmplY3QuaXNTa2lubmVkTWVzaCgpKSAge1xuICAgICAgICAgICAgICAgIGlmICghY3VsbGluZ0JvdW5kaW5nQm94LmludGVyc2VjdEJvdW5kaW5nQm94KGNhbWVyYS5mcnVzdHVtLmJvdW5kaW5nQm94KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdWxsaW5nTWF0cml4LmFycmF5ID0gcHJvamVjdGlvbk1hdDtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGN1bGxpbmdCb3VuZGluZ0JveC5tYXguYXJyYXlbMl0gPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIGN1bGxpbmdCb3VuZGluZ0JveC5taW4uYXJyYXlbMl0gPCAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaXAgaW4gdGhlIG5lYXIgcGxhbmVcbiAgICAgICAgICAgICAgICAgICAgY3VsbGluZ0JvdW5kaW5nQm94Lm1heC5hcnJheVsyXSA9IC0xZS0yMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdWxsaW5nQm91bmRpbmdCb3guYXBwbHlQcm9qZWN0aW9uKGN1bGxpbmdNYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1pbiA9IGN1bGxpbmdCb3VuZGluZ0JveC5taW4uYXJyYXk7XG4gICAgICAgICAgICAgICAgdmFyIG1heCA9IGN1bGxpbmdCb3VuZGluZ0JveC5tYXguYXJyYXk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1heFswXSA8IC0xIHx8IG1pblswXSA+IDFcbiAgICAgICAgICAgICAgICAgICAgfHwgbWF4WzFdIDwgLTEgfHwgbWluWzFdID4gMVxuICAgICAgICAgICAgICAgICAgICB8fCBtYXhbMl0gPCAtMSB8fCBtaW5bMl0gPiAxXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGdpdmVuIHNjZW5lLCBpbmNsdWRpbmcgYWxsIGdlb21ldHJpcywgdGV4dHVyZXMgYW5kIHNoYWRlcnMgaW4gdGhlIHNjZW5lXG4gICAgICogQHBhcmFtIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqL1xuICAgIGRpc3Bvc2VTY2VuZTogZnVuY3Rpb24oc2NlbmUpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlTm9kZShzY2VuZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHNjZW5lLmRpc3Bvc2UoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBnaXZlbiBub2RlLCBpbmNsdWRpbmcgYWxsIGdlb21ldHJpZXMsIHRleHR1cmVzIGFuZCBzaGFkZXJzIGF0dGFjaGVkIG9uIGl0IG9yIGl0cyBkZXNjZW5kYW50XG4gICAgICogQHBhcmFtIHtjbGF5Lk5vZGV9IG5vZGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkaXNwb3NlR2VvbWV0cnk9ZmFsc2VdIElmIGRpc3Bvc2UgdGhlIGdlb21ldHJpZXMgdXNlZCBpbiB0aGUgZGVzY2VuZGFudCBtZXNoXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGlzcG9zZVRleHR1cmU9ZmFsc2VdIElmIGRpc3Bvc2UgdGhlIHRleHR1cmVzIHVzZWQgaW4gdGhlIGRlc2NlbmRhbnQgbWVzaFxuICAgICAqL1xuICAgIGRpc3Bvc2VOb2RlOiBmdW5jdGlvbihyb290LCBkaXNwb3NlR2VvbWV0cnksIGRpc3Bvc2VUZXh0dXJlKSB7XG4gICAgICAgIC8vIERldHRhY2hlZCBmcm9tIHBhcmVudFxuICAgICAgICBpZiAocm9vdC5nZXRQYXJlbnQoKSkge1xuICAgICAgICAgICAgcm9vdC5nZXRQYXJlbnQoKS5yZW1vdmUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC50cmF2ZXJzZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5nZW9tZXRyeSAmJiBkaXNwb3NlR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBub2RlLmdlb21ldHJ5LmRpc3Bvc2UodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQYXJ0aWNsZSBzeXN0ZW0gYW5kIEFtYmllbnRDdWJlbWFwIGxpZ2h0IG5lZWQgdG8gZGlzcG9zZVxuICAgICAgICAgICAgaWYgKG5vZGUuZGlzcG9zZSkge1xuICAgICAgICAgICAgICAgIG5vZGUuZGlzcG9zZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2UgZ2l2ZW4gZ2VvbWV0cnlcbiAgICAgKiBAcGFyYW0ge2NsYXkuR2VvbWV0cnl9IGdlb21ldHJ5XG4gICAgICovXG4gICAgZGlzcG9zZUdlb21ldHJ5OiBmdW5jdGlvbihnZW9tZXRyeSkge1xuICAgICAgICBnZW9tZXRyeS5kaXNwb3NlKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGdpdmVuIHRleHR1cmVcbiAgICAgKiBAcGFyYW0ge2NsYXkuVGV4dHVyZX0gdGV4dHVyZVxuICAgICAqL1xuICAgIGRpc3Bvc2VUZXh0dXJlOiBmdW5jdGlvbih0ZXh0dXJlKSB7XG4gICAgICAgIHRleHR1cmUuZGlzcG9zZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBnaXZlbiBmcmFtZSBidWZmZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkuRnJhbWVCdWZmZXJ9IGZyYW1lQnVmZmVyXG4gICAgICovXG4gICAgZGlzcG9zZUZyYW1lQnVmZmVyOiBmdW5jdGlvbihmcmFtZUJ1ZmZlcikge1xuICAgICAgICBmcmFtZUJ1ZmZlci5kaXNwb3NlKHRoaXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHNjcmVlbiBjb29yZHMgdG8gbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZXMoTkRDKVxuICAgICAqIFNjcmVlbiBjb29yZHMgY2FuIGdldCBmcm9tIG1vdXNlIGV2ZW50LCBpdCBpcyBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIGNhbnZhcyBlbGVtZW50XG4gICAgICogTkRDIGNhbiBiZSB1c2VkIGluIHJheSBjYXN0aW5nIHdpdGggQ2FtZXJhLnByb3RvdHlwZS5jYXN0UmF5IG1ldGhvZHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gICAgICAgeFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gICAgICAgeVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IyfVxuICAgICAqL1xuICAgIHNjcmVlblRvTkRDOiBmdW5jdGlvbih4LCB5LCBvdXQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW52ZXJ0IHk7XG4gICAgICAgIHkgPSB0aGlzLl9oZWlnaHQgLSB5O1xuXG4gICAgICAgIHZhciB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQ7XG4gICAgICAgIHZhciBhcnIgPSBvdXQuYXJyYXk7XG4gICAgICAgIGFyclswXSA9ICh4IC0gdmlld3BvcnQueCkgLyB2aWV3cG9ydC53aWR0aDtcbiAgICAgICAgYXJyWzBdID0gYXJyWzBdICogMiAtIDE7XG4gICAgICAgIGFyclsxXSA9ICh5IC0gdmlld3BvcnQueSkgLyB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgIGFyclsxXSA9IGFyclsxXSAqIDIgLSAxO1xuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufSk7XG5cbi8qKlxuICogT3BhcXVlIHJlbmRlcmFibGVzIGNvbXBhcmUgZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkuUmVuZGVyYWJsZX0geFxuICogQHBhcmFtICB7Y2xheS5SZW5kZXJhYmxlfSB5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHN0YXRpY1xuICovXG5SZW5kZXJlci5vcGFxdWVTb3J0Q29tcGFyZSA9IFJlbmRlcmVyLnByb3RvdHlwZS5vcGFxdWVTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAvLyBQcmlvcml0eSByZW5kZXJPcmRlciAtPiBwcm9ncmFtIC0+IG1hdGVyaWFsIC0+IGdlb21ldHJ5XG4gICAgaWYgKHgucmVuZGVyT3JkZXIgPT09IHkucmVuZGVyT3JkZXIpIHtcbiAgICAgICAgaWYgKHguX19wcm9ncmFtID09PSB5Ll9fcHJvZ3JhbSkge1xuICAgICAgICAgICAgaWYgKHgubWF0ZXJpYWwgPT09IHkubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC5nZW9tZXRyeS5fX3VpZF9fIC0geS5nZW9tZXRyeS5fX3VpZF9fO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHgubWF0ZXJpYWwuX191aWRfXyAtIHkubWF0ZXJpYWwuX191aWRfXztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeC5fX3Byb2dyYW0gICYmIHkuX19wcm9ncmFtKSB7XG4gICAgICAgICAgICByZXR1cm4geC5fX3Byb2dyYW0uX191aWRfXyAtIHkuX19wcm9ncmFtLl9fdWlkX187XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB4LnJlbmRlck9yZGVyIC0geS5yZW5kZXJPcmRlcjtcbn07XG5cbi8qKlxuICogVHJhbnNwYXJlbnQgcmVuZGVyYWJsZXMgY29tcGFyZSBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5SZW5kZXJhYmxlfSBhXG4gKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmFibGV9IGJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAc3RhdGljXG4gKi9cblJlbmRlcmVyLnRyYW5zcGFyZW50U29ydENvbXBhcmUgPSBSZW5kZXJlci5wcm90b3R5cGUudHJhbnNwYXJlbnRTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAvLyBQcmlvcml0eSByZW5kZXJPcmRlciAtPiBkZXB0aCAtPiBwcm9ncmFtIC0+IG1hdGVyaWFsIC0+IGdlb21ldHJ5XG5cbiAgICBpZiAoeC5yZW5kZXJPcmRlciA9PT0geS5yZW5kZXJPcmRlcikge1xuICAgICAgICBpZiAoeC5fX2RlcHRoID09PSB5Ll9fZGVwdGgpIHtcbiAgICAgICAgICAgIGlmICh4Ll9fcHJvZ3JhbSA9PT0geS5fX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoeC5tYXRlcmlhbCA9PT0geS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5nZW9tZXRyeS5fX3VpZF9fIC0geS5nZW9tZXRyeS5fX3VpZF9fO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geC5tYXRlcmlhbC5fX3VpZF9fIC0geS5tYXRlcmlhbC5fX3VpZF9fO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHguX19wcm9ncmFtICAmJiB5Ll9fcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB4Ll9fcHJvZ3JhbS5fX3VpZF9fIC0geS5fX3Byb2dyYW0uX191aWRfXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlcHRoIGlzIG5lZ2F0aXZlXG4gICAgICAgIC8vIFNvIGZhcnRoZXIgb2JqZWN0IGhhcyBzbWFsbGVyIGRlcHRoIHZhbHVlXG4gICAgICAgIHJldHVybiB4Ll9fZGVwdGggLSB5Ll9fZGVwdGg7XG4gICAgfVxuICAgIHJldHVybiB4LnJlbmRlck9yZGVyIC0geS5yZW5kZXJPcmRlcjtcbn07XG5cbi8vIFRlbXBvcmFyeSB2YXJpYWJsZXNcbnZhciBtYXRyaWNlcyA9IHtcbiAgICBJREVOVElUWTogbWF0NENyZWF0ZSgpLFxuXG4gICAgV09STEQ6IG1hdDRDcmVhdGUoKSxcbiAgICBWSUVXOiBtYXQ0Q3JlYXRlKCksXG4gICAgUFJPSkVDVElPTjogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxEVklFVzogbWF0NENyZWF0ZSgpLFxuICAgIFZJRVdQUk9KRUNUSU9OOiBtYXQ0Q3JlYXRlKCksXG4gICAgV09STERWSUVXUFJPSkVDVElPTjogbWF0NENyZWF0ZSgpLFxuXG4gICAgV09STERJTlZFUlNFOiBtYXQ0Q3JlYXRlKCksXG4gICAgVklFV0lOVkVSU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBQUk9KRUNUSU9OSU5WRVJTRTogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxEVklFV0lOVkVSU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBWSUVXUFJPSkVDVElPTklOVkVSU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBXT1JMRFZJRVdQUk9KRUNUSU9OSU5WRVJTRTogbWF0NENyZWF0ZSgpLFxuXG4gICAgV09STERUUkFOU1BPU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBWSUVXVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgUFJPSkVDVElPTlRSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxEVklFV1RSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFZJRVdQUk9KRUNUSU9OVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgV09STERWSUVXUFJPSkVDVElPTlRSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFdPUkxESU5WRVJTRVRSQU5TUE9TRTogbWF0NENyZWF0ZSgpLFxuICAgIFZJRVdJTlZFUlNFVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0U6IG1hdDRDcmVhdGUoKSxcbiAgICBXT1JMRFZJRVdJTlZFUlNFVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgVklFV1BST0pFQ1RJT05JTlZFUlNFVFJBTlNQT1NFOiBtYXQ0Q3JlYXRlKCksXG4gICAgV09STERWSUVXUFJPSkVDVElPTklOVkVSU0VUUkFOU1BPU0U6IG1hdDRDcmVhdGUoKVxufTtcblxuLyoqXG4gKiBAbmFtZSBjbGF5LlJlbmRlcmVyLkNPTE9SX0JVRkZFUl9CSVRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmVyLkNPTE9SX0JVRkZFUl9CSVQgPSBnbGVudW0uQ09MT1JfQlVGRkVSX0JJVDtcbi8qKlxuICogQG5hbWUgY2xheS5SZW5kZXJlci5ERVBUSF9CVUZGRVJfQklUXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJlci5ERVBUSF9CVUZGRVJfQklUID0gZ2xlbnVtLkRFUFRIX0JVRkZFUl9CSVQ7XG4vKipcbiAqIEBuYW1lIGNsYXkuUmVuZGVyZXIuU1RFTkNJTF9CVUZGRVJfQklUXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJlci5TVEVOQ0lMX0JVRkZFUl9CSVQgPSBnbGVudW0uU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlcjtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5RdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge251bWJlcn0geFxuICogQHBhcmFtIHtudW1iZXJ9IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB6XG4gKiBAcGFyYW0ge251bWJlcn0gd1xuICovXG52YXIgUXVhdGVybmlvbiA9IGZ1bmN0aW9uICh4LCB5LCB6LCB3KSB7XG5cbiAgICB4ID0geCB8fCAwO1xuICAgIHkgPSB5IHx8IDA7XG4gICAgeiA9IHogfHwgMDtcbiAgICB3ID0gdyA9PT0gdW5kZWZpbmVkID8gMSA6IHc7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIFF1YXRlcm5pb24sIHJlYWQgYW5kIHdyaXRlIG9mIHgsIHksIHosIHcgd2lsbCBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhcnJheVxuICAgICAqIEFsbCBtZXRob2RzIGFsc28gb3BlcmF0ZSBvbiB0aGUgYXJyYXkgaW5zdGVhZCBvZiB4LCB5LCB6LCB3IGNvbXBvbmVudHNcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5RdWF0ZXJuaW9uI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBxdWF0LmZyb21WYWx1ZXMoeCwgeSwgeiwgdyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXJ0eSBmbGFnIGlzIHVzZWQgYnkgdGhlIE5vZGUgdG8gZGV0ZXJtaW5lXG4gICAgICogaWYgdGhlIG1hdHJpeCBpcyB1cGRhdGVkIHRvIGxhdGVzdFxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguUXVhdGVybmlvbiNcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGIgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAoYikge1xuICAgICAgICBxdWF0LmFkZCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSB3IGNvbXBvbmVudCBmcm9tIHgsIHksIHogY29tcG9uZW50XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgY2FsY3VsYXRlVzogZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWF0LmNhbGN1bGF0ZVcodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB4LCB5IGFuZCB6IGNvbXBvbmVudHNcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgeVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHpcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB3XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbiAoeCwgeSwgeiwgdykge1xuICAgICAgICB0aGlzLmFycmF5WzBdID0geDtcbiAgICAgICAgdGhpcy5hcnJheVsxXSA9IHk7XG4gICAgICAgIHRoaXMuYXJyYXlbMl0gPSB6O1xuICAgICAgICB0aGlzLmFycmF5WzNdID0gdztcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHgsIHksIHogYW5kIHcgY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICB0aGlzLmFycmF5WzBdID0gYXJyWzBdO1xuICAgICAgICB0aGlzLmFycmF5WzFdID0gYXJyWzFdO1xuICAgICAgICB0aGlzLmFycmF5WzJdID0gYXJyWzJdO1xuICAgICAgICB0aGlzLmFycmF5WzNdID0gYXJyWzNdO1xuXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IFF1YXRlcm5pb25cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1YXRlcm5pb24odGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIHNlbGYgSWYgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIGludmVydCBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgY29uanVnYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHF1YXQuY29uanVnYXRlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGZyb20gYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgY29weTogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgcXVhdC5jb3B5KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEb3QgcHJvZHVjdCBvZiBzZWxmIGFuZCBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZG90OiBmdW5jdGlvbiAoYikge1xuICAgICAgICByZXR1cm4gcXVhdC5kb3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBmcm9tTWF0MzogZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgcXVhdC5mcm9tTWF0Myh0aGlzLmFycmF5LCBtLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGZyb20gdGhlIGdpdmVuIDR4NCByb3RhdGlvbiBtYXRyaXhcbiAgICAgKiBUaGUgNHRoIGNvbHVtbiBhbmQgNHRoIHJvdyB3aWxsIGJlIGRyb3BlZFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBtXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgZnJvbU1hdDQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXQzID0gZ2xNYXRyaXgubWF0MztcbiAgICAgICAgdmFyIG0zID0gbWF0My5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICBtYXQzLmZyb21NYXQ0KG0zLCBtLmFycmF5KTtcbiAgICAgICAgICAgIC8vIFRPRE8gTm90IGxpa2UgbWF0NCwgbWF0MyBpbiBnbG1hdHJpeCBzZWVtcyB0byBiZSByb3ctYmFzZWRcbiAgICAgICAgICAgIG1hdDMudHJhbnNwb3NlKG0zLCBtMyk7XG4gICAgICAgICAgICBxdWF0LmZyb21NYXQzKHRoaXMuYXJyYXksIG0zKTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gaWRlbnRpdHkgcXVhdGVybmlvblxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHF1YXQuaWRlbnRpdHkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBJbnZlcnQgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIGludmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWF0LmludmVydCh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHF1YXQubGVuKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW5ndGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHF1YXQubGVuZ3RoKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIGxlcnA6IGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIHF1YXQubGVycCh0aGlzLmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11bHRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHF1YXQubXVsKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgbXVsdGlwbHlMZWZ0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICBtdWxMZWZ0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBxdWF0Lm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNdXRpcGx5IHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIG11bHRpcGx5OiBmdW5jdGlvbiAoYikge1xuICAgICAgICBxdWF0Lm11bHRpcGx5KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNdXRpcGx5IGEgYW5kIHNlbGZcbiAgICAgKiBRdWF0ZXJuaW9uIG11dGlwbHkgaXMgbm90IGNvbW11dGF0aXZlLCBzbyB0aGUgcmVzdWx0IG9mIG11dGlwbHlMZWZ0IGlzIGRpZmZlcmVudCB3aXRoIG11bHRpcGx5LlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgbXVsdGlwbHlMZWZ0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBxdWF0Lm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgc2VsZlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWF0Lm5vcm1hbGl6ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHNlbGYgYnkgYSBnaXZlbiByYWRpYW4gYWJvdXQgWCBheGlzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICAgICAqL1xuICAgIHJvdGF0ZVg6IGZ1bmN0aW9uIChyYWQpIHtcbiAgICAgICAgcXVhdC5yb3RhdGVYKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBzZWxmIGJ5IGEgZ2l2ZW4gcmFkaWFuIGFib3V0IFkgYXhpc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICByb3RhdGVZOiBmdW5jdGlvbiAocmFkKSB7XG4gICAgICAgIHF1YXQucm90YXRlWSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCByYWQpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSBhIGdpdmVuIHJhZGlhbiBhYm91dCBaIGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgcm90YXRlWjogZnVuY3Rpb24gKHJhZCkge1xuICAgICAgICBxdWF0LnJvdGF0ZVoodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBzZWxmIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBWZWN0b3IzIGEgdG8gVmVjdG9yMyBiLlxuICAgICAqIGEgYW5kIGIgbmVlZHMgdG8gYmUgbm9ybWFsaXplZFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICByb3RhdGlvblRvOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBxdWF0LnJvdGF0aW9uVG8odGhpcy5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXRzIHNlbGYgd2l0aCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXhlc1xuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHZpZXdcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSByaWdodFxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHVwXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2V0QXhlczogZnVuY3Rpb24gKHZpZXcsIHJpZ2h0LCB1cCkge1xuICAgICAgICBxdWF0LnNldEF4ZXModGhpcy5hcnJheSwgdmlldy5hcnJheSwgcmlnaHQuYXJyYXksIHVwLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyBzZWxmIHdpdGggYSByb3RhdGlvbiBheGlzIGFuZCByb3RhdGlvbiBhbmdsZVxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2V0QXhpc0FuZ2xlOiBmdW5jdGlvbiAoYXhpcywgcmFkKSB7XG4gICAgICAgIHF1YXQuc2V0QXhpc0FuZ2xlKHRoaXMuYXJyYXksIGF4aXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGEgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gICAgICovXG4gICAgc2xlcnA6IGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIHF1YXQuc2xlcnAodGhpcy5hcnJheSwgYS5hcnJheSwgYi5hcnJheSwgdCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzcXVhcmVkTGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcXVhdC5zcXJMZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNxdWFyZWQgbGVuZ3RoIG9mIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3F1YXJlZExlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcXVhdC5zcXVhcmVkTGVuZ3RoKHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgZnJvbSBldWxlclxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHZcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3JkZXJcbiAgICAgKi9cbiAgICBmcm9tRXVsZXI6IGZ1bmN0aW9uICh2LCBvcmRlcikge1xuICAgICAgICByZXR1cm4gUXVhdGVybmlvbi5mcm9tRXVsZXIodGhpcywgdiwgb3JkZXIpO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ1snICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbCh0aGlzLmFycmF5LCAnLCcpICsgJ10nO1xuICAgIH0sXG5cbiAgICB0b0FycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KTtcbiAgICB9XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBHZXR0ZXIgYW5kIFNldHRlclxuaWYgKGRlZmluZVByb3BlcnR5KSB7XG5cbiAgICB2YXIgcHJvdG8gPSBRdWF0ZXJuaW9uLnByb3RvdHlwZTtcbiAgICAvKipcbiAgICAgKiBAbmFtZSB4XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlF1YXRlcm5pb25cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3gnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbMF07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzBdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguUXVhdGVybmlvblxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbMV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgelxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5RdWF0ZXJuaW9uXG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd6Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzJdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVsyXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSB3XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlF1YXRlcm5pb25cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3cnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbM107XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzNdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLy8gU3VwcGx5IG1ldGhvZHMgdGhhdCBhcmUgbm90IGluIHBsYWNlXG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5hZGQgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgcXVhdC5hZGQob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB5XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB6XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICB3XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5zZXQgPSBmdW5jdGlvbiAob3V0LCB4LCB5LCB6LCB3KSB7XG4gICAgcXVhdC5zZXQob3V0LmFycmF5LCB4LCB5LCB6LCB3KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmNvcHkgPSBmdW5jdGlvbiAob3V0LCBiKSB7XG4gICAgcXVhdC5jb3B5KG91dC5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmNhbGN1bGF0ZVcgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgcXVhdC5jYWxjdWxhdGVXKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBxdWF0LmNvbmp1Z2F0ZShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLmlkZW50aXR5ID0gZnVuY3Rpb24gKG91dCkge1xuICAgIHF1YXQuaWRlbnRpdHkob3V0LmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24uaW52ZXJ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIHF1YXQuaW52ZXJ0KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblF1YXRlcm5pb24uZG90ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcXVhdC5kb3QoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblF1YXRlcm5pb24ubGVuID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gcXVhdC5sZW5ndGgoYS5hcnJheSk7XG59O1xuXG4vLyBRdWF0ZXJuaW9uLmxlbmd0aCA9IFF1YXRlcm5pb24ubGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYlxuICogQHBhcmFtICB7bnVtYmVyfSAgICAgdFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICBxdWF0LmxlcnAob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLnNsZXJwID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgdCkge1xuICAgIHF1YXQuc2xlcnAob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5LCB0KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLm11bCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICBxdWF0Lm11bHRpcGx5KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLm11bHRpcGx5ID0gUXVhdGVybmlvbi5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ucm90YXRlWCA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHF1YXQucm90YXRlWChvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHF1YXQucm90YXRlWShvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24ucm90YXRlWiA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHF1YXQucm90YXRlWihvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIGF4aXNcbiAqIEBwYXJhbSAge251bWJlcn0gICAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLlF1YXRlcm5pb259XG4gKi9cblF1YXRlcm5pb24uc2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24gKG91dCwgYXhpcywgcmFkKSB7XG4gICAgcXVhdC5zZXRBeGlzQW5nbGUob3V0LmFycmF5LCBheGlzLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5ub3JtYWxpemUgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgcXVhdC5ub3JtYWxpemUob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5RdWF0ZXJuaW9uLnNxckxlbiA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIHF1YXQuc3FyTGVuKGEuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblF1YXRlcm5pb24uc3F1YXJlZExlbmd0aCA9IFF1YXRlcm5pb24uc3FyTGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSAgICBtXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5mcm9tTWF0MyA9IGZ1bmN0aW9uIChvdXQsIG0pIHtcbiAgICBxdWF0LmZyb21NYXQzKG91dC5hcnJheSwgbS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIHZpZXdcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSAgICByaWdodFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIHVwXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAqL1xuUXVhdGVybmlvbi5zZXRBeGVzID0gZnVuY3Rpb24gKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgcXVhdC5zZXRBeGVzKG91dC5hcnJheSwgdmlldy5hcnJheSwgcmlnaHQuYXJyYXksIHVwLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gICAgYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9ICAgIGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5RdWF0ZXJuaW9ufVxuICovXG5RdWF0ZXJuaW9uLnJvdGF0aW9uVG8gPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgcXVhdC5yb3RhdGlvblRvKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHF1YXRlcm5pb24gZnJvbSBldWxlclxuICogQHBhcmFtIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gb3V0XG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSB2XG4gKiBAcGFyYW0ge1N0cmluZ30gb3JkZXJcbiAqL1xuUXVhdGVybmlvbi5mcm9tRXVsZXIgPSBmdW5jdGlvbiAob3V0LCB2LCBvcmRlcikge1xuXG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG5cbiAgICB2ID0gdi5hcnJheTtcbiAgICB2YXIgdGFyZ2V0ID0gb3V0LmFycmF5O1xuICAgIHZhciBjMSA9IE1hdGguY29zKHZbMF0gLyAyKTtcbiAgICB2YXIgYzIgPSBNYXRoLmNvcyh2WzFdIC8gMik7XG4gICAgdmFyIGMzID0gTWF0aC5jb3ModlsyXSAvIDIpO1xuICAgIHZhciBzMSA9IE1hdGguc2luKHZbMF0gLyAyKTtcbiAgICB2YXIgczIgPSBNYXRoLnNpbih2WzFdIC8gMik7XG4gICAgdmFyIHMzID0gTWF0aC5zaW4odlsyXSAvIDIpO1xuXG4gICAgdmFyIG9yZGVyID0gKG9yZGVyIHx8ICdYWVonKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuICAgIC8vICAyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cbiAgICAvLyAgY29udGVudC9TcGluQ2FsYy5tXG5cbiAgICBzd2l0Y2ggKG9yZGVyKSB7XG4gICAgICAgIGNhc2UgJ1hZWic6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMV0gPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG4gICAgICAgICAgICB0YXJnZXRbM10gPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVhaJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcbiAgICAgICAgICAgIHRhcmdldFszXSA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdaWFknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuICAgICAgICAgICAgdGFyZ2V0WzNdID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1pZWCc6XG4gICAgICAgICAgICB0YXJnZXRbMF0gPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMV0gPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG4gICAgICAgICAgICB0YXJnZXRbMl0gPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG4gICAgICAgICAgICB0YXJnZXRbM10gPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnWVpYJzpcbiAgICAgICAgICAgIHRhcmdldFswXSA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsxXSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcbiAgICAgICAgICAgIHRhcmdldFsyXSA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcbiAgICAgICAgICAgIHRhcmdldFszXSA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdYWlknOlxuICAgICAgICAgICAgdGFyZ2V0WzBdID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzFdID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuICAgICAgICAgICAgdGFyZ2V0WzJdID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuICAgICAgICAgICAgdGFyZ2V0WzNdID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUXVhdGVybmlvbjtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBRdWF0ZXJuaW9uIGZyb20gJy4vbWF0aC9RdWF0ZXJuaW9uJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuL2RlcC9nbG1hdHJpeCc7XG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi9tYXRoL0JvdW5kaW5nQm94JztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcblxudmFyIG5hbWVJZCA9IDA7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuTm9kZVxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIE5vZGUgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5Ob2RlIyAqL1xue1xuICAgIC8qKlxuICAgICAqIFNjZW5lIG5vZGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgbmFtZTogJycsXG5cbiAgICAvKipcbiAgICAgKiBQb3NpdGlvbiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IG5vZGUuIGFrYSB0cmFuc2xhdGlvbi5cbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgcG9zaXRpb246IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGlvbiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IG5vZGUuIFJlcHJlc2VudGVkIGJ5IGEgcXVhdGVybmlvblxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguUXVhdGVybmlvbn1cbiAgICAgKi9cbiAgICByb3RhdGlvbjogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgbm9kZVxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBzY2FsZTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIEFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHJlbGF0aXZlIHRvIGl0cyByb290IHNjZW5lLlxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICB3b3JsZFRyYW5zZm9ybTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIEFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgbm9kZS5cbiAgICAgKiBDb21wb3NpdGVkIHdpdGggcG9zaXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsZS5cbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICovXG4gICAgbG9jYWxUcmFuc2Zvcm06IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgbG9jYWwgdHJhbnNmb3JtIGlzIHVwZGF0ZSBmcm9tIFNSVChzY2FsZSwgcm90YXRpb24sIHRyYW5zbGF0aW9uLCB3aGljaCBpcyBwb3NpdGlvbiBoZXJlKSBlYWNoIGZyYW1lXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgYXV0b1VwZGF0ZUxvY2FsVHJhbnNmb3JtOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogUGFyZW50IG9mIGN1cnJlbnQgc2NlbmUgbm9kZVxuICAgICAqIEB0eXBlIHs/Y2xheS5Ob2RlfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3BhcmVudDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBUaGUgcm9vdCBzY2VuZSBtb3VudGVkLiBOdWxsIGlmIGl0IGlzIGEgaXNvbGF0ZWQgbm9kZVxuICAgICAqIEB0eXBlIHs/Y2xheS5TY2VuZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9zY2VuZTogbnVsbCxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9uZWVkc1VwZGF0ZVdvcmxkVHJhbnNmb3JtOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2luSXRlcmF0aW5nOiBmYWxzZSxcblxuICAgIC8vIERlcHRoIGZvciB0cmFuc3BhcmVudCBsaXN0IHNvcnRpbmdcbiAgICBfX2RlcHRoOiAwXG5cbn0sIGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICh0aGlzLnR5cGUgfHwgJ05PREUnKSArICdfJyArIChuYW1lSWQrKyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucm90YXRpb24pIHtcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zY2FsZSkge1xuICAgICAgICB0aGlzLnNjYWxlID0gbmV3IFZlY3RvcjMoMSwgMSwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy53b3JsZFRyYW5zZm9ybSA9IG5ldyBNYXRyaXg0KCk7XG4gICAgdGhpcy5sb2NhbFRyYW5zZm9ybSA9IG5ldyBNYXRyaXg0KCk7XG5cbiAgICB0aGlzLl9jaGlsZHJlbiA9IFtdO1xuXG59LFxuLyoqQGxlbmRzIGNsYXkuTm9kZS5wcm90b3R5cGUuICovXG57XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIHRhcmdldDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBJZiBub2RlIGFuZCBpdHMgY2hpbHJlbiBpbnZpc2libGVcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBpbnZpc2libGU6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogSWYgTm9kZSBpcyBhIHNraW5uZWQgbWVzaFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTa2lubmVkTWVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIHJlbmRlcmFibGUgc2NlbmUgbm9kZSwgbGlrZSBNZXNoIGFuZCBQYXJ0aWNsZVN5c3RlbVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNSZW5kZXJhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBzY2VuZSBub2RlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKi9cbiAgICBzZXROYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLl9zY2VuZTtcbiAgICAgICAgaWYgKHNjZW5lKSB7XG4gICAgICAgICAgICB2YXIgbm9kZVJlcG9zaXRvcnkgPSBzY2VuZS5fbm9kZVJlcG9zaXRvcnk7XG4gICAgICAgICAgICBkZWxldGUgbm9kZVJlcG9zaXRvcnlbdGhpcy5uYW1lXTtcbiAgICAgICAgICAgIG5vZGVSZXBvc2l0b3J5W25hbWVdID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjaGlsZCBub2RlXG4gICAgICogQHBhcmFtIHtjbGF5Lk5vZGV9IG5vZGVcbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbkl0ZXJhdGluZykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdBZGQgb3BlcmF0aW9uIGNhbiBjYXVzZSB1bnByZWRpY3RhYmxlIGVycm9yIHdoZW4gaW4gaXRlcmF0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yaWdpbmFsUGFyZW50ID0gbm9kZS5fcGFyZW50O1xuICAgICAgICBpZiAob3JpZ2luYWxQYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JpZ2luYWxQYXJlbnQpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsUGFyZW50LnJlbW92ZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLl9wYXJlbnQgPSB0aGlzO1xuICAgICAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKG5vZGUpO1xuXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuX3NjZW5lO1xuICAgICAgICBpZiAoc2NlbmUgJiYgc2NlbmUgIT09IG5vZGUuc2NlbmUpIHtcbiAgICAgICAgICAgIG5vZGUudHJhdmVyc2UodGhpcy5fYWRkU2VsZlRvU2NlbmUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgY2hpbGRyZW4gbmVlZHMgdXBkYXRlIHRyYW5zZm9ybVxuICAgICAgICAvLyBJbiBjYXNlIGNoaWxkIGFyZSByZW1vdmUgYW5kIGFkZGVkIGFnYWluIGFmdGVyIHBhcmVudCBtb3ZlZFxuICAgICAgICBub2RlLl9uZWVkc1VwZGF0ZVdvcmxkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBjaGlsZCBzY2VuZSBub2RlXG4gICAgICogQHBhcmFtIHtjbGF5Lk5vZGV9IG5vZGVcbiAgICAgKi9cbiAgICByZW1vdmU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbkl0ZXJhdGluZykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW1vdmUgb3BlcmF0aW9uIGNhbiBjYXVzZSB1bnByZWRpY3RhYmxlIGVycm9yIHdoZW4gaW4gaXRlcmF0aW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIHZhciBpZHggPSBjaGlsZHJlbi5pbmRleE9mKG5vZGUpO1xuICAgICAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIG5vZGUuX3BhcmVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NjZW5lKSB7XG4gICAgICAgICAgICBub2RlLnRyYXZlcnNlKHRoaXMuX3JlbW92ZVNlbGZGcm9tU2NlbmUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgY2hpbGRyZW5cbiAgICAgKi9cbiAgICByZW1vdmVBbGw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG5cbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY2hpbGRyZW5baWR4XS5fcGFyZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baWR4XS50cmF2ZXJzZSh0aGlzLl9yZW1vdmVTZWxmRnJvbVNjZW5lLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0gW107XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2NlbmUgbW91bnRlZFxuICAgICAqIEByZXR1cm4ge2NsYXkuU2NlbmV9XG4gICAgICovXG4gICAgZ2V0U2NlbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjZW5lO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGFyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlNjZW5lfVxuICAgICAqL1xuICAgIGdldFBhcmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlU2VsZkZyb21TY2VuZTogZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgZGVzY2VuZGFudC5fc2NlbmUucmVtb3ZlRnJvbVNjZW5lKGRlc2NlbmRhbnQpO1xuICAgICAgICBkZXNjZW5kYW50Ll9zY2VuZSA9IG51bGw7XG4gICAgfSxcblxuICAgIF9hZGRTZWxmVG9TY2VuZTogZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgdGhpcy5fc2NlbmUuYWRkVG9TY2VuZShkZXNjZW5kYW50KTtcbiAgICAgICAgZGVzY2VuZGFudC5fc2NlbmUgPSB0aGlzLl9zY2VuZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgaXQgaXMgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHNjZW5lIG5vZGVcbiAgICAgKiBAcGFyYW0ge2NsYXkuTm9kZX0gbm9kZVxuICAgICAqL1xuICAgIGlzQW5jZXN0b3I6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBub2RlLl9wYXJlbnQ7XG4gICAgICAgIHdoaWxlKHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBuZXcgY3JlYXRlZCBhcnJheSBvZiBhbGwgY2hpbGRyZW4gbm9kZXNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lk5vZGVbXX1cbiAgICAgKi9cbiAgICBjaGlsZHJlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uc2xpY2UoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGNoaWxkIHNjZW5lIG5vZGUgYXQgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeFxuICAgICAqIEByZXR1cm4ge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICBjaGlsZEF0OiBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbltpZHhdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmlyc3QgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIGdldENoaWxkQnlOYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGZpcnN0IGRlc2NlbmRhbnQgaGF2ZSB0aGUgZ2l2ZW4gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIGdldERlc2NlbmRhbnRCeU5hbWU6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gY2hpbGQuZ2V0RGVzY2VuZGFudEJ5TmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGRlc2NlbmRhbnQgbm9kZSBieSBwYXRoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lk5vZGV9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgbm9kZS5xdWVyeU5vZGUoJ3Jvb3QvcGFyZW50L2NoaWxkJyk7XG4gICAgICovXG4gICAgcXVlcnlOb2RlOiBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIE5hbWUgaGF2ZSBzbGFzaCA/XG4gICAgICAgIHZhciBwYXRoQXJyID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBwYXRoQXJyW2ldO1xuICAgICAgICAgICAgLy8gU2tpcCBlbXB0eVxuICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGN1cnJlbnQuX2NoaWxkcmVuO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm90IGZvdW5kXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBxdWVyeSBwYXRoLCByZWxhdGl2ZSB0byByb290Tm9kZShkZWZhdWx0IGlzIHNjZW5lKVxuICAgICAqIEBwYXJhbSB7Y2xheS5Ob2RlfSBbcm9vdE5vZGVdXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldFBhdGg6IGZ1bmN0aW9uIChyb290Tm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuICcvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMubmFtZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQuX3BhcmVudCkge1xuICAgICAgICAgICAgcGF0aCA9IGN1cnJlbnQubmFtZSArICcvJyArIHBhdGg7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5fcGFyZW50ID09IHJvb3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudC5fcGFyZW50ICYmIHJvb3ROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVwdGggZmlyc3QgdHJhdmVyc2UgYWxsIGl0cyBkZXNjZW5kYW50IHNjZW5lIG5vZGVzIGFuZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtOb2RlfSBbY29udGV4dF1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZmlsdGVyXVxuICAgICAqL1xuICAgIHRyYXZlcnNlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQsIGZpbHRlcikge1xuXG4gICAgICAgIHRoaXMuX2luSXRlcmF0aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIuY2FsbChjb250ZXh0LCB0aGlzKSkge1xuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2NoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IF9jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgX2NoaWxkcmVuW2ldLnRyYXZlcnNlKGNhbGxiYWNrLCBjb250ZXh0LCBmaWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5JdGVyYXRpbmcgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgZWFjaENoaWxkOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQsIGN0b3IpIHtcbiAgICAgICAgdGhpcy5faW5JdGVyYXRpbmcgPSB0cnVlO1xuXG4gICAgICAgIHZhciBfY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlbjtcbiAgICAgICAgdmFyIG5vQ3RvciA9IGN0b3IgPT0gbnVsbDtcbiAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gX2NoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBfY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobm9DdG9yIHx8IGNoaWxkLmNvbnN0cnVjdG9yID09PSBjdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBjaGlsZCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbkl0ZXJhdGluZyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxvY2FsIHRyYW5zZm9ybSBhbmQgZGVjb21wb3NlIHRvIFNSVFxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLk1hdHJpeDR9IG1hdHJpeFxuICAgICAqL1xuICAgIHNldExvY2FsVHJhbnNmb3JtOiBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgICAgIG1hdDQuY29weSh0aGlzLmxvY2FsVHJhbnNmb3JtLmFycmF5LCBtYXRyaXguYXJyYXkpO1xuICAgICAgICB0aGlzLmRlY29tcG9zZUxvY2FsVHJhbnNmb3JtKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlY29tcG9zZSB0aGUgbG9jYWwgdHJhbnNmb3JtIHRvIFNSVFxuICAgICAqL1xuICAgIGRlY29tcG9zZUxvY2FsVHJhbnNmb3JtOiBmdW5jdGlvbiAoa2VlcFNjYWxlKSB7XG4gICAgICAgIHZhciBzY2FsZSA9ICFrZWVwU2NhbGUgPyB0aGlzLnNjYWxlOiBudWxsO1xuICAgICAgICB0aGlzLmxvY2FsVHJhbnNmb3JtLmRlY29tcG9zZU1hdHJpeChzY2FsZSwgdGhpcy5yb3RhdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgd29ybGQgdHJhbnNmb3JtIGFuZCBkZWNvbXBvc2UgdG8gU1JUXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH0gbWF0cml4XG4gICAgICovXG4gICAgc2V0V29ybGRUcmFuc2Zvcm06IGZ1bmN0aW9uIChtYXRyaXgpIHtcbiAgICAgICAgbWF0NC5jb3B5KHRoaXMud29ybGRUcmFuc2Zvcm0uYXJyYXksIG1hdHJpeC5hcnJheSk7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlV29ybGRUcmFuc2Zvcm0oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVjb21wb3NlIHRoZSB3b3JsZCB0cmFuc2Zvcm0gdG8gU1JUXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgZGVjb21wb3NlV29ybGRUcmFuc2Zvcm06IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIHRtcCA9IG1hdDQuY3JlYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZWVwU2NhbGUpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbFRyYW5zZm9ybSA9IHRoaXMubG9jYWxUcmFuc2Zvcm07XG4gICAgICAgICAgICB2YXIgd29ybGRUcmFuc2Zvcm0gPSB0aGlzLndvcmxkVHJhbnNmb3JtO1xuICAgICAgICAgICAgLy8gQXNzdW1lIHdvcmxkIHRyYW5zZm9ybSBpcyB1cGRhdGVkXG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgbWF0NC5pbnZlcnQodG1wLCB0aGlzLl9wYXJlbnQud29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobG9jYWxUcmFuc2Zvcm0uYXJyYXksIHRtcCwgd29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXQ0LmNvcHkobG9jYWxUcmFuc2Zvcm0uYXJyYXksIHdvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzY2FsZSA9ICFrZWVwU2NhbGUgPyB0aGlzLnNjYWxlOiBudWxsO1xuICAgICAgICAgICAgbG9jYWxUcmFuc2Zvcm0uZGVjb21wb3NlTWF0cml4KHNjYWxlLCB0aGlzLnJvdGF0aW9uLCB0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgdHJhbnNmb3JtTmVlZHNVcGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24uX2RpcnR5XG4gICAgICAgICAgICB8fCB0aGlzLnJvdGF0aW9uLl9kaXJ0eVxuICAgICAgICAgICAgfHwgdGhpcy5zY2FsZS5fZGlydHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBsb2NhbCB0cmFuc2Zvcm0gZnJvbSBTUlRcbiAgICAgKiBOb3RpY2UgdGhhdCBsb2NhbCB0cmFuc2Zvcm0gd2lsbCBub3QgYmUgdXBkYXRlZCBpZiBfZGlydHkgbWFyayBvZiBwb3NpdGlvbiwgcm90YXRpb24sIHNjYWxlIGlzIGFsbCBmYWxzZVxuICAgICAqL1xuICAgIHVwZGF0ZUxvY2FsVHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgICAgIHZhciByb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtTmVlZHNVcGRhdGUoKSkge1xuICAgICAgICAgICAgdmFyIG0gPSB0aGlzLmxvY2FsVHJhbnNmb3JtLmFycmF5O1xuXG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gb3JkZXIsIHNjYWxlLT5yb3RhdGlvbi0+cG9zaXRpb25cbiAgICAgICAgICAgIG1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24obSwgcm90YXRpb24uYXJyYXksIHBvc2l0aW9uLmFycmF5KTtcblxuICAgICAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBzY2FsZS5hcnJheSk7XG5cbiAgICAgICAgICAgIHJvdGF0aW9uLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgc2NhbGUuX2RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICBwb3NpdGlvbi5fZGlydHkgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGVXb3JsZFRyYW5zZm9ybSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHdvcmxkIHRyYW5zZm9ybSwgYXNzdW1lIGl0cyBwYXJlbnQgd29ybGQgdHJhbnNmb3JtIGhhdmUgYmVlbiB1cGRhdGVkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlV29ybGRUcmFuc2Zvcm1Ub3BEb3duOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsb2NhbFRyYW5zZm9ybSA9IHRoaXMubG9jYWxUcmFuc2Zvcm0uYXJyYXk7XG4gICAgICAgIHZhciB3b3JsZFRyYW5zZm9ybSA9IHRoaXMud29ybGRUcmFuc2Zvcm0uYXJyYXk7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHlBZmZpbmUoXG4gICAgICAgICAgICAgICAgd29ybGRUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LndvcmxkVHJhbnNmb3JtLmFycmF5LFxuICAgICAgICAgICAgICAgIGxvY2FsVHJhbnNmb3JtXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0NC5jb3B5KHdvcmxkVHJhbnNmb3JtLCBsb2NhbFRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHdvcmxkIHRyYW5zZm9ybSBiZWZvcmUgd2hvbGUgc2NlbmUgaXMgdXBkYXRlZC5cbiAgICAgKi9cbiAgICB1cGRhdGVXb3JsZFRyYW5zZm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBGaW5kIHRoZSByb290IG5vZGUgd2hpY2ggdHJhbnNmb3JtIG5lZWRzIHVwZGF0ZTtcbiAgICAgICAgdmFyIHJvb3ROb2RlSXNEaXJ0eSA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChyb290Tm9kZUlzRGlydHkgJiYgcm9vdE5vZGVJc0RpcnR5LmdldFBhcmVudCgpXG4gICAgICAgICAgICAmJiByb290Tm9kZUlzRGlydHkuZ2V0UGFyZW50KCkudHJhbnNmb3JtTmVlZHNVcGRhdGUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJvb3ROb2RlSXNEaXJ0eSA9IHJvb3ROb2RlSXNEaXJ0eS5nZXRQYXJlbnQoKTtcbiAgICAgICAgfTJcbiAgICAgICAgcm9vdE5vZGVJc0RpcnR5LnVwZGF0ZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgbG9jYWwgdHJhbnNmb3JtIGFuZCB3b3JsZCB0cmFuc2Zvcm0gcmVjdXJzaXZlbHlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlVXBkYXRlV29ybGRcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChmb3JjZVVwZGF0ZVdvcmxkKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVMb2NhbFRyYW5zZm9ybSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbFRyYW5zZm9ybSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGlzIG1hbnVhbGx5IHNldHRlZFxuICAgICAgICAgICAgZm9yY2VVcGRhdGVXb3JsZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9yY2VVcGRhdGVXb3JsZCB8fCB0aGlzLl9uZWVkc1VwZGF0ZVdvcmxkVHJhbnNmb3JtKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JsZFRyYW5zZm9ybVRvcERvd24oKTtcbiAgICAgICAgICAgIGZvcmNlVXBkYXRlV29ybGQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGVXb3JsZFRyYW5zZm9ybSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW47XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZHJlbltpXS51cGRhdGUoZm9yY2VVcGRhdGVXb3JsZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGJvdW5kaW5nIGJveCBvZiBub2RlXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtmaWx0ZXJdXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5Cb3VuZGluZ0JveH1cbiAgICAgKi9cbiAgICAvLyBUT0RPIFNraW5uaW5nXG4gICAgZ2V0Qm91bmRpbmdCb3g6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIgKGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gIWVsLmludmlzaWJsZSAmJiBlbC5nZW9tZXRyeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG1wQkJveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB2YXIgdG1wTWF0NCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBpbnZXb3JsZFRyYW5zZm9ybSA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZmlsdGVyLCBvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG91dCB8fCBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlciB8fCBkZWZhdWx0RmlsdGVyO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgTWF0cml4NC5pbnZlcnQoaW52V29ybGRUcmFuc2Zvcm0sIHRoaXMuX3BhcmVudC53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBNYXRyaXg0LmlkZW50aXR5KGludldvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmF2ZXJzZShmdW5jdGlvbiAobWVzaCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoLmdlb21ldHJ5ICYmIG1lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wQkJveC5jb3B5KG1lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgICAgICAgICBNYXRyaXg0Lm11bHRpcGx5KHRtcE1hdDQsIGludldvcmxkVHJhbnNmb3JtLCBtZXNoLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgdG1wQkJveC5hcHBseVRyYW5zZm9ybSh0bXBNYXQ0KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnVuaW9uKHRtcEJCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMsIGRlZmF1bHRGaWx0ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBHZXQgd29ybGQgcG9zaXRpb24sIGV4dHJhY3RlZCBmcm9tIHdvcmxkIHRyYW5zZm9ybVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgLy8gUEVORElOR1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1OZWVkc1VwZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdvcmxkVHJhbnNmb3JtKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG0gPSB0aGlzLndvcmxkVHJhbnNmb3JtLmFycmF5O1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICB2YXIgYXJyID0gb3V0LmFycmF5O1xuICAgICAgICAgICAgYXJyWzBdID0gbVsxMl07XG4gICAgICAgICAgICBhcnJbMV0gPSBtWzEzXTtcbiAgICAgICAgICAgIGFyclsyXSA9IG1bMTRdO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMyhtWzEyXSwgbVsxM10sIG1bMTRdKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBub2RlXG4gICAgICogQHJldHVybiB7Tm9kZX1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCk7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuO1xuXG4gICAgICAgIG5vZGUuc2V0TmFtZSh0aGlzLm5hbWUpO1xuICAgICAgICBub2RlLnBvc2l0aW9uLmNvcHkodGhpcy5wb3NpdGlvbik7XG4gICAgICAgIG5vZGUucm90YXRpb24uY29weSh0aGlzLnJvdGF0aW9uKTtcbiAgICAgICAgbm9kZS5zY2FsZS5jb3B5KHRoaXMuc2NhbGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5vZGUuYWRkKGNoaWxkcmVuW2ldLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhlIG5vZGUgYXJvdW5kIGEgYXhpcyBieSBhbmdsZSBkZWdyZWVzLCBheGlzIHBhc3NlcyB0aHJvdWdoIHBvaW50XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gcG9pbnQgQ2VudGVyIHBvaW50XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gYXhpcyAgQ2VudGVyIGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gICAgICAgYW5nbGUgUm90YXRpb24gYW5nbGVcbiAgICAgKiBAc2VlIGh0dHA6Ly9kb2NzLnVuaXR5M2QuY29tL0RvY3VtZW50YXRpb24vU2NyaXB0UmVmZXJlbmNlL1RyYW5zZm9ybS5Sb3RhdGVBcm91bmQuaHRtbFxuICAgICAqIEBmdW5jdGlvblxuICAgICAqL1xuICAgIHJvdGF0ZUFyb3VuZDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB2YXIgUlRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG4gICAgICAgIC8vIFRPRE8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvaW50LCBheGlzLCBhbmdsZSkge1xuXG4gICAgICAgICAgICB2LmNvcHkodGhpcy5wb3NpdGlvbikuc3VidHJhY3QocG9pbnQpO1xuXG4gICAgICAgICAgICB2YXIgbG9jYWxUcmFuc2Zvcm0gPSB0aGlzLmxvY2FsVHJhbnNmb3JtO1xuICAgICAgICAgICAgbG9jYWxUcmFuc2Zvcm0uaWRlbnRpdHkoKTtcbiAgICAgICAgICAgIC8vIHBhcmVudCBub2RlXG4gICAgICAgICAgICBsb2NhbFRyYW5zZm9ybS50cmFuc2xhdGUocG9pbnQpO1xuICAgICAgICAgICAgbG9jYWxUcmFuc2Zvcm0ucm90YXRlKGFuZ2xlLCBheGlzKTtcblxuICAgICAgICAgICAgUlRNYXRyaXguZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24odGhpcy5yb3RhdGlvbiwgdik7XG4gICAgICAgICAgICBsb2NhbFRyYW5zZm9ybS5tdWx0aXBseShSVE1hdHJpeCk7XG4gICAgICAgICAgICBsb2NhbFRyYW5zZm9ybS5zY2FsZSh0aGlzLnNjYWxlKTtcblxuICAgICAgICAgICAgdGhpcy5kZWNvbXBvc2VMb2NhbFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGVXb3JsZFRyYW5zZm9ybSA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IFt1cF1cbiAgICAgKiBAc2VlIGh0dHA6Ly93d3cub3BlbmdsLm9yZy9zZGsvZG9jcy9tYW4yL3hodG1sL2dsdUxvb2tBdC54bWxcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKi9cbiAgICBsb29rQXQ6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVwKSB7XG4gICAgICAgICAgICBtLmxvb2tBdCh0aGlzLnBvc2l0aW9uLCB0YXJnZXQsIHVwIHx8IHRoaXMubG9jYWxUcmFuc2Zvcm0ueSkuaW52ZXJ0KCk7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsVHJhbnNmb3JtKG0pO1xuXG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgfTtcbiAgICB9KSgpXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTm9kZTtcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuTGlnaHRcbiAqIEBleHRlbmRzIGNsYXkuTm9kZVxuICovXG52YXIgTGlnaHQgPSBOb2RlLmV4dGVuZChmdW5jdGlvbigpe1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuTGlnaHQjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpZ2h0IFJHQiBjb2xvclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyW119XG4gICAgICAgICAqL1xuICAgICAgICBjb2xvcjogWzEsIDEsIDFdLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaWdodCBpbnRlbnNpdHlcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIGludGVuc2l0eTogMS4wLFxuXG4gICAgICAgIC8vIENvbmZpZyBmb3Igc2hhZG93IG1hcFxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgbGlnaHQgY2FzdCBzaGFkb3dcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBjYXN0U2hhZG93OiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaGFkb3cgbWFwIHNpemVcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNoYWRvd1Jlc29sdXRpb246IDUxMixcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlnaHQgZ3JvdXAsIHNoYWRlciB3aXRoIHNhbWUgYGxpZ2h0R3JvdXBgIHdpbGwgYmUgYWZmZWN0ZWRcbiAgICAgICAgICpcbiAgICAgICAgICogT25seSB1c2VmdWwgaW4gZm9yd2FyZCByZW5kZXJpbmdcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIGdyb3VwOiAwXG4gICAgfTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuTGlnaHQucHJvdG90eXBlLiAqL1xue1xuICAgIC8qKlxuICAgICAqIExpZ2h0IHR5cGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LkxpZ2h0I1xuICAgICAqL1xuICAgIHR5cGU6ICcnLFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Y2xheS5MaWdodH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5MaWdodC5wcm90b3R5cGVcbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBsaWdodCA9IE5vZGUucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIGxpZ2h0LmNvbG9yID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5jb2xvcik7XG4gICAgICAgIGxpZ2h0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuICAgICAgICBsaWdodC5jYXN0U2hhZG93ID0gdGhpcy5jYXN0U2hhZG93O1xuICAgICAgICBsaWdodC5zaGFkb3dSZXNvbHV0aW9uID0gdGhpcy5zaGFkb3dSZXNvbHV0aW9uO1xuXG4gICAgICAgIHJldHVybiBsaWdodDtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTGlnaHQ7XG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG52YXIgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG52YXIgdmVjNCA9IGdsTWF0cml4LnZlYzQ7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlBsYW5lXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbbm9ybWFsXVxuICogQHBhcmFtIHtudW1iZXJ9IFtkaXN0YW5jZV1cbiAqL1xudmFyIFBsYW5lID0gZnVuY3Rpb24obm9ybWFsLCBkaXN0YW5jZSkge1xuICAgIC8qKlxuICAgICAqIE5vcm1hbCBvZiB0aGUgcGxhbmVcbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy5ub3JtYWwgPSBub3JtYWwgfHwgbmV3IFZlY3RvcjMoMCwgMSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdGFudCBvZiB0aGUgcGxhbmUgZXF1YXRpb24sIHVzZWQgYXMgZGlzdGFuY2UgdG8gdGhlIG9yaWdpblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlIHx8IDA7XG59O1xuXG5QbGFuZS5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogUGxhbmUsXG5cbiAgICAvKipcbiAgICAgKiBEaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gcG9pbnQgdG8gdGhlIHBsYW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IHBvaW50XG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZG90KHBvaW50LmFycmF5LCB0aGlzLm5vcm1hbC5hcnJheSkgLSB0aGlzLmRpc3RhbmNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHByb2plY3Rpb24gcG9pbnQgb24gdGhlIHBsYW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IHBvaW50XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjN9IG91dFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHByb2plY3RQb2ludDogZnVuY3Rpb24ocG9pbnQsIG91dCkge1xuICAgICAgICBpZiAoIW91dCkge1xuICAgICAgICAgICAgb3V0ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KHBvaW50KTtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIHBvaW50LmFycmF5LCB0aGlzLm5vcm1hbC5hcnJheSwgLWQpO1xuICAgICAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRoZSBwbGFuZSdzIG5vcm1hbCBhbmQgY2FsY3VsYXRlIHRoZSBkaXN0YW5jZVxuICAgICAqL1xuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpbnZMZW4gPSAxIC8gdmVjMy5sZW4odGhpcy5ub3JtYWwuYXJyYXkpO1xuICAgICAgICB2ZWMzLnNjYWxlKHRoaXMubm9ybWFsLmFycmF5LCBpbnZMZW4pO1xuICAgICAgICB0aGlzLmRpc3RhbmNlICo9IGludkxlbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYW5lIGludGVyc2VjdCBhIGZydXN0dW1cbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguRnJ1c3R1bX0gRnJ1c3R1bVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW50ZXJzZWN0RnJ1c3R1bTogZnVuY3Rpb24oZnJ1c3R1bSkge1xuICAgICAgICAvLyBDaGVjayBpZiBhbGwgY29vcmRzIG9mIGZydXN0dW0gaXMgb24gcGxhbmUgYWxsIHVuZGVyIHBsYW5lXG4gICAgICAgIHZhciBjb29yZHMgPSBmcnVzdHVtLnZlcnRpY2VzO1xuICAgICAgICB2YXIgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXJyYXk7XG4gICAgICAgIHZhciBvblBsYW5lID0gdmVjMy5kb3QoY29vcmRzWzBdLmFycmF5LCBub3JtYWwpID4gdGhpcy5kaXN0YW5jZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgIGlmICgodmVjMy5kb3QoY29vcmRzW2ldLmFycmF5LCBub3JtYWwpID4gdGhpcy5kaXN0YW5jZSkgIT0gb25QbGFuZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgaW50ZXJzZWN0aW9uIHBvaW50IGJldHdlZW4gcGxhbmUgYW5kIGEgZ2l2ZW4gbGluZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IHN0YXJ0IHN0YXJ0IHBvaW50IG9mIGxpbmVcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBlbmQgZW5kIHBvaW50IG9mIGxpbmVcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGludGVyc2VjdExpbmU6IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJkID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIG91dCkge1xuICAgICAgICAgICAgdmFyIGQwID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGQxID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoZW5kKTtcbiAgICAgICAgICAgIGlmICgoZDAgPiAwICYmIGQxID4gMCkgfHwgKGQwIDwgMCAmJiBkMSA8IDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSYXkgaW50ZXJzZWN0aW9uXG4gICAgICAgICAgICB2YXIgcG4gPSB0aGlzLm5vcm1hbC5hcnJheTtcbiAgICAgICAgICAgIHZhciBkID0gdGhpcy5kaXN0YW5jZTtcbiAgICAgICAgICAgIHZhciBybyA9IHN0YXJ0LmFycmF5O1xuICAgICAgICAgICAgLy8gZGlyZWN0aW9uXG4gICAgICAgICAgICB2ZWMzLnN1YihyZCwgZW5kLmFycmF5LCBzdGFydC5hcnJheSk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZShyZCwgcmQpO1xuXG4gICAgICAgICAgICB2YXIgZGl2aWRlciA9IHZlYzMuZG90KHBuLCByZCk7XG4gICAgICAgICAgICAvLyByYXkgaXMgcGFyYWxsZWwgdG8gdGhlIHBsYW5lXG4gICAgICAgICAgICBpZiAoZGl2aWRlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgICAgICBvdXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHQgPSAodmVjMy5kb3QocG4sIHJvKSAtIGQpIC8gZGl2aWRlcjtcbiAgICAgICAgICAgIHZlYzMuc2NhbGVBbmRBZGQob3V0LmFycmF5LCBybywgcmQsIC10KTtcbiAgICAgICAgICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYW4gYWZmaW5lIHRyYW5zZm9ybSBtYXRyaXggdG8gcGxhbmVcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKi9cbiAgICBhcHBseVRyYW5zZm9ybTogKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaW52ZXJzZVRyYW5zcG9zZSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIHZhciBub3JtYWx2NCA9IHZlYzQuY3JlYXRlKCk7XG4gICAgICAgIHZhciBwb2ludHY0ID0gdmVjNC5jcmVhdGUoKTtcbiAgICAgICAgcG9pbnR2NFszXSA9IDE7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtNCkge1xuICAgICAgICAgICAgbTQgPSBtNC5hcnJheTtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBwb2ludCBvbiBwbGFuZVxuICAgICAgICAgICAgdmVjMy5zY2FsZShwb2ludHY0LCB0aGlzLm5vcm1hbC5hcnJheSwgdGhpcy5kaXN0YW5jZSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocG9pbnR2NCwgcG9pbnR2NCwgbTQpO1xuICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSA9IHZlYzMuZG90KHBvaW50djQsIHRoaXMubm9ybWFsLmFycmF5KTtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBwbGFuZSBub3JtYWxcbiAgICAgICAgICAgIG1hdDQuaW52ZXJ0KGludmVyc2VUcmFuc3Bvc2UsIG00KTtcbiAgICAgICAgICAgIG1hdDQudHJhbnNwb3NlKGludmVyc2VUcmFuc3Bvc2UsIGludmVyc2VUcmFuc3Bvc2UpO1xuICAgICAgICAgICAgbm9ybWFsdjRbM10gPSAwO1xuICAgICAgICAgICAgdmVjMy5jb3B5KG5vcm1hbHY0LCB0aGlzLm5vcm1hbC5hcnJheSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQobm9ybWFsdjQsIG5vcm1hbHY0LCBpbnZlcnNlVHJhbnNwb3NlKTtcbiAgICAgICAgICAgIHZlYzMuY29weSh0aGlzLm5vcm1hbC5hcnJheSwgbm9ybWFsdjQpO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGZyb20gYW5vdGhlciBwbGFuZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBwbGFuZVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKHBsYW5lKSB7XG4gICAgICAgIHZlYzMuY29weSh0aGlzLm5vcm1hbC5hcnJheSwgcGxhbmUubm9ybWFsLmFycmF5KTtcbiAgICAgICAgdGhpcy5ub3JtYWwuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IHBsYW5lLmRpc3RhbmNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBwbGFuZVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5QbGFuZX1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuICAgICAgICBwbGFuZS5jb3B5KHRoaXMpO1xuICAgICAgICByZXR1cm4gcGxhbmU7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGxhbmU7XG4iLCJpbXBvcnQgVmVjdG9yMyBmcm9tICcuL1ZlY3RvcjMnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4vQm91bmRpbmdCb3gnO1xuaW1wb3J0IFBsYW5lIGZyb20gJy4vUGxhbmUnO1xuXG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcblxudmFyIHZlYzNTZXQgPSB2ZWMzLnNldDtcbnZhciB2ZWMzQ29weSA9IHZlYzMuY29weTtcbnZhciB2ZWMzVHJhbmZvcm1NYXQ0ID0gdmVjMy50cmFuc2Zvcm1NYXQ0O1xudmFyIG1hdGhNaW4gPSBNYXRoLm1pbjtcbnZhciBtYXRoTWF4ID0gTWF0aC5tYXg7XG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5GcnVzdHVtXG4gKi9cbnZhciBGcnVzdHVtID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBFaWdodCBwbGFuZXMgdG8gZW5jbG9zZSB0aGUgZnJ1c3R1bVxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguUGxhbmVbXX1cbiAgICAgKi9cbiAgICB0aGlzLnBsYW5lcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgdGhpcy5wbGFuZXMucHVzaChuZXcgUGxhbmUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQm91bmRpbmcgYm94IG9mIGZydXN0dW1cbiAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLkJvdW5kaW5nQm94fVxuICAgICAqL1xuICAgIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcblxuICAgIC8qKlxuICAgICAqIEVpZ2h0IHZlcnRpY2VzIG9mIGZydXN0dW1cbiAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XG4gICAgICovXG4gICAgdGhpcy52ZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgIHRoaXMudmVydGljZXNbaV0gPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMCk7XG4gICAgfVxufTtcblxuRnJ1c3R1bS5wcm90b3R5cGUgPSB7XG5cbiAgICAvLyBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEyMDUzMTIzMTAwNS9odHRwOi8vY3Jhenlqb2tlLmZyZWUuZnIvZG9jLzNEL3BsYW5lJTIwZXh0cmFjdGlvbi5wZGZcbiAgICAvKipcbiAgICAgKiBTZXQgZnJ1c3R1bSBmcm9tIGEgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5NYXRyaXg0fSBwcm9qZWN0aW9uTWF0cml4XG4gICAgICovXG4gICAgc2V0RnJvbVByb2plY3Rpb246IGZ1bmN0aW9uKHByb2plY3Rpb25NYXRyaXgpIHtcblxuICAgICAgICB2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG4gICAgICAgIHZhciBtID0gcHJvamVjdGlvbk1hdHJpeC5hcnJheTtcbiAgICAgICAgdmFyIG0wID0gbVswXSwgbTEgPSBtWzFdLCBtMiA9IG1bMl0sIG0zID0gbVszXTtcbiAgICAgICAgdmFyIG00ID0gbVs0XSwgbTUgPSBtWzVdLCBtNiA9IG1bNl0sIG03ID0gbVs3XTtcbiAgICAgICAgdmFyIG04ID0gbVs4XSwgbTkgPSBtWzldLCBtMTAgPSBtWzEwXSwgbTExID0gbVsxMV07XG4gICAgICAgIHZhciBtMTIgPSBtWzEyXSwgbTEzID0gbVsxM10sIG0xNCA9IG1bMTRdLCBtMTUgPSBtWzE1XTtcblxuICAgICAgICAvLyBVcGRhdGUgcGxhbmVzXG4gICAgICAgIHZlYzNTZXQocGxhbmVzWzBdLm5vcm1hbC5hcnJheSwgbTMgLSBtMCwgbTcgLSBtNCwgbTExIC0gbTgpO1xuICAgICAgICBwbGFuZXNbMF0uZGlzdGFuY2UgPSAtKG0xNSAtIG0xMik7XG4gICAgICAgIHBsYW5lc1swXS5ub3JtYWxpemUoKTtcblxuICAgICAgICB2ZWMzU2V0KHBsYW5lc1sxXS5ub3JtYWwuYXJyYXksIG0zICsgbTAsIG03ICsgbTQsIG0xMSArIG04KTtcbiAgICAgICAgcGxhbmVzWzFdLmRpc3RhbmNlID0gLShtMTUgKyBtMTIpO1xuICAgICAgICBwbGFuZXNbMV0ubm9ybWFsaXplKCk7XG5cbiAgICAgICAgdmVjM1NldChwbGFuZXNbMl0ubm9ybWFsLmFycmF5LCBtMyArIG0xLCBtNyArIG01LCBtMTEgKyBtOSk7XG4gICAgICAgIHBsYW5lc1syXS5kaXN0YW5jZSA9IC0obTE1ICsgbTEzKTtcbiAgICAgICAgcGxhbmVzWzJdLm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIHZlYzNTZXQocGxhbmVzWzNdLm5vcm1hbC5hcnJheSwgbTMgLSBtMSwgbTcgLSBtNSwgbTExIC0gbTkpO1xuICAgICAgICBwbGFuZXNbM10uZGlzdGFuY2UgPSAtKG0xNSAtIG0xMyk7XG4gICAgICAgIHBsYW5lc1szXS5ub3JtYWxpemUoKTtcblxuICAgICAgICB2ZWMzU2V0KHBsYW5lc1s0XS5ub3JtYWwuYXJyYXksIG0zIC0gbTIsIG03IC0gbTYsIG0xMSAtIG0xMCk7XG4gICAgICAgIHBsYW5lc1s0XS5kaXN0YW5jZSA9IC0obTE1IC0gbTE0KTtcbiAgICAgICAgcGxhbmVzWzRdLm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIHZlYzNTZXQocGxhbmVzWzVdLm5vcm1hbC5hcnJheSwgbTMgKyBtMiwgbTcgKyBtNiwgbTExICsgbTEwKTtcbiAgICAgICAgcGxhbmVzWzVdLmRpc3RhbmNlID0gLShtMTUgKyBtMTQpO1xuICAgICAgICBwbGFuZXNbNV0ubm9ybWFsaXplKCk7XG5cbiAgICAgICAgLy8gUGVyc3BlY3RpdmUgcHJvamVjdGlvblxuICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSB0aGlzLmJvdW5kaW5nQm94O1xuICAgICAgICBpZiAobTE1ID09PSAwKSAge1xuICAgICAgICAgICAgdmFyIGFzcGVjdCA9IG01IC8gbTA7XG4gICAgICAgICAgICB2YXIgek5lYXIgPSAtbTE0IC8gKG0xMCAtIDEpO1xuICAgICAgICAgICAgdmFyIHpGYXIgPSAtbTE0IC8gKG0xMCArIDEpO1xuICAgICAgICAgICAgdmFyIGZhclkgPSAtekZhciAvIG01O1xuICAgICAgICAgICAgdmFyIG5lYXJZID0gLXpOZWFyIC8gbTU7XG4gICAgICAgICAgICAvLyBVcGRhdGUgYm91bmRpbmcgYm94XG4gICAgICAgICAgICBib3VuZGluZ0JveC5taW4uc2V0KC1mYXJZICogYXNwZWN0LCAtZmFyWSwgekZhcik7XG4gICAgICAgICAgICBib3VuZGluZ0JveC5tYXguc2V0KGZhclkgKiBhc3BlY3QsIGZhclksIHpOZWFyKTtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB2ZXJ0aWNlc1xuICAgICAgICAgICAgdmFyIHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcbiAgICAgICAgICAgIC8vLS0tIG1pbiB6XG4gICAgICAgICAgICAvLyBtaW4geFxuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1swXSwgLWZhclkgKiBhc3BlY3QsIC1mYXJZLCB6RmFyKTtcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbMV0sIC1mYXJZICogYXNwZWN0LCBmYXJZLCB6RmFyKTtcbiAgICAgICAgICAgIC8vIG1heCB4XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzJdLCBmYXJZICogYXNwZWN0LCAtZmFyWSwgekZhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzNdLCBmYXJZICogYXNwZWN0LCBmYXJZLCB6RmFyKTtcbiAgICAgICAgICAgIC8vLS0gbWF4IHpcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbNF0sIC1uZWFyWSAqIGFzcGVjdCwgLW5lYXJZLCB6TmVhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzVdLCAtbmVhclkgKiBhc3BlY3QsIG5lYXJZLCB6TmVhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzZdLCBuZWFyWSAqIGFzcGVjdCwgLW5lYXJZLCB6TmVhcik7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzddLCBuZWFyWSAqIGFzcGVjdCwgbmVhclksIHpOZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gT3J0aG9ncmFwaGljIHByb2plY3Rpb25cbiAgICAgICAgICAgIHZhciBsZWZ0ID0gKC0xIC0gbTEyKSAvIG0wO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKDEgLSBtMTIpIC8gbTA7XG4gICAgICAgICAgICB2YXIgdG9wID0gKDEgLSBtMTMpIC8gbTU7XG4gICAgICAgICAgICB2YXIgYm90dG9tID0gKC0xIC0gbTEzKSAvIG01O1xuICAgICAgICAgICAgdmFyIG5lYXIgPSAoLTEgLSBtMTQpIC8gbTEwO1xuICAgICAgICAgICAgdmFyIGZhciA9ICgxIC0gbTE0KSAvIG0xMDtcblxuXG4gICAgICAgICAgICBib3VuZGluZ0JveC5taW4uc2V0KE1hdGgubWluKGxlZnQsIHJpZ2h0KSwgTWF0aC5taW4oYm90dG9tLCB0b3ApLCBNYXRoLm1pbihmYXIsIG5lYXIpKTtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94Lm1heC5zZXQoTWF0aC5tYXgocmlnaHQsIGxlZnQpLCBNYXRoLm1heCh0b3AsIGJvdHRvbSksIE1hdGgubWF4KG5lYXIsIGZhcikpO1xuXG4gICAgICAgICAgICB2YXIgbWluID0gYm91bmRpbmdCb3gubWluLmFycmF5O1xuICAgICAgICAgICAgdmFyIG1heCA9IGJvdW5kaW5nQm94Lm1heC5hcnJheTtcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG4gICAgICAgICAgICAvLy0tLSBtaW4gelxuICAgICAgICAgICAgLy8gbWluIHhcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbMF0sIG1pblswXSwgbWluWzFdLCBtaW5bMl0pO1xuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1sxXSwgbWluWzBdLCBtYXhbMV0sIG1pblsyXSk7XG4gICAgICAgICAgICAvLyBtYXggeFxuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1syXSwgbWF4WzBdLCBtaW5bMV0sIG1pblsyXSk7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzNdLCBtYXhbMF0sIG1heFsxXSwgbWluWzJdKTtcbiAgICAgICAgICAgIC8vLS0gbWF4IHpcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbNF0sIG1pblswXSwgbWluWzFdLCBtYXhbMl0pO1xuICAgICAgICAgICAgdmVjM1NldCh2ZXJ0aWNlc1s1XSwgbWluWzBdLCBtYXhbMV0sIG1heFsyXSk7XG4gICAgICAgICAgICB2ZWMzU2V0KHZlcnRpY2VzWzZdLCBtYXhbMF0sIG1pblsxXSwgbWF4WzJdKTtcbiAgICAgICAgICAgIHZlYzNTZXQodmVydGljZXNbN10sIG1heFswXSwgbWF4WzFdLCBtYXhbMl0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFwcGx5IGEgYWZmaW5lIHRyYW5zZm9ybSBtYXRyaXggYW5kIHNldCB0byB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94XG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICovXG4gICAgZ2V0VHJhbnNmb3JtZWRCb3VuZGluZ0JveDogKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciB0bXBWZWMzID0gdmVjMy5jcmVhdGUoKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYmJveCwgbWF0cml4KSB7XG4gICAgICAgICAgICB2YXIgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xuXG4gICAgICAgICAgICB2YXIgbTQgPSBtYXRyaXguYXJyYXk7XG4gICAgICAgICAgICB2YXIgbWluID0gYmJveC5taW47XG4gICAgICAgICAgICB2YXIgbWF4ID0gYmJveC5tYXg7XG4gICAgICAgICAgICB2YXIgbWluQXJyID0gbWluLmFycmF5O1xuICAgICAgICAgICAgdmFyIG1heEFyciA9IG1heC5hcnJheTtcbiAgICAgICAgICAgIHZhciB2ID0gdmVydGljZXNbMF07XG4gICAgICAgICAgICB2ZWMzVHJhbmZvcm1NYXQ0KHRtcFZlYzMsIHYsIG00KTtcbiAgICAgICAgICAgIHZlYzNDb3B5KG1pbkFyciwgdG1wVmVjMyk7XG4gICAgICAgICAgICB2ZWMzQ29weShtYXhBcnIsIHRtcFZlYzMpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgICAgIHYgPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgICAgICAgICB2ZWMzVHJhbmZvcm1NYXQ0KHRtcFZlYzMsIHYsIG00KTtcblxuICAgICAgICAgICAgICAgIG1pbkFyclswXSA9IG1hdGhNaW4odG1wVmVjM1swXSwgbWluQXJyWzBdKTtcbiAgICAgICAgICAgICAgICBtaW5BcnJbMV0gPSBtYXRoTWluKHRtcFZlYzNbMV0sIG1pbkFyclsxXSk7XG4gICAgICAgICAgICAgICAgbWluQXJyWzJdID0gbWF0aE1pbih0bXBWZWMzWzJdLCBtaW5BcnJbMl0pO1xuXG4gICAgICAgICAgICAgICAgbWF4QXJyWzBdID0gbWF0aE1heCh0bXBWZWMzWzBdLCBtYXhBcnJbMF0pO1xuICAgICAgICAgICAgICAgIG1heEFyclsxXSA9IG1hdGhNYXgodG1wVmVjM1sxXSwgbWF4QXJyWzFdKTtcbiAgICAgICAgICAgICAgICBtYXhBcnJbMl0gPSBtYXRoTWF4KHRtcFZlYzNbMl0sIG1heEFyclsyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1pbi5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgbWF4Ll9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiBiYm94O1xuICAgICAgICB9O1xuICAgIH0pICgpXG59O1xuZXhwb3J0IGRlZmF1bHQgRnJ1c3R1bTtcbiIsImltcG9ydCBWZWN0b3IzIGZyb20gJy4vVmVjdG9yMyc7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcblxudmFyIEVQU0lMT04gPSAxZS01O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5SYXlcbiAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IFtvcmlnaW5dXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbZGlyZWN0aW9uXVxuICovXG52YXIgUmF5ID0gZnVuY3Rpb24gKG9yaWdpbiwgZGlyZWN0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luIHx8IG5ldyBWZWN0b3IzKCk7XG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8IG5ldyBWZWN0b3IzKCk7XG59O1xuXG5SYXkucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IFJheSxcblxuICAgIC8vIGh0dHA6Ly93d3cuc2lnZ3JhcGgub3JnL2VkdWNhdGlvbi9tYXRlcmlhbHMvSHlwZXJHcmFwaC9yYXl0cmFjZS9yYXlwbGFuZV9pbnRlcnNlY3Rpb24uaHRtXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludCBiZXR3ZWVuIHJheSBhbmQgYSBnaXZlIHBsYW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlBsYW5lfSBwbGFuZVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IzfSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAocGxhbmUsIG91dCkge1xuICAgICAgICB2YXIgcG4gPSBwbGFuZS5ub3JtYWwuYXJyYXk7XG4gICAgICAgIHZhciBkID0gcGxhbmUuZGlzdGFuY2U7XG4gICAgICAgIHZhciBybyA9IHRoaXMub3JpZ2luLmFycmF5O1xuICAgICAgICB2YXIgcmQgPSB0aGlzLmRpcmVjdGlvbi5hcnJheTtcblxuICAgICAgICB2YXIgZGl2aWRlciA9IHZlYzMuZG90KHBuLCByZCk7XG4gICAgICAgIC8vIHJheSBpcyBwYXJhbGxlbCB0byB0aGUgcGxhbmVcbiAgICAgICAgaWYgKGRpdmlkZXIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3V0KSB7XG4gICAgICAgICAgICBvdXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ID0gKHZlYzMuZG90KHBuLCBybykgLSBkKSAvIGRpdmlkZXI7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQob3V0LmFycmF5LCBybywgcmQsIC10KTtcbiAgICAgICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1pcnJvciB0aGUgcmF5IGFnYWluc3QgcGxhbmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguUGxhbmV9IHBsYW5lXG4gICAgICovXG4gICAgbWlycm9yQWdhaW5zdFBsYW5lOiBmdW5jdGlvbiAocGxhbmUpIHtcbiAgICAgICAgLy8gRGlzdGFuY2UgdG8gcGxhbmVcbiAgICAgICAgdmFyIGQgPSB2ZWMzLmRvdChwbGFuZS5ub3JtYWwuYXJyYXksIHRoaXMuZGlyZWN0aW9uLmFycmF5KTtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZCh0aGlzLmRpcmVjdGlvbi5hcnJheSwgdGhpcy5kaXJlY3Rpb24uYXJyYXksIHBsYW5lLm5vcm1hbC5hcnJheSwgLWQgKiAyKTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24uX2RpcnR5ID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZGlzdGFuY2VUb1BvaW50OiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgICAgIHZlYzMuc3ViKHYsIHBvaW50LCB0aGlzLm9yaWdpbi5hcnJheSk7XG4gICAgICAgICAgICAvLyBEaXN0YW5jZSBmcm9tIHByb2plY3Rpb24gcG9pbnQgdG8gb3JpZ2luXG4gICAgICAgICAgICB2YXIgYiA9IHZlYzMuZG90KHYsIHRoaXMuZGlyZWN0aW9uLmFycmF5KTtcbiAgICAgICAgICAgIGlmIChiIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzLmRpc3RhbmNlKHRoaXMub3JpZ2luLmFycmF5LCBwb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTcXVhcmVkIGRpc3RhbmNlIGZyb20gY2VudGVyIHRvIG9yaWdpblxuICAgICAgICAgICAgdmFyIGMyID0gdmVjMy5sZW5TcXVhcmVkKHYpO1xuICAgICAgICAgICAgLy8gU3F1YXJlZCBkaXN0YW5jZSBmcm9tIGNlbnRlciB0byBwcm9qZWN0aW9uIHBvaW50XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGMyIC0gYiAqIGIpO1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uIHBvaW50IGJldHdlZW4gcmF5IGFuZCBzcGhlcmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gY2VudGVyXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSByYWRpdXNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gb3V0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgaW50ZXJzZWN0U3BoZXJlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2VudGVyLCByYWRpdXMsIG91dCkge1xuICAgICAgICAgICAgdmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luLmFycmF5O1xuICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uLmFycmF5O1xuICAgICAgICAgICAgY2VudGVyID0gY2VudGVyLmFycmF5O1xuICAgICAgICAgICAgdmVjMy5zdWIodiwgY2VudGVyLCBvcmlnaW4pO1xuICAgICAgICAgICAgLy8gRGlzdGFuY2UgZnJvbSBwcm9qZWN0aW9uIHBvaW50IHRvIG9yaWdpblxuICAgICAgICAgICAgdmFyIGIgPSB2ZWMzLmRvdCh2LCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgLy8gU3F1YXJlZCBkaXN0YW5jZSBmcm9tIGNlbnRlciB0byBvcmlnaW5cbiAgICAgICAgICAgIHZhciBjMiA9IHZlYzMuc3F1YXJlZExlbmd0aCh2KTtcbiAgICAgICAgICAgIC8vIFNxdWFyZWQgZGlzdGFuY2UgZnJvbSBjZW50ZXIgdG8gcHJvamVjdGlvbiBwb2ludFxuICAgICAgICAgICAgdmFyIGQyID0gYzIgLSBiICogYjtcblxuICAgICAgICAgICAgdmFyIHIyID0gcmFkaXVzICogcmFkaXVzO1xuICAgICAgICAgICAgLy8gTm8gaW50ZXJzZWN0aW9uXG4gICAgICAgICAgICBpZiAoZDIgPiByMikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGEgPSBNYXRoLnNxcnQocjIgLSBkMik7XG4gICAgICAgICAgICAvLyBGaXJzdCBpbnRlcnNlY3QgcG9pbnRcbiAgICAgICAgICAgIHZhciB0MCA9IGIgLSBhO1xuICAgICAgICAgICAgLy8gU2Vjb25kIGludGVyc2VjdCBwb2ludFxuICAgICAgICAgICAgdmFyIHQxID0gYiArIGE7XG5cbiAgICAgICAgICAgIGlmICghb3V0KSB7XG4gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0MCA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodDEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIG9yaWdpbiwgZGlyZWN0aW9uLCB0MSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChvdXQuYXJyYXksIG9yaWdpbiwgZGlyZWN0aW9uLCB0MCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgLy8gaHR0cDovL3d3dy5zY3JhdGNoYXBpeGVsLmNvbS9sZXNzb25zLzNkLWJhc2ljLWxlc3NvbnMvbGVzc29uLTctaW50ZXJzZWN0aW5nLXNpbXBsZS1zaGFwZXMvcmF5LWJveC1pbnRlcnNlY3Rpb24vXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludCBiZXR3ZWVuIHJheSBhbmQgYm91bmRpbmcgYm94XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9IGJib3hcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIGludGVyc2VjdEJvdW5kaW5nQm94OiBmdW5jdGlvbiAoYmJveCwgb3V0KSB7XG4gICAgICAgIHZhciBkaXIgPSB0aGlzLmRpcmVjdGlvbi5hcnJheTtcbiAgICAgICAgdmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luLmFycmF5O1xuICAgICAgICB2YXIgbWluID0gYmJveC5taW4uYXJyYXk7XG4gICAgICAgIHZhciBtYXggPSBiYm94Lm1heC5hcnJheTtcblxuICAgICAgICB2YXIgaW52ZGlyeCA9IDEgLyBkaXJbMF07XG4gICAgICAgIHZhciBpbnZkaXJ5ID0gMSAvIGRpclsxXTtcbiAgICAgICAgdmFyIGludmRpcnogPSAxIC8gZGlyWzJdO1xuXG4gICAgICAgIHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcbiAgICAgICAgaWYgKGludmRpcnggPj0gMCkge1xuICAgICAgICAgICAgdG1pbiA9IChtaW5bMF0gLSBvcmlnaW5bMF0pICogaW52ZGlyeDtcbiAgICAgICAgICAgIHRtYXggPSAobWF4WzBdIC0gb3JpZ2luWzBdKSAqIGludmRpcng7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0bWF4ID0gKG1pblswXSAtIG9yaWdpblswXSkgKiBpbnZkaXJ4O1xuICAgICAgICAgICAgdG1pbiA9IChtYXhbMF0gLSBvcmlnaW5bMF0pICogaW52ZGlyeDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW52ZGlyeSA+PSAwKSB7XG4gICAgICAgICAgICB0eW1pbiA9IChtaW5bMV0gLSBvcmlnaW5bMV0pICogaW52ZGlyeTtcbiAgICAgICAgICAgIHR5bWF4ID0gKG1heFsxXSAtIG9yaWdpblsxXSkgKiBpbnZkaXJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHltYXggPSAobWluWzFdIC0gb3JpZ2luWzFdKSAqIGludmRpcnk7XG4gICAgICAgICAgICB0eW1pbiA9IChtYXhbMV0gLSBvcmlnaW5bMV0pICogaW52ZGlyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgodG1pbiA+IHR5bWF4KSB8fCAodHltaW4gPiB0bWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4pIHtcbiAgICAgICAgICAgIHRtaW4gPSB0eW1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHltYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXgpIHtcbiAgICAgICAgICAgIHRtYXggPSB0eW1heDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZkaXJ6ID49IDApIHtcbiAgICAgICAgICAgIHR6bWluID0gKG1pblsyXSAtIG9yaWdpblsyXSkgKiBpbnZkaXJ6O1xuICAgICAgICAgICAgdHptYXggPSAobWF4WzJdIC0gb3JpZ2luWzJdKSAqIGludmRpcno7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0em1heCA9IChtaW5bMl0gLSBvcmlnaW5bMl0pICogaW52ZGlyejtcbiAgICAgICAgICAgIHR6bWluID0gKG1heFsyXSAtIG9yaWdpblsyXSkgKiBpbnZkaXJ6O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0bWluID4gdHptYXgpIHx8ICh0em1pbiA+IHRtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbikge1xuICAgICAgICAgICAgdG1pbiA9IHR6bWluO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCkge1xuICAgICAgICAgICAgdG1heCA9IHR6bWF4O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0bWF4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4O1xuXG4gICAgICAgIGlmICghb3V0KSB7XG4gICAgICAgICAgICBvdXQgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB9XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQob3V0LmFycmF5LCBvcmlnaW4sIGRpciwgdCk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfSxcblxuICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTSVDMyVCNmxsZXIlRTIlODAlOTNUcnVtYm9yZV9pbnRlcnNlY3Rpb25fYWxnb3JpdGhtXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIGludGVyc2VjdGlvbiBwb2ludCBiZXR3ZWVuIHJheSBhbmQgdGhyZWUgdHJpYW5nbGUgdmVydGljZXNcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBhXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gYlxuICAgICAqIEBwYXJhbSB7Y2xheS5tYXRoLlZlY3RvcjN9IGNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59ICAgICAgICAgICBzaW5nbGVTaWRlZCwgQ1cgdHJpYW5nbGUgd2lsbCBiZSBpZ25vcmVkXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gW291dF1cbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBbYmFyeWNlbnRlcmljXSBiYXJ5Y2VudHJpYyBjb29yZHNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICBpbnRlcnNlY3RUcmlhbmdsZTogKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgZUJBID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgdmFyIGVDQSA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciBBTyA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgIHZhciB2Q3Jvc3MgPSB2ZWMzLmNyZWF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYywgc2luZ2xlU2lkZWQsIG91dCwgYmFyeWNlbnRlcmljKSB7XG4gICAgICAgICAgICB2YXIgZGlyID0gdGhpcy5kaXJlY3Rpb24uYXJyYXk7XG4gICAgICAgICAgICB2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW4uYXJyYXk7XG4gICAgICAgICAgICBhID0gYS5hcnJheTtcbiAgICAgICAgICAgIGIgPSBiLmFycmF5O1xuICAgICAgICAgICAgYyA9IGMuYXJyYXk7XG5cbiAgICAgICAgICAgIHZlYzMuc3ViKGVCQSwgYiwgYSk7XG4gICAgICAgICAgICB2ZWMzLnN1YihlQ0EsIGMsIGEpO1xuXG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHZDcm9zcywgZUNBLCBkaXIpO1xuXG4gICAgICAgICAgICB2YXIgZGV0ID0gdmVjMy5kb3QoZUJBLCB2Q3Jvc3MpO1xuXG4gICAgICAgICAgICBpZiAoc2luZ2xlU2lkZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0ID4gLUVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGRldCA+IC1FUFNJTE9OICYmIGRldCA8IEVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZWMzLnN1YihBTywgb3JpZ2luLCBhKTtcbiAgICAgICAgICAgIHZhciB1ID0gdmVjMy5kb3QodkNyb3NzLCBBTykgLyBkZXQ7XG4gICAgICAgICAgICBpZiAodSA8IDAgfHwgdSA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVjMy5jcm9zcyh2Q3Jvc3MsIGVCQSwgQU8pO1xuICAgICAgICAgICAgdmFyIHYgPSB2ZWMzLmRvdChkaXIsIHZDcm9zcykgLyBkZXQ7XG5cbiAgICAgICAgICAgIGlmICh2IDwgMCB8fCB2ID4gMSB8fCAodSArIHYgPiAxKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHZDcm9zcywgZUJBLCBlQ0EpO1xuICAgICAgICAgICAgdmFyIHQgPSAtdmVjMy5kb3QoQU8sIHZDcm9zcykgLyBkZXQ7XG5cbiAgICAgICAgICAgIGlmICh0IDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW91dCkge1xuICAgICAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmFyeWNlbnRlcmljKSB7XG4gICAgICAgICAgICAgICAgVmVjdG9yMy5zZXQoYmFyeWNlbnRlcmljLCAoMSAtIHUgLSB2KSwgdSwgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZWMzLnNjYWxlQW5kQWRkKG91dC5hcnJheSwgb3JpZ2luLCBkaXIsIHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBhZmZpbmUgdHJhbnNmb3JtIG1hdHJpeCB0byB0aGUgcmF5XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDR9IG1hdHJpeFxuICAgICAqL1xuICAgIGFwcGx5VHJhbnNmb3JtOiBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgICAgIFZlY3RvcjMuYWRkKHRoaXMuZGlyZWN0aW9uLCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5vcmlnaW4pO1xuICAgICAgICBWZWN0b3IzLnRyYW5zZm9ybU1hdDQodGhpcy5vcmlnaW4sIHRoaXMub3JpZ2luLCBtYXRyaXgpO1xuICAgICAgICBWZWN0b3IzLnRyYW5zZm9ybU1hdDQodGhpcy5kaXJlY3Rpb24sIHRoaXMuZGlyZWN0aW9uLCBtYXRyaXgpO1xuXG4gICAgICAgIFZlY3RvcjMuc3ViKHRoaXMuZGlyZWN0aW9uLCB0aGlzLmRpcmVjdGlvbiwgdGhpcy5vcmlnaW4pO1xuICAgICAgICBWZWN0b3IzLm5vcm1hbGl6ZSh0aGlzLmRpcmVjdGlvbiwgdGhpcy5kaXJlY3Rpb24pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3B5IHZhbHVlcyBmcm9tIGFub3RoZXIgcmF5XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguUmF5fSByYXlcbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAocmF5KSB7XG4gICAgICAgIFZlY3RvcjMuY29weSh0aGlzLm9yaWdpbiwgcmF5Lm9yaWdpbik7XG4gICAgICAgIFZlY3RvcjMuY29weSh0aGlzLmRpcmVjdGlvbiwgcmF5LmRpcmVjdGlvbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IHJheVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5SYXl9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJheSA9IG5ldyBSYXkoKTtcbiAgICAgICAgcmF5LmNvcHkodGhpcyk7XG4gICAgICAgIHJldHVybiByYXk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmF5O1xuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBGcnVzdHVtIGZyb20gJy4vbWF0aC9GcnVzdHVtJztcbmltcG9ydCBSYXkgZnJvbSAnLi9tYXRoL1JheSc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG52YXIgdmVjNCA9IGdsTWF0cml4LnZlYzQ7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuQ2FtZXJhXG4gKiBAZXh0ZW5kcyBjbGF5Lk5vZGVcbiAqL1xudmFyIENhbWVyYSA9IE5vZGUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LkNhbWVyYSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgICAgICovXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXg6IG5ldyBNYXRyaXg0KCksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludmVyc2Ugb2YgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguTWF0cml4NH1cbiAgICAgICAgICovXG4gICAgICAgIGludlByb2plY3Rpb25NYXRyaXg6IG5ldyBNYXRyaXg0KCksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFZpZXcgbWF0cml4LCBlcXVhbCB0byBpbnZlcnNlIG9mIGNhbWVyYSdzIHdvcmxkIG1hdHJpeFxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5tYXRoLk1hdHJpeDR9XG4gICAgICAgICAqL1xuICAgICAgICB2aWV3TWF0cml4OiBuZXcgTWF0cml4NCgpLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYW1lcmEgZnJ1c3R1bSBpbiB2aWV3IHNwYWNlXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguRnJ1c3R1bX1cbiAgICAgICAgICovXG4gICAgICAgIGZydXN0dW06IG5ldyBGcnVzdHVtKClcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudXBkYXRlKHRydWUpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5DYW1lcmEucHJvdG90eXBlICovXG57XG5cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgICBOb2RlLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLCBmb3JjZSk7XG4gICAgICAgIE1hdHJpeDQuaW52ZXJ0KHRoaXMudmlld01hdHJpeCwgdGhpcy53b3JsZFRyYW5zZm9ybSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICAgIE1hdHJpeDQuaW52ZXJ0KHRoaXMuaW52UHJvamVjdGlvbk1hdHJpeCwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgICB0aGlzLmZydXN0dW0uc2V0RnJvbVByb2plY3Rpb24odGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGNhbWVyYSB2aWV3IG1hdHJpeFxuICAgICAqL1xuICAgIHNldFZpZXdNYXRyaXg6IGZ1bmN0aW9uICh2aWV3TWF0cml4KSB7XG4gICAgICAgIE1hdHJpeDQuY29weSh0aGlzLnZpZXdNYXRyaXgsIHZpZXdNYXRyaXgpO1xuICAgICAgICBNYXRyaXg0LmludmVydCh0aGlzLndvcmxkVHJhbnNmb3JtLCB2aWV3TWF0cml4KTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2VXb3JsZFRyYW5zZm9ybSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEZWNvbXBvc2UgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICovXG4gICAgZGVjb21wb3NlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge30sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH0gcHJvamVjdGlvbk1hdHJpeFxuICAgICAqL1xuICAgIHNldFByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uIChwcm9qZWN0aW9uTWF0cml4KSB7XG4gICAgICAgIE1hdHJpeDQuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgsIHByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICBNYXRyaXg0LmludmVydCh0aGlzLmludlByb2plY3Rpb25NYXRyaXgsIHByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICB0aGlzLmRlY29tcG9zZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCwgY2FsbGVkIGFmdGVyIHVwZGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHt9LFxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBhIHBpY2tpbmcgcmF5IGZyb20gY2FtZXJhIG5lYXIgcGxhbmUgdG8gZmFyIHBsYW5lXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yMn0gbmRjXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguUmF5fSBbb3V0XVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5SYXl9XG4gICAgICovXG4gICAgY2FzdFJheTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHY0ID0gdmVjNC5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuZGMsIG91dCkge1xuICAgICAgICAgICAgdmFyIHJheSA9IG91dCAhPT0gdW5kZWZpbmVkID8gb3V0IDogbmV3IFJheSgpO1xuICAgICAgICAgICAgdmFyIHggPSBuZGMuYXJyYXlbMF07XG4gICAgICAgICAgICB2YXIgeSA9IG5kYy5hcnJheVsxXTtcbiAgICAgICAgICAgIHZlYzQuc2V0KHY0LCB4LCB5LCAtMSwgMSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodjQsIHY0LCB0aGlzLmludlByb2plY3Rpb25NYXRyaXguYXJyYXkpO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHY0LCB2NCwgdGhpcy53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICB2ZWMzLnNjYWxlKHJheS5vcmlnaW4uYXJyYXksIHY0LCAxIC8gdjRbM10pO1xuXG4gICAgICAgICAgICB2ZWM0LnNldCh2NCwgeCwgeSwgMSwgMSk7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodjQsIHY0LCB0aGlzLmludlByb2plY3Rpb25NYXRyaXguYXJyYXkpO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHY0LCB2NCwgdGhpcy53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICB2ZWMzLnNjYWxlKHY0LCB2NCwgMSAvIHY0WzNdKTtcbiAgICAgICAgICAgIHZlYzMuc3ViKHJheS5kaXJlY3Rpb24uYXJyYXksIHY0LCByYXkub3JpZ2luLmFycmF5KTtcblxuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUocmF5LmRpcmVjdGlvbi5hcnJheSwgcmF5LmRpcmVjdGlvbi5hcnJheSk7XG4gICAgICAgICAgICByYXkuZGlyZWN0aW9uLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICByYXkub3JpZ2luLl9kaXJ0eSA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiByYXk7XG4gICAgICAgIH07XG4gICAgfSkoKVxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAcmV0dXJuIHtjbGF5LkNhbWVyYX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5DYW1lcmEucHJvdG90eXBlXG4gICAgICovXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FtZXJhO1xuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcbmltcG9ydCBMaWdodCBmcm9tICcuL0xpZ2h0JztcbmltcG9ydCBDYW1lcmEgZnJvbSAnLi9DYW1lcmEnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4vbWF0aC9Cb3VuZGluZ0JveCc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5cbnZhciBwcm9ncmFtS2V5Q2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gZ2V0UHJvZ3JhbUtleShsaWdodE51bWJlcnMpIHtcbiAgICB2YXIgZGVmaW5lU3RyID0gW107XG4gICAgdmFyIGxpZ2h0VHlwZXMgPSBPYmplY3Qua2V5cyhsaWdodE51bWJlcnMpO1xuICAgIGxpZ2h0VHlwZXMuc29ydCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlnaHRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGlnaHRUeXBlID0gbGlnaHROdW1iZXJzW2ldO1xuICAgICAgICBkZWZpbmVTdHIucHVzaChsaWdodFR5cGUgKyAnICcgKyBsaWdodE51bWJlcnNbbGlnaHRUeXBlXSk7XG4gICAgfVxuICAgIHZhciBrZXkgPSBkZWZpbmVTdHIuam9pbignXFxuJyk7XG5cbiAgICBpZiAocHJvZ3JhbUtleUNhY2hlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW1LZXlDYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHZhciBpZCA9IHV0aWwuZ2VuR1VJRCgpO1xuICAgIHByb2dyYW1LZXlDYWNoZVtrZXldID0gaWQ7XG4gICAgcmV0dXJuIGlkO1xufVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LlNjZW5lXG4gKiBAZXh0ZW5kcyBjbGF5Lk5vZGVcbiAqL1xudmFyIFNjZW5lID0gTm9kZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuU2NlbmUjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdsb2JhbCBtYXRlcmlhbCBvZiBzY2VuZVxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5NYXRlcmlhbH1cbiAgICAgICAgICovXG4gICAgICAgIG1hdGVyaWFsOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9VcGRhdGU6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wYXF1ZSByZW5kZXJhYmxlIGxpc3QsIGl0IHdpbGwgYmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlJlbmRlcmFibGVbXX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICBvcGFxdWVMaXN0OiBbXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3BhcXVlIHJlbmRlcmFibGUgbGlzdCwgaXQgd2lsbCBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICogQHR5cGUge2NsYXkuUmVuZGVyYWJsZVtdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zcGFyZW50TGlzdDogW10sXG5cbiAgICAgICAgbGlnaHRzOiBbXSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY2VuZSBib3VuZGluZyBib3ggaW4gdmlldyBzcGFjZS5cbiAgICAgICAgICogVXNlZCB3aGVuIGNhbWVyYSBuZWVkcyB0byBhZHVqc3QgdGhlIG5lYXIgYW5kIGZhciBwbGFuZSBhdXRvbWF0aWNhbGx5XG4gICAgICAgICAqIHNvIHRoYXQgdGhlIHZpZXcgZnJ1c3R1bSBjb250YWlucyB0aGUgdmlzaWJsZSBvYmplY3RzIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUuXG4gICAgICAgICAqIE5vdGljZTpcbiAgICAgICAgICogIEl0IGlzIHVwZGF0ZWQgYWZ0ZXIgcmVuZGVyaW5nIChpbiB0aGUgc3RlcCBvZiBmcnVzdHVtIGN1bGxpbmcgcGFzc2luZ2x5KS4gU28gbWF5IGJlIG5vdCBzbyBhY2N1cmF0ZSwgYnV0IHNhdmVzIGEgbG90IG9mIGNhbGN1bGF0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICAgICAqL1xuICAgICAgICB2aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWU6IG5ldyBCb3VuZGluZ0JveCgpLFxuXG4gICAgICAgIC8vIFVuaWZvcm1zIGZvciBzaGFkb3cgbWFwLlxuICAgICAgICBzaGFkb3dVbmlmb3Jtczoge30sXG5cbiAgICAgICAgX2NhbWVyYUxpc3Q6IFtdLFxuXG4gICAgICAgIC8vIFByb3BlcnRpZXMgdG8gc2F2ZSB0aGUgbGlnaHQgaW5mb3JtYXRpb24gaW4gdGhlIHNjZW5lXG4gICAgICAgIC8vIFdpbGwgYmUgc2V0IGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAgICAgX2xpZ2h0VW5pZm9ybXM6IHt9LFxuXG4gICAgICAgIF9wcmV2aW91c0xpZ2h0TnVtYmVyOiB7fSxcblxuICAgICAgICBfbGlnaHROdW1iZXI6IHtcbiAgICAgICAgICAgIC8vIGdyb3VwSWQ6IHtcbiAgICAgICAgICAgICAgICAvLyBQT0lOVF9MSUdIVDogMCxcbiAgICAgICAgICAgICAgICAvLyBESVJFQ1RJT05BTF9MSUdIVDogMCxcbiAgICAgICAgICAgICAgICAvLyBTUE9UX0xJR0hUOiAwLFxuICAgICAgICAgICAgICAgIC8vIEFNQklFTlRfTElHSFQ6IDAsXG4gICAgICAgICAgICAgICAgLy8gQU1CSUVOVF9TSF9MSUdIVDogMFxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9saWdodFByb2dyYW1LZXlzOiB7fSxcblxuICAgICAgICBfb3BhcXVlT2JqZWN0Q291bnQ6IDAsXG4gICAgICAgIF90cmFuc3BhcmVudE9iamVjdENvdW50OiAwLFxuXG4gICAgICAgIF9ub2RlUmVwb3NpdG9yeToge30sXG5cbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3NjZW5lID0gdGhpcztcbn0sXG4vKiogQGxlbmRzIGNsYXkuU2NlbmUucHJvdG90eXBlLiAqL1xue1xuICAgIC8qKlxuICAgICAqIEFkZCBub2RlIHRvIHNjZW5lXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAgICovXG4gICAgYWRkVG9TY2VuZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDYW1lcmEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYW1lcmFMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZvdW5kIG11bHRpcGxlIGNhbWVyYSBpbiBvbmUgc2NlbmUuIFVzZSB0aGUgZmlzdCBvbmUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFMaXN0LnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fbm9kZVJlcG9zaXRvcnlbbm9kZS5uYW1lXSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIG5vZGUgZnJvbSBzY2VuZVxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgICAqL1xuICAgIHJlbW92ZUZyb21TY2VuZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDYW1lcmEpIHtcbiAgICAgICAgICAgIHZhciBpZHggPSB0aGlzLl9jYW1lcmFMaXN0LmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYW1lcmFMaXN0LnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ub2RlUmVwb3NpdG9yeVtub2RlLm5hbWVdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBub2RlIGJ5IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtOb2RlfVxuICAgICAqIEBERVBSRUNBVEVEXG4gICAgICovXG4gICAgZ2V0Tm9kZTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vZGVSZXBvc2l0b3J5W25hbWVdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBzY2VuZSBub2RlIHJlY3Vyc2l2ZWx5LCBpbmNsdWRpbmcgbWF0ZXJpYWwsIHNrZWxldG9uLlxuICAgICAqIFNoYWRlciBhbmQgZ2VvbWV0cnkgaW5zdGFuY2VzIHdpbGwgbm90IGJlZW4gY2xvbmVkXG4gICAgICogQHBhcmFtICB7Y2xheS5Ob2RlfSBub2RlXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIGNsb25lTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIG5ld05vZGUgPSBub2RlLmNsb25lKCk7XG4gICAgICAgIHZhciBtYXRlcmlhbHNNYXAgPSB7fTtcblxuICAgICAgICB2YXIgY2xvbmVTa2VsZXRvbiA9IGZ1bmN0aW9uIChjdXJyZW50LCBjdXJyZW50TmV3KSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5za2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnROZXcuc2tlbGV0b24gPSBjdXJyZW50LnNrZWxldG9uLmNsb25lKG5vZGUsIG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnROZXcuam9pbnRzID0gY3VycmVudC5qb2ludHMuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50Lm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxzTWFwW2N1cnJlbnQubWF0ZXJpYWwuX191aWRfX10gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZE1hdDogY3VycmVudC5tYXRlcmlhbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnQuX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2xvbmVTa2VsZXRvbihjdXJyZW50Ll9jaGlsZHJlbltpXSwgY3VycmVudE5ldy5fY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNsb25lU2tlbGV0b24obm9kZSwgbmV3Tm9kZSk7XG5cbiAgICAgICAgZm9yICh2YXIgZ3VpZCBpbiBtYXRlcmlhbHNNYXApIHtcbiAgICAgICAgICAgIG1hdGVyaWFsc01hcFtndWlkXS5uZXdNYXQgPSBtYXRlcmlhbHNNYXBbZ3VpZF0ub2xkTWF0LmNsb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXBsYWNlIG1hdGVyaWFsXG4gICAgICAgIG5ld05vZGUudHJhdmVyc2UoZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Lm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5tYXRlcmlhbCA9IG1hdGVyaWFsc01hcFtjdXJyZW50Lm1hdGVyaWFsLl9fdWlkX19dLm5ld01hdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogU2NlbmUgdXBkYXRlXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gZm9yY2VcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBub3RVcGRhdGVMaWdodHNcbiAgICAgKiAgICAgICAgIFVzZWZ1bCBpbiBkZWZlcnJlZCBwaXBlbGluZVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKGZvcmNlLCBub3RVcGRhdGVMaWdodHMpIHtcbiAgICAgICAgaWYgKCEodGhpcy5hdXRvVXBkYXRlIHx8IGZvcmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZS5jYWxsKHRoaXMsIGZvcmNlKTtcblxuICAgICAgICB2YXIgbGlnaHRzID0gdGhpcy5saWdodHM7XG4gICAgICAgIHZhciBzY2VuZU1hdGVyaWFsVHJhbnNwYXJlbnQgPSB0aGlzLm1hdGVyaWFsICYmIHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQ7XG5cbiAgICAgICAgdGhpcy5fb3BhcXVlT2JqZWN0Q291bnQgPSAwO1xuICAgICAgICB0aGlzLl90cmFuc3BhcmVudE9iamVjdENvdW50ID0gMDtcblxuICAgICAgICBsaWdodHMubGVuZ3RoID0gMDtcblxuICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJMaXN0KHRoaXMsIHNjZW5lTWF0ZXJpYWxUcmFuc3BhcmVudCk7XG5cbiAgICAgICAgdGhpcy5vcGFxdWVMaXN0Lmxlbmd0aCA9IHRoaXMuX29wYXF1ZU9iamVjdENvdW50O1xuICAgICAgICB0aGlzLnRyYW5zcGFyZW50TGlzdC5sZW5ndGggPSB0aGlzLl90cmFuc3BhcmVudE9iamVjdENvdW50O1xuXG4gICAgICAgIC8vIHJlc2V0XG4gICAgICAgIGlmICghbm90VXBkYXRlTGlnaHRzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c0xpZ2h0TnVtYmVyID0gdGhpcy5fbGlnaHROdW1iZXI7XG5cbiAgICAgICAgICAgIHZhciBsaWdodE51bWJlciA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbGlnaHQgPSBsaWdodHNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwID0gbGlnaHQuZ3JvdXA7XG4gICAgICAgICAgICAgICAgaWYgKCFsaWdodE51bWJlcltncm91cF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlnaHROdW1iZXJbZ3JvdXBdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFVzZXIgY2FuIHVzZSBhbnkgdHlwZSBvZiBsaWdodFxuICAgICAgICAgICAgICAgIGxpZ2h0TnVtYmVyW2dyb3VwXVtsaWdodC50eXBlXSA9IGxpZ2h0TnVtYmVyW2dyb3VwXVtsaWdodC50eXBlXSB8fCAwO1xuICAgICAgICAgICAgICAgIGxpZ2h0TnVtYmVyW2dyb3VwXVtsaWdodC50eXBlXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGlnaHROdW1iZXIgPSBsaWdodE51bWJlcjtcblxuICAgICAgICAgICAgZm9yICh2YXIgZ3JvdXBJZCBpbiBsaWdodE51bWJlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0UHJvZ3JhbUtleXNbZ3JvdXBJZF0gPSBnZXRQcm9ncmFtS2V5KGxpZ2h0TnVtYmVyW2dyb3VwSWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGlnaHRVbmlmb3JtcygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldE1haW5DYW1lcmE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbWVyYUxpc3RbMF07XG4gICAgfSxcblxuICAgIC8vIFRyYXZlcnNlIHRoZSBzY2VuZSBhbmQgYWRkIHRoZSByZW5kZXJhYmxlXG4gICAgLy8gb2JqZWN0IHRvIHRoZSByZW5kZXIgbGlzdFxuICAgIF91cGRhdGVSZW5kZXJMaXN0OiBmdW5jdGlvbiAocGFyZW50LCBzY2VuZU1hdGVyaWFsVHJhbnNwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5pbnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50Ll9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Ll9jaGlsZHJlbltpXTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTGlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpZ2h0cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLm1hdGVyaWFsLnRyYW5zcGFyZW50IHx8IHNjZW5lTWF0ZXJpYWxUcmFuc3BhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcGFyZW50TGlzdFt0aGlzLl90cmFuc3BhcmVudE9iamVjdENvdW50KytdID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wYXF1ZUxpc3RbdGhpcy5fb3BhcXVlT2JqZWN0Q291bnQrK10gPSBjaGlsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hpbGQuX2NoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJMaXN0KGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfdXBkYXRlTGlnaHRVbmlmb3JtczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlnaHRzID0gdGhpcy5saWdodHM7XG4gICAgICAgIC8vIFB1dCB0aGUgbGlnaHQgY2FzdCBzaGFkb3cgYmVmb3JlIHRoZSBsaWdodCBub3QgY2FzdCBzaGFkb3dcbiAgICAgICAgbGlnaHRzLnNvcnQobGlnaHRTb3J0RnVuYyk7XG5cbiAgICAgICAgdmFyIGxpZ2h0VW5pZm9ybXMgPSB0aGlzLl9saWdodFVuaWZvcm1zO1xuICAgICAgICBmb3IgKHZhciBncm91cCBpbiBsaWdodFVuaWZvcm1zKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzeW1ib2wgaW4gbGlnaHRVbmlmb3Jtc1tncm91cF0pIHtcbiAgICAgICAgICAgICAgICBsaWdodFVuaWZvcm1zW2dyb3VwXVtzeW1ib2xdLnZhbHVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaWdodHMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgdmFyIGxpZ2h0ID0gbGlnaHRzW2ldO1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gbGlnaHQuZ3JvdXA7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHN5bWJvbCBpbiBsaWdodC51bmlmb3JtVGVtcGxhdGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuaWZvcm1UcGwgPSBsaWdodC51bmlmb3JtVGVtcGxhdGVzW3N5bWJvbF07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdW5pZm9ybVRwbC52YWx1ZShsaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbGlnaHRVbmlmb3Jtc1tncm91cF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlnaHRVbmlmb3Jtc1tncm91cF0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFsaWdodFVuaWZvcm1zW2dyb3VwXVtzeW1ib2xdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0VW5pZm9ybXNbZ3JvdXBdW3N5bWJvbF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbHUgPSBsaWdodFVuaWZvcm1zW2dyb3VwXVtzeW1ib2xdO1xuICAgICAgICAgICAgICAgIGx1LnR5cGUgPSB1bmlmb3JtVHBsLnR5cGUgKyAndic7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh1bmlmb3JtVHBsLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMWknOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbHUudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzRmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdS52YWx1ZS5wdXNoKHZhbHVlW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5rb3duIGxpZ2h0IHVuaWZvcm0gdHlwZSAnICsgdW5pZm9ybVRwbC50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0TGlnaHRHcm91cHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpZ2h0R3JvdXBzID0gW107XG4gICAgICAgIGZvciAodmFyIGdyb3VwSWQgaW4gdGhpcy5fbGlnaHROdW1iZXIpIHtcbiAgICAgICAgICAgIGxpZ2h0R3JvdXBzLnB1c2goZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpZ2h0R3JvdXBzO1xuICAgIH0sXG5cbiAgICBnZXROdW1iZXJDaGFuZ2VkTGlnaHRHcm91cHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpZ2h0R3JvdXBzID0gW107XG4gICAgICAgIGZvciAodmFyIGdyb3VwSWQgaW4gdGhpcy5fbGlnaHROdW1iZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGlnaHROdW1iZXJDaGFuZ2VkKGdyb3VwSWQpKSB7XG4gICAgICAgICAgICAgICAgbGlnaHRHcm91cHMucHVzaChncm91cElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlnaHRHcm91cHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiBsaWdodCBncm91cCBpcyBkaWZmZXJlbnQgd2l0aCBzaW5jZSBsYXN0IGZyYW1lXG4gICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byB1cGRhdGUgc2hhZGVyIGFuZCBzY2VuZSdzIHVuaWZvcm1zIGluIFJlbmRlcmVyLnJlbmRlclxuICAgICAqIEBwYXJhbSB7U2hhZGVyfSBzaGFkZXJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0xpZ2h0TnVtYmVyQ2hhbmdlZDogZnVuY3Rpb24gKGxpZ2h0R3JvdXApIHtcbiAgICAgICAgdmFyIHByZXZMaWdodE51bWJlciA9IHRoaXMuX3ByZXZpb3VzTGlnaHROdW1iZXI7XG4gICAgICAgIHZhciBjdXJyZW50TGlnaHROdW1iZXIgPSB0aGlzLl9saWdodE51bWJlcjtcbiAgICAgICAgLy8gUEVORElORyBQZXJmb3JtYW5jZVxuICAgICAgICBmb3IgKHZhciB0eXBlIGluIGN1cnJlbnRMaWdodE51bWJlcltsaWdodEdyb3VwXSkge1xuICAgICAgICAgICAgaWYgKCFwcmV2TGlnaHROdW1iZXJbbGlnaHRHcm91cF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50TGlnaHROdW1iZXJbbGlnaHRHcm91cF1bdHlwZV0gIT09IHByZXZMaWdodE51bWJlcltsaWdodEdyb3VwXVt0eXBlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIHR5cGUgaW4gcHJldkxpZ2h0TnVtYmVyW2xpZ2h0R3JvdXBdKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRMaWdodE51bWJlcltsaWdodEdyb3VwXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaWdodE51bWJlcltsaWdodEdyb3VwXVt0eXBlXSAhPT0gcHJldkxpZ2h0TnVtYmVyW2xpZ2h0R3JvdXBdW3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2hhZGVyJ3MgbGlnaHQgZ3JvdXAgd2l0aCBzY2VuZSdzXG4gICAgICogQHBhcmFtIHtTaGFkZXJ9IHNoYWRlclxuICAgICAqL1xuICAgIGdldExpZ2h0c051bWJlcnM6IGZ1bmN0aW9uIChsaWdodEdyb3VwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodE51bWJlcltsaWdodEdyb3VwXTtcbiAgICB9LFxuXG4gICAgZ2V0UHJvZ3JhbUtleTogZnVuY3Rpb24gKGxpZ2h0R3JvdXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpZ2h0UHJvZ3JhbUtleXNbbGlnaHRHcm91cF07XG4gICAgfSxcblxuICAgIHNldExpZ2h0VW5pZm9ybXM6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIHNldFVuaWZvcm1zKHVuaWZvcm1zLCBwcm9ncmFtLCByZW5kZXJlcikge1xuICAgICAgICAgICAgZm9yICh2YXIgc3ltYm9sIGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGx1ID0gdW5pZm9ybXNbc3ltYm9sXTtcbiAgICAgICAgICAgICAgICBpZiAobHUudHlwZSA9PT0gJ3R2Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0uaGFzVW5pZm9ybShzeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4U2xvdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsdS52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBsdS52YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzbG90ID0gcHJvZ3JhbS50YWtlQ3VycmVudFRleHR1cmVTbG90KHJlbmRlcmVyLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleFNsb3RzLnB1c2goc2xvdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKHJlbmRlcmVyLmdsLCAnMWl2Jywgc3ltYm9sLCB0ZXhTbG90cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0ocmVuZGVyZXIuZ2wsIGx1LnR5cGUsIHN5bWJvbCwgbHUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJvZ3JhbSwgbGlnaHRHcm91cCwgcmVuZGVyZXIpIHtcbiAgICAgICAgICAgIHNldFVuaWZvcm1zKHRoaXMuX2xpZ2h0VW5pZm9ybXNbbGlnaHRHcm91cF0sIHByb2dyYW0sIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIC8vIFNldCBzaGFkb3dzXG4gICAgICAgICAgICBzZXRVbmlmb3Jtcyh0aGlzLnNoYWRvd1VuaWZvcm1zLCBwcm9ncmFtLCByZW5kZXJlcik7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugc2VsZiwgY2xlYXIgYWxsIHRoZSBzY2VuZSBvYmplY3RzXG4gICAgICogQnV0IHJlc291cmNlcyBvZiBnbCBsaWtlIHRleHV0dXJlLCBzaGFkZXIgd2lsbCBub3QgYmUgZGlzcG9zZWQuXG4gICAgICogTW9zdGx5IHlvdSBzaG91bGQgdXNlIGRpc3Bvc2VTY2VuZSBtZXRob2QgaW4gUmVuZGVyZXIgdG8gZG8gZGlzcG9zZS5cbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBudWxsO1xuICAgICAgICB0aGlzLm9wYXF1ZUxpc3QgPSBbXTtcbiAgICAgICAgdGhpcy50cmFuc3BhcmVudExpc3QgPSBbXTtcblxuICAgICAgICB0aGlzLmxpZ2h0cyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX2xpZ2h0VW5pZm9ybXMgPSB7fTtcblxuICAgICAgICB0aGlzLl9saWdodE51bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9ub2RlUmVwb3NpdG9yeSA9IHt9O1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBsaWdodFNvcnRGdW5jKGEsIGIpIHtcbiAgICBpZiAoYi5jYXN0U2hhZG93ICYmICFhLmNhc3RTaGFkb3cpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY2VuZTtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4vY29yZS9CYXNlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgQ2FjaGUgZnJvbSAnLi9jb3JlL0NhY2hlJztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4vbWF0aC9Cb3VuZGluZ0JveCc7XG5cbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcblxudmFyIHZlYzNDcmVhdGUgPSB2ZWMzLmNyZWF0ZTtcbnZhciB2ZWMzQWRkID0gdmVjMy5hZGQ7XG52YXIgdmVjM1NldCA9IHZlYzMuc2V0O1xuXG5mdW5jdGlvbiBnZXRBcnJheUN0b3JCeVR5cGUgKHR5cGUpIHtcbiAgICByZXR1cm4gKHtcbiAgICAgICAgJ2J5dGUnOiB2ZW5kb3IuSW50OEFycmF5LFxuICAgICAgICAndWJ5dGUnOiB2ZW5kb3IuVWludDhBcnJheSxcbiAgICAgICAgJ3Nob3J0JzogdmVuZG9yLkludDE2QXJyYXksXG4gICAgICAgICd1c2hvcnQnOiB2ZW5kb3IuVWludDE2QXJyYXlcbiAgICB9KVt0eXBlXSB8fCB2ZW5kb3IuRmxvYXQzMkFycmF5O1xufVxuXG5mdW5jdGlvbiBtYWtlQXR0cktleShhdHRyTmFtZSkge1xuICAgIHJldHVybiAnYXR0cl8nICsgYXR0ck5hbWU7XG59XG4vKipcbiAqIEdlb21ldHJ5IGF0dHJpYnV0ZVxuICogQGFsaWFzIGNsYXkuR2VvbWV0cnkuQXR0cmlidXRlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlKG5hbWUsIHR5cGUsIHNpemUsIHNlbWFudGljKSB7XG4gICAgLyoqXG4gICAgICogQXR0cmlidXRlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgLyoqXG4gICAgICogQXR0cmlidXRlIHR5cGVcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsgYCdieXRlJ2BcbiAgICAgKiAgKyBgJ3VieXRlJ2BcbiAgICAgKiAgKyBgJ3Nob3J0J2BcbiAgICAgKiAgKyBgJ3VzaG9ydCdgXG4gICAgICogICsgYCdmbG9hdCdgIE1vc3QgY29tbW9ubHkgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgLyoqXG4gICAgICogU2l6ZSBvZiBhdHRyaWJ1dGUgY29tcG9uZW50LiAxIC0gNC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgLyoqXG4gICAgICogU2VtYW50aWMgb2YgdGhpcyBhdHRyaWJ1dGUuXG4gICAgICogUG9zc2libGUgdmFsdWVzOlxuICAgICAqICArIGAnUE9TSVRJT04nYFxuICAgICAqICArIGAnTk9STUFMJ2BcbiAgICAgKiAgKyBgJ0JJTk9STUFMJ2BcbiAgICAgKiAgKyBgJ1RBTkdFTlQnYFxuICAgICAqICArIGAnVEVYQ09PUkQnYFxuICAgICAqICArIGAnVEVYQ09PUkRfMCdgXG4gICAgICogICsgYCdURVhDT09SRF8xJ2BcbiAgICAgKiAgKyBgJ0NPTE9SJ2BcbiAgICAgKiAgKyBgJ0pPSU5UJ2BcbiAgICAgKiAgKyBgJ1dFSUdIVCdgXG4gICAgICpcbiAgICAgKiBJbiBzaGFkZXIsIGF0dHJpYnV0ZSB3aXRoIHNhbWUgc2VtYW50aWMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hcHBlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBgZ2xzbFxuICAgICAqIGF0dHJpYnV0ZSB2ZWMzIHBvczogUE9TSVRJT05cbiAgICAgKiBgYGBcbiAgICAgKiB3aWxsIHVzZSB0aGUgYXR0cmlidXRlIHZhbHVlIHdpdGggc2VtYW50aWMgUE9TSVRJT04gaW4gZ2VvbWV0cnksIG5vIG1hdHRlciB3aGF0IG5hbWUgaXQgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc2VtYW50aWMgPSBzZW1hbnRpYyB8fCAnJztcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAgICogQHR5cGUge1R5cGVkQXJyYXl9XG4gICAgICovXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG5cbiAgICAvLyBJbml0IGdldHRlciBzZXR0ZXJcbiAgICBzd2l0Y2ggKHNpemUpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVbaWR4XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldCA9IGZ1bmN0aW9uIChpZHgsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVtpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ29weSBmcm9tIHNvdXJjZSB0byB0YXJnZXRcbiAgICAgICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVbdGFyZ2V0XSA9IHRoaXMudmFsdWVbdGFyZ2V0XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoaWR4LCBvdXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBvdXRbMF0gPSBhcnJbaWR4ICogMl07XG4gICAgICAgICAgICAgICAgb3V0WzFdID0gYXJyW2lkeCAqIDIgKyAxXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2V0ID0gZnVuY3Rpb24gKGlkeCwgdmFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICAgICAgYXJyW2lkeCAqIDJdID0gdmFsWzBdO1xuICAgICAgICAgICAgICAgIGFycltpZHggKiAyICsgMV0gPSB2YWxbMV07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jb3B5ID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICAgICAgc291cmNlICo9IDI7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ICo9IDI7XG4gICAgICAgICAgICAgICAgYXJyW3RhcmdldF0gPSBhcnJbc291cmNlXTtcbiAgICAgICAgICAgICAgICBhcnJbdGFyZ2V0ICsgMV0gPSBhcnJbc291cmNlICsgMV07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKGlkeCwgb3V0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkeDMgPSBpZHggKiAzO1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIG91dFswXSA9IGFycltpZHgzXTtcbiAgICAgICAgICAgICAgICBvdXRbMV0gPSBhcnJbaWR4MyArIDFdO1xuICAgICAgICAgICAgICAgIG91dFsyXSA9IGFycltpZHgzICsgMl07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldCA9IGZ1bmN0aW9uIChpZHgsIHZhbCkge1xuICAgICAgICAgICAgICAgIHZhciBpZHgzID0gaWR4ICogMztcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBhcnJbaWR4M10gPSB2YWxbMF07XG4gICAgICAgICAgICAgICAgYXJyW2lkeDMgKyAxXSA9IHZhbFsxXTtcbiAgICAgICAgICAgICAgICBhcnJbaWR4MyArIDJdID0gdmFsWzJdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSAqPSAzO1xuICAgICAgICAgICAgICAgIHRhcmdldCAqPSAzO1xuICAgICAgICAgICAgICAgIGFyclt0YXJnZXRdID0gYXJyW3NvdXJjZV07XG4gICAgICAgICAgICAgICAgYXJyW3RhcmdldCArIDFdID0gYXJyW3NvdXJjZSArIDFdO1xuICAgICAgICAgICAgICAgIGFyclt0YXJnZXQgKyAyXSA9IGFycltzb3VyY2UgKyAyXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgdGhpcy5nZXQgPSBmdW5jdGlvbiAoaWR4LCBvdXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaWR4NCA9IGlkeCAqIDQ7XG4gICAgICAgICAgICAgICAgb3V0WzBdID0gYXJyW2lkeDRdO1xuICAgICAgICAgICAgICAgIG91dFsxXSA9IGFycltpZHg0ICsgMV07XG4gICAgICAgICAgICAgICAgb3V0WzJdID0gYXJyW2lkeDQgKyAyXTtcbiAgICAgICAgICAgICAgICBvdXRbM10gPSBhcnJbaWR4NCArIDNdO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBmdW5jdGlvbiAoaWR4LCB2YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaWR4NCA9IGlkeCAqIDQ7XG4gICAgICAgICAgICAgICAgYXJyW2lkeDRdID0gdmFsWzBdO1xuICAgICAgICAgICAgICAgIGFycltpZHg0ICsgMV0gPSB2YWxbMV07XG4gICAgICAgICAgICAgICAgYXJyW2lkeDQgKyAyXSA9IHZhbFsyXTtcbiAgICAgICAgICAgICAgICBhcnJbaWR4NCArIDNdID0gdmFsWzNdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSAqPSA0O1xuICAgICAgICAgICAgICAgIHRhcmdldCAqPSA0O1xuICAgICAgICAgICAgICAgIC8vIGNvcHlXaXRoaW4gaXMgZXh0cmVtZWx5IHNsb3dcbiAgICAgICAgICAgICAgICBhcnJbdGFyZ2V0XSA9IGFycltzb3VyY2VdO1xuICAgICAgICAgICAgICAgIGFyclt0YXJnZXQgKyAxXSA9IGFycltzb3VyY2UgKyAxXTtcbiAgICAgICAgICAgICAgICBhcnJbdGFyZ2V0ICsgMl0gPSBhcnJbc291cmNlICsgMl07XG4gICAgICAgICAgICAgICAgYXJyW3RhcmdldCArIDNdID0gYXJyW3NvdXJjZSArIDNdO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogU2V0IGl0ZW0gdmFsdWUgYXQgZ2l2ZSBpbmRleC4gU2Vjb25kIHBhcmFtZXRlciB2YWwgaXMgbnVtYmVyIGlmIHNpemUgaXMgMVxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBjbGF5Lkdlb21ldHJ5LkF0dHJpYnV0ZSNzZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpZHhcbiAqIEBwYXJhbSB7bnVtYmVyW118bnVtYmVyfSB2YWxcbiAqIEBleGFtcGxlXG4gKiBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykuc2V0KDAsIFsxLCAxLCAxXSk7XG4gKi9cblxuLyoqXG4gKiBHZXQgaXRlbSB2YWx1ZSBhdCBnaXZlIGluZGV4LiBTZWNvbmQgcGFyYW1ldGVyIG91dCBpcyBubyBuZWVkIGlmIHNpemUgaXMgMVxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBjbGF5Lkdlb21ldHJ5LkF0dHJpYnV0ZSNzZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpZHhcbiAqIEBwYXJhbSB7bnVtYmVyW119IFtvdXRdXG4gKiBAZXhhbXBsZVxuICogZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpLmdldCgwLCBvdXQpO1xuICovXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgd2l0aCBnaXZlbiB2ZXJ0ZXggY291bnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuVmVydGV4XG4gKi9cbkF0dHJpYnV0ZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChuVmVydGV4KSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUubGVuZ3RoICE9IG5WZXJ0ZXggKiB0aGlzLnNpemUpIHtcbiAgICAgICAgdmFyIEFycmF5Q29uc3RydWN0b3IgPSBnZXRBcnJheUN0b3JCeVR5cGUodGhpcy50eXBlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKG5WZXJ0ZXggKiB0aGlzLnNpemUpO1xuICAgIH1cbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhdHRyaWJ1dGUgd2l0aCBnaXZlbiBhcnJheS4gV2hpY2ggY2FuIGJlIDEgZGltZW5zaW9uYWwgb3IgMiBkaW1lbnNpb25hbFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAqIEBleGFtcGxlXG4gKiAgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpLmZyb21BcnJheShcbiAqICAgICAgWy0xLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwXVxuICogICk7XG4gKiAgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpLmZyb21BcnJheShcbiAqICAgICAgWyBbLTEsIDAsIDBdLCBbMSwgMCwgMF0sIFswLCAxLCAwXSBdXG4gKiAgKTtcbiAqL1xuQXR0cmlidXRlLnByb3RvdHlwZS5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgQXJyYXlDb25zdHJ1Y3RvciA9IGdldEFycmF5Q3RvckJ5VHlwZSh0aGlzLnR5cGUpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBDb252ZXJ0IDJkIGFycmF5IHRvIGZsYXRcbiAgICBpZiAoYXJyYXlbMF0gJiYgKGFycmF5WzBdLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgdmFsdWUgPSBuZXcgQXJyYXlDb25zdHJ1Y3RvcihhcnJheS5sZW5ndGggKiBzaXplKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtuKytdID0gYXJyYXlbaV1bal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IEFycmF5Q29uc3RydWN0b3IoYXJyYXkpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG59O1xuXG5BdHRyaWJ1dGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oY29weVZhbHVlKSB7XG4gICAgdmFyIHJldCA9IG5ldyBBdHRyaWJ1dGUodGhpcy5uYW1lLCB0aGlzLnR5cGUsIHRoaXMuc2l6ZSwgdGhpcy5zZW1hbnRpYyk7XG4gICAgLy8gRklYTUVcbiAgICBpZiAoY29weVZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybigndG9kbycpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gQXR0cmlidXRlQnVmZmVyKG5hbWUsIHR5cGUsIGJ1ZmZlciwgc2l6ZSwgc2VtYW50aWMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLnNlbWFudGljID0gc2VtYW50aWM7XG5cbiAgICAvLyBUbyBiZSBzZXQgaW4gbWVzaFxuICAgIC8vIHN5bWJvbCBpbiB0aGUgc2hhZGVyXG4gICAgdGhpcy5zeW1ib2wgPSAnJztcblxuICAgIC8vIE5lZWRzIHJlbW92ZSBmbGFnXG4gICAgdGhpcy5uZWVkc1JlbW92ZSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBJbmRpY2VzQnVmZmVyKGJ1ZmZlcikge1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMuY291bnQgPSAwO1xufVxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lkdlb21ldHJ5XG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgR2VvbWV0cnkgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5HZW9tZXRyeSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXR0cmlidXRlcyBvZiBnZW9tZXRyeS4gSW5jbHVkaW5nOlxuICAgICAgICAgKiAgKyBgcG9zaXRpb25gXG4gICAgICAgICAqICArIGB0ZXhjb29yZDBgXG4gICAgICAgICAqICArIGB0ZXhjb29yZDFgXG4gICAgICAgICAqICArIGBub3JtYWxgXG4gICAgICAgICAqICArIGB0YW5nZW50YFxuICAgICAgICAgKiAgKyBgY29sb3JgXG4gICAgICAgICAqICArIGB3ZWlnaHRgXG4gICAgICAgICAqICArIGBqb2ludGBcbiAgICAgICAgICogICsgYGJhcnljZW50cmljYFxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgcG9zaXRpb246IG5ldyBBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgJ2Zsb2F0JywgMywgJ1BPU0lUSU9OJyksXG4gICAgICAgICAgICB0ZXhjb29yZDA6IG5ldyBBdHRyaWJ1dGUoJ3RleGNvb3JkMCcsICdmbG9hdCcsIDIsICdURVhDT09SRF8wJyksXG4gICAgICAgICAgICB0ZXhjb29yZDE6IG5ldyBBdHRyaWJ1dGUoJ3RleGNvb3JkMScsICdmbG9hdCcsIDIsICdURVhDT09SRF8xJyksXG4gICAgICAgICAgICBub3JtYWw6IG5ldyBBdHRyaWJ1dGUoJ25vcm1hbCcsICdmbG9hdCcsIDMsICdOT1JNQUwnKSxcbiAgICAgICAgICAgIHRhbmdlbnQ6IG5ldyBBdHRyaWJ1dGUoJ3RhbmdlbnQnLCAnZmxvYXQnLCA0LCAnVEFOR0VOVCcpLFxuICAgICAgICAgICAgY29sb3I6IG5ldyBBdHRyaWJ1dGUoJ2NvbG9yJywgJ2Zsb2F0JywgNCwgJ0NPTE9SJyksXG4gICAgICAgICAgICAvLyBTa2lubmluZyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAvLyBFYWNoIHZlcnRleCBjYW4gYmUgYmluZCB0byA0IGJvbmVzLCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgLy8gc3VtIG9mIHdlaWdodHMgaXMgMSwgc28gdGhlIHdlaWdodHMgaXMgc3RvcmVkIGluIHZlYzMgYW5kIHRoZSBsYXN0XG4gICAgICAgICAgICAvLyBjYW4gYmUgY2FsY3VsYXRlZCBieSAxLXcueC13Lnktdy56XG4gICAgICAgICAgICB3ZWlnaHQ6IG5ldyBBdHRyaWJ1dGUoJ3dlaWdodCcsICdmbG9hdCcsIDMsICdXRUlHSFQnKSxcbiAgICAgICAgICAgIGpvaW50OiBuZXcgQXR0cmlidXRlKCdqb2ludCcsICdmbG9hdCcsIDQsICdKT0lOVCcpLFxuICAgICAgICAgICAgLy8gRm9yIHdpcmVmcmFtZSBkaXNwbGF5XG4gICAgICAgICAgICAvLyBodHRwOi8vY29kZWZsb3cub3JnL2VudHJpZXMvMjAxMi9hdWcvMDIvZWFzeS13aXJlZnJhbWUtZGlzcGxheS13aXRoLWJhcnljZW50cmljLWNvb3JkaW5hdGVzL1xuICAgICAgICAgICAgYmFyeWNlbnRyaWM6IG5ldyBBdHRyaWJ1dGUoJ2JhcnljZW50cmljJywgJ2Zsb2F0JywgMywgbnVsbCksXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGVkIGJvdW5kaW5nIGJveCBvZiBnZW9tZXRyeS5cbiAgICAgICAgICogQHR5cGUge2NsYXkubWF0aC5Cb3VuZGluZ0JveH1cbiAgICAgICAgICovXG4gICAgICAgIGJvdW5kaW5nQm94OiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2VzIG9mIGdlb21ldHJ5LlxuICAgICAgICAgKiBAdHlwZSB7VWludDE2QXJyYXl8VWludDMyQXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICBpbmRpY2VzOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB2ZXJ0aWNlcyBkYXRhIGR5bmFtaWNhbGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEF0dHJpYnV0ZXMgdmFsdWUgY2FuJ3QgYmUgY2hhbmdlZCBhZnRlciBmaXJzdCByZW5kZXIgaWYgZHlhbm1pYyBpcyBmYWxzZS5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBkeW5hbWljOiB0cnVlLFxuXG4gICAgICAgIF9lbmFibGVkQXR0cmlidXRlczogbnVsbFxuICAgIH07XG59LCBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgY2FjaGVcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBDYWNoZSgpO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlTGlzdCA9IE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcyk7XG59LFxuLyoqIEBsZW5kcyBjbGF5Lkdlb21ldHJ5LnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIE1haW4gYXR0cmlidXRlIHdpbGwgYmUgdXNlZCB0byBjb3VudCB2ZXJ0ZXggbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBtYWluQXR0cmlidXRlOiAncG9zaXRpb24nLFxuICAgIC8qKlxuICAgICAqIFVzZXIgZGVmaW5lZCBwaWNraW5nIGFsZ29yaXRobSBpbnN0ZWFkIG9mIGRlZmF1bHRcbiAgICAgKiB0cmlhbmdsZSByYXkgaW50ZXJzZWN0aW9uXG4gICAgICogeCwgeSBhcmUgTkRDLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAoeCwgeSwgcmVuZGVyZXIsIGNhbWVyYSwgcmVuZGVyYWJsZSwgb3V0KSA9PiBib29sZWFuXG4gICAgICogYGBgXG4gICAgICogQHR5cGUgez9GdW5jdGlvbn1cbiAgICAgKi9cbiAgICBwaWNrOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogVXNlciBkZWZpbmVkIHJheSBwaWNraW5nIGFsZ29yaXRobSBpbnN0ZWFkIG9mIGRlZmF1bHRcbiAgICAgKiB0cmlhbmdsZSByYXkgaW50ZXJzZWN0aW9uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIChyYXk6IGNsYXkubWF0aC5SYXksIHJlbmRlcmFibGU6IGNsYXkuUmVuZGVyYWJsZSwgb3V0OiBBcnJheSkgPT4gYm9vbGVhblxuICAgICAqIGBgYFxuICAgICAqIEB0eXBlIHs/RnVuY3Rpb259XG4gICAgICovXG4gICAgcGlja0J5UmF5OiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGJvdW5kaW5nQm94IG9mIEdlb21ldHJ5XG4gICAgICovXG4gICAgdXBkYXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJib3ggPSB0aGlzLmJvdW5kaW5nQm94O1xuICAgICAgICBpZiAoIWJib3gpIHtcbiAgICAgICAgICAgIGJib3ggPSB0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc0FyciA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZTtcbiAgICAgICAgaWYgKHBvc0FyciAmJiBwb3NBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbWluID0gYmJveC5taW47XG4gICAgICAgICAgICB2YXIgbWF4ID0gYmJveC5tYXg7XG4gICAgICAgICAgICB2YXIgbWluQXJyID0gbWluLmFycmF5O1xuICAgICAgICAgICAgdmFyIG1heEFyciA9IG1heC5hcnJheTtcbiAgICAgICAgICAgIHZlYzMuc2V0KG1pbkFyciwgcG9zQXJyWzBdLCBwb3NBcnJbMV0sIHBvc0FyclsyXSk7XG4gICAgICAgICAgICB2ZWMzLnNldChtYXhBcnIsIHBvc0FyclswXSwgcG9zQXJyWzFdLCBwb3NBcnJbMl0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDM7IGkgPCBwb3NBcnIubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgIHZhciB4ID0gcG9zQXJyW2krK107XG4gICAgICAgICAgICAgICAgdmFyIHkgPSBwb3NBcnJbaSsrXTtcbiAgICAgICAgICAgICAgICB2YXIgeiA9IHBvc0FycltpKytdO1xuICAgICAgICAgICAgICAgIGlmICh4IDwgbWluQXJyWzBdKSB7IG1pbkFyclswXSA9IHg7IH1cbiAgICAgICAgICAgICAgICBpZiAoeSA8IG1pbkFyclsxXSkgeyBtaW5BcnJbMV0gPSB5OyB9XG4gICAgICAgICAgICAgICAgaWYgKHogPCBtaW5BcnJbMl0pIHsgbWluQXJyWzJdID0gejsgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHggPiBtYXhBcnJbMF0pIHsgbWF4QXJyWzBdID0geDsgfVxuICAgICAgICAgICAgICAgIGlmICh5ID4gbWF4QXJyWzFdKSB7IG1heEFyclsxXSA9IHk7IH1cbiAgICAgICAgICAgICAgICBpZiAoeiA+IG1heEFyclsyXSkgeyBtYXhBcnJbMl0gPSB6OyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaW4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1heC5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBNYXJrIGF0dHJpYnV0ZXMgYW5kIGluZGljZXMgaW4gZ2VvbWV0cnkgbmVlZHMgdG8gdXBkYXRlLlxuICAgICAqL1xuICAgIGRpcnR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbmFibGVkQXR0cmlidXRlcyA9IHRoaXMuZ2V0RW5hYmxlZEF0dHJpYnV0ZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eUF0dHJpYnV0ZShlbmFibGVkQXR0cmlidXRlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eUluZGljZXMoKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZEF0dHJpYnV0ZXMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5KCdhbnknKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGluZGljZXMgbmVlZHMgdG8gdXBkYXRlLlxuICAgICAqL1xuICAgIGRpcnR5SW5kaWNlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jYWNoZS5kaXJ0eUFsbCgnaW5kaWNlcycpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogTWFyayB0aGUgYXR0cmlidXRlcyBuZWVkcyB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFthdHRyTmFtZV1cbiAgICAgKi9cbiAgICBkaXJ0eUF0dHJpYnV0ZTogZnVuY3Rpb24gKGF0dHJOYW1lKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5QWxsKG1ha2VBdHRyS2V5KGF0dHJOYW1lKSk7XG4gICAgICAgIHRoaXMuX2NhY2hlLmRpcnR5QWxsKCdhdHRyaWJ1dGVzJyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgaW5kaWNlcyBvZiB0cmlhbmdsZSBhdCBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4XG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gb3V0XG4gICAgICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59XG4gICAgICovXG4gICAgZ2V0VHJpYW5nbGVJbmRpY2VzOiBmdW5jdGlvbiAoaWR4LCBvdXQpIHtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudHJpYW5nbGVDb3VudCAmJiBpZHggPj0gMCkge1xuICAgICAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgICAgICBvdXQgPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgICAgIG91dFswXSA9IGluZGljZXNbaWR4ICogM107XG4gICAgICAgICAgICBvdXRbMV0gPSBpbmRpY2VzW2lkeCAqIDMgKyAxXTtcbiAgICAgICAgICAgIG91dFsyXSA9IGluZGljZXNbaWR4ICogMyArIDJdO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgaW5kaWNlcyBvZiB0cmlhbmdsZSBhdCBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4XG4gICAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyXG4gICAgICovXG4gICAgc2V0VHJpYW5nbGVJbmRpY2VzOiBmdW5jdGlvbiAoaWR4LCBhcnIpIHtcbiAgICAgICAgdmFyIGluZGljZXMgPSB0aGlzLmluZGljZXM7XG4gICAgICAgIGluZGljZXNbaWR4ICogM10gPSBhcnJbMF07XG4gICAgICAgIGluZGljZXNbaWR4ICogMyArIDFdID0gYXJyWzFdO1xuICAgICAgICBpbmRpY2VzW2lkeCAqIDMgKyAyXSA9IGFyclsyXTtcbiAgICB9LFxuXG4gICAgaXNVc2VJbmRpY2VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuaW5kaWNlcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBpbmRpY2VzIGZyb20gYW4gYXJyYXkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICAgKi9cbiAgICBpbml0SW5kaWNlc0Zyb21BcnJheTogZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgdmFyIEFycmF5Q29uc3RydWN0b3IgPSB0aGlzLnZlcnRleENvdW50ID4gMHhmZmZmXG4gICAgICAgICAgICA/IHZlbmRvci5VaW50MzJBcnJheSA6IHZlbmRvci5VaW50MTZBcnJheTtcbiAgICAgICAgLy8gQ29udmVydCAyZCBhcnJheSB0byBmbGF0XG4gICAgICAgIGlmIChhcnJheVswXSAmJiAoYXJyYXlbMF0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICAgICAgdmFyIHNpemUgPSAzO1xuXG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKGFycmF5Lmxlbmd0aCAqIHNpemUpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW24rK10gPSBhcnJheVtpXVtqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKGFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IHZhbHVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGF0dHJpYnV0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VtYW50aWNdXG4gICAgICovXG4gICAgY3JlYXRlQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgdHlwZSwgc2l6ZSwgc2VtYW50aWMpIHtcbiAgICAgICAgdmFyIGF0dHJpYiA9IG5ldyBBdHRyaWJ1dGUobmFtZSwgdHlwZSwgc2l6ZSwgc2VtYW50aWMpO1xuICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzW25hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyaWI7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZUxpc3QucHVzaChuYW1lKTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhdHRyaWJ1dGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqL1xuICAgIHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUxpc3QgPSB0aGlzLl9hdHRyaWJ1dGVMaXN0O1xuICAgICAgICB2YXIgaWR4ID0gYXR0cmlidXRlTGlzdC5pbmRleE9mKG5hbWUpO1xuICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3Quc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXR0cmlidXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lkdlb21ldHJ5LkF0dHJpYnV0ZX1cbiAgICAgKi9cbiAgICBnZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBlbmFibGVkIGF0dHJpYnV0ZXMgbmFtZSBsaXN0XG4gICAgICogQXR0cmlidXRlIHdoaWNoIGhhcyB0aGUgc2FtZSB2ZXJ0ZXggbnVtYmVyIHdpdGggcG9zaXRpb24gaXMgdHJlYXRlZCBhcyBhIGVuYWJsZWQgYXR0cmlidXRlXG4gICAgICogQHJldHVybiB7c3RyaW5nW119XG4gICAgICovXG4gICAgZ2V0RW5hYmxlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gdGhpcy5fZW5hYmxlZEF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVMaXN0ID0gdGhpcy5fYXR0cmlidXRlTGlzdDtcbiAgICAgICAgLy8gQ2FjaGVcbiAgICAgICAgaWYgKGVuYWJsZWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5hYmxlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBuVmVydGV4ID0gdGhpcy52ZXJ0ZXhDb3VudDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTGlzdFtpXTtcbiAgICAgICAgICAgIHZhciBhdHRyaWIgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0cmliLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYi52YWx1ZS5sZW5ndGggPT09IG5WZXJ0ZXggKiBhdHRyaWIuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbmFibGVkQXR0cmlidXRlcyA9IHJlc3VsdDtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXRCdWZmZXJDaHVua3M6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuICAgICAgICB2YXIgaXNBdHRyaWJ1dGVzRGlydHkgPSBjYWNoZS5pc0RpcnR5KCdhdHRyaWJ1dGVzJyk7XG4gICAgICAgIHZhciBpc0luZGljZXNEaXJ0eSA9IGNhY2hlLmlzRGlydHkoJ2luZGljZXMnKTtcbiAgICAgICAgaWYgKGlzQXR0cmlidXRlc0RpcnR5IHx8IGlzSW5kaWNlc0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVCdWZmZXIocmVuZGVyZXIuZ2wsIGlzQXR0cmlidXRlc0RpcnR5LCBpc0luZGljZXNEaXJ0eSk7XG4gICAgICAgICAgICB2YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSB0aGlzLmdldEVuYWJsZWRBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUuZnJlc2gobWFrZUF0dHJLZXkoZW5hYmxlZEF0dHJpYnV0ZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlLmZyZXNoKCdhdHRyaWJ1dGVzJyk7XG4gICAgICAgICAgICBjYWNoZS5mcmVzaCgnaW5kaWNlcycpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlLmZyZXNoKCdhbnknKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldCgnY2h1bmtzJyk7XG4gICAgfSxcblxuICAgIF91cGRhdGVCdWZmZXI6IGZ1bmN0aW9uIChfZ2wsIGlzQXR0cmlidXRlc0RpcnR5LCBpc0luZGljZXNEaXJ0eSkge1xuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgdmFyIGNodW5rcyA9IGNhY2hlLmdldCgnY2h1bmtzJyk7XG4gICAgICAgIHZhciBmaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWNodW5rcykge1xuICAgICAgICAgICAgY2h1bmtzID0gW107XG4gICAgICAgICAgICAvLyBJbnRpYWxpemVcbiAgICAgICAgICAgIGNodW5rc1swXSA9IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVCdWZmZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBpbmRpY2VzQnVmZmVyOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FjaGUucHV0KCdjaHVua3MnLCBjaHVua3MpO1xuICAgICAgICAgICAgZmlyc3RVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNodW5rID0gY2h1bmtzWzBdO1xuICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVycyA9IGNodW5rLmF0dHJpYnV0ZUJ1ZmZlcnM7XG4gICAgICAgIHZhciBpbmRpY2VzQnVmZmVyID0gY2h1bmsuaW5kaWNlc0J1ZmZlcjtcblxuICAgICAgICBpZiAoaXNBdHRyaWJ1dGVzRGlydHkgfHwgZmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVMaXN0ID0gdGhpcy5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVyTWFwID0ge307XG4gICAgICAgICAgICBpZiAoIWZpcnN0VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUJ1ZmZlck1hcFthdHRyaWJ1dGVCdWZmZXJzW2ldLm5hbWVdID0gYXR0cmlidXRlQnVmZmVyc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGSVhNRSBJZiBzb21lIGF0dHJpYnV0ZXMgcmVtb3ZlZFxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhdHRyaWJ1dGVMaXN0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVMaXN0W2tdO1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVySW5mbztcblxuICAgICAgICAgICAgICAgIGlmICghZmlyc3RVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5mbyA9IGF0dHJpYnV0ZUJ1ZmZlck1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJJbmZvLmJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLmlzRGlydHkobWFrZUF0dHJLZXkobmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gdGhleSBhcmUgZGlydHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBCdWZmZXJTdWJEYXRhP1xuICAgICAgICAgICAgICAgICAgICBfZ2wuYmluZEJ1ZmZlcihfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBfZ2wuYnVmZmVyRGF0YShfZ2wuQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGUudmFsdWUsIHRoaXMuZHluYW1pYyA/IGdsZW51bS5EWU5BTUlDX0RSQVcgOiBnbGVudW0uU1RBVElDX0RSQVcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUJ1ZmZlcnNba10gPSBuZXcgQXR0cmlidXRlQnVmZmVyKG5hbWUsIGF0dHJpYnV0ZS50eXBlLCBidWZmZXIsIGF0dHJpYnV0ZS5zaXplLCBhdHRyaWJ1dGUuc2VtYW50aWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIHVudXNlZCBhdHRyaWJ1dGVzIGJ1ZmZlcnMuXG4gICAgICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gazsgaSA8IGF0dHJpYnV0ZUJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBfZ2wuZGVsZXRlQnVmZmVyKGF0dHJpYnV0ZUJ1ZmZlcnNbaV0uYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHJpYnV0ZUJ1ZmZlcnMubGVuZ3RoID0gaztcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNVc2VJbmRpY2VzKCkgJiYgKGlzSW5kaWNlc0RpcnR5IHx8IGZpcnN0VXBkYXRlKSkge1xuICAgICAgICAgICAgaWYgKCFpbmRpY2VzQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgaW5kaWNlc0J1ZmZlciA9IG5ldyBJbmRpY2VzQnVmZmVyKF9nbC5jcmVhdGVCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgY2h1bmsuaW5kaWNlc0J1ZmZlciA9IGluZGljZXNCdWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRpY2VzQnVmZmVyLmNvdW50ID0gdGhpcy5pbmRpY2VzLmxlbmd0aDtcbiAgICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kaWNlc0J1ZmZlci5idWZmZXIpO1xuICAgICAgICAgICAgX2dsLmJ1ZmZlckRhdGEoX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmluZGljZXMsIHRoaXMuZHluYW1pYyA/IGdsZW51bS5EWU5BTUlDX0RSQVcgOiBnbGVudW0uU1RBVElDX0RSQVcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG5vcm1hbHMgcGVyIHZlcnRleC5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZlcnRleENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlO1xuICAgICAgICB2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlO1xuXG4gICAgICAgIGlmICghbm9ybWFscyB8fCBub3JtYWxzLmxlbmd0aCAhPT0gcG9zaXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlID0gbmV3IHZlbmRvci5GbG9hdDMyQXJyYXkocG9zaXRpb25zLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub3JtYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsc1tpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcDEgPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgIHZhciBwMiA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIHAzID0gdmVjM0NyZWF0ZSgpO1xuXG4gICAgICAgIHZhciB2MjEgPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgIHZhciB2MzIgPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIG4gPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIGxlbiA9IGluZGljZXMgPyBpbmRpY2VzLmxlbmd0aCA6IHRoaXMudmVydGV4Q291bnQ7XG4gICAgICAgIHZhciBpMSwgaTIsIGkzO1xuICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGxlbjspIHtcbiAgICAgICAgICAgIGlmIChpbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgaTEgPSBpbmRpY2VzW2YrK107XG4gICAgICAgICAgICAgICAgaTIgPSBpbmRpY2VzW2YrK107XG4gICAgICAgICAgICAgICAgaTMgPSBpbmRpY2VzW2YrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpMSA9IGYrKztcbiAgICAgICAgICAgICAgICBpMiA9IGYrKztcbiAgICAgICAgICAgICAgICBpMyA9IGYrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVjM1NldChwMSwgcG9zaXRpb25zW2kxKjNdLCBwb3NpdGlvbnNbaTEqMysxXSwgcG9zaXRpb25zW2kxKjMrMl0pO1xuICAgICAgICAgICAgdmVjM1NldChwMiwgcG9zaXRpb25zW2kyKjNdLCBwb3NpdGlvbnNbaTIqMysxXSwgcG9zaXRpb25zW2kyKjMrMl0pO1xuICAgICAgICAgICAgdmVjM1NldChwMywgcG9zaXRpb25zW2kzKjNdLCBwb3NpdGlvbnNbaTMqMysxXSwgcG9zaXRpb25zW2kzKjMrMl0pO1xuXG4gICAgICAgICAgICB2ZWMzLnN1Yih2MjEsIHAxLCBwMik7XG4gICAgICAgICAgICB2ZWMzLnN1Yih2MzIsIHAyLCBwMyk7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKG4sIHYyMSwgdjMyKTtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYmUgd2VpZ2h0ZWQgYnkgdGhlIHRyaWFuZ2xlIGFyZWFcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsc1tpMSozK2ldID0gbm9ybWFsc1tpMSozK2ldICsgbltpXTtcbiAgICAgICAgICAgICAgICBub3JtYWxzW2kyKjMraV0gPSBub3JtYWxzW2kyKjMraV0gKyBuW2ldO1xuICAgICAgICAgICAgICAgIG5vcm1hbHNbaTMqMytpXSA9IG5vcm1hbHNbaTMqMytpXSArIG5baV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vcm1hbHMubGVuZ3RoOykge1xuICAgICAgICAgICAgdmVjM1NldChuLCBub3JtYWxzW2ldLCBub3JtYWxzW2krMV0sIG5vcm1hbHNbaSsyXSk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZShuLCBuKTtcbiAgICAgICAgICAgIG5vcm1hbHNbaSsrXSA9IG5bMF07XG4gICAgICAgICAgICBub3JtYWxzW2krK10gPSBuWzFdO1xuICAgICAgICAgICAgbm9ybWFsc1tpKytdID0gblsyXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG5vcm1hbHMgcGVyIGZhY2UuXG4gICAgICovXG4gICAgZ2VuZXJhdGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudmVydGV4Q291bnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1VuaXF1ZVZlcnRleCgpKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlVW5pcXVlVmVydGV4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlO1xuICAgICAgICB2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLnZhbHVlO1xuXG4gICAgICAgIHZhciBwMSA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIHAyID0gdmVjM0NyZWF0ZSgpO1xuICAgICAgICB2YXIgcDMgPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgdmFyIHYyMSA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIHYzMiA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIG4gPSB2ZWMzQ3JlYXRlKCk7XG5cbiAgICAgICAgaWYgKCFub3JtYWxzKSB7XG4gICAgICAgICAgICBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9ucy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW4gPSBpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiB0aGlzLnZlcnRleENvdW50O1xuICAgICAgICB2YXIgaTEsIGkyLCBpMztcbiAgICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCBsZW47KSB7XG4gICAgICAgICAgICBpZiAoaW5kaWNlcykge1xuICAgICAgICAgICAgICAgIGkxID0gaW5kaWNlc1tmKytdO1xuICAgICAgICAgICAgICAgIGkyID0gaW5kaWNlc1tmKytdO1xuICAgICAgICAgICAgICAgIGkzID0gaW5kaWNlc1tmKytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaTEgPSBmKys7XG4gICAgICAgICAgICAgICAgaTIgPSBmKys7XG4gICAgICAgICAgICAgICAgaTMgPSBmKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlYzNTZXQocDEsIHBvc2l0aW9uc1tpMSozXSwgcG9zaXRpb25zW2kxKjMrMV0sIHBvc2l0aW9uc1tpMSozKzJdKTtcbiAgICAgICAgICAgIHZlYzNTZXQocDIsIHBvc2l0aW9uc1tpMiozXSwgcG9zaXRpb25zW2kyKjMrMV0sIHBvc2l0aW9uc1tpMiozKzJdKTtcbiAgICAgICAgICAgIHZlYzNTZXQocDMsIHBvc2l0aW9uc1tpMyozXSwgcG9zaXRpb25zW2kzKjMrMV0sIHBvc2l0aW9uc1tpMyozKzJdKTtcblxuICAgICAgICAgICAgdmVjMy5zdWIodjIxLCBwMSwgcDIpO1xuICAgICAgICAgICAgdmVjMy5zdWIodjMyLCBwMiwgcDMpO1xuICAgICAgICAgICAgdmVjMy5jcm9zcyhuLCB2MjEsIHYzMik7XG5cbiAgICAgICAgICAgIHZlYzMubm9ybWFsaXplKG4sIG4pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICAgICAgICAgIG5vcm1hbHNbaTEqMyArIGldID0gbltpXTtcbiAgICAgICAgICAgICAgICBub3JtYWxzW2kyKjMgKyBpXSA9IG5baV07XG4gICAgICAgICAgICAgICAgbm9ybWFsc1tpMyozICsgaV0gPSBuW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGFuZ2VudHMgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy52ZXJ0ZXhDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5WZXJ0ZXggPSB0aGlzLnZlcnRleENvdW50O1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLnRhbmdlbnQudmFsdWUpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkoblZlcnRleCAqIDQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSBhdHRyaWJ1dGVzLnRleGNvb3JkMC52YWx1ZTtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWU7XG4gICAgICAgIHZhciB0YW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZTtcbiAgICAgICAgdmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZTtcblxuICAgICAgICBpZiAoIXRleGNvb3Jkcykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdHZW9tZXRyeSB3aXRob3V0IHRleGNvb3JkcyBjYW5cXCd0IGdlbmVyYXRlIHRhbmdlbnRzLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRhbjEgPSBbXTtcbiAgICAgICAgdmFyIHRhbjIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuVmVydGV4OyBpKyspIHtcbiAgICAgICAgICAgIHRhbjFbaV0gPSBbMC4wLCAwLjAsIDAuMF07XG4gICAgICAgICAgICB0YW4yW2ldID0gWzAuMCwgMC4wLCAwLjBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNkaXIgPSBbMC4wLCAwLjAsIDAuMF07XG4gICAgICAgIHZhciB0ZGlyID0gWzAuMCwgMC4wLCAwLjBdO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcblxuICAgICAgICB2YXIgbGVuID0gaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogdGhpcy52ZXJ0ZXhDb3VudDtcbiAgICAgICAgdmFyIGkxLCBpMiwgaTM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOykge1xuICAgICAgICAgICAgaWYgKGluZGljZXMpIHtcbiAgICAgICAgICAgICAgICBpMSA9IGluZGljZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpMiA9IGluZGljZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpMyA9IGluZGljZXNbaSsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGkxID0gaSsrO1xuICAgICAgICAgICAgICAgIGkyID0gaSsrO1xuICAgICAgICAgICAgICAgIGkzID0gaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3QxcyA9IHRleGNvb3Jkc1tpMSAqIDJdLFxuICAgICAgICAgICAgICAgIHN0MnMgPSB0ZXhjb29yZHNbaTIgKiAyXSxcbiAgICAgICAgICAgICAgICBzdDNzID0gdGV4Y29vcmRzW2kzICogMl0sXG4gICAgICAgICAgICAgICAgc3QxdCA9IHRleGNvb3Jkc1tpMSAqIDIgKyAxXSxcbiAgICAgICAgICAgICAgICBzdDJ0ID0gdGV4Y29vcmRzW2kyICogMiArIDFdLFxuICAgICAgICAgICAgICAgIHN0M3QgPSB0ZXhjb29yZHNbaTMgKiAyICsgMV0sXG5cbiAgICAgICAgICAgICAgICBwMXggPSBwb3NpdGlvbnNbaTEgKiAzXSxcbiAgICAgICAgICAgICAgICBwMnggPSBwb3NpdGlvbnNbaTIgKiAzXSxcbiAgICAgICAgICAgICAgICBwM3ggPSBwb3NpdGlvbnNbaTMgKiAzXSxcbiAgICAgICAgICAgICAgICBwMXkgPSBwb3NpdGlvbnNbaTEgKiAzICsgMV0sXG4gICAgICAgICAgICAgICAgcDJ5ID0gcG9zaXRpb25zW2kyICogMyArIDFdLFxuICAgICAgICAgICAgICAgIHAzeSA9IHBvc2l0aW9uc1tpMyAqIDMgKyAxXSxcbiAgICAgICAgICAgICAgICBwMXogPSBwb3NpdGlvbnNbaTEgKiAzICsgMl0sXG4gICAgICAgICAgICAgICAgcDJ6ID0gcG9zaXRpb25zW2kyICogMyArIDJdLFxuICAgICAgICAgICAgICAgIHAzeiA9IHBvc2l0aW9uc1tpMyAqIDMgKyAyXTtcblxuICAgICAgICAgICAgdmFyIHgxID0gcDJ4IC0gcDF4LFxuICAgICAgICAgICAgICAgIHgyID0gcDN4IC0gcDF4LFxuICAgICAgICAgICAgICAgIHkxID0gcDJ5IC0gcDF5LFxuICAgICAgICAgICAgICAgIHkyID0gcDN5IC0gcDF5LFxuICAgICAgICAgICAgICAgIHoxID0gcDJ6IC0gcDF6LFxuICAgICAgICAgICAgICAgIHoyID0gcDN6IC0gcDF6O1xuXG4gICAgICAgICAgICB2YXIgczEgPSBzdDJzIC0gc3QxcyxcbiAgICAgICAgICAgICAgICBzMiA9IHN0M3MgLSBzdDFzLFxuICAgICAgICAgICAgICAgIHQxID0gc3QydCAtIHN0MXQsXG4gICAgICAgICAgICAgICAgdDIgPSBzdDN0IC0gc3QxdDtcblxuICAgICAgICAgICAgdmFyIHIgPSAxLjAgLyAoczEgKiB0MiAtIHQxICogczIpO1xuICAgICAgICAgICAgc2RpclswXSA9ICh0MiAqIHgxIC0gdDEgKiB4MikgKiByO1xuICAgICAgICAgICAgc2RpclsxXSA9ICh0MiAqIHkxIC0gdDEgKiB5MikgKiByO1xuICAgICAgICAgICAgc2RpclsyXSA9ICh0MiAqIHoxIC0gdDEgKiB6MikgKiByO1xuXG4gICAgICAgICAgICB0ZGlyWzBdID0gKHMxICogeDIgLSBzMiAqIHgxKSAqIHI7XG4gICAgICAgICAgICB0ZGlyWzFdID0gKHMxICogeTIgLSBzMiAqIHkxKSAqIHI7XG4gICAgICAgICAgICB0ZGlyWzJdID0gKHMxICogejIgLSBzMiAqIHoxKSAqIHI7XG5cbiAgICAgICAgICAgIHZlYzNBZGQodGFuMVtpMV0sIHRhbjFbaTFdLCBzZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMVtpMl0sIHRhbjFbaTJdLCBzZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMVtpM10sIHRhbjFbaTNdLCBzZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMltpMV0sIHRhbjJbaTFdLCB0ZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMltpMl0sIHRhbjJbaTJdLCB0ZGlyKTtcbiAgICAgICAgICAgIHZlYzNBZGQodGFuMltpM10sIHRhbjJbaTNdLCB0ZGlyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG1wID0gdmVjM0NyZWF0ZSgpO1xuICAgICAgICB2YXIgbkNyb3NzVCA9IHZlYzNDcmVhdGUoKTtcbiAgICAgICAgdmFyIG4gPSB2ZWMzQ3JlYXRlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblZlcnRleDsgaSsrKSB7XG4gICAgICAgICAgICBuWzBdID0gbm9ybWFsc1tpICogM107XG4gICAgICAgICAgICBuWzFdID0gbm9ybWFsc1tpICogMyArIDFdO1xuICAgICAgICAgICAgblsyXSA9IG5vcm1hbHNbaSAqIDMgKyAyXTtcbiAgICAgICAgICAgIHZhciB0ID0gdGFuMVtpXTtcblxuICAgICAgICAgICAgLy8gR3JhbS1TY2htaWR0IG9ydGhvZ29uYWxpemVcbiAgICAgICAgICAgIHZlYzMuc2NhbGUodG1wLCBuLCB2ZWMzLmRvdChuLCB0KSk7XG4gICAgICAgICAgICB2ZWMzLnN1Yih0bXAsIHQsIHRtcCk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXAsIHRtcCk7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgaGFuZGVkbmVzcy5cbiAgICAgICAgICAgIHZlYzMuY3Jvc3MobkNyb3NzVCwgbiwgdCk7XG4gICAgICAgICAgICB0YW5nZW50c1tpICogNF0gPSB0bXBbMF07XG4gICAgICAgICAgICB0YW5nZW50c1tpICogNCArIDFdID0gdG1wWzFdO1xuICAgICAgICAgICAgdGFuZ2VudHNbaSAqIDQgKyAyXSA9IHRtcFsyXTtcbiAgICAgICAgICAgIC8vIFBFTkRJTkcgY2FuIGNvbmZpZyA/XG4gICAgICAgICAgICB0YW5nZW50c1tpICogNCArIDNdID0gdmVjMy5kb3QobkNyb3NzVCwgdGFuMltpXSkgPCAwLjAgPyAtMS4wIDogMS4wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgdmVydGljZXMgYXJlIG5vdCBzaGFyZWQgYnkgZGlmZmVyZW50IGluZGljZXMuXG4gICAgICovXG4gICAgaXNVbmlxdWVWZXJ0ZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNVc2VJbmRpY2VzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnRleENvdW50ID09PSB0aGlzLmluZGljZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHVuaXF1ZSB2ZXJ0ZXggZm9yIGVhY2ggaW5kZXguXG4gICAgICovXG4gICAgZ2VuZXJhdGVVbmlxdWVWZXJ0ZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZlcnRleENvdW50IHx8ICF0aGlzLmluZGljZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZGljZXMubGVuZ3RoID4gMHhmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLmluZGljZXMgPSBuZXcgdmVuZG9yLlVpbnQzMkFycmF5KHRoaXMuaW5kaWNlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgICAgdmFyIGluZGljZXMgPSB0aGlzLmluZGljZXM7XG5cbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWVMaXN0ID0gdGhpcy5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgIHZhciBvbGRBdHRyVmFsdWVzID0ge307XG4gICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgYXR0cmlidXRlTmFtZUxpc3QubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZUxpc3RbYV07XG4gICAgICAgICAgICBvbGRBdHRyVmFsdWVzW25hbWVdID0gYXR0cmlidXRlc1tuYW1lXS52YWx1ZTtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0uaW5pdCh0aGlzLmluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJzb3IgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpaSA9IGluZGljZXNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGF0dHJpYnV0ZU5hbWVMaXN0Lmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lTGlzdFthXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzW25hbWVdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gYXR0cmlidXRlc1tuYW1lXS5zaXplO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzaXplOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlbY3Vyc29yICogc2l6ZSArIGtdID0gb2xkQXR0clZhbHVlc1tuYW1lXVtpaSAqIHNpemUgKyBrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRpY2VzW2ldID0gY3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIGZvciB3aXJlZnJhbWUgZHJhdy5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZUJhcnljZW50cmljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy52ZXJ0ZXhDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVW5pcXVlVmVydGV4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVVbmlxdWVWZXJ0ZXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgICAgICB2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLmJhcnljZW50cmljLnZhbHVlO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgLy8gQWxyZWFkeSBleGlzdGVkO1xuICAgICAgICBpZiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoID09PSBpbmRpY2VzLmxlbmd0aCAqIDMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhcnJheSA9IGF0dHJpYnV0ZXMuYmFyeWNlbnRyaWMudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KGluZGljZXMubGVuZ3RoICogMyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAoaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogdGhpcy52ZXJ0ZXhDb3VudCAvIDMpOykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaWkgPSBpbmRpY2VzID8gaW5kaWNlc1tpKytdIDogKGkgKiAzICsgaik7XG4gICAgICAgICAgICAgICAgYXJyYXlbaWkgKiAzICsgal0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgdHJhbnNmb3JtIHRvIGdlb21ldHJ5IGF0dHJpYnV0ZXMuXG4gICAgICogQHBhcmFtIHtjbGF5Lm1hdGguTWF0cml4NH0gbWF0cml4XG4gICAgICovXG4gICAgYXBwbHlUcmFuc2Zvcm06IGZ1bmN0aW9uIChtYXRyaXgpIHtcblxuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWU7XG4gICAgICAgIHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwudmFsdWU7XG4gICAgICAgIHZhciB0YW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC52YWx1ZTtcblxuICAgICAgICBtYXRyaXggPSBtYXRyaXguYXJyYXk7XG4gICAgICAgIC8vIE5vcm1hbCBNYXRyaXhcbiAgICAgICAgdmFyIGludmVyc2VUcmFuc3Bvc2VNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LmludmVydChpbnZlcnNlVHJhbnNwb3NlTWF0cml4LCBtYXRyaXgpO1xuICAgICAgICBtYXQ0LnRyYW5zcG9zZShpbnZlcnNlVHJhbnNwb3NlTWF0cml4LCBpbnZlcnNlVHJhbnNwb3NlTWF0cml4KTtcblxuICAgICAgICB2YXIgdmVjM1RyYW5zZm9ybU1hdDQgPSB2ZWMzLnRyYW5zZm9ybU1hdDQ7XG4gICAgICAgIHZhciB2ZWMzRm9yRWFjaCA9IHZlYzMuZm9yRWFjaDtcbiAgICAgICAgdmVjM0ZvckVhY2gocG9zaXRpb25zLCAzLCAwLCBudWxsLCB2ZWMzVHJhbnNmb3JtTWF0NCwgbWF0cml4KTtcbiAgICAgICAgaWYgKG5vcm1hbHMpIHtcbiAgICAgICAgICAgIHZlYzNGb3JFYWNoKG5vcm1hbHMsIDMsIDAsIG51bGwsIHZlYzNUcmFuc2Zvcm1NYXQ0LCBpbnZlcnNlVHJhbnNwb3NlTWF0cml4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFuZ2VudHMpIHtcbiAgICAgICAgICAgIHZlYzNGb3JFYWNoKHRhbmdlbnRzLCA0LCAwLCBudWxsLCB2ZWMzVHJhbnNmb3JtTWF0NCwgaW52ZXJzZVRyYW5zcG9zZU1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ib3VuZGluZ0JveCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCb3VuZGluZ0JveCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGdlb21ldHJ5IGRhdGEgaW4gR0wgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuICAgICAgICB2YXIgY2h1bmtzID0gY2FjaGUuZ2V0KCdjaHVua3MnKTtcbiAgICAgICAgaWYgKGNodW5rcykge1xuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjaHVua3MubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSBjaHVua3NbY107XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGNodW5rLmF0dHJpYnV0ZUJ1ZmZlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnMgPSBjaHVuay5hdHRyaWJ1dGVCdWZmZXJzW2tdO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5nbC5kZWxldGVCdWZmZXIoYXR0cmlicy5idWZmZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjaHVuay5pbmRpY2VzQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLmdsLmRlbGV0ZUJ1ZmZlcihjaHVuay5pbmRpY2VzQnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlLmRlbGV0ZUNvbnRleHQocmVuZGVyZXIuX191aWRfXyk7XG4gICAgfVxuXG59KTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIC8qKlxuICAgICAqIEBuYW1lIGNsYXkuR2VvbWV0cnkjdmVydGV4Q291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEByZWFkT25seVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShHZW9tZXRyeS5wcm90b3R5cGUsICd2ZXJ0ZXhDb3VudCcsIHtcblxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcblxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtYWluQXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzW3RoaXMubWFpbkF0dHJpYnV0ZV07XG4gICAgICAgICAgICBpZiAoIW1haW5BdHRyaWJ1dGUgfHwgIW1haW5BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYWluQXR0cmlidXRlLnZhbHVlLmxlbmd0aCAvIG1haW5BdHRyaWJ1dGUuc2l6ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBuYW1lIGNsYXkuR2VvbWV0cnkjdHJpYW5nbGVDb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQHJlYWRPbmx5XG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEdlb21ldHJ5LnByb3RvdHlwZSwgJ3RyaWFuZ2xlQ291bnQnLCB7XG5cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgICAgIGlmICghaW5kaWNlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5HZW9tZXRyeS5TVEFUSUNfRFJBVyA9IGdsZW51bS5TVEFUSUNfRFJBVztcbkdlb21ldHJ5LkRZTkFNSUNfRFJBVyA9IGdsZW51bS5EWU5BTUlDX0RSQVc7XG5HZW9tZXRyeS5TVFJFQU1fRFJBVyA9IGdsZW51bS5TVFJFQU1fRFJBVztcblxuR2VvbWV0cnkuQXR0cmlidXRlQnVmZmVyID0gQXR0cmlidXRlQnVmZmVyO1xuR2VvbWV0cnkuSW5kaWNlc0J1ZmZlciA9IEluZGljZXNCdWZmZXI7XG5cbkdlb21ldHJ5LkF0dHJpYnV0ZSA9IEF0dHJpYnV0ZTtcblxuZXhwb3J0IGRlZmF1bHQgR2VvbWV0cnk7XG4iLCJpbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lmdlb21ldHJ5LlBsYW5lXG4gKiBAZXh0ZW5kcyBjbGF5Lkdlb21ldHJ5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0LndpZHRoU2VnbWVudHNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5oZWlnaHRTZWdtZW50c11cbiAqL1xudmFyIFBsYW5lID0gR2VvbWV0cnkuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LlBsYW5lIyAqL1xue1xuICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgd2lkdGhTZWdtZW50czogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodFNlZ21lbnRzOiAxXG59LCBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmJ1aWxkKCk7XG59LFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LlBsYW5lLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEJ1aWxkIHBsYW5lIGdlb21ldHJ5XG4gICAgICovXG4gICAgYnVpbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaGVpZ2h0U2VnbWVudHMgPSB0aGlzLmhlaWdodFNlZ21lbnRzO1xuICAgICAgICB2YXIgd2lkdGhTZWdtZW50cyA9IHRoaXMud2lkdGhTZWdtZW50cztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtdO1xuICAgICAgICB2YXIgbm9ybWFscyA9IFtdO1xuICAgICAgICB2YXIgZmFjZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHkgLyBoZWlnaHRTZWdtZW50cztcbiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDw9IHdpZHRoU2VnbWVudHM7IHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzID0geCAvIHdpZHRoU2VnbWVudHM7XG5cbiAgICAgICAgICAgICAgICBwb3NpdGlvbnMucHVzaChbMiAqIHMgLSAxLCAyICogdCAtIDEsIDBdKTtcbiAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKFtzLCB0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbHMucHVzaChbMCwgMCwgMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeCA8IHdpZHRoU2VnbWVudHMgJiYgeSA8IGhlaWdodFNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0geCArIHkgKiAod2lkdGhTZWdtZW50cyArIDEpO1xuICAgICAgICAgICAgICAgICAgICBmYWNlcy5wdXNoKFtpLCBpICsgMSwgaSArIHdpZHRoU2VnbWVudHMgKyAxXSk7XG4gICAgICAgICAgICAgICAgICAgIGZhY2VzLnB1c2goW2kgKyB3aWR0aFNlZ21lbnRzICsgMSwgaSArIDEsIGkgKyB3aWR0aFNlZ21lbnRzICsgMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24uZnJvbUFycmF5KHBvc2l0aW9ucyk7XG4gICAgICAgIGF0dHJpYnV0ZXMudGV4Y29vcmQwLmZyb21BcnJheSh0ZXhjb29yZHMpO1xuICAgICAgICBhdHRyaWJ1dGVzLm5vcm1hbC5mcm9tQXJyYXkobm9ybWFscyk7XG5cbiAgICAgICAgdGhpcy5pbml0SW5kaWNlc0Zyb21BcnJheShmYWNlcyk7XG5cbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94Lm1pbi5zZXQoLTEsIC0xLCAwKTtcbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveC5tYXguc2V0KDEsIDEsIDApO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBQbGFuZTtcbiIsImltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgUGxhbmUgZnJvbSAnLi9QbGFuZSc7XG5pbXBvcnQgTWF0cml4NCBmcm9tICcuLi9tYXRoL01hdHJpeDQnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBCb3VuZGluZ0JveCBmcm9tICcuLi9tYXRoL0JvdW5kaW5nQm94JztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi4vY29yZS92ZW5kb3InO1xuXG52YXIgcGxhbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5Lmdlb21ldHJ5LkN1YmVcbiAqIEBleHRlbmRzIGNsYXkuR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQud2lkdGhTZWdtZW50c11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0LmhlaWdodFNlZ21lbnRzXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQuZGVwdGhTZWdtZW50c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdC5pbnNpZGVdXG4gKi9cbnZhciBDdWJlID0gR2VvbWV0cnkuZXh0ZW5kKFxuLyoqQGxlbmRzIGNsYXkuZ2VvbWV0cnkuQ3ViZSMgKi9cbntcbiAgICBkeW5hbWljOiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRlcHRoU2VnbWVudHM6IDEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5zaWRlOiBmYWxzZVxufSwgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5idWlsZCgpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5DdWJlLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEJ1aWxkIGN1YmUgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIHBsYW5lcyA9IHtcbiAgICAgICAgICAgICdweCc6IGNyZWF0ZVBsYW5lKCdweCcsIHRoaXMuZGVwdGhTZWdtZW50cywgdGhpcy5oZWlnaHRTZWdtZW50cyksXG4gICAgICAgICAgICAnbngnOiBjcmVhdGVQbGFuZSgnbngnLCB0aGlzLmRlcHRoU2VnbWVudHMsIHRoaXMuaGVpZ2h0U2VnbWVudHMpLFxuICAgICAgICAgICAgJ3B5JzogY3JlYXRlUGxhbmUoJ3B5JywgdGhpcy53aWR0aFNlZ21lbnRzLCB0aGlzLmRlcHRoU2VnbWVudHMpLFxuICAgICAgICAgICAgJ255JzogY3JlYXRlUGxhbmUoJ255JywgdGhpcy53aWR0aFNlZ21lbnRzLCB0aGlzLmRlcHRoU2VnbWVudHMpLFxuICAgICAgICAgICAgJ3B6JzogY3JlYXRlUGxhbmUoJ3B6JywgdGhpcy53aWR0aFNlZ21lbnRzLCB0aGlzLmhlaWdodFNlZ21lbnRzKSxcbiAgICAgICAgICAgICdueic6IGNyZWF0ZVBsYW5lKCdueicsIHRoaXMud2lkdGhTZWdtZW50cywgdGhpcy5oZWlnaHRTZWdtZW50cyksXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGF0dHJMaXN0ID0gWydwb3NpdGlvbicsICd0ZXhjb29yZDAnLCAnbm9ybWFsJ107XG4gICAgICAgIHZhciB2ZXJ0ZXhOdW1iZXIgPSAwO1xuICAgICAgICB2YXIgZmFjZU51bWJlciA9IDA7XG4gICAgICAgIGZvciAodmFyIHBvcyBpbiBwbGFuZXMpIHtcbiAgICAgICAgICAgIHZlcnRleE51bWJlciArPSBwbGFuZXNbcG9zXS52ZXJ0ZXhDb3VudDtcbiAgICAgICAgICAgIGZhY2VOdW1iZXIgKz0gcGxhbmVzW3Bvc10uaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhdHRyTGlzdC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2F0dHJMaXN0W2tdXS5pbml0KHZlcnRleE51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IHZlbmRvci5VaW50MTZBcnJheShmYWNlTnVtYmVyKTtcbiAgICAgICAgdmFyIGZhY2VPZmZzZXQgPSAwO1xuICAgICAgICB2YXIgdmVydGV4T2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgcG9zIGluIHBsYW5lcykge1xuICAgICAgICAgICAgdmFyIHBsYW5lID0gcGxhbmVzW3Bvc107XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGF0dHJMaXN0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gYXR0ckxpc3Rba107XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJBcnJheSA9IHBsYW5lLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBhdHRyU2l6ZSA9IHBsYW5lLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLnNpemU7XG4gICAgICAgICAgICAgICAgdmFyIGlzTm9ybWFsID0gYXR0ck5hbWUgPT09ICdub3JtYWwnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0ckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGF0dHJBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5zaWRlICYmIGlzTm9ybWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IC12YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLnZhbHVlW2kgKyBhdHRyU2l6ZSAqIHZlcnRleE9mZnNldF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbGVuID0gcGxhbmUuaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYW5lLmluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljZXNbaSArIGZhY2VPZmZzZXRdID0gdmVydGV4T2Zmc2V0ICsgcGxhbmUuaW5kaWNlc1t0aGlzLmluc2lkZSA/IChsZW4gLSBpIC0gMSkgOiBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhY2VPZmZzZXQgKz0gcGxhbmUuaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQgKz0gcGxhbmUudmVydGV4Q291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWF4LnNldCgxLCAxLCAxKTtcbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveC5taW4uc2V0KC0xLCAtMSwgLTEpO1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVQbGFuZShwb3MsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzKSB7XG5cbiAgICBwbGFuZU1hdHJpeC5pZGVudGl0eSgpO1xuXG4gICAgdmFyIHBsYW5lID0gbmV3IFBsYW5lKHtcbiAgICAgICAgd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcbiAgICAgICAgaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG4gICAgfSk7XG5cbiAgICBzd2l0Y2gocG9zKSB7XG4gICAgICAgIGNhc2UgJ3B4JzpcbiAgICAgICAgICAgIE1hdHJpeDQudHJhbnNsYXRlKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgVmVjdG9yMy5QT1NJVElWRV9YKTtcbiAgICAgICAgICAgIE1hdHJpeDQucm90YXRlWShwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIE1hdGguUEkgLyAyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdueCc6XG4gICAgICAgICAgICBNYXRyaXg0LnRyYW5zbGF0ZShwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIFZlY3RvcjMuTkVHQVRJVkVfWCk7XG4gICAgICAgICAgICBNYXRyaXg0LnJvdGF0ZVkocGxhbmVNYXRyaXgsIHBsYW5lTWF0cml4LCAtTWF0aC5QSSAvIDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3B5JzpcbiAgICAgICAgICAgIE1hdHJpeDQudHJhbnNsYXRlKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgVmVjdG9yMy5QT1NJVElWRV9ZKTtcbiAgICAgICAgICAgIE1hdHJpeDQucm90YXRlWChwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIC1NYXRoLlBJIC8gMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnknOlxuICAgICAgICAgICAgTWF0cml4NC50cmFuc2xhdGUocGxhbmVNYXRyaXgsIHBsYW5lTWF0cml4LCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgTWF0cml4NC5yb3RhdGVYKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgTWF0aC5QSSAvIDIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3B6JzpcbiAgICAgICAgICAgIE1hdHJpeDQudHJhbnNsYXRlKHBsYW5lTWF0cml4LCBwbGFuZU1hdHJpeCwgVmVjdG9yMy5QT1NJVElWRV9aKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdueic6XG4gICAgICAgICAgICBNYXRyaXg0LnRyYW5zbGF0ZShwbGFuZU1hdHJpeCwgcGxhbmVNYXRyaXgsIFZlY3RvcjMuTkVHQVRJVkVfWik7XG4gICAgICAgICAgICBNYXRyaXg0LnJvdGF0ZVkocGxhbmVNYXRyaXgsIHBsYW5lTWF0cml4LCBNYXRoLlBJKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwbGFuZS5hcHBseVRyYW5zZm9ybShwbGFuZU1hdHJpeCk7XG4gICAgcmV0dXJuIHBsYW5lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDdWJlO1xuIiwiaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4uL0dlb21ldHJ5JztcbmltcG9ydCBCb3VuZGluZ0JveCBmcm9tICcuLi9tYXRoL0JvdW5kaW5nQm94JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5nZW9tZXRyeS5TcGhlcmVcbiAqIEBleHRlbmRzIGNsYXkuR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aFNlZ21lbnRzXVxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50c11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpU3RhcnRdXG4gKiBAcGFyYW0ge251bWJlcn0gW3BoaUxlbmd0aF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGhdXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1c11cbiAqL1xudmFyIFNwaGVyZSA9IEdlb21ldHJ5LmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5TcGhlcmUjICovXG57XG4gICAgZHluYW1pYzogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB3aWR0aFNlZ21lbnRzOiA0MCxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodFNlZ21lbnRzOiAyMCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcGhpU3RhcnQ6IDAsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBwaGlMZW5ndGg6IE1hdGguUEkgKiAyLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGV0YVN0YXJ0OiAwLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhldGFMZW5ndGg6IE1hdGguUEksXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHJhZGl1czogMVxuXG59LCBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmJ1aWxkKCk7XG59LFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LlNwaGVyZS5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBCdWlsZCBzcGhlcmUgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoZWlnaHRTZWdtZW50cyA9IHRoaXMuaGVpZ2h0U2VnbWVudHM7XG4gICAgICAgIHZhciB3aWR0aFNlZ21lbnRzID0gdGhpcy53aWR0aFNlZ21lbnRzO1xuXG4gICAgICAgIHZhciBwb3NpdGlvbkF0dHIgPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG4gICAgICAgIHZhciB0ZXhjb29yZEF0dHIgPSB0aGlzLmF0dHJpYnV0ZXMudGV4Y29vcmQwO1xuICAgICAgICB2YXIgbm9ybWFsQXR0ciA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cbiAgICAgICAgdmFyIHZlcnRleENvdW50ID0gKHdpZHRoU2VnbWVudHMgKyAxKSAqIChoZWlnaHRTZWdtZW50cyArIDEpO1xuICAgICAgICBwb3NpdGlvbkF0dHIuaW5pdCh2ZXJ0ZXhDb3VudCk7XG4gICAgICAgIHRleGNvb3JkQXR0ci5pbml0KHZlcnRleENvdW50KTtcbiAgICAgICAgbm9ybWFsQXR0ci5pbml0KHZlcnRleENvdW50KTtcblxuICAgICAgICB2YXIgSW5kaWNlc0N0b3IgPSB2ZXJ0ZXhDb3VudCA+IDB4ZmZmZiA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgICAgIHZhciBpbmRpY2VzID0gdGhpcy5pbmRpY2VzID0gbmV3IEluZGljZXNDdG9yKHdpZHRoU2VnbWVudHMgKiBoZWlnaHRTZWdtZW50cyAqIDYpO1xuXG4gICAgICAgIHZhciB4LCB5LCB6LFxuICAgICAgICAgICAgdSwgdixcbiAgICAgICAgICAgIGksIGo7XG5cbiAgICAgICAgdmFyIHJhZGl1cyA9IHRoaXMucmFkaXVzO1xuICAgICAgICB2YXIgcGhpU3RhcnQgPSB0aGlzLnBoaVN0YXJ0O1xuICAgICAgICB2YXIgcGhpTGVuZ3RoID0gdGhpcy5waGlMZW5ndGg7XG4gICAgICAgIHZhciB0aGV0YVN0YXJ0ID0gdGhpcy50aGV0YVN0YXJ0O1xuICAgICAgICB2YXIgdGhldGFMZW5ndGggPSB0aGlzLnRoZXRhTGVuZ3RoO1xuICAgICAgICB2YXIgcmFkaXVzID0gdGhpcy5yYWRpdXM7XG5cbiAgICAgICAgdmFyIHBvcyA9IFtdO1xuICAgICAgICB2YXIgdXYgPSBbXTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBkaXZpZGVyID0gMSAvIHJhZGl1cztcbiAgICAgICAgZm9yIChqID0gMDsgaiA8PSBoZWlnaHRTZWdtZW50czsgaiArKykge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSB3aWR0aFNlZ21lbnRzOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgdSA9IGkgLyB3aWR0aFNlZ21lbnRzO1xuICAgICAgICAgICAgICAgIHYgPSBqIC8gaGVpZ2h0U2VnbWVudHM7XG5cbiAgICAgICAgICAgICAgICAvLyBYIGF4aXMgaXMgaW52ZXJ0ZWQgc28gdGV4dHVyZSBjYW4gYmUgbWFwcGVkIGZyb20gbGVmdCB0byByaWdodFxuICAgICAgICAgICAgICAgIHggPSAtcmFkaXVzICogTWF0aC5jb3MocGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoKSAqIE1hdGguc2luKHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHkgPSByYWRpdXMgKiBNYXRoLmNvcyh0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB6ID0gcmFkaXVzICogTWF0aC5zaW4ocGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoKSAqIE1hdGguc2luKHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgcG9zWzBdID0geDsgcG9zWzFdID0geTsgcG9zWzJdID0gejtcbiAgICAgICAgICAgICAgICB1dlswXSA9IHU7IHV2WzFdID0gdjtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkF0dHIuc2V0KG9mZnNldCwgcG9zKTtcbiAgICAgICAgICAgICAgICB0ZXhjb29yZEF0dHIuc2V0KG9mZnNldCwgdXYpO1xuICAgICAgICAgICAgICAgIHBvc1swXSAqPSBkaXZpZGVyO1xuICAgICAgICAgICAgICAgIHBvc1sxXSAqPSBkaXZpZGVyO1xuICAgICAgICAgICAgICAgIHBvc1syXSAqPSBkaXZpZGVyO1xuICAgICAgICAgICAgICAgIG5vcm1hbEF0dHIuc2V0KG9mZnNldCwgcG9zKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpMSwgaTIsIGkzLCBpNDtcblxuICAgICAgICB2YXIgbGVuID0gd2lkdGhTZWdtZW50cyArIDE7XG5cbiAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0U2VnbWVudHM7IGogKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aFNlZ21lbnRzOyBpICsrKSB7XG4gICAgICAgICAgICAgICAgaTIgPSBqICogbGVuICsgaTtcbiAgICAgICAgICAgICAgICBpMSA9IChqICogbGVuICsgaSArIDEpO1xuICAgICAgICAgICAgICAgIGk0ID0gKGogKyAxKSAqIGxlbiArIGkgKyAxO1xuICAgICAgICAgICAgICAgIGkzID0gKGogKyAxKSAqIGxlbiArIGk7XG5cbiAgICAgICAgICAgICAgICBpbmRpY2VzW24rK10gPSBpMTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzW24rK10gPSBpMjtcbiAgICAgICAgICAgICAgICBpbmRpY2VzW24rK10gPSBpNDtcblxuICAgICAgICAgICAgICAgIGluZGljZXNbbisrXSA9IGkyO1xuICAgICAgICAgICAgICAgIGluZGljZXNbbisrXSA9IGkzO1xuICAgICAgICAgICAgICAgIGluZGljZXNbbisrXSA9IGk0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94Lm1heC5zZXQocmFkaXVzLCByYWRpdXMsIHJhZGl1cyk7XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWluLnNldCgtcmFkaXVzLCAtcmFkaXVzLCAtcmFkaXVzKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU3BoZXJlO1xuIiwidmFyIG1hdGhVdGlsID0ge307XG5cbm1hdGhVdGlsLmlzUG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDA7XG59O1xuXG5tYXRoVXRpbC5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhbHVlIC0tO1xuICAgIHZhbHVlIHw9IHZhbHVlID4+IDE7XG4gICAgdmFsdWUgfD0gdmFsdWUgPj4gMjtcbiAgICB2YWx1ZSB8PSB2YWx1ZSA+PiA0O1xuICAgIHZhbHVlIHw9IHZhbHVlID4+IDg7XG4gICAgdmFsdWUgfD0gdmFsdWUgPj4gMTY7XG4gICAgdmFsdWUgKys7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG5tYXRoVXRpbC5uZWFyZXN0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5yb3VuZCggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtYXRoVXRpbDtcbiIsImltcG9ydCBUZXh0dXJlIGZyb20gJy4vVGV4dHVyZSc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4vY29yZS9nbGVudW0nO1xuaW1wb3J0IG1hdGhVdGlsIGZyb20gJy4vbWF0aC91dGlsJztcbnZhciBpc1Bvd2VyT2ZUd28gPSBtYXRoVXRpbC5pc1Bvd2VyT2ZUd287XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuVGV4dHVyZTJEXG4gKiBAZXh0ZW5kcyBjbGF5LlRleHR1cmVcbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIC4uLlxuICogICAgIHZhciBtYXQgPSBuZXcgY2xheS5NYXRlcmlhbCh7XG4gKiAgICAgICAgIHNoYWRlcjogY2xheS5zaGFkZXIubGlicmFyeS5nZXQoJ2NsYXkucGhvbmcnLCAnZGlmZnVzZU1hcCcpXG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIGRpZmZ1c2VNYXAgPSBuZXcgY2xheS5UZXh0dXJlMkQoKTtcbiAqICAgICBkaWZmdXNlTWFwLmxvYWQoJ2Fzc2V0cy90ZXh0dXJlcy9kaWZmdXNlLmpwZycpO1xuICogICAgIG1hdC5zZXQoJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlTWFwKTtcbiAqICAgICAuLi5cbiAqICAgICBkaWZmdXNlTWFwLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICogICAgICAgICAvLyBXYWl0IGZvciB0aGUgZGlmZnVzZSB0ZXh0dXJlIGxvYWRlZFxuICogICAgICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24gKGZyYW1lVGltZSkge1xuICogICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICogICAgICAgICB9KTtcbiAqICAgICB9KTtcbiAqL1xudmFyIFRleHR1cmUyRCA9IFRleHR1cmUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LlRleHR1cmUyRCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUgez9IVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtbmV0fVxuICAgICAgICAgKi9cbiAgICAgICAgaW1hZ2U6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQaXhlbHMgZGF0YS4gV2lsbCBiZSBpZ25vcmVkIGlmIGltYWdlIGlzIHNldC5cbiAgICAgICAgICogQHR5cGUgez9VaW50OEFycmF5fEZsb2F0MzJBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHBpeGVsczogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48T2JqZWN0Pn1cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogICAgIFt7XG4gICAgICAgICAqICAgICAgICAgaW1hZ2U6IG1pcG1hcDAsXG4gICAgICAgICAqICAgICAgICAgcGl4ZWxzOiBudWxsXG4gICAgICAgICAqICAgICB9LCB7XG4gICAgICAgICAqICAgICAgICAgaW1hZ2U6IG1pcG1hcDEsXG4gICAgICAgICAqICAgICAgICAgcGl4ZWxzOiBudWxsXG4gICAgICAgICAqICAgICB9LCAuLi4uXVxuICAgICAgICAgKi9cbiAgICAgICAgbWlwbWFwczogW11cbiAgICB9O1xufSwge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBfZ2wuYmluZFRleHR1cmUoX2dsLlRFWFRVUkVfMkQsIHRoaXMuX2NhY2hlLmdldCgnd2ViZ2xfdGV4dHVyZScpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbW1vbihyZW5kZXJlcik7XG5cbiAgICAgICAgdmFyIGdsRm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgICAgIHZhciBnbFR5cGUgPSB0aGlzLnR5cGU7XG5cbiAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoX2dsLlRFWFRVUkVfMkQsIF9nbC5URVhUVVJFX1dSQVBfUywgdGhpcy5nZXRBdmFpbGFibGVXcmFwUygpKTtcbiAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoX2dsLlRFWFRVUkVfMkQsIF9nbC5URVhUVVJFX1dSQVBfVCwgdGhpcy5nZXRBdmFpbGFibGVXcmFwVCgpKTtcblxuICAgICAgICBfZ2wudGV4UGFyYW1ldGVyaShfZ2wuVEVYVFVSRV8yRCwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdGhpcy5nZXRBdmFpbGFibGVNYWdGaWx0ZXIoKSk7XG4gICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKF9nbC5URVhUVVJFXzJELCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB0aGlzLmdldEF2YWlsYWJsZU1pbkZpbHRlcigpKTtcblxuICAgICAgICB2YXIgYW5pc290cm9waWNFeHQgPSByZW5kZXJlci5nZXRHTEV4dGVuc2lvbignRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyk7XG4gICAgICAgIGlmIChhbmlzb3Ryb3BpY0V4dCAmJiB0aGlzLmFuaXNvdHJvcGljID4gMSkge1xuICAgICAgICAgICAgX2dsLnRleFBhcmFtZXRlcmYoX2dsLlRFWFRVUkVfMkQsIGFuaXNvdHJvcGljRXh0LlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCB0aGlzLmFuaXNvdHJvcGljKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGZsb2F0IHR5cGUgaWYgYnJvd3NlciBkb24ndCBoYXZlIGhhbGYgZmxvYXQgZXh0ZW5zaW9uXG4gICAgICAgIGlmIChnbFR5cGUgPT09IDM2MTkzKSB7XG4gICAgICAgICAgICB2YXIgaGFsZkZsb2F0RXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnKTtcbiAgICAgICAgICAgIGlmICghaGFsZkZsb2F0RXh0KSB7XG4gICAgICAgICAgICAgICAgZ2xUeXBlID0gZ2xlbnVtLkZMT0FUO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWlwbWFwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWlwbWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBtaXBtYXAgPSB0aGlzLm1pcG1hcHNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZURhdGEoX2dsLCBtaXBtYXAsIGksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUpO1xuICAgICAgICAgICAgICAgIHdpZHRoIC89IDI7XG4gICAgICAgICAgICAgICAgaGVpZ2h0IC89IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUZXh0dXJlRGF0YShfZ2wsIHRoaXMsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudXNlTWlwbWFwICYmICF0aGlzLk5QT1QpIHtcbiAgICAgICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFXzJELCBudWxsKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVRleHR1cmVEYXRhOiBmdW5jdGlvbiAoX2dsLCBkYXRhLCBsZXZlbCwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSkge1xuICAgICAgICBpZiAoZGF0YS5pbWFnZSkge1xuICAgICAgICAgICAgX2dsLnRleEltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgZGF0YS5pbWFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDYW4gYmUgdXNlZCBhcyBhIGJsYW5rIHRleHR1cmUgd2hlbiB3cml0aW5nIHJlbmRlciB0byB0ZXh0dXJlKFJUVClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBnbEZvcm1hdCA8PSBUZXh0dXJlLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUXG4gICAgICAgICAgICAgICAgJiYgZ2xGb3JtYXQgPj0gVGV4dHVyZS5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfZ2wuY29tcHJlc3NlZFRleEltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCBnbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZGF0YS5waXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSXMgYSByZW5kZXIgdGFyZ2V0IGlmIHBpeGVscyBpcyBudWxsXG4gICAgICAgICAgICAgICAgX2dsLnRleEltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCBnbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgZGF0YS5waXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQG1lbWJlck9mIGNsYXkuVGV4dHVyZTJELnByb3RvdHlwZVxuICAgICAqL1xuICAgIGdlbmVyYXRlTWlwbWFwOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBpZiAodGhpcy51c2VNaXBtYXAgJiYgIXRoaXMuTlBPVCkge1xuICAgICAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFXzJELCB0aGlzLl9jYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKSk7XG4gICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfMkQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGlzUG93ZXJPZlR3bzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuaW1hZ2Uud2lkdGg7XG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLmltYWdlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1Bvd2VyT2ZUd28od2lkdGgpICYmIGlzUG93ZXJPZlR3byhoZWlnaHQpO1xuICAgIH0sXG5cbiAgICBpc1JlbmRlcmFibGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmltYWdlLm5vZGVOYW1lID09PSAnQ0FOVkFTJ1xuICAgICAgICAgICAgICAgIHx8IHRoaXMuaW1hZ2Uubm9kZU5hbWUgPT09ICdWSURFTydcbiAgICAgICAgICAgICAgICB8fCB0aGlzLmltYWdlLmNvbXBsZXRlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICEhKHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFXzJELCB0aGlzLmdldFdlYkdMVGV4dHVyZShyZW5kZXJlcikpO1xuICAgIH0sXG5cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFXzJELCBudWxsKTtcbiAgICB9LFxuXG4gICAgbG9hZDogZnVuY3Rpb24gKHNyYywgY3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGlmIChjcm9zc09yaWdpbikge1xuICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuZGlydHkoKTtcbiAgICAgICAgICAgIHNlbGYudHJpZ2dlcignc3VjY2VzcycsIHNlbGYpO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYudHJpZ2dlcignZXJyb3InLCBzZWxmKTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dHVyZTJELnByb3RvdHlwZSwgJ3dpZHRoJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2Uud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGV4dHVyZSBmcm9tIGltYWdlIGNhblxcJ3Qgc2V0IHdpZHRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHR1cmUyRC5wcm90b3R5cGUsICdoZWlnaHQnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RleHR1cmUgZnJvbSBpbWFnZSBjYW5cXCd0IHNldCBoZWlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZTJEO1xuIiwiaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuXG52YXIgX2xpYnJhcnkgPSB7fTtcblxuZnVuY3Rpb24gU2hhZGVyTGlicmFyeSAoKSB7XG4gICAgdGhpcy5fcG9vbCA9IHt9O1xufVxuXG5TaGFkZXJMaWJyYXJ5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGtleSA9IG5hbWU7XG5cbiAgICBpZiAodGhpcy5fcG9vbFtrZXldKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb29sW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgc291cmNlID0gX2xpYnJhcnlbbmFtZV07XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTaGFkZXIgXCInICsgbmFtZSArICdcIicgKyAnIGlzIG5vdCBpbiB0aGUgbGlicmFyeScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzaGFkZXIgPSBuZXcgU2hhZGVyKHNvdXJjZS52ZXJ0ZXgsIHNvdXJjZS5mcmFnbWVudCk7XG4gICAgICAgIHRoaXMuX3Bvb2xba2V5XSA9IHNoYWRlcjtcbiAgICAgICAgcmV0dXJuIHNoYWRlcjtcbiAgICB9XG59O1xuXG5TaGFkZXJMaWJyYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3Bvb2wgPSB7fTtcbn07XG5cbmZ1bmN0aW9uIHRlbXBsYXRlKG5hbWUsIHZlcnRleCwgZnJhZ21lbnQpIHtcbiAgICBfbGlicmFyeVtuYW1lXSA9IHtcbiAgICAgICAgdmVydGV4OiB2ZXJ0ZXgsXG4gICAgICAgIGZyYWdtZW50OiBmcmFnbWVudFxuICAgIH07XG59XG5cbnZhciBkZWZhdWx0TGlicmFyeSA9IG5ldyBTaGFkZXJMaWJyYXJ5KCk7XG5cbi8qKlxuICogIyMjIEJ1aWxpbiBzaGFkZXJzXG4gKiArIGNsYXkuc3RhbmRhcmRcbiAqICsgY2xheS5iYXNpY1xuICogKyBjbGF5LmxhbWJlcnRcbiAqICsgY2xheS53aXJlZnJhbWVcbiAqXG4gKiBAbmFtZXNwYWNlIGNsYXkuc2hhZGVyLmxpYnJhcnlcbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBzaGFkZXIgbGlicmFyeS5cbiAgICAgKi9cbiAgICBjcmVhdGVMaWJyYXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2hhZGVyTGlicmFyeSgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHNoYWRlciBmcm9tIGRlZmF1bHQgbGlicmFyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm4ge2NsYXkuU2hhZGVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnNoYWRlci5saWJyYXJ5XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICAgY2xheS5zaGFkZXIubGlicmFyeS5nZXQoJ2NsYXkuc3RhbmRhcmQnKVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdExpYnJhcnkuZ2V0LmFwcGx5KGRlZmF1bHRMaWJyYXJ5LCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQG1lbWJlck9mIGNsYXkuc2hhZGVyLmxpYnJhcnlcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHZlcnRleCAtIFZlcnRleCBzaGFkZXIgY29kZVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gZnJhZ21lbnQgLSBGcmFnbWVudCBzaGFkZXIgY29kZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdExpYnJhcnkuY2xlYXIoKTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5cbi8vIENhY2hlXG52YXIgcHJldkRyYXdJRCA9IDA7XG52YXIgcHJldkRyYXdJbmRpY2VzQnVmZmVyID0gbnVsbDtcbnZhciBwcmV2RHJhd0lzVXNlSW5kaWNlcyA9IHRydWU7XG5cbnZhciBjdXJyZW50RHJhd0lEO1xuXG52YXIgUmVuZGVySW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudHJpYW5nbGVDb3VudCA9IDA7XG4gICAgdGhpcy52ZXJ0ZXhDb3VudCA9IDA7XG4gICAgdGhpcy5kcmF3Q2FsbENvdW50ID0gMDtcbn07XG5cbmZ1bmN0aW9uIFZlcnRleEFycmF5T2JqZWN0KFxuICAgIGF2YWlsYWJsZUF0dHJpYnV0ZXMsXG4gICAgYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scyxcbiAgICBpbmRpY2VzQnVmZmVyXG4pIHtcbiAgICB0aGlzLmF2YWlsYWJsZUF0dHJpYnV0ZXMgPSBhdmFpbGFibGVBdHRyaWJ1dGVzO1xuICAgIHRoaXMuYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scyA9IGF2YWlsYWJsZUF0dHJpYnV0ZVN5bWJvbHM7XG4gICAgdGhpcy5pbmRpY2VzQnVmZmVyID0gaW5kaWNlc0J1ZmZlcjtcblxuICAgIHRoaXMudmFvID0gbnVsbDtcbn1cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5SZW5kZXJhYmxlXG4gKiBAZXh0ZW5kcyBjbGF5Lk5vZGVcbiAqL1xudmFyIFJlbmRlcmFibGUgPSBOb2RlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5SZW5kZXJhYmxlIyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5Lk1hdGVyaWFsfVxuICAgICAqL1xuICAgIG1hdGVyaWFsOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkuR2VvbWV0cnl9XG4gICAgICovXG4gICAgZ2VvbWV0cnk6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIG1vZGU6IGdsZW51bS5UUklBTkdMRVMsXG5cbiAgICBfZHJhd0NhY2hlOiBudWxsLFxuXG4gICAgX3JlbmRlckluZm86IG51bGxcbn0sIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2RyYXdDYWNoZSA9IHt9O1xuICAgIHRoaXMuX3JlbmRlckluZm8gPSBuZXcgUmVuZGVySW5mbygpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5SZW5kZXJhYmxlLnByb3RvdHlwZSAqL1xue1xuXG4gICAgX19wcm9ncmFtOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogR3JvdXAgb2YgcmVjZWl2ZWQgbGlnaHQuXG4gICAgICovXG4gICAgbGlnaHRHcm91cDogMCxcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgb3JkZXIsIE5vZGVzIHdpdGggc21hbGxlciB2YWx1ZSByZW5kZXJzIGJlZm9yZSBub2RlcyB3aXRoIGxhcmdlciB2YWx1ZXMuXG4gICAgICogQHR5cGUge051bWJlcn1cbiAgICAgKi9cbiAgICByZW5kZXJPcmRlcjogMCxcbiAgICAvKipcbiAgICAgKiBVc2VkIHdoZW4gbW9kZSBpcyBMSU5FUywgTElORV9TVFJJUCBvciBMSU5FX0xPT1BcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxpbmVXaWR0aDogMSxcblxuICAgIC8qKlxuICAgICAqIElmIGVuYWJsZSBjdWxsaW5nXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgY3VsbGluZzogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIHNpZGUgb2YgcG9seWdvbiB3aWxsIGJlIGN1bGxlZC5cbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuUmVuZGVyYWJsZS5CQUNLfVxuICAgICAqICArIHtAbGluayBjbGF5LlJlbmRlcmFibGUuRlJPTlR9XG4gICAgICogICsge0BsaW5rIGNsYXkuUmVuZGVyYWJsZS5GUk9OVF9BTkRfQkFDS31cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvY3VsbEZhY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGN1bGxGYWNlOiBnbGVudW0uQkFDSyxcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIHNpZGUgaXMgZnJvbnQgZmFjZS5cbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAgICogICsge0BsaW5rIGNsYXkuUmVuZGVyYWJsZS5DV31cbiAgICAgKiAgKyB7QGxpbmsgY2xheS5SZW5kZXJhYmxlLkNDV31cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvZnJvbnRGYWNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBmcm9udEZhY2U6IGdsZW51bS5DQ1csXG5cbiAgICAvKipcbiAgICAgKiBJZiBlbmFibGUgc29mdHdhcmUgZnJ1c3R1bSBjdWxsaW5nXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnJ1c3R1bUN1bGxpbmc6IHRydWUsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVjZWl2ZVNoYWRvdzogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBjYXN0U2hhZG93OiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGlnbm9yZVBpY2tpbmc6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGlnbm9yZVByZVo6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaWdub3JlR0J1ZmZlcjogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzUmVuZGVyYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFRPRE8gU2hhZGVyID9cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5tYXRlcmlhbCAmJiB0aGlzLm1hdGVyaWFsLnNoYWRlciAmJiAhdGhpcy5pbnZpc2libGVcbiAgICAgICAgICAgICYmIHRoaXMuZ2VvbWV0cnkudmVydGV4Q291bnQgPiAwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBCZWZvcmUgcmVuZGVyIGhvb2tcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICovXG4gICAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiAoX2dsKSB7fSxcblxuICAgIC8qKlxuICAgICAqIEJlZm9yZSByZW5kZXIgaG9va1xuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKF9nbCwgcmVuZGVyU3RhdCkge30sXG5cbiAgICBnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKGZpbHRlciwgb3V0KSB7XG4gICAgICAgIG91dCA9IE5vZGUucHJvdG90eXBlLmdldEJvdW5kaW5nQm94LmNhbGwodGhpcywgZmlsdGVyLCBvdXQpO1xuICAgICAgICBpZiAodGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmJvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICBvdXQudW5pb24odGhpcy5nZW9tZXRyeS5ib3VuZGluZ0JveCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSAge2NsYXkuTWF0ZXJpYWx9IFttYXRlcmlhbF1cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIG1hdGVyaWFsLCBwcm9ncmFtKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgbWF0ZXJpYWwgPSBtYXRlcmlhbCB8fCB0aGlzLm1hdGVyaWFsO1xuICAgICAgICAvLyBNYXkgdXNlIHNoYWRlciBvZiBvdGhlciBtYXRlcmlhbCBpZiBzaGFkZXIgY29kZSBhcmUgc2FtZVxuICAgICAgICB2YXIgc2hhZGVyID0gbWF0ZXJpYWwuc2hhZGVyO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG4gICAgICAgIHZhciBnbERyYXdNb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgICAgIHZhciBuVmVydGV4ID0gZ2VvbWV0cnkudmVydGV4Q291bnQ7XG4gICAgICAgIHZhciBpc1VzZUluZGljZXMgPSBnZW9tZXRyeS5pc1VzZUluZGljZXMoKTtcblxuICAgICAgICB2YXIgdWludEV4dCA9IHJlbmRlcmVyLmdldEdMRXh0ZW5zaW9uKCdPRVNfZWxlbWVudF9pbmRleF91aW50Jyk7XG4gICAgICAgIHZhciB1c2VVaW50RXh0ID0gdWludEV4dCAmJiBuVmVydGV4ID4gMHhmZmZmO1xuICAgICAgICB2YXIgaW5kaWNlc1R5cGUgPSB1c2VVaW50RXh0ID8gX2dsLlVOU0lHTkVEX0lOVCA6IF9nbC5VTlNJR05FRF9TSE9SVDtcblxuICAgICAgICB2YXIgdmFvRXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIC8vIHZhciB2YW9FeHQgPSBudWxsO1xuXG4gICAgICAgIHZhciBpc1N0YXRpYyA9ICFnZW9tZXRyeS5keW5hbWljO1xuXG4gICAgICAgIHZhciByZW5kZXJJbmZvID0gdGhpcy5fcmVuZGVySW5mbztcbiAgICAgICAgcmVuZGVySW5mby52ZXJ0ZXhDb3VudCA9IG5WZXJ0ZXg7XG4gICAgICAgIHJlbmRlckluZm8udHJpYW5nbGVDb3VudCA9IDA7XG4gICAgICAgIHJlbmRlckluZm8uZHJhd0NhbGxDb3VudCA9IDA7XG4gICAgICAgIC8vIERyYXcgZWFjaCBjaHVua1xuICAgICAgICB2YXIgZHJhd0hhc2hDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIC8vIEhhc2ggd2l0aCBzaGFkZXIgaWQgaW4gY2FzZSBwcmV2aW91cyBtYXRlcmlhbCBoYXMgbGVzcyBhdHRyaWJ1dGVzIHRoYW4gbmV4dCBtYXRlcmlhbFxuICAgICAgICBjdXJyZW50RHJhd0lEID0gcmVuZGVyZXIuX191aWRfXyArICctJyArIGdlb21ldHJ5Ll9fdWlkX18gKyAnLScgKyBwcm9ncmFtLl9fdWlkX187XG5cbiAgICAgICAgaWYgKGN1cnJlbnREcmF3SUQgIT09IHByZXZEcmF3SUQpIHtcbiAgICAgICAgICAgIGRyYXdIYXNoQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGUgd2lsbCBiZSBpbnZhbGlkIGluIHRoZSBmb2xsb3dpbmcgY2FzZXNcbiAgICAgICAgICAgIC8vIDEuIFZBTyBpcyBlbmFibGVkIGFuZCBpcyBiaW5kZWQgdG8gbnVsbCBhZnRlciByZW5kZXJcbiAgICAgICAgICAgIC8vIDIuIEdlb21ldHJ5IG5lZWRzIHVwZGF0ZVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIC8vIFRPRE8gT3B0aW1pemVcbiAgICAgICAgICAgICAgICAodmFvRXh0ICYmIGlzU3RhdGljKVxuICAgICAgICAgICAgICAgIC8vIFBFTkRJTkdcbiAgICAgICAgICAgICAgICB8fCBnZW9tZXRyeS5fY2FjaGUuaXNEaXJ0eSgnYW55JylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRyYXdIYXNoQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJldkRyYXdJRCA9IGN1cnJlbnREcmF3SUQ7XG5cbiAgICAgICAgaWYgKCFkcmF3SGFzaENoYW5nZWQpIHtcbiAgICAgICAgICAgIC8vIERpcmVjdCBkcmF3XG4gICAgICAgICAgICBpZiAocHJldkRyYXdJc1VzZUluZGljZXMpIHtcbiAgICAgICAgICAgICAgICBfZ2wuZHJhd0VsZW1lbnRzKGdsRHJhd01vZGUsIHByZXZEcmF3SW5kaWNlc0J1ZmZlci5jb3VudCwgaW5kaWNlc1R5cGUsIDApO1xuICAgICAgICAgICAgICAgIHJlbmRlckluZm8udHJpYW5nbGVDb3VudCA9IHByZXZEcmF3SW5kaWNlc0J1ZmZlci5jb3VudCAvIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBVc2UgdmVydGV4IG51bWJlciBpbiBidWZmZXJcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0ZXhDb3VudCBtYXkgZ2V0IHRoZSB3cm9uZyB2YWx1ZSB3aGVuIGdlb21ldHJ5IGZvcmdldCB0byBtYXJrIGRpcnR5IGFmdGVyIHVwZGF0ZVxuICAgICAgICAgICAgICAgIF9nbC5kcmF3QXJyYXlzKGdsRHJhd01vZGUsIDAsIG5WZXJ0ZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVySW5mby5kcmF3Q2FsbENvdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgY2FjaGUgb2Ygc3RhdGljIGdlb21ldHJ5XG4gICAgICAgICAgICB2YXIgdmFvTGlzdCA9IHRoaXMuX2RyYXdDYWNoZVtjdXJyZW50RHJhd0lEXTtcbiAgICAgICAgICAgIGlmICghdmFvTGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBjaHVua3MgPSBnZW9tZXRyeS5nZXRCdWZmZXJDaHVua3MocmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIGlmICghY2h1bmtzKSB7ICAvLyBFbXB0eSBtZXNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFvTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2h1bmtzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IGNodW5rc1tjXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUJ1ZmZlcnMgPSBjaHVuay5hdHRyaWJ1dGVCdWZmZXJzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlc0J1ZmZlciA9IGNodW5rLmluZGljZXNCdWZmZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGF2YWlsYWJsZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF2YWlsYWJsZUF0dHJpYnV0ZVN5bWJvbHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdHRyaWJ1dGVCdWZmZXJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVySW5mbyA9IGF0dHJpYnV0ZUJ1ZmZlcnNbYV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZUJ1ZmZlckluZm8ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpYyA9IGF0dHJpYnV0ZUJ1ZmZlckluZm8uc2VtYW50aWM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbWFudGljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbWFudGljSW5mbyA9IHNoYWRlci5hdHRyaWJ1dGVTZW1hbnRpY3Nbc2VtYW50aWNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IHNlbWFudGljSW5mbyAmJiBzZW1hbnRpY0luZm8uc3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgJiYgcHJvZ3JhbS5hdHRyaWJ1dGVzW3N5bWJvbF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlQnVmZmVySW5mbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scy5wdXNoKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFvID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUF0dHJpYnV0ZVN5bWJvbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzQnVmZmVyXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHZhb0xpc3QucHVzaCh2YW8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0NhY2hlW2N1cnJlbnREcmF3SURdID0gdmFvTGlzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFvTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2YW8gPSB2YW9MaXN0W2ldO1xuICAgICAgICAgICAgICAgIHZhciBuZWVkc0JpbmRBdHRyaWJ1dGVzID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB2ZXJ0ZXggb2JqZWN0IGFycmF5IGNvc3QgYSBsb3RcbiAgICAgICAgICAgICAgICAvLyBTbyB3ZSBkb24ndCB1c2UgaXQgb24gdGhlIGR5bmFtaWMgb2JqZWN0XG4gICAgICAgICAgICAgICAgaWYgKHZhb0V4dCAmJiBpc1N0YXRpYykge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdmVydGV4IGFycmF5IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vYmxvZy50b2ppY29kZS5jb20vMjAxMi8xMC9vZXN2ZXJ0ZXhhcnJheW9iamVjdC1leHRlbnNpb24uaHRtbFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFvLnZhbyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YW8udmFvID0gdmFvRXh0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZWVkc0JpbmRBdHRyaWJ1dGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFvRXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8udmFvKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgYXZhaWxhYmxlQXR0cmlidXRlcyA9IHZhby5hdmFpbGFibGVBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIHZhciBpbmRpY2VzQnVmZmVyID0gdmFvLmluZGljZXNCdWZmZXI7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNCaW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25MaXN0ID0gcHJvZ3JhbS5lbmFibGVBdHRyaWJ1dGVzKHJlbmRlcmVyLCB2YW8uYXZhaWxhYmxlQXR0cmlidXRlU3ltYm9scywgKHZhb0V4dCAmJiBpc1N0YXRpYyAmJiB2YW8udmFvKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgYXR0cmlidXRlcztcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdmFpbGFibGVBdHRyaWJ1dGVzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBsb2NhdGlvbkxpc3RbYV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlQnVmZmVySW5mbyA9IGF2YWlsYWJsZUF0dHJpYnV0ZXNbYV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gYXR0cmlidXRlQnVmZmVySW5mby5idWZmZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IGF0dHJpYnV0ZUJ1ZmZlckluZm8uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnbFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZUJ1ZmZlckluZm8udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLkZMT0FUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdieXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLkJZVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VieXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLlVOU0lHTkVEX0JZVEU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3J0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xUeXBlID0gX2dsLlNIT1JUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1c2hvcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbFR5cGUgPSBfZ2wuVU5TSUdORURfU0hPUlQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsVHlwZSA9IF9nbC5GTE9BVDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgc2l6ZSwgZ2xUeXBlLCBmYWxzZSwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBnbERyYXdNb2RlID09IGdsZW51bS5MSU5FUyB8fFxuICAgICAgICAgICAgICAgICAgICBnbERyYXdNb2RlID09IGdsZW51bS5MSU5FX1NUUklQIHx8XG4gICAgICAgICAgICAgICAgICAgIGdsRHJhd01vZGUgPT0gZ2xlbnVtLkxJTkVfTE9PUFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBfZ2wubGluZVdpZHRoKHRoaXMubGluZVdpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2RHJhd0luZGljZXNCdWZmZXIgPSBpbmRpY2VzQnVmZmVyO1xuICAgICAgICAgICAgICAgIHByZXZEcmF3SXNVc2VJbmRpY2VzID0gZ2VvbWV0cnkuaXNVc2VJbmRpY2VzKCk7XG4gICAgICAgICAgICAgICAgLy8gRG8gZHJhd2luZ1xuICAgICAgICAgICAgICAgIGlmIChwcmV2RHJhd0lzVXNlSW5kaWNlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNCaW5kQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2dsLmJpbmRCdWZmZXIoX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzQnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2dsLmRyYXdFbGVtZW50cyhnbERyYXdNb2RlLCBpbmRpY2VzQnVmZmVyLmNvdW50LCBpbmRpY2VzVHlwZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckluZm8udHJpYW5nbGVDb3VudCArPSBpbmRpY2VzQnVmZmVyLmNvdW50IC8gMztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfZ2wuZHJhd0FycmF5cyhnbERyYXdNb2RlLCAwLCBuVmVydGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFvRXh0ICYmIGlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhb0V4dC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVuZGVySW5mby5kcmF3Q2FsbENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVySW5mbztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgYSBuZXcgcmVuZGVyYWJsZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge2NsYXkuUmVuZGVyYWJsZX1cbiAgICAgKi9cbiAgICBjbG9uZTogKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICdjYXN0U2hhZG93JywgJ3JlY2VpdmVTaGFkb3cnLFxuICAgICAgICAgICAgJ21vZGUnLCAnY3VsbGluZycsICdjdWxsRmFjZScsICdmcm9udEZhY2UnLFxuICAgICAgICAgICAgJ2ZydXN0dW1DdWxsaW5nJyxcbiAgICAgICAgICAgICdyZW5kZXJPcmRlcicsICdsaW5lV2lkdGgnLFxuICAgICAgICAgICAgJ2lnbm9yZVBpY2tpbmcnLCAnaWdub3JlUHJlWicsICdpZ25vcmVHQnVmZmVyJ1xuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyYWJsZSA9IE5vZGUucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgIHJlbmRlcmFibGUuZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuICAgICAgICAgICAgcmVuZGVyYWJsZS5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBUcnkgbm90IHRvIG92ZXJ3cml0ZSB0aGUgcHJvdG90eXBlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmFibGVbbmFtZV0gIT09IHRoaXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyYWJsZVtuYW1lXSA9IHRoaXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyYWJsZTtcbiAgICAgICAgfTtcbiAgICB9KSgpXG59KTtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJhYmxlLlBPSU5UUyA9IGdsZW51bS5QT0lOVFM7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmFibGUuTElORVMgPSBnbGVudW0uTElORVM7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmFibGUuTElORV9MT09QID0gZ2xlbnVtLkxJTkVfTE9PUDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5MSU5FX1NUUklQID0gZ2xlbnVtLkxJTkVfU1RSSVA7XG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblJlbmRlcmFibGUuVFJJQU5HTEVTID0gZ2xlbnVtLlRSSUFOR0xFUztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5UUklBTkdMRV9TVFJJUCA9IGdsZW51bS5UUklBTkdMRV9TVFJJUDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5UUklBTkdMRV9GQU4gPSBnbGVudW0uVFJJQU5HTEVfRkFOO1xuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5SZW5kZXJhYmxlLkJBQ0sgPSBnbGVudW0uQkFDSztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5GUk9OVCA9IGdsZW51bS5GUk9OVDtcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5GUk9OVF9BTkRfQkFDSyA9IGdsZW51bS5GUk9OVF9BTkRfQkFDSztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5DVyA9IGdsZW51bS5DVztcbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuUmVuZGVyYWJsZS5DQ1cgPSBnbGVudW0uQ0NXO1xuXG5SZW5kZXJhYmxlLlJlbmRlckluZm8gPSBSZW5kZXJJbmZvO1xuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJhYmxlO1xuIiwiaW1wb3J0IFJlbmRlcmFibGUgZnJvbSAnLi9SZW5kZXJhYmxlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4vVGV4dHVyZTJEJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5NZXNoXG4gKiBAZXh0ZW5kcyBjbGF5LlJlbmRlcmFibGVcbiAqL1xudmFyIE1lc2ggPSBSZW5kZXJhYmxlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5NZXNoIyAqL1xue1xuICAgIC8qKlxuICAgICAqIFVzZWQgd2hlbiBpdCBpcyBhIHNraW5uZWQgbWVzaFxuICAgICAqIEB0eXBlIHtjbGF5LlNrZWxldG9ufVxuICAgICAqL1xuICAgIHNrZWxldG9uOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEpvaW50cyBpbmRpY2VzIE1lc2hlcyBjYW4gc2hhcmUgdGhlIG9uZSBza2VsZXRvbiBpbnN0YW5jZSBhbmQgZWFjaCBtZXNoIGNhbiB1c2Ugb25lIHBhcnQgb2Ygam9pbnRzLiBKb2ludHMgaW5kaWNlcyBpbmRpY2F0ZSB0aGUgaW5kZXggb2Ygam9pbnQgaW4gdGhlIHNrZWxldG9uIGluc3RhbmNlXG4gICAgICogQHR5cGUge251bWJlcltdfVxuICAgICAqL1xuICAgIGpvaW50czogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIElmIHN0b3JlIHRoZSBza2luIG1hdHJpY2VzIGluIHZlcnRleCB0ZXh0dXJlXG4gICAgICogQHR5cGUge2Jvb2x9XG4gICAgICovXG4gICAgdXNlU2tpbk1hdHJpY2VzVGV4dHVyZTogZmFsc2VcblxufSwgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5qb2ludHMpIHtcbiAgICAgICAgdGhpcy5qb2ludHMgPSBbXTtcbiAgICB9XG59LCB7XG5cbiAgICBpc1NraW5uZWRNZXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLnNrZWxldG9uICYmIHRoaXMuam9pbnRzICYmIHRoaXMuam9pbnRzLmxlbmd0aCA+IDApO1xuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2hhZGVyLCBwcm9ncmFtKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgLy8gU2V0IHBvc2UgbWF0cmljZXMgb2Ygc2tpbm5lZCBtZXNoXG4gICAgICAgIGlmICh0aGlzLnNrZWxldG9uKSB7XG4gICAgICAgICAgICAvLyBUT0RPIE11bHRpcGxlIG1lc2ggc2hhcmUgc2FtZSBza2VsZXRvblxuICAgICAgICAgICAgdGhpcy5za2VsZXRvbi51cGRhdGUoKTtcblxuICAgICAgICAgICAgdmFyIHNraW5NYXRyaWNlc0FycmF5ID0gdGhpcy5za2VsZXRvbi5nZXRTdWJTa2luTWF0cmljZXModGhpcy5fX3VpZF9fLCB0aGlzLmpvaW50cyk7XG5cbiAgICAgICAgICAgIC8vIGlmICh0aGlzLnVzZVNraW5NYXRyaWNlc1RleHR1cmUpIHtcbiAgICAgICAgICAgIC8vICAgICB2YXIgc2l6ZTtcbiAgICAgICAgICAgIC8vICAgICB2YXIgbnVtSm9pbnRzID0gdGhpcy5qb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgLy8gICAgIGlmIChudW1Kb2ludHMgPiAyNTYpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgc2l6ZSA9IDY0O1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBlbHNlIGlmIChudW1Kb2ludHMgPiA2NCkge1xuICAgICAgICAgICAgLy8gICAgICAgICBzaXplID0gMzI7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGVsc2UgaWYgKG51bUpvaW50cyA+IDE2KSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHNpemUgPSAxNjtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHNpemUgPSA4O1xuICAgICAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAgICAgLy8gICAgIHZhciB0ZXh0dXJlID0gdGhpcy5nZXRTa2luTWF0cmljZXNUZXh0dXJlKCk7XG4gICAgICAgICAgICAvLyAgICAgdGV4dHVyZS53aWR0aCA9IHNpemU7XG4gICAgICAgICAgICAvLyAgICAgdGV4dHVyZS5oZWlnaHQgPSBzaXplO1xuXG4gICAgICAgICAgICAvLyAgICAgaWYgKCF0ZXh0dXJlLnBpeGVscyB8fCB0ZXh0dXJlLnBpeGVscy5sZW5ndGggIT09IHNpemUgKiBzaXplICogNCkge1xuICAgICAgICAgICAgLy8gICAgICAgICB0ZXh0dXJlLnBpeGVscyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIHNpemUgKiA0KTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgdGV4dHVyZS5waXhlbHMuc2V0KHNraW5NYXRyaWNlc0FycmF5KTtcbiAgICAgICAgICAgIC8vICAgICB0ZXh0dXJlLmRpcnR5KCk7XG5cbiAgICAgICAgICAgIC8vICAgICBzaGFkZXIuc2V0VW5pZm9ybShfZ2wsICcxZicsICdza2luTWF0cmljZXNUZXh0dXJlU2l6ZScsIHNpemUpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKF9nbCwgJ1NLSU5fTUFUUklYJywgc2tpbk1hdHJpY2VzQXJyYXkpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlbmRlcmFibGUucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMsIHJlbmRlcmVyLCBzaGFkZXIsIHByb2dyYW0pO1xuICAgIH0sXG5cbiAgICBnZXRTa2luTWF0cmljZXNUZXh0dXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9za2luTWF0cmljZXNUZXh0dXJlIHx8IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgdHlwZTogZ2xlbnVtLkZMT0FULFxuICAgICAgICAgICAgbWluRmlsdGVyOiBnbGVudW0uTkVBUkVTVCxcbiAgICAgICAgICAgIG1hZ0ZpbHRlcjogZ2xlbnVtLk5FQVJFU1QsXG4gICAgICAgICAgICB1c2VNaXBtYXA6IGZhbHNlLFxuICAgICAgICAgICAgZmxpcFk6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9za2luTWF0cmljZXNUZXh0dXJlO1xuICAgIH1cbn0pO1xuXG4vLyBFbnVtc1xuTWVzaC5QT0lOVFMgPSBnbGVudW0uUE9JTlRTO1xuTWVzaC5MSU5FUyA9IGdsZW51bS5MSU5FUztcbk1lc2guTElORV9MT09QID0gZ2xlbnVtLkxJTkVfTE9PUDtcbk1lc2guTElORV9TVFJJUCA9IGdsZW51bS5MSU5FX1NUUklQO1xuTWVzaC5UUklBTkdMRVMgPSBnbGVudW0uVFJJQU5HTEVTO1xuTWVzaC5UUklBTkdMRV9TVFJJUCA9IGdsZW51bS5UUklBTkdMRV9TVFJJUDtcbk1lc2guVFJJQU5HTEVfRkFOID0gZ2xlbnVtLlRSSUFOR0xFX0ZBTjtcblxuTWVzaC5CQUNLID0gZ2xlbnVtLkJBQ0s7XG5NZXNoLkZST05UID0gZ2xlbnVtLkZST05UO1xuTWVzaC5GUk9OVF9BTkRfQkFDSyA9IGdsZW51bS5GUk9OVF9BTkRfQkFDSztcbk1lc2guQ1cgPSBnbGVudW0uQ1c7XG5NZXNoLkNDVyA9IGdsZW51bS5DQ1c7XG5cbmV4cG9ydCBkZWZhdWx0IE1lc2g7XG4iLCJpbXBvcnQgQ2FtZXJhIGZyb20gJy4uL0NhbWVyYSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY2FtZXJhLlBlcnNwZWN0aXZlXG4gKiBAZXh0ZW5kcyBjbGF5LkNhbWVyYVxuICovXG52YXIgUGVyc3BlY3RpdmUgPSBDYW1lcmEuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LmNhbWVyYS5QZXJzcGVjdGl2ZSMgKi9cbntcbiAgICAvKipcbiAgICAgKiBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGZvdjogNTAsXG4gICAgLyoqXG4gICAgICogQXNwZWN0IHJhdGlvLCB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGggLyBoZWlnaHRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGFzcGVjdDogMSxcbiAgICAvKipcbiAgICAgKiBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBuZWFyOiAwLjEsXG4gICAgLyoqXG4gICAgICogRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBmYXI6IDIwMDBcbn0sXG4vKiogQGxlbmRzIGNsYXkuY2FtZXJhLlBlcnNwZWN0aXZlLnByb3RvdHlwZSAqL1xue1xuXG4gICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByYWQgPSB0aGlzLmZvdiAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeC5wZXJzcGVjdGl2ZShyYWQsIHRoaXMuYXNwZWN0LCB0aGlzLm5lYXIsIHRoaXMuZmFyKTtcbiAgICB9LFxuICAgIGRlY29tcG9zZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzLnByb2plY3Rpb25NYXRyaXguYXJyYXk7XG4gICAgICAgIHZhciByYWQgPSBNYXRoLmF0YW4oMSAvIG1bNV0pICogMjtcbiAgICAgICAgdGhpcy5mb3YgPSByYWQgLyBNYXRoLlBJICogMTgwO1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG1bNV0gLyBtWzBdO1xuICAgICAgICB0aGlzLm5lYXIgPSBtWzE0XSAvIChtWzEwXSAtIDEpO1xuICAgICAgICB0aGlzLmZhciA9IG1bMTRdIC8gKG1bMTBdICsgMSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmNhbWVyYS5QZXJzcGVjdGl2ZX1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjYW1lcmEgPSBDYW1lcmEucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIGNhbWVyYS5mb3YgPSB0aGlzLmZvdjtcbiAgICAgICAgY2FtZXJhLmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuICAgICAgICBjYW1lcmEubmVhciA9IHRoaXMubmVhcjtcbiAgICAgICAgY2FtZXJhLmZhciA9IHRoaXMuZmFyO1xuXG4gICAgICAgIHJldHVybiBjYW1lcmE7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFBlcnNwZWN0aXZlO1xuIiwiaW1wb3J0IENhbWVyYSBmcm9tICcuLi9DYW1lcmEnO1xuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jYW1lcmEuT3J0aG9ncmFwaGljXG4gKiBAZXh0ZW5kcyBjbGF5LkNhbWVyYVxuICovXG52YXIgT3J0aG9ncmFwaGljID0gQ2FtZXJhLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5jYW1lcmEuT3J0aG9ncmFwaGljIyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgbGVmdDogLTEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICByaWdodDogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIG5lYXI6IC0xLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZmFyOiAxLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdG9wOiAxLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgYm90dG9tOiAtMVxufSxcbi8qKiBAbGVuZHMgY2xheS5jYW1lcmEuT3J0aG9ncmFwaGljLnByb3RvdHlwZSAqL1xue1xuXG4gICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeC5vcnRobyh0aGlzLmxlZnQsIHRoaXMucmlnaHQsIHRoaXMuYm90dG9tLCB0aGlzLnRvcCwgdGhpcy5uZWFyLCB0aGlzLmZhcik7XG4gICAgfSxcblxuICAgIGRlY29tcG9zZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzLnByb2plY3Rpb25NYXRyaXguYXJyYXk7XG4gICAgICAgIHRoaXMubGVmdCA9ICgtMSAtIG1bMTJdKSAvIG1bMF07XG4gICAgICAgIHRoaXMucmlnaHQgPSAoMSAtIG1bMTJdKSAvIG1bMF07XG4gICAgICAgIHRoaXMudG9wID0gKDEgLSBtWzEzXSkgLyBtWzVdO1xuICAgICAgICB0aGlzLmJvdHRvbSA9ICgtMSAtIG1bMTNdKSAvIG1bNV07XG4gICAgICAgIHRoaXMubmVhciA9IC0oLTEgLSBtWzE0XSkgLyBtWzEwXTtcbiAgICAgICAgdGhpcy5mYXIgPSAtKDEgLSBtWzE0XSkgLyBtWzEwXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkuY2FtZXJhLk9ydGhvZ3JhcGhpY31cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjYW1lcmEgPSBDYW1lcmEucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIGNhbWVyYS5sZWZ0ID0gdGhpcy5sZWZ0O1xuICAgICAgICBjYW1lcmEucmlnaHQgPSB0aGlzLnJpZ2h0O1xuICAgICAgICBjYW1lcmEubmVhciA9IHRoaXMubmVhcjtcbiAgICAgICAgY2FtZXJhLmZhciA9IHRoaXMuZmFyO1xuICAgICAgICBjYW1lcmEudG9wID0gdGhpcy50b3A7XG4gICAgICAgIGNhbWVyYS5ib3R0b20gPSB0aGlzLmJvdHRvbTtcblxuICAgICAgICByZXR1cm4gY2FtZXJhO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBPcnRob2dyYXBoaWM7XG4iLCJmdW5jdGlvbiBnZXQob3B0aW9ucykge1xuXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgeGhyLm9wZW4oJ2dldCcsIG9wdGlvbnMudXJsKTtcbiAgICAvLyBXaXRoIHJlc3BvbnNlIHR5cGUgc2V0IGJyb3dzZXIgY2FuIGdldCBhbmQgcHV0IGJpbmFyeSBkYXRhXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vWE1MSHR0cFJlcXVlc3QvU2VuZGluZ19hbmRfUmVjZWl2aW5nX0JpbmFyeV9EYXRhXG4gICAgLy8gRGVmYXVsdCBpcyB0ZXh0LCBhbmQgaXQgY2FuIGJlIHNldFxuICAgIC8vIGFycmF5YnVmZmVyLCBibG9iLCBkb2N1bWVudCwganNvbiwgdGV4dFxuICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBpZiAob3B0aW9ucy5vbnByb2dyZXNzKSB7XG4gICAgICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vWE1MSHR0cFJlcXVlc3QvVXNpbmdfWE1MSHR0cFJlcXVlc3RcbiAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAoZS5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSBlLmxvYWRlZCAvIGUudG90YWw7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbnByb2dyZXNzKHBlcmNlbnQsIGUubG9hZGVkLCBlLnRvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25wcm9ncmVzcyhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uZXJyb3IgJiYgb3B0aW9ucy5vbmVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLm9ubG9hZCAmJiBvcHRpb25zLm9ubG9hZCh4aHIucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5vbmVycm9yKSB7XG4gICAgICAgIHhoci5vbmVycm9yID0gb3B0aW9ucy5vbmVycm9yO1xuICAgIH1cbiAgICB4aHIuc2VuZChudWxsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldCA6IGdldFxufTtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LnN0YW5kYXJkLnZlcnRleFxcbiNkZWZpbmUgU0hBREVSX05BTUUgc3RhbmRhcmRcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSBtYXQ0IHdvcmxkSW52ZXJzZVRyYW5zcG9zZSA6IFdPUkxESU5WRVJTRVRSQU5TUE9TRTtcXG51bmlmb3JtIG1hdDQgd29ybGQgOiBXT1JMRDtcXG51bmlmb3JtIHZlYzIgdXZSZXBlYXQgOiBbMS4wLCAxLjBdO1xcbnVuaWZvcm0gdmVjMiB1dk9mZnNldCA6IFswLjAsIDAuMF07XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZCA6IFRFWENPT1JEXzA7XFxuI2lmIGRlZmluZWQoQU9NQVBfRU5BQkxFRClcXG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZDIgOiBURVhDT09SRF8xO1xcbiNlbmRpZlxcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbCA6IE5PUk1BTDtcXG5hdHRyaWJ1dGUgdmVjNCB0YW5nZW50IDogVEFOR0VOVDtcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuYXR0cmlidXRlIHZlYzQgYV9Db2xvciA6IENPTE9SO1xcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbmF0dHJpYnV0ZSB2ZWMzIGJhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG4jaWYgZGVmaW5lZChQQVJBTExBWE9DQ0xVU0lPTk1BUF9FTkFCTEVEKSB8fCBkZWZpbmVkKE5PUk1BTE1BUF9FTkFCTEVEKVxcbnZhcnlpbmcgdmVjMyB2X1RhbmdlbnQ7XFxudmFyeWluZyB2ZWMzIHZfQml0YW5nZW50O1xcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKEFPTUFQX0VOQUJMRUQpXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQyO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiAgICB2ZWMzIHNraW5uZWROb3JtYWwgPSBub3JtYWw7XFxuICAgIHZlYzMgc2tpbm5lZFRhbmdlbnQgPSB0YW5nZW50Lnh5ejtcXG4jaWZkZWYgU0tJTk5JTkdcXG4gICAgQGltcG9ydCBjbGF5LmNodW5rLnNraW5fbWF0cml4XFxuICAgIHNraW5uZWRQb3NpdGlvbiA9IChza2luTWF0cml4V1MgKiB2ZWM0KHBvc2l0aW9uLCAxLjApKS54eXo7XFxuICAgIHNraW5uZWROb3JtYWwgPSAoc2tpbk1hdHJpeFdTICogdmVjNChub3JtYWwsIDAuMCkpLnh5ejtcXG4gICAgc2tpbm5lZFRhbmdlbnQgPSAoc2tpbk1hdHJpeFdTICogdmVjNCh0YW5nZW50Lnh5eiwgMC4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkICogdXZSZXBlYXQgKyB1dk9mZnNldDtcXG4gICAgdl9Xb3JsZFBvc2l0aW9uID0gKHdvcmxkICogdmVjNChza2lubmVkUG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbiAgICB2X05vcm1hbCA9IG5vcm1hbGl6ZSgod29ybGRJbnZlcnNlVHJhbnNwb3NlICogdmVjNChza2lubmVkTm9ybWFsLCAwLjApKS54eXopO1xcbiNpZiBkZWZpbmVkKFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRUQpIHx8IGRlZmluZWQoTk9STUFMTUFQX0VOQUJMRUQpXFxuICAgIHZfVGFuZ2VudCA9IG5vcm1hbGl6ZSgod29ybGRJbnZlcnNlVHJhbnNwb3NlICogdmVjNChza2lubmVkVGFuZ2VudCwgMC4wKSkueHl6KTtcXG4gICAgdl9CaXRhbmdlbnQgPSBub3JtYWxpemUoY3Jvc3Modl9Ob3JtYWwsIHZfVGFuZ2VudCkgKiB0YW5nZW50LncpO1xcbiNlbmRpZlxcbiNpZmRlZiBWRVJURVhfQ09MT1JcXG4gICAgdl9Db2xvciA9IGFfQ29sb3I7XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoQU9NQVBfRU5BQkxFRClcXG4gICAgdl9UZXhjb29yZDIgPSB0ZXhjb29yZDI7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuc3RhbmRhcmQuZnJhZ21lbnRcXG4jZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzlcXG4jZGVmaW5lIEdMT1NTSU5FU1NfQ0hBTk5FTCAwXFxuI2RlZmluZSBST1VHSE5FU1NfQ0hBTk5FTCAwXFxuI2RlZmluZSBNRVRBTE5FU1NfQ0hBTk5FTCAxXFxudW5pZm9ybSBtYXQ0IHZpZXdJbnZlcnNlIDogVklFV0lOVkVSU0U7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudmFyeWluZyB2ZWMzIHZfTm9ybWFsO1xcbnZhcnlpbmcgdmVjMyB2X1dvcmxkUG9zaXRpb247XFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRUQpIHx8IGRlZmluZWQoTk9STUFMTUFQX0VOQUJMRUQpXFxudmFyeWluZyB2ZWMzIHZfVGFuZ2VudDtcXG52YXJ5aW5nIHZlYzMgdl9CaXRhbmdlbnQ7XFxuI2VuZGlmXFxuI2lmZGVmIE5PUk1BTE1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBESUZGVVNFTUFQX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBkaWZmdXNlTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBTUEVDVUxBUk1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NcXG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcyA6IDAuNTtcXG4gICAgI2lmZGVmIFJPVUdITkVTU01BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiAgICAjZW5kaWZcXG4jZWxzZVxcbnVuaWZvcm0gZmxvYXQgZ2xvc3NpbmVzczogMC41O1xcbiAgICAjaWZkZWYgR0xPU1NJTkVTU01BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgZ2xvc3NpbmVzc01hcDtcXG4gICAgI2VuZGlmXFxuI2VuZGlmXFxuI2lmZGVmIE1FVEFMTkVTU01BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBFTlZJUk9OTUVOVE1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZpcm9ubWVudE1hcDtcXG4gICAgI2lmZGVmIFBBUkFMTEFYX0NPUlJFQ1RFRFxcbnVuaWZvcm0gdmVjMyBlbnZpcm9ubWVudEJveE1pbjtcXG51bmlmb3JtIHZlYzMgZW52aXJvbm1lbnRCb3hNYXg7XFxuICAgICNlbmRpZlxcbiNlbmRpZlxcbiNpZmRlZiBCUkRGTE9PS1VQX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBicmRmTG9va3VwO1xcbiNlbmRpZlxcbiNpZmRlZiBFTUlTU0lWRU1BUF9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFNTQU9NQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHNzYW9NYXA7XFxudW5pZm9ybSB2ZWM0IHZpZXdwb3J0IDogVklFV1BPUlQ7XFxuI2VuZGlmXFxuI2lmZGVmIEFPTUFQX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG51bmlmb3JtIGZsb2F0IGFvSW50ZW5zaXR5O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkMjtcXG4jZW5kaWZcXG51bmlmb3JtIHZlYzMgY29sb3IgOiBbMS4wLCAxLjAsIDEuMF07XFxudW5pZm9ybSBmbG9hdCBhbHBoYSA6IDEuMDtcXG4jaWZkZWYgQUxQSEFfVEVTVFxcbnVuaWZvcm0gZmxvYXQgYWxwaGFDdXRvZmY6IDAuOTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX01FVEFMTkVTU1xcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzIDogMC4wO1xcbiNlbHNlXFxudW5pZm9ybSB2ZWMzIHNwZWN1bGFyQ29sb3IgOiBbMC4xLCAwLjEsIDAuMV07XFxuI2VuZGlmXFxudW5pZm9ybSB2ZWMzIGVtaXNzaW9uIDogWzAuMCwgMC4wLCAwLjBdO1xcbnVuaWZvcm0gZmxvYXQgZW1pc3Npb25JbnRlbnNpdHk6IDE7XFxudW5pZm9ybSBmbG9hdCBsaW5lV2lkdGggOiAwLjA7XFxudW5pZm9ybSB2ZWM0IGxpbmVDb2xvciA6IFswLjAsIDAuMCwgMC4wLCAwLjZdO1xcbnZhcnlpbmcgdmVjMyB2X0JhcnljZW50cmljO1xcbiNpZmRlZiBFTlZJUk9OTUVOVE1BUF9QUkVGSUxURVJcXG51bmlmb3JtIGZsb2F0IG1heE1pcG1hcExldmVsOiA1O1xcbiNlbmRpZlxcbiNpZmRlZiBBTUJJRU5UX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5hbWJpZW50X2xpZ2h0XFxuI2VuZGlmXFxuI2lmZGVmIEFNQklFTlRfU0hfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLmFtYmllbnRfc2hfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgQU1CSUVOVF9DVUJFTUFQX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5hbWJpZW50X2N1YmVtYXBfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgUE9JTlRfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLnBvaW50X2xpZ2h0XFxuI2VuZGlmXFxuI2lmZGVmIERJUkVDVElPTkFMX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5kaXJlY3Rpb25hbF9saWdodFxcbiNlbmRpZlxcbiNpZmRlZiBTUE9UX0xJR0hUX0NPVU5UXFxuQGltcG9ydCBjbGF5LmhlYWRlci5zcG90X2xpZ2h0XFxuI2VuZGlmXFxuQGltcG9ydCBjbGF5LnV0aWwuY2FsY3VsYXRlX2F0dGVudWF0aW9uXFxuQGltcG9ydCBjbGF5LnV0aWwuZWRnZV9mYWN0b3JcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuQGltcG9ydCBjbGF5LnV0aWwuc3JnYlxcbkBpbXBvcnQgY2xheS5wbHVnaW4uY29tcHV0ZV9zaGFkb3dfbWFwXFxuQGltcG9ydCBjbGF5LnV0aWwucGFyYWxsYXhfY29ycmVjdFxcbkBpbXBvcnQgY2xheS51dGlsLkFDRVNcXG5mbG9hdCBHX1NtaXRoKGZsb2F0IGcsIGZsb2F0IG5kdiwgZmxvYXQgbmRsKVxcbntcXG4gICAgZmxvYXQgcm91Z2huZXNzID0gMS4wIC0gZztcXG4gICAgZmxvYXQgayA9IHJvdWdobmVzcyAqIHJvdWdobmVzcyAvIDIuMDtcXG4gICAgZmxvYXQgRzFWID0gbmR2IC8gKG5kdiAqICgxLjAgLSBrKSArIGspO1xcbiAgICBmbG9hdCBHMUwgPSBuZGwgLyAobmRsICogKDEuMCAtIGspICsgayk7XFxuICAgIHJldHVybiBHMUwgKiBHMVY7XFxufVxcbnZlYzMgRl9TY2hsaWNrKGZsb2F0IG5kdiwgdmVjMyBzcGVjKSB7XFxuICAgIHJldHVybiBzcGVjICsgKDEuMCAtIHNwZWMpICogcG93KDEuMCAtIG5kdiwgNS4wKTtcXG59XFxuZmxvYXQgRF9QaG9uZyhmbG9hdCBnLCBmbG9hdCBuZGgpIHtcXG4gICAgZmxvYXQgYSA9IHBvdyg4MTkyLjAsIGcpO1xcbiAgICByZXR1cm4gKGEgKyAyLjApIC8gOC4wICogcG93KG5kaCwgYSk7XFxufVxcbmZsb2F0IERfR0dYKGZsb2F0IGcsIGZsb2F0IG5kaCkge1xcbiAgICBmbG9hdCByID0gMS4wIC0gZztcXG4gICAgZmxvYXQgYSA9IHIgKiByO1xcbiAgICBmbG9hdCB0bXAgPSBuZGggKiBuZGggKiAoYSAtIDEuMCkgKyAxLjA7XFxuICAgIHJldHVybiBhIC8gKFBJICogdG1wICogdG1wKTtcXG59XFxuI2lmZGVmIFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRURcXG51bmlmb3JtIGZsb2F0IHBhcmFsbGF4T2NjbHVzaW9uU2NhbGUgOiAwLjAyO1xcbnVuaWZvcm0gZmxvYXQgcGFyYWxsYXhNYXhMYXllcnMgOiAyMDtcXG51bmlmb3JtIGZsb2F0IHBhcmFsbGF4TWluTGF5ZXJzIDogNTtcXG51bmlmb3JtIHNhbXBsZXIyRCBwYXJhbGxheE9jY2x1c2lvbk1hcDtcXG5tYXQzIHRyYW5zcG9zZShpbiBtYXQzIGluTWF0KVxcbntcXG4gICAgdmVjMyBpMCA9IGluTWF0WzBdO1xcbiAgICB2ZWMzIGkxID0gaW5NYXRbMV07XFxuICAgIHZlYzMgaTIgPSBpbk1hdFsyXTtcXG4gICAgcmV0dXJuIG1hdDMoXFxuICAgICAgICB2ZWMzKGkwLngsIGkxLngsIGkyLngpLFxcbiAgICAgICAgdmVjMyhpMC55LCBpMS55LCBpMi55KSxcXG4gICAgICAgIHZlYzMoaTAueiwgaTEueiwgaTIueilcXG4gICAgKTtcXG59XFxudmVjMiBwYXJhbGxheFV2KHZlYzIgdXYsIHZlYzMgdmlld0RpcilcXG57XFxuICAgIGZsb2F0IG51bUxheWVycyA9IG1peChwYXJhbGxheE1heExheWVycywgcGFyYWxsYXhNaW5MYXllcnMsIGFicyhkb3QodmVjMygwLjAsIDAuMCwgMS4wKSwgdmlld0RpcikpKTtcXG4gICAgZmxvYXQgbGF5ZXJIZWlnaHQgPSAxLjAgLyBudW1MYXllcnM7XFxuICAgIGZsb2F0IGN1ckxheWVySGVpZ2h0ID0gMC4wO1xcbiAgICB2ZWMyIGRlbHRhVXYgPSB2aWV3RGlyLnh5ICogcGFyYWxsYXhPY2NsdXNpb25TY2FsZSAvICh2aWV3RGlyLnogKiBudW1MYXllcnMpO1xcbiAgICB2ZWMyIGN1clV2ID0gdXY7XFxuICAgIGZsb2F0IGhlaWdodCA9IDEuMCAtIHRleHR1cmUyRChwYXJhbGxheE9jY2x1c2lvbk1hcCwgY3VyVXYpLnI7XFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzA7IGkrKykge1xcbiAgICAgICAgY3VyTGF5ZXJIZWlnaHQgKz0gbGF5ZXJIZWlnaHQ7XFxuICAgICAgICBjdXJVdiAtPSBkZWx0YVV2O1xcbiAgICAgICAgaGVpZ2h0ID0gMS4wIC0gdGV4dHVyZTJEKHBhcmFsbGF4T2NjbHVzaW9uTWFwLCBjdXJVdikucjtcXG4gICAgICAgIGlmIChoZWlnaHQgPCBjdXJMYXllckhlaWdodCkge1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHZlYzIgcHJldlV2ID0gY3VyVXYgKyBkZWx0YVV2O1xcbiAgICBmbG9hdCBuZXh0ID0gaGVpZ2h0IC0gY3VyTGF5ZXJIZWlnaHQ7XFxuICAgIGZsb2F0IHByZXYgPSAxLjAgLSB0ZXh0dXJlMkQocGFyYWxsYXhPY2NsdXNpb25NYXAsIHByZXZVdikuciAtIGN1ckxheWVySGVpZ2h0ICsgbGF5ZXJIZWlnaHQ7XFxuICAgIHJldHVybiBtaXgoY3VyVXYsIHByZXZVdiwgbmV4dCAvIChuZXh0IC0gcHJldikpO1xcbn1cXG4jZW5kaWZcXG52b2lkIG1haW4oKSB7XFxuICAgIHZlYzQgYWxiZWRvQ29sb3IgPSB2ZWM0KGNvbG9yLCBhbHBoYSk7XFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbiAgICBhbGJlZG9Db2xvciAqPSB2X0NvbG9yO1xcbiNlbmRpZlxcbiAgICB2ZWMzIGV5ZVBvcyA9IHZpZXdJbnZlcnNlWzNdLnh5ejtcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvcyAtIHZfV29ybGRQb3NpdGlvbik7XFxuICAgIHZlYzIgdXYgPSB2X1RleGNvb3JkO1xcbiNpZiBkZWZpbmVkKFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRUQpIHx8IGRlZmluZWQoTk9STUFMTUFQX0VOQUJMRUQpXFxuICAgIG1hdDMgdGJuID0gbWF0Myh2X1RhbmdlbnQsIHZfQml0YW5nZW50LCB2X05vcm1hbCk7XFxuI2VuZGlmXFxuI2lmZGVmIFBBUkFMTEFYT0NDTFVTSU9OTUFQX0VOQUJMRURcXG4gICAgdXYgPSBwYXJhbGxheFV2KHZfVGV4Y29vcmQsIG5vcm1hbGl6ZSh0cmFuc3Bvc2UodGJuKSAqIC1WKSk7XFxuI2VuZGlmXFxuI2lmZGVmIERJRkZVU0VNQVBfRU5BQkxFRFxcbiAgICB2ZWM0IHRleGVsID0gdGV4dHVyZTJEKGRpZmZ1c2VNYXAsIHV2KTtcXG4gICAgI2lmZGVmIFNSR0JfREVDT0RFXFxuICAgIHRleGVsID0gc1JHQlRvTGluZWFyKHRleGVsKTtcXG4gICAgI2VuZGlmXFxuICAgIGFsYmVkb0NvbG9yLnJnYiAqPSB0ZXhlbC5yZ2I7XFxuICAgICNpZmRlZiBESUZGVVNFTUFQX0FMUEhBX0FMUEhBXFxuICAgIGFsYmVkb0NvbG9yLmEgKj0gdGV4ZWwuYTtcXG4gICAgI2VuZGlmXFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NcXG4gICAgZmxvYXQgbSA9IG1ldGFsbmVzcztcXG4gICAgI2lmZGVmIE1FVEFMTkVTU01BUF9FTkFCTEVEXFxuICAgIGZsb2F0IG0yID0gdGV4dHVyZTJEKG1ldGFsbmVzc01hcCwgdXYpW01FVEFMTkVTU19DSEFOTkVMXTtcXG4gICAgbSA9IGNsYW1wKG0yICsgKG0gLSAwLjUpICogMi4wLCAwLjAsIDEuMCk7XFxuICAgICNlbmRpZlxcbiAgICB2ZWMzIGJhc2VDb2xvciA9IGFsYmVkb0NvbG9yLnJnYjtcXG4gICAgYWxiZWRvQ29sb3IucmdiID0gYmFzZUNvbG9yICogKDEuMCAtIG0pO1xcbiAgICB2ZWMzIHNwZWMgPSBtaXgodmVjMygwLjA0KSwgYmFzZUNvbG9yLCBtKTtcXG4jZWxzZVxcbiAgICB2ZWMzIHNwZWMgPSBzcGVjdWxhckNvbG9yO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfUk9VR0hORVNTXFxuICAgIGZsb2F0IGcgPSAxLjAgLSByb3VnaG5lc3M7XFxuICAgICNpZmRlZiBST1VHSE5FU1NNQVBfRU5BQkxFRFxcbiAgICBmbG9hdCBnMiA9IDEuMCAtIHRleHR1cmUyRChyb3VnaG5lc3NNYXAsIHV2KVtST1VHSE5FU1NfQ0hBTk5FTF07XFxuICAgIGcgPSBjbGFtcChnMiArIChnIC0gMC41KSAqIDIuMCwgMC4wLCAxLjApO1xcbiAgICAjZW5kaWZcXG4jZWxzZVxcbiAgICBmbG9hdCBnID0gZ2xvc3NpbmVzcztcXG4gICAgI2lmZGVmIEdMT1NTSU5FU1NNQVBfRU5BQkxFRFxcbiAgICBmbG9hdCBnMiA9IHRleHR1cmUyRChnbG9zc2luZXNzTWFwLCB1dilbR0xPU1NJTkVTU19DSEFOTkVMXTtcXG4gICAgZyA9IGNsYW1wKGcyICsgKGcgLSAwLjUpICogMi4wLCAwLjAsIDEuMCk7XFxuICAgICNlbmRpZlxcbiNlbmRpZlxcbiNpZmRlZiBTUEVDVUxBUk1BUF9FTkFCTEVEXFxuICAgIHNwZWMgKj0gc1JHQlRvTGluZWFyKHRleHR1cmUyRChzcGVjdWxhck1hcCwgdXYpKS5yZ2I7XFxuI2VuZGlmXFxuICAgIHZlYzMgTiA9IHZfTm9ybWFsO1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG4gICAgaWYgKGRvdChOLCBWKSA8IDAuMCkge1xcbiAgICAgICAgTiA9IC1OO1xcbiAgICB9XFxuI2VuZGlmXFxuI2lmZGVmIE5PUk1BTE1BUF9FTkFCTEVEXFxuICAgIGlmIChkb3Qodl9UYW5nZW50LCB2X1RhbmdlbnQpID4gMC4wKSB7XFxuICAgICAgICB2ZWMzIG5vcm1hbFRleGVsID0gdGV4dHVyZTJEKG5vcm1hbE1hcCwgdXYpLnh5ejtcXG4gICAgICAgIGlmIChkb3Qobm9ybWFsVGV4ZWwsIG5vcm1hbFRleGVsKSA+IDAuMCkgeyAgICAgICAgICAgIE4gPSBub3JtYWxUZXhlbCAqIDIuMCAtIDEuMDtcXG4gICAgICAgICAgICB0Ym5bMV0gPSAtdGJuWzFdO1xcbiAgICAgICAgICAgIE4gPSBub3JtYWxpemUodGJuICogTik7XFxuICAgICAgICB9XFxuICAgIH1cXG4jZW5kaWZcXG4gICAgdmVjMyBkaWZmdXNlVGVybSA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuICAgIHZlYzMgc3BlY3VsYXJUZXJtID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIHZlYzMgZnJlc25lbFRlcm0gPSBGX1NjaGxpY2sobmR2LCBzcGVjKTtcXG4jaWZkZWYgQU1CSUVOVF9MSUdIVF9DT1VOVFxcbiAgICBmb3IoaW50IF9pZHhfID0gMDsgX2lkeF8gPCBBTUJJRU5UX0xJR0hUX0NPVU5UOyBfaWR4XysrKVxcbiAgICB7e1xcbiAgICAgICAgZGlmZnVzZVRlcm0gKz0gYW1iaWVudExpZ2h0Q29sb3JbX2lkeF9dO1xcbiAgICB9fVxcbiNlbmRpZlxcbiNpZmRlZiBBTUJJRU5UX1NIX0xJR0hUX0NPVU5UXFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IEFNQklFTlRfU0hfTElHSFRfQ09VTlQ7IF9pZHhfKyspXFxuICAgIHt7XFxuICAgICAgICBkaWZmdXNlVGVybSArPSBjYWxjQW1iaWVudFNITGlnaHQoX2lkeF8sIE4pICogYW1iaWVudFNITGlnaHRDb2xvcltfaWR4X107XFxuICAgIH19XFxuI2VuZGlmXFxuI2lmZGVmIFBPSU5UX0xJR0hUX0NPVU5UXFxuI2lmIGRlZmluZWQoUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICBmbG9hdCBzaGFkb3dDb250cmlic1BvaW50W1BPSU5UX0xJR0hUX0NPVU5UXTtcXG4gICAgaWYoc2hhZG93RW5hYmxlZClcXG4gICAge1xcbiAgICAgICAgY29tcHV0ZVNoYWRvd09mUG9pbnRMaWdodHModl9Xb3JsZFBvc2l0aW9uLCBzaGFkb3dDb250cmlic1BvaW50KTtcXG4gICAgfVxcbiNlbmRpZlxcbiAgICBmb3IoaW50IF9pZHhfID0gMDsgX2lkeF8gPCBQT0lOVF9MSUdIVF9DT1VOVDsgX2lkeF8rKylcXG4gICAge3tcXG4gICAgICAgIHZlYzMgbGlnaHRQb3NpdGlvbiA9IHBvaW50TGlnaHRQb3NpdGlvbltfaWR4X107XFxuICAgICAgICB2ZWMzIGxjID0gcG9pbnRMaWdodENvbG9yW19pZHhfXTtcXG4gICAgICAgIGZsb2F0IHJhbmdlID0gcG9pbnRMaWdodFJhbmdlW19pZHhfXTtcXG4gICAgICAgIHZlYzMgTCA9IGxpZ2h0UG9zaXRpb24gLSB2X1dvcmxkUG9zaXRpb247XFxuICAgICAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKEwpO1xcbiAgICAgICAgZmxvYXQgYXR0ZW51YXRpb24gPSBsaWdodEF0dGVudWF0aW9uKGRpc3QsIHJhbmdlKTtcXG4gICAgICAgIEwgLz0gZGlzdDtcXG4gICAgICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBjbGFtcChkb3QoTiwgTCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxuICAgICAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic1BvaW50W19pZHhfXTtcXG4gICAgICAgIH1cXG4jZW5kaWZcXG4gICAgICAgIHZlYzMgbGkgPSBsYyAqIG5kbCAqIGF0dGVudWF0aW9uICogc2hhZG93Q29udHJpYjtcXG4gICAgICAgIGRpZmZ1c2VUZXJtICs9IGxpO1xcbiAgICAgICAgc3BlY3VsYXJUZXJtICs9IGxpICogZnJlc25lbFRlcm0gKiBEX1Bob25nKGcsIG5kaCk7XFxuICAgIH19XFxuI2VuZGlmXFxuI2lmZGVmIERJUkVDVElPTkFMX0xJR0hUX0NPVU5UXFxuI2lmIGRlZmluZWQoRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICBmbG9hdCBzaGFkb3dDb250cmlic0RpcltESVJFQ1RJT05BTF9MSUdIVF9DT1VOVF07XFxuICAgIGlmKHNoYWRvd0VuYWJsZWQpXFxuICAgIHtcXG4gICAgICAgIGNvbXB1dGVTaGFkb3dPZkRpcmVjdGlvbmFsTGlnaHRzKHZfV29ybGRQb3NpdGlvbiwgc2hhZG93Q29udHJpYnNEaXIpO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IERJUkVDVElPTkFMX0xJR0hUX0NPVU5UOyBfaWR4XysrKVxcbiAgICB7e1xcbiAgICAgICAgdmVjMyBMID0gLW5vcm1hbGl6ZShkaXJlY3Rpb25hbExpZ2h0RGlyZWN0aW9uW19pZHhfXSk7XFxuICAgICAgICB2ZWMzIGxjID0gZGlyZWN0aW9uYWxMaWdodENvbG9yW19pZHhfXTtcXG4gICAgICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBjbGFtcChkb3QoTiwgTCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChESVJFQ1RJT05BTF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxuICAgICAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic0RpcltfaWR4X107XFxuICAgICAgICB9XFxuI2VuZGlmXFxuICAgICAgICB2ZWMzIGxpID0gbGMgKiBuZGwgKiBzaGFkb3dDb250cmliO1xcbiAgICAgICAgZGlmZnVzZVRlcm0gKz0gbGk7XFxuICAgICAgICBzcGVjdWxhclRlcm0gKz0gbGkgKiBmcmVzbmVsVGVybSAqIERfUGhvbmcoZywgbmRoKTtcXG4gICAgfX1cXG4jZW5kaWZcXG4jaWZkZWYgU1BPVF9MSUdIVF9DT1VOVFxcbiNpZiBkZWZpbmVkKFNQT1RfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICBmbG9hdCBzaGFkb3dDb250cmlic1Nwb3RbU1BPVF9MSUdIVF9DT1VOVF07XFxuICAgIGlmKHNoYWRvd0VuYWJsZWQpXFxuICAgIHtcXG4gICAgICAgIGNvbXB1dGVTaGFkb3dPZlNwb3RMaWdodHModl9Xb3JsZFBvc2l0aW9uLCBzaGFkb3dDb250cmlic1Nwb3QpO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGZvcihpbnQgaSA9IDA7IGkgPCBTUE9UX0xJR0hUX0NPVU5UOyBpKyspXFxuICAgIHtcXG4gICAgICAgIHZlYzMgbGlnaHRQb3NpdGlvbiA9IHNwb3RMaWdodFBvc2l0aW9uW2ldO1xcbiAgICAgICAgdmVjMyBzcG90TGlnaHREaXJlY3Rpb24gPSAtbm9ybWFsaXplKHNwb3RMaWdodERpcmVjdGlvbltpXSk7XFxuICAgICAgICB2ZWMzIGxjID0gc3BvdExpZ2h0Q29sb3JbaV07XFxuICAgICAgICBmbG9hdCByYW5nZSA9IHNwb3RMaWdodFJhbmdlW2ldO1xcbiAgICAgICAgZmxvYXQgYSA9IHNwb3RMaWdodFVtYnJhQW5nbGVDb3NpbmVbaV07XFxuICAgICAgICBmbG9hdCBiID0gc3BvdExpZ2h0UGVudW1icmFBbmdsZUNvc2luZVtpXTtcXG4gICAgICAgIGZsb2F0IGZhbGxvZmZGYWN0b3IgPSBzcG90TGlnaHRGYWxsb2ZmRmFjdG9yW2ldO1xcbiAgICAgICAgdmVjMyBMID0gbGlnaHRQb3NpdGlvbiAtIHZfV29ybGRQb3NpdGlvbjtcXG4gICAgICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoTCk7XFxuICAgICAgICBmbG9hdCBhdHRlbnVhdGlvbiA9IGxpZ2h0QXR0ZW51YXRpb24oZGlzdCwgcmFuZ2UpO1xcbiAgICAgICAgTCAvPSBkaXN0O1xcbiAgICAgICAgZmxvYXQgYyA9IGRvdChzcG90TGlnaHREaXJlY3Rpb24sIEwpO1xcbiAgICAgICAgZmxvYXQgZmFsbG9mZjtcXG4gICAgICAgIGZhbGxvZmYgPSBjbGFtcCgoYyAtIGEpIC8oIGIgLSBhKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmFsbG9mZiA9IHBvdyhmYWxsb2ZmLCBmYWxsb2ZmRmFjdG9yKTtcXG4gICAgICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBjbGFtcChkb3QoTiwgTCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgICAgIGlmIChzaGFkb3dFbmFibGVkKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic1Nwb3RbaV07XFxuICAgICAgICB9XFxuI2VuZGlmXFxuICAgICAgICB2ZWMzIGxpID0gbGMgKiBhdHRlbnVhdGlvbiAqICgxLjAgLSBmYWxsb2ZmKSAqIHNoYWRvd0NvbnRyaWIgKiBuZGw7XFxuICAgICAgICBkaWZmdXNlVGVybSArPSBsaTtcXG4gICAgICAgIHNwZWN1bGFyVGVybSArPSBsaSAqIGZyZXNuZWxUZXJtICogRF9QaG9uZyhnLCBuZGgpO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIHZlYzQgb3V0Q29sb3IgPSBhbGJlZG9Db2xvcjtcXG4gICAgb3V0Q29sb3IucmdiICo9IGRpZmZ1c2VUZXJtO1xcbiAgICBvdXRDb2xvci5yZ2IgKz0gc3BlY3VsYXJUZXJtO1xcbiNpZmRlZiBBTUJJRU5UX0NVQkVNQVBfTElHSFRfQ09VTlRcXG4gICAgdmVjMyBMID0gcmVmbGVjdCgtViwgTik7XFxuICAgIGZsb2F0IHJvdWdoMiA9IGNsYW1wKDEuMCAtIGcsIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgYmlhczIgPSByb3VnaDIgKiA1LjA7XFxuICAgIHZlYzIgYnJkZlBhcmFtMiA9IHRleHR1cmUyRChhbWJpZW50Q3ViZW1hcExpZ2h0QlJERkxvb2t1cFswXSwgdmVjMihyb3VnaDIsIG5kdikpLnh5O1xcbiAgICB2ZWMzIGVudldlaWdodDIgPSBzcGVjICogYnJkZlBhcmFtMi54ICsgYnJkZlBhcmFtMi55O1xcbiAgICB2ZWMzIGVudlRleGVsMjtcXG4gICAgZm9yKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgQU1CSUVOVF9DVUJFTUFQX0xJR0hUX0NPVU5UOyBfaWR4XysrKVxcbiAgICB7e1xcbiAgICAgICAgZW52VGV4ZWwyID0gUkdCTURlY29kZSh0ZXh0dXJlQ3ViZUxvZEVYVChhbWJpZW50Q3ViZW1hcExpZ2h0Q3ViZW1hcFtfaWR4X10sIEwsIGJpYXMyKSwgNTEuNSk7XFxuICAgICAgICBvdXRDb2xvci5yZ2IgKz0gYW1iaWVudEN1YmVtYXBMaWdodENvbG9yW19pZHhfXSAqIGVudlRleGVsMiAqIGVudldlaWdodDI7XFxuICAgIH19XFxuI2VuZGlmXFxuI2lmZGVmIEVOVklST05NRU5UTUFQX0VOQUJMRURcXG4gICAgdmVjMyBlbnZXZWlnaHQgPSBnICogZnJlc25lbFRlcm07XFxuICAgIHZlYzMgTCA9IHJlZmxlY3QoLVYsIE4pO1xcbiAgICAjaWZkZWYgUEFSQUxMQVhfQ09SUkVDVEVEXFxuICAgIEwgPSBwYXJhbGxheENvcnJlY3QoTCwgdl9Xb3JsZFBvc2l0aW9uLCBlbnZpcm9ubWVudEJveE1pbiwgZW52aXJvbm1lbnRCb3hNYXgpO1xcbiAgICAjZW5kaWZcXG4gICAgI2lmZGVmIEVOVklST05NRU5UTUFQX1BSRUZJTFRFUlxcbiAgICBmbG9hdCByb3VnaCA9IGNsYW1wKDEuMCAtIGcsIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgYmlhcyA9IHJvdWdoICogbWF4TWlwbWFwTGV2ZWw7XFxuICAgIHZlYzMgZW52VGV4ZWwgPSBkZWNvZGVIRFIodGV4dHVyZUN1YmVMb2RFWFQoZW52aXJvbm1lbnRNYXAsIEwsIGJpYXMpKS5yZ2I7XFxuICAgICAgICAjaWZkZWYgQlJERkxPT0tVUF9FTkFCTEVEXFxuICAgIHZlYzIgYnJkZlBhcmFtID0gdGV4dHVyZTJEKGJyZGZMb29rdXAsIHZlYzIocm91Z2gsIG5kdikpLnh5O1xcbiAgICBlbnZXZWlnaHQgPSBzcGVjICogYnJkZlBhcmFtLnggKyBicmRmUGFyYW0ueTtcXG4gICAgICAgICNlbmRpZlxcbiAgICAjZWxzZVxcbiAgICB2ZWMzIGVudlRleGVsID0gdGV4dHVyZUN1YmUoZW52aXJvbm1lbnRNYXAsIEwpLnh5ejtcXG4gICAgI2VuZGlmXFxuICAgIG91dENvbG9yLnJnYiArPSBlbnZUZXhlbCAqIGVudldlaWdodDtcXG4jZW5kaWZcXG4gICAgZmxvYXQgYW9GYWN0b3IgPSAxLjA7XFxuI2lmZGVmIFNTQU9NQVBfRU5BQkxFRFxcbiAgICBhb0ZhY3RvciA9IG1pbih0ZXh0dXJlMkQoc3Nhb01hcCwgKGdsX0ZyYWdDb29yZC54eSAtIHZpZXdwb3J0Lnh5KSAvIHZpZXdwb3J0Lnp3KS5yLCBhb0ZhY3Rvcik7XFxuI2VuZGlmXFxuI2lmZGVmIEFPTUFQX0VOQUJMRURcXG4gICAgYW9GYWN0b3IgPSBtaW4oMS4wIC0gY2xhbXAoKDEuMCAtIHRleHR1cmUyRChhb01hcCwgdl9UZXhjb29yZDIpLnIpICogYW9JbnRlbnNpdHksIDAuMCwgMS4wKSwgYW9GYWN0b3IpO1xcbiNlbmRpZlxcbiAgICBvdXRDb2xvci5yZ2IgKj0gYW9GYWN0b3I7XFxuICAgIHZlYzMgbEVtaXNzaW9uID0gZW1pc3Npb247XFxuI2lmZGVmIEVNSVNTSVZFTUFQX0VOQUJMRURcXG4gICAgbEVtaXNzaW9uICo9IHRleHR1cmUyRChlbWlzc2l2ZU1hcCwgdXYpLnJnYjtcXG4jZW5kaWZcXG4gICAgb3V0Q29sb3IucmdiICs9IGxFbWlzc2lvbiAqIGVtaXNzaW9uSW50ZW5zaXR5O1xcbiNpZmRlZiBHQU1NQV9FTkNPREVcXG4gICAgb3V0Q29sb3IucmdiID0gcG93KG91dENvbG9yLnJnYiwgdmVjMygxIC8gMi4yKSk7XFxuI2VuZGlmXFxuICAgIGlmKGxpbmVXaWR0aCA+IDAuKVxcbiAgICB7XFxuICAgICAgICBvdXRDb2xvci5yZ2IgPSBtaXgob3V0Q29sb3IucmdiLCBsaW5lQ29sb3IucmdiLCAoMS4wIC0gZWRnZUZhY3RvcihsaW5lV2lkdGgpKSAqIGxpbmVDb2xvci5hKTtcXG4gICAgfVxcbiNpZmRlZiBBTFBIQV9URVNUXFxuICAgIGlmIChvdXRDb2xvci5hIDwgYWxwaGFDdXRvZmYpIHtcXG4gICAgICAgIGRpc2NhcmQ7XFxuICAgIH1cXG4jZW5kaWZcXG4jaWZkZWYgVE9ORU1BUFBJTkdcXG4gICAgb3V0Q29sb3IucmdiID0gQUNFU1RvbmVNYXBwaW5nKG91dENvbG9yLnJnYik7XFxuI2VuZGlmXFxuI2lmZGVmIFNSR0JfRU5DT0RFXFxuICAgIG91dENvbG9yID0gbGluZWFyVG9zUkdCKG91dENvbG9yKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKG91dENvbG9yKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5zdGFuZGFyZE1SLnZlcnRleFxcbkBpbXBvcnQgY2xheS5zdGFuZGFyZC52ZXJ0ZXhcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnN0YW5kYXJkTVIuZnJhZ21lbnRcXG4jZGVmaW5lIFVTRV9NRVRBTE5FU1NcXG4jZGVmaW5lIFVTRV9ST1VHSE5FU1NcXG5AaW1wb3J0IGNsYXkuc3RhbmRhcmQuZnJhZ21lbnRcXG5AZW5kXCI7XG4iLCJpbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi9NYXRlcmlhbCc7XG5cbmltcG9ydCBTaGFkZXIgZnJvbSAnLi9TaGFkZXInO1xuaW1wb3J0IHN0YW5kYXJkRXNzbCBmcm9tICcuL3NoYWRlci9zb3VyY2Uvc3RhbmRhcmQuZ2xzbC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5cbi8vIEltcG9ydCBzdGFuZGFyZCBzaGFkZXJcblNoYWRlclsnaW1wb3J0J10oc3RhbmRhcmRFc3NsKTtcblxudmFyIFRFWFRVUkVfUFJPUEVSVElFUyA9IFsnZGlmZnVzZU1hcCcsICdub3JtYWxNYXAnLCAncm91Z2huZXNzTWFwJywgJ21ldGFsbmVzc01hcCcsICdlbWlzc2l2ZU1hcCcsICdlbnZpcm9ubWVudE1hcCcsICdicmRmTG9va3VwJywgJ3NzYW9NYXAnLCAnYW9NYXAnXTtcbnZhciBTSU1QTEVfUFJPUEVSVElFUyA9IFsnY29sb3InLCAnZW1pc3Npb24nLCAnZW1pc3Npb25JbnRlbnNpdHknLCAnYWxwaGEnLCAncm91Z2huZXNzJywgJ21ldGFsbmVzcycsICd1dlJlcGVhdCcsICd1dk9mZnNldCcsICdhb0ludGVuc2l0eScsICdhbHBoYUN1dG9mZiddO1xudmFyIFBST1BFUlRJRVNfQ0hBTkdFX1NIQURFUiA9IFsnbGluZWFyJywgJ2VuY29kZVJHQk0nLCAnZGVjb2RlUkdCTScsICdkb3VibGVTaWRlZCcsICdhbHBoYVRlc3QnLCAncm91Z2huZXNzQ2hhbm5lbCcsICdtZXRhbG5lc3NDaGFubmVsJywgJ2Vudmlyb25tZW50TWFwUHJlZmlsdGVyZWQnXTtcblxudmFyIE5VTV9ERUZJTkVfTUFQID0ge1xuICAgICdyb3VnaG5lc3NDaGFubmVsJzogJ1JPVUdITkVTU19DSEFOTkVMJyxcbiAgICAnbWV0YWxuZXNzQ2hhbm5lbCc6ICdNRVRBTE5FU1NfQ0hBTk5FTCdcbn07XG52YXIgQk9PTF9ERUZJTkVfTUFQID0ge1xuICAgICdsaW5lYXInOiAnU1JHQl9ERUNPREUnLFxuICAgICdlbmNvZGVSR0JNJzogJ1JHQk1fRU5DT0RFJyxcbiAgICAnZGVjb2RlUkdCTSc6ICdSR0JNX0RFQ09ERScsXG4gICAgJ2RvdWJsZVNpZGVkJzogJ0RPVUJMRV9TSURFRCcsXG4gICAgJ2FscGhhVGVzdCc6ICdBTFBIQV9URVNUJyxcbiAgICAnZW52aXJvbm1lbnRNYXBQcmVmaWx0ZXJlZCc6ICdFTlZJUk9OTUVOVE1BUF9QUkVGSUxURVInXG59XG5cblxudmFyIHN0YW5kYXJkU2hhZGVyO1xuLyoqXG4gKiBTdGFuZGFyZCBtYXRlcmlhbCB3aXRob3V0IGN1c3RvbSBzaGFkZXIuXG4gKiBAY29uc3RydWN0b3IgY2xheS5TdGFuZGFyZE1hdGVyaWFsXG4gKiBAZXh0ZW5kcyBjbGF5LkJhc2VcbiAqIEBleGFtcGxlXG4gKiB2YXIgbWF0ID0gbmV3IGNsYXkuU3RhbmRhcmRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IFsxLCAxLCAxXSxcbiAqICAgICBkaWZmdXNlTWFwOiBkaWZmdXNlVGV4dHVyZVxuICogfSk7XG4gKiBtYXQucm91Z2huZXNzID0gMTtcbiAqL1xudmFyIFN0YW5kYXJkTWF0ZXJpYWwgPSBNYXRlcmlhbC5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RhbmRhcmRTaGFkZXIpIHtcbiAgICAgICAgc3RhbmRhcmRTaGFkZXIgPSBuZXcgU2hhZGVyKFNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmQudmVydGV4JyksIFNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmQuZnJhZ21lbnQnKSk7XG4gICAgfVxuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuU3RhbmRhcmRNYXRlcmlhbCMgKi8ge1xuICAgICAgICBzaGFkZXI6IHN0YW5kYXJkU2hhZGVyXG4gICAgfTtcbn0sIGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAvLyBQRU5ESU5HXG4gICAgdXRpbC5leHRlbmQodGhpcywgb3B0aW9uKTtcbiAgICAvLyBFeHRlbmQgYWZ0ZXIgc2hhZGVyIGlzIGNyZWF0ZWQuXG4gICAgdXRpbC5kZWZhdWx0cyh0aGlzLCAvKiogQGxlbmRzIGNsYXkuU3RhbmRhcmRNYXRlcmlhbCMgKi8gIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn1cbiAgICAgICAgICogQGRlZmF1bHQgWzEsIDEsIDFdXG4gICAgICAgICAqL1xuICAgICAgICBjb2xvcjogWzEsIDEsIDFdLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59XG4gICAgICAgICAqIEBkZWZhdWx0IFswLCAwLCAwXVxuICAgICAgICAgKi9cbiAgICAgICAgZW1pc3Npb246IFswLCAwLCAwXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgZW1pc3Npb25JbnRlbnNpdHk6IDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDAuNVxuICAgICAgICAgKi9cbiAgICAgICAgcm91Z2huZXNzOiAwLjUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIG1ldGFsbmVzczogMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgYWxwaGE6IDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgYWxwaGFUZXN0OiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3V0b2ZmIHRocmVzaG9sZCBmb3IgYWxwaGEgdGVzdFxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgYWxwaGFDdXRvZmY6IDAuOSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICAvLyBUT0RPIE11c3QgZGlzYWJsZSBjdWxsaW5nLlxuICAgICAgICBkb3VibGVTaWRlZDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgICAgICovXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlQ3ViZX1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguQm91bmRpbmdCb3h9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCUkRGIExvb2t1cCBpcyBnZW5lcmF0ZWQgYnkgY2xheS51dGlsLmN1YmVtYXAuaW50ZWdyYXRlQnJkZlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPG51bWJlcj59XG4gICAgICAgICAqIEBkZWZhdWx0IFsxLCAxXVxuICAgICAgICAgKi9cbiAgICAgICAgdXZSZXBlYXQ6IFsxLCAxXSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXI+fVxuICAgICAgICAgKiBAZGVmYXVsdCBbMCwgMF1cbiAgICAgICAgICovXG4gICAgICAgIHV2T2Zmc2V0OiBbMCwgMF0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIGFvSW50ZW5zaXR5OiAxLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGVudmlyb25tZW50TWFwUHJlZmlsdGVyZWQ6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmVhcjogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZW5jb2RlUkdCTTogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgZGVjb2RlUkdCTTogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICByb3VnaG5lc3NDaGFubmVsOiAwLFxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIG1ldGFsbmVzc0NoYW5uZWw6IDFcbiAgICB9KTtcblxuICAgIHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfTUVUQUxORVNTJyk7XG4gICAgdGhpcy5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9ST1VHSE5FU1MnKTtcbn0sIHtcbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgU3RhbmRhcmRNYXRlcmlhbCh7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIFRFWFRVUkVfUFJPUEVSVElFUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxbcHJvcE5hbWVdID0gdGhpc1twcm9wTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICBTSU1QTEVfUFJPUEVSVElFUy5jb25jYXQoUFJPUEVSVElFU19DSEFOR0VfU0hBREVSKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgbWF0ZXJpYWxbcHJvcE5hbWVdID0gdGhpc1twcm9wTmFtZV07XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfVxufSk7XG5cblNJTVBMRV9QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLCBwcm9wTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChwcm9wTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFVuaWZvcm0ocHJvcE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cblRFWFRVUkVfUFJPUEVSVElFUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSwgcHJvcE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQocHJvcE5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRVbmlmb3JtKHByb3BOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5QUk9QRVJUSUVTX0NIQU5HRV9TSEFERVIuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICB2YXIgcHJpdmF0ZUtleSA9ICdfJyArIHByb3BOYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSwgcHJvcE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1twcml2YXRlS2V5XTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbcHJpdmF0ZUtleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChwcm9wTmFtZSBpbiBOVU1fREVGSU5FX01BUCkge1xuICAgICAgICAgICAgICAgIHZhciBkZWZpbmVOYW1lID0gTlVNX0RFRklORV9NQVBbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsIGRlZmluZU5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBkZWZpbmVOYW1lID0gQk9PTF9ERUZJTkVfTUFQW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA/IHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsIGRlZmluZU5hbWUpIDogdGhpcy51bmRlZmluZSgnZnJhZ21lbnQnLCBkZWZpbmVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSwgJ2Vudmlyb25tZW50Qm94Jywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW52Qm94ID0gdGhpcy5fZW52aXJvbm1lbnRCb3g7XG4gICAgICAgIGlmIChlbnZCb3gpIHtcbiAgICAgICAgICAgIGVudkJveC5taW4uc2V0QXJyYXkodGhpcy5nZXQoJ2Vudmlyb25tZW50Qm94TWluJykpO1xuICAgICAgICAgICAgZW52Qm94Lm1heC5zZXRBcnJheSh0aGlzLmdldCgnZW52aXJvbm1lbnRCb3hNYXgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudkJveDtcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZW52aXJvbm1lbnRCb3ggPSB2YWx1ZTtcblxuICAgICAgICB2YXIgdW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zID0gdGhpcy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdW5pZm9ybXNbJ2Vudmlyb25tZW50Qm94TWluJ10gPSB1bmlmb3Jtc1snZW52aXJvbm1lbnRCb3hNaW4nXSB8fCB7XG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB1bmlmb3Jtc1snZW52aXJvbm1lbnRCb3hNYXgnXSA9IHVuaWZvcm1zWydlbnZpcm9ubWVudEJveE1heCddIHx8IHtcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETyBDYW4ndCBkZXRlY3Qgb3BlcmF0aW9uIGxpa2UgYm94Lm1pbiA9IG5ldyBWZWN0b3IoKVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VW5pZm9ybSgnZW52aXJvbm1lbnRCb3hNaW4nLCB2YWx1ZS5taW4uYXJyYXkpO1xuICAgICAgICAgICAgdGhpcy5zZXRVbmlmb3JtKCdlbnZpcm9ubWVudEJveE1heCcsIHZhbHVlLm1heC5hcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lKCdmcmFnbWVudCcsICdQQVJBTExBWF9DT1JSRUNURUQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BBUkFMTEFYX0NPUlJFQ1RFRCcpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0YW5kYXJkTWF0ZXJpYWw7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuL2NvcmUvQmFzZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuSm9pbnRcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBKb2ludCA9IEJhc2UuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LkpvaW50IyAqL1xue1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9pc3N1ZXMvMTkzI2lzc3VlY29tbWVudC0yOTIxNjU3NlxuICAgIC8qKlxuICAgICAqIEpvaW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIG5hbWU6ICcnLFxuICAgIC8qKlxuICAgICAqIEluZGV4IG9mIGpvaW50IGluIHRoZSBza2VsZXRvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgaW5kZXg6IC0xLFxuXG4gICAgLyoqXG4gICAgICogU2NlbmUgbm9kZSBhdHRhY2hlZCB0b1xuICAgICAqIEB0eXBlIHtjbGF5Lk5vZGV9XG4gICAgICovXG4gICAgbm9kZTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFJvb3Qgc2NlbmUgbm9kZSBvZiB0aGUgc2tlbGV0b24sIHdoaWNoIHBhcmVudCBub2RlIGlzIG51bGwgb3IgZG9uJ3QgaGF2ZSBhIGpvaW50XG4gICAgICogQHR5cGUge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICByb290Tm9kZTogbnVsbFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEpvaW50O1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IEpvaW50IGZyb20gJy4vSm9pbnQnO1xuXG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHF1YXQgPSBnbE1hdHJpeC5xdWF0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LlNrZWxldG9uXG4gKi9cbnZhciBTa2VsZXRvbiA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LlNrZWxldG9uIyAqL3tcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpdmUgcm9vdCBub2RlIHRoYXQgbm90IGFmZmVjdCB0cmFuc2Zvcm0gb2Ygam9pbnQuXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lk5vZGV9XG4gICAgICAgICAqL1xuICAgICAgICByZWxhdGl2ZVJvb3ROb2RlOiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBqb2ludHNcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxjbGF5LkpvaW50Pn1cbiAgICAgICAgICovXG4gICAgICAgIGpvaW50czogW10sXG5cbiAgICAgICAgX2NsaXBzOiBbXSxcblxuICAgICAgICAvLyBNYXRyaXggdG8gam9pbnQgc3BhY2UgKHJlbGF0aXZlIHRvIHJvb3Qgam9pbnQpXG4gICAgICAgIF9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXk6IG51bGwsXG5cbiAgICAgICAgLy8gVXNlIHN1YmFycmF5IGluc3RlYWQgb2YgY29weSBiYWNrIGVhY2ggdGltZSBjb21wdXRpbmcgbWF0cml4XG4gICAgICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL3N1YmFycmF5LXZzLWNvcHktZm9yLWFycmF5LXRyYW5zZm9ybS81XG4gICAgICAgIF9qb2ludE1hdHJpY2VzU3ViQXJyYXlzOiBbXSxcblxuICAgICAgICAvLyBqb2ludE1hdHJpeCAqIGN1cnJlbnRQb3NlTWF0cml4XG4gICAgICAgIC8vIHdvcmxkVHJhbnNmb3JtIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IGJvbmVcbiAgICAgICAgLy8gc3RpbGwgaW4gbW9kZWwgc3BhY2Ugbm90IHdvcmxkIHNwYWNlXG4gICAgICAgIF9za2luTWF0cmljZXNBcnJheTogbnVsbCxcblxuICAgICAgICBfc2tpbk1hdHJpY2VzU3ViQXJyYXlzOiBbXSxcblxuICAgICAgICBfc3ViU2tpbk1hdHJpY2VzQXJyYXk6IHt9XG4gICAgfTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuU2tlbGV0b24ucHJvdG90eXBlICovXG57XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBza2lubmluZyBjbGlwIGFuZCBjcmVhdGUgYSBtYXAgYmV0d2VlbiBjbGlwIGFuZCBza2VsZXRvblxuICAgICAqIEBwYXJhbSB7Y2xheS5hbmltYXRpb24uU2tpbm5pbmdDbGlwfSBjbGlwXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFttYXBSdWxlXSBNYXAgYmV0d2VlbiBqb2ludCBuYW1lIGluIHNrZWxldG9uIGFuZCBqb2ludCBuYW1lIGluIGNsaXBcbiAgICAgKi9cbiAgICBhZGRDbGlwOiBmdW5jdGlvbiAoY2xpcCwgbWFwUnVsZSkge1xuICAgICAgICAvLyBDbGlwIGhhdmUgYmVlbiBleGlzdHMgaW5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jbGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NsaXBzW2ldLmNsaXAgPT09IGNsaXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFwIHRoZSBqb2ludCBpbmRleCBpbiBza2VsZXRvbiB0byBqb2ludCBwb3NlIGluZGV4IGluIGNsaXBcbiAgICAgICAgdmFyIG1hcHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmpvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbWFwc1tpXSA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhdmF0YXJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLmpvaW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBqb2ludCA9IHRoaXMuam9pbnRzW2pdO1xuICAgICAgICAgICAgICAgIHZhciB0cmFjayA9IGNsaXAudHJhY2tzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBqb2ludE5hbWUgPSBqb2ludC5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChtYXBSdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW50TmFtZSA9IG1hcFJ1bGVbam9pbnROYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrLm5hbWUgPT09IGpvaW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXBzW2pdID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xpcHMucHVzaCh7XG4gICAgICAgICAgICBtYXBzOiBtYXBzLFxuICAgICAgICAgICAgY2xpcDogY2xpcFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpcHMubGVuZ3RoIC0gMTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtjbGF5LmFuaW1hdGlvbi5Ta2lubmluZ0NsaXB9IGNsaXBcbiAgICAgKi9cbiAgICByZW1vdmVDbGlwOiBmdW5jdGlvbiAoY2xpcCkge1xuICAgICAgICB2YXIgaWR4ID0gLTE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fY2xpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGlwc1tpXS5jbGlwID09PSBjbGlwKSB7XG4gICAgICAgICAgICAgICAgaWR4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY2xpcHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgY2xpcHNcbiAgICAgKi9cbiAgICByZW1vdmVDbGlwc0FsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jbGlwcyA9IFtdO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpcCBieSBpbmRleFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gaW5kZXhcbiAgICAgKi9cbiAgICBnZXRDbGlwOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsaXBzW2luZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsaXBzW2luZGV4XS5jbGlwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRDbGlwTnVtYmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGlwcy5sZW5ndGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBqb2ludCBtYXRyaWNlcyBmcm9tIG5vZGUgdHJhbnNmb3JtXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdXBkYXRlSm9pbnRNYXRyaWNlczogKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgbTQgPSBtYXQ0LmNyZWF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuam9pbnRzLmxlbmd0aCAqIDE2KTtcbiAgICAgICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmpvaW50cy5sZW5ndGggKiAxNik7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5qb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSB0aGlzLmpvaW50c1tpXTtcbiAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5yZWxhdGl2ZVJvb3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIG1hdDQuaW52ZXJ0KG00LCB0aGlzLnJlbGF0aXZlUm9vdE5vZGUud29ybGRUcmFuc2Zvcm0uYXJyYXkpO1xuICAgICAgICAgICAgICAgIC8vICAgICBtYXQ0Lm11bHRpcGx5KFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgbTQsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtNCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGpvaW50Lm5vZGUud29ybGRUcmFuc2Zvcm0uYXJyYXlcbiAgICAgICAgICAgICAgICAvLyAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgbWF0NC5pbnZlcnQobTQsIG00KTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdDQuY29weShtNCwgam9pbnQubm9kZS53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIG1hdDQuaW52ZXJ0KG00LCBtNCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGkgKiAxNjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5W29mZnNldCArIGpdID0gbTRbal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpY2VzU3ViQXJyYXlzKCk7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIHNldEpvaW50TWF0cmljZXNBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICB0aGlzLl9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXkgPSBhcnI7XG4gICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShhcnIubGVuZ3RoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNYXRyaWNlc1N1YkFycmF5cygpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVNYXRyaWNlc1N1YkFycmF5czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9qb2ludE1hdHJpY2VzU3ViQXJyYXlzW2ldID0gdGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5LnN1YmFycmF5KGkgKiAxNiwgKGkrMSkgKiAxNik7XG4gICAgICAgICAgICB0aGlzLl9za2luTWF0cmljZXNTdWJBcnJheXNbaV0gPSB0aGlzLl9za2luTWF0cmljZXNBcnJheS5zdWJhcnJheShpICogMTYsIChpKzEpICogMTYpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBza2lubmluZyBtYXRyaWNlc1xuICAgICAqL1xuICAgIHVwZGF0ZTogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdmFyIG00ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5qb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSB0aGlzLmpvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBtYXQ0Lm11bHRpcGx5KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2luTWF0cmljZXNTdWJBcnJheXNbaV0sXG4gICAgICAgICAgICAgICAgICAgIGpvaW50Lm5vZGUud29ybGRUcmFuc2Zvcm0uYXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2pvaW50TWF0cmljZXNTdWJBcnJheXNbaV1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gSm9pbnQgc3BhY2UgaXMgcmVsYXRpdmUgdG8gcm9vdCwgaWYgaGF2ZVxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLnJlbGF0aXZlUm9vdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbWF0NC5pbnZlcnQobTQsIHRoaXMucmVsYXRpdmVSb290Tm9kZS53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIG1hdDQubXVsdGlwbHkoXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLl9za2luTWF0cmljZXNTdWJBcnJheXNbaV0sXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtNCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX3NraW5NYXRyaWNlc1N1YkFycmF5c1tpXVxuICAgICAgICAgICAgICAgIC8vICAgICApO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgZ2V0U3ViU2tpbk1hdHJpY2VzOiBmdW5jdGlvbiAobWVzaElkLCBqb2ludHMpIHtcbiAgICAgICAgdmFyIHN1YkFycmF5ID0gdGhpcy5fc3ViU2tpbk1hdHJpY2VzQXJyYXlbbWVzaElkXTtcbiAgICAgICAgaWYgKCFzdWJBcnJheSkge1xuICAgICAgICAgICAgc3ViQXJyYXlcbiAgICAgICAgICAgICAgICA9IHRoaXMuX3N1YlNraW5NYXRyaWNlc0FycmF5W21lc2hJZF1cbiAgICAgICAgICAgICAgICA9IG5ldyBGbG9hdDMyQXJyYXkoam9pbnRzLmxlbmd0aCAqIDE2KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3Vyc29yID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpZHggPSBqb2ludHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAgICAgICBzdWJBcnJheVtjdXJzb3IrK10gPSB0aGlzLl9za2luTWF0cmljZXNBcnJheVtpZHggKiAxNiArIGpdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWJBcnJheTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHBvc2UgYW5kIHVwZGF0ZSBza2lubmluZyBtYXRyaWNlc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbGlwSW5kZXhcbiAgICAgKi9cbiAgICBzZXRQb3NlOiBmdW5jdGlvbiAoY2xpcEluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGlwc1tjbGlwSW5kZXhdKSB7XG4gICAgICAgICAgICB2YXIgY2xpcCA9IHRoaXMuX2NsaXBzW2NsaXBJbmRleF0uY2xpcDtcbiAgICAgICAgICAgIHZhciBtYXBzID0gdGhpcy5fY2xpcHNbY2xpcEluZGV4XS5tYXBzO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGpvaW50ID0gdGhpcy5qb2ludHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG1hcHNbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zZSA9IGNsaXAudHJhY2tzW21hcHNbaV1dO1xuXG4gICAgICAgICAgICAgICAgLy8gTm90IHVwZGF0ZSBpZiB0aGVyZSBpcyBubyBkYXRhLlxuICAgICAgICAgICAgICAgIC8vIFBFTkRJTkcgSWYgc3luYyBwb3NlLnBvc2l0aW9uLCBwb3NlLnJvdGF0aW9uLCBwb3NlLnNjYWxlXG4gICAgICAgICAgICAgICAgaWYgKHBvc2UuY2hhbm5lbHMucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjMy5jb3B5KGpvaW50Lm5vZGUucG9zaXRpb24uYXJyYXksIHBvc2UucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocG9zZS5jaGFubmVscy5yb3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBxdWF0LmNvcHkoam9pbnQubm9kZS5yb3RhdGlvbi5hcnJheSwgcG9zZS5yb3RhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3NlLmNoYW5uZWxzLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzMuY29weShqb2ludC5ub2RlLnNjYWxlLmFycmF5LCBwb3NlLnNjYWxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBqb2ludC5ub2RlLnBvc2l0aW9uLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgam9pbnQubm9kZS5yb3RhdGlvbi5fZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGpvaW50Lm5vZGUuc2NhbGUuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH0sXG5cbiAgICBjbG9uZTogZnVuY3Rpb24gKHJvb3ROb2RlLCBuZXdSb290Tm9kZSkge1xuICAgICAgICB2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oKTtcbiAgICAgICAgc2tlbGV0b24ubmFtZSA9IHRoaXMubmFtZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3Sm9pbnQgPSBuZXcgSm9pbnQoKTtcbiAgICAgICAgICAgIG5ld0pvaW50Lm5hbWUgPSB0aGlzLmpvaW50c1tpXS5uYW1lO1xuICAgICAgICAgICAgbmV3Sm9pbnQuaW5kZXggPSB0aGlzLmpvaW50c1tpXS5pbmRleDtcblxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLmpvaW50c1tpXS5ub2RlLmdldFBhdGgocm9vdE5vZGUpO1xuICAgICAgICAgICAgdmFyIHJvb3ROb2RlUGF0aCA9IHRoaXMuam9pbnRzW2ldLnJvb3ROb2RlLmdldFBhdGgocm9vdE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHJvb3ROb2RlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3Sm9pbnQubm9kZSA9IG5ld1Jvb3ROb2RlLnF1ZXJ5Tm9kZShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFBFTkRJTkdcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NvbWV0aGluZyB3cm9uZyBpbiBjbG9uZSwgbWF5IGJlIHRoZSBza2VsZXRvbiByb290IG5vZGVzIGlzIG5vdCBtb3VudGVkIG9uIHRoZSBjbG9uZWQgcm9vdCBub2RlLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBza2VsZXRvbi5qb2ludHMucHVzaChuZXdKb2ludCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5KSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gdGhpcy5faW52QmluZFBvc2VNYXRyaWNlc0FycmF5Lmxlbmd0aDtcbiAgICAgICAgICAgIHNrZWxldG9uLl9pbnZCaW5kUG9zZU1hdHJpY2VzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2tlbGV0b24uX2ludkJpbmRQb3NlTWF0cmljZXNBcnJheVtpXSA9IHRoaXMuX2ludkJpbmRQb3NlTWF0cmljZXNBcnJheVtpXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2tlbGV0b24uX3NraW5NYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuXG4gICAgICAgICAgICBza2VsZXRvbi51cGRhdGVNYXRyaWNlc1N1YkFycmF5cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2tlbGV0b24udXBkYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNrZWxldG9uO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LnV0aWwucmFuZFxcbmhpZ2hwIGZsb2F0IHJhbmQodmVjMiB1dikge1xcbiAgICBjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XFxuICAgIGhpZ2hwIGZsb2F0IGR0ID0gZG90KHV2Lnh5LCB2ZWMyKGEsYikpLCBzbiA9IG1vZChkdCwgMy4xNDE1OTI2NTM1ODk3OTMpO1xcbiAgICByZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnV0aWwuY2FsY3VsYXRlX2F0dGVudWF0aW9uXFxudW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkZhY3RvciA6IDUuMDtcXG5mbG9hdCBsaWdodEF0dGVudWF0aW9uKGZsb2F0IGRpc3QsIGZsb2F0IHJhbmdlKVxcbntcXG4gICAgZmxvYXQgYXR0ZW51YXRpb24gPSAxLjA7XFxuICAgIGF0dGVudWF0aW9uID0gZGlzdCpkaXN0LyhyYW5nZSpyYW5nZSsxLjApO1xcbiAgICBmbG9hdCBhdHRfcyA9IGF0dGVudWF0aW9uRmFjdG9yO1xcbiAgICBhdHRlbnVhdGlvbiA9IDEuMC8oYXR0ZW51YXRpb24qYXR0X3MrMS4wKTtcXG4gICAgYXR0X3MgPSAxLjAvKGF0dF9zKzEuMCk7XFxuICAgIGF0dGVudWF0aW9uID0gYXR0ZW51YXRpb24gLSBhdHRfcztcXG4gICAgYXR0ZW51YXRpb24gLz0gMS4wIC0gYXR0X3M7XFxuICAgIHJldHVybiBjbGFtcChhdHRlbnVhdGlvbiwgMC4wLCAxLjApO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnV0aWwuZWRnZV9mYWN0b3JcXG5mbG9hdCBlZGdlRmFjdG9yKGZsb2F0IHdpZHRoKVxcbntcXG4gICAgdmVjMyBkID0gZndpZHRoKHZfQmFyeWNlbnRyaWMpO1xcbiAgICB2ZWMzIGEzID0gc21vb3Roc3RlcCh2ZWMzKDAuMCksIGQgKiB3aWR0aCwgdl9CYXJ5Y2VudHJpYyk7XFxuICAgIHJldHVybiBtaW4obWluKGEzLngsIGEzLnkpLCBhMy56KTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLmVuY29kZV9mbG9hdFxcbnZlYzQgZW5jb2RlRmxvYXQoY29uc3QgaW4gZmxvYXQgZGVwdGgpXFxue1xcbiAgICBjb25zdCB2ZWM0IGJpdFNoaWZ0cyA9IHZlYzQoMjU2LjAqMjU2LjAqMjU2LjAsIDI1Ni4wKjI1Ni4wLCAyNTYuMCwgMS4wKTtcXG4gICAgY29uc3QgdmVjNCBiaXRfbWFzayAgPSB2ZWM0KDAuMCwgMS4wLzI1Ni4wLCAxLjAvMjU2LjAsIDEuMC8yNTYuMCk7XFxuICAgIHZlYzQgcmVzID0gZnJhY3QoZGVwdGggKiBiaXRTaGlmdHMpO1xcbiAgICByZXMgLT0gcmVzLnh4eXogKiBiaXRfbWFzaztcXG4gICAgcmV0dXJuIHJlcztcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbmZsb2F0IGRlY29kZUZsb2F0KGNvbnN0IGluIHZlYzQgY29sb3IpXFxue1xcbiAgICBjb25zdCB2ZWM0IGJpdFNoaWZ0cyA9IHZlYzQoMS4wLygyNTYuMCoyNTYuMCoyNTYuMCksIDEuMC8oMjU2LjAqMjU2LjApLCAxLjAvMjU2LjAsIDEuMCk7XFxuICAgIHJldHVybiBkb3QoY29sb3IsIGJpdFNoaWZ0cyk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkudXRpbC5mbG9hdFxcbkBpbXBvcnQgY2xheS51dGlsLmVuY29kZV9mbG9hdFxcbkBpbXBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbkBlbmRcXG5AZXhwb3J0IGNsYXkudXRpbC5yZ2JtX2RlY29kZVxcbnZlYzMgUkdCTURlY29kZSh2ZWM0IHJnYm0sIGZsb2F0IHJhbmdlKSB7XFxuICByZXR1cm4gcmFuZ2UgKiByZ2JtLnJnYiAqIHJnYm0uYTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnJnYm1fZW5jb2RlXFxudmVjNCBSR0JNRW5jb2RlKHZlYzMgY29sb3IsIGZsb2F0IHJhbmdlKSB7XFxuICAgIGlmIChkb3QoY29sb3IsIGNvbG9yKSA9PSAwLjApIHtcXG4gICAgICAgIHJldHVybiB2ZWM0KDAuMCk7XFxuICAgIH1cXG4gICAgdmVjNCByZ2JtO1xcbiAgICBjb2xvciAvPSByYW5nZTtcXG4gICAgcmdibS5hID0gY2xhbXAobWF4KG1heChjb2xvci5yLCBjb2xvci5nKSwgbWF4KGNvbG9yLmIsIDFlLTYpKSwgMC4wLCAxLjApO1xcbiAgICByZ2JtLmEgPSBjZWlsKHJnYm0uYSAqIDI1NS4wKSAvIDI1NS4wO1xcbiAgICByZ2JtLnJnYiA9IGNvbG9yIC8gcmdibS5hO1xcbiAgICByZXR1cm4gcmdibTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtX2RlY29kZVxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1fZW5jb2RlXFxudmVjNCBkZWNvZGVIRFIodmVjNCBjb2xvcilcXG57XFxuI2lmIGRlZmluZWQoUkdCTV9ERUNPREUpIHx8IGRlZmluZWQoUkdCTSlcXG4gICAgcmV0dXJuIHZlYzQoUkdCTURlY29kZShjb2xvciwgNTEuNSksIDEuMCk7XFxuI2Vsc2VcXG4gICAgcmV0dXJuIGNvbG9yO1xcbiNlbmRpZlxcbn1cXG52ZWM0IGVuY29kZUhEUih2ZWM0IGNvbG9yKVxcbntcXG4jaWYgZGVmaW5lZChSR0JNX0VOQ09ERSkgfHwgZGVmaW5lZChSR0JNKVxcbiAgICByZXR1cm4gUkdCTUVuY29kZShjb2xvci54eXosIDUxLjUpO1xcbiNlbHNlXFxuICAgIHJldHVybiBjb2xvcjtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnNyZ2JcXG52ZWM0IHNSR0JUb0xpbmVhcihpbiB2ZWM0IHZhbHVlKSB7XFxuICAgIHJldHVybiB2ZWM0KG1peChwb3codmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMygwLjA1MjEzMjcwMTQpLCB2ZWMzKDIuNCkpLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMobGVzc1RoYW5FcXVhbCh2YWx1ZS5yZ2IsIHZlYzMoMC4wNDA0NSkpKSksIHZhbHVlLncpO1xcbn1cXG52ZWM0IGxpbmVhclRvc1JHQihpbiB2ZWM0IHZhbHVlKSB7XFxuICAgIHJldHVybiB2ZWM0KG1peChwb3codmFsdWUucmdiLCB2ZWMzKDAuNDE2NjYpKSAqIDEuMDU1IC0gdmVjMygwLjA1NSksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKGxlc3NUaGFuRXF1YWwodmFsdWUucmdiLCB2ZWMzKDAuMDAzMTMwOCkpKSksIHZhbHVlLncpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNodW5rLnNraW5uaW5nX2hlYWRlclxcbiNpZmRlZiBTS0lOTklOR1xcbmF0dHJpYnV0ZSB2ZWMzIHdlaWdodCA6IFdFSUdIVDtcXG5hdHRyaWJ1dGUgdmVjNCBqb2ludCA6IEpPSU5UO1xcbnVuaWZvcm0gbWF0NCBza2luTWF0cml4W0pPSU5UX0NPVU5UXSA6IFNLSU5fTUFUUklYO1xcbm1hdDQgZ2V0U2tpbk1hdHJpeChmbG9hdCBpZHgpIHtcXG4gICAgcmV0dXJuIHNraW5NYXRyaXhbaW50KGlkeCldO1xcbn1cXG4jZW5kaWZcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNodW5rLnNraW5fbWF0cml4XFxubWF0NCBza2luTWF0cml4V1MgPSBnZXRTa2luTWF0cml4KGpvaW50LngpICogd2VpZ2h0Lng7XFxuaWYgKHdlaWdodC55ID4gMWUtNClcXG57XFxuICAgIHNraW5NYXRyaXhXUyArPSBnZXRTa2luTWF0cml4KGpvaW50LnkpICogd2VpZ2h0Lnk7XFxufVxcbmlmICh3ZWlnaHQueiA+IDFlLTQpXFxue1xcbiAgICBza2luTWF0cml4V1MgKz0gZ2V0U2tpbk1hdHJpeChqb2ludC56KSAqIHdlaWdodC56O1xcbn1cXG5mbG9hdCB3ZWlnaHRXID0gMS4wLXdlaWdodC54LXdlaWdodC55LXdlaWdodC56O1xcbmlmICh3ZWlnaHRXID4gMWUtNClcXG57XFxuICAgIHNraW5NYXRyaXhXUyArPSBnZXRTa2luTWF0cml4KGpvaW50LncpICogd2VpZ2h0VztcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLnBhcmFsbGF4X2NvcnJlY3RcXG52ZWMzIHBhcmFsbGF4Q29ycmVjdChpbiB2ZWMzIGRpciwgaW4gdmVjMyBwb3MsIGluIHZlYzMgYm94TWluLCBpbiB2ZWMzIGJveE1heCkge1xcbiAgICB2ZWMzIGZpcnN0ID0gKGJveE1heCAtIHBvcykgLyBkaXI7XFxuICAgIHZlYzMgc2Vjb25kID0gKGJveE1pbiAtIHBvcykgLyBkaXI7XFxuICAgIHZlYzMgZnVydGhlciA9IG1heChmaXJzdCwgc2Vjb25kKTtcXG4gICAgZmxvYXQgZGlzdCA9IG1pbihmdXJ0aGVyLngsIG1pbihmdXJ0aGVyLnksIGZ1cnRoZXIueikpO1xcbiAgICB2ZWMzIGZpeGVkUG9zID0gcG9zICsgZGlyICogZGlzdDtcXG4gICAgdmVjMyBib3hDZW50ZXIgPSAoYm94TWF4ICsgYm94TWluKSAqIDAuNTtcXG4gICAgcmV0dXJuIG5vcm1hbGl6ZShmaXhlZFBvcyAtIGJveENlbnRlcik7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkudXRpbC5jbGFtcF9zYW1wbGVcXG52ZWM0IGNsYW1wU2FtcGxlKGNvbnN0IGluIHNhbXBsZXIyRCB0ZXh0dXJlLCBjb25zdCBpbiB2ZWMyIGNvb3JkKVxcbntcXG4jaWZkZWYgU1RFUkVPXFxuICAgIGZsb2F0IGV5ZSA9IHN0ZXAoMC41LCBjb29yZC54KSAqIDAuNTtcXG4gICAgdmVjMiBjb29yZENsYW1wZWQgPSBjbGFtcChjb29yZCwgdmVjMihleWUsIDAuMCksIHZlYzIoMC41ICsgZXllLCAxLjApKTtcXG4jZWxzZVxcbiAgICB2ZWMyIGNvb3JkQ2xhbXBlZCA9IGNsYW1wKGNvb3JkLCB2ZWMyKDAuMCksIHZlYzIoMS4wKSk7XFxuI2VuZGlmXFxuICAgIHJldHVybiB0ZXh0dXJlMkQodGV4dHVyZSwgY29vcmRDbGFtcGVkKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS51dGlsLkFDRVNcXG52ZWMzIEFDRVNUb25lTWFwcGluZyh2ZWMzIGNvbG9yKVxcbntcXG4gICAgY29uc3QgZmxvYXQgQSA9IDIuNTE7XFxuICAgIGNvbnN0IGZsb2F0IEIgPSAwLjAzO1xcbiAgICBjb25zdCBmbG9hdCBDID0gMi40MztcXG4gICAgY29uc3QgZmxvYXQgRCA9IDAuNTk7XFxuICAgIGNvbnN0IGZsb2F0IEUgPSAwLjE0O1xcbiAgICByZXR1cm4gKGNvbG9yICogKEEgKiBjb2xvciArIEIpKSAvIChjb2xvciAqIChDICogY29sb3IgKyBEKSArIEUpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5iYXNpYy52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSB2ZWMyIHV2UmVwZWF0IDogWzEuMCwgMS4wXTtcXG51bmlmb3JtIHZlYzIgdXZPZmZzZXQgOiBbMC4wLCAwLjBdO1xcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkIDogVEVYQ09PUkRfMDtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMzIGJhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuYXR0cmlidXRlIHZlYzQgYV9Db2xvciA6IENPTE9SO1xcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiNpZmRlZiBTS0lOTklOR1xcbiAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgc2tpbm5lZFBvc2l0aW9uID0gKHNraW5NYXRyaXhXUyAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4jZW5kaWZcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkICogdXZSZXBlYXQgKyB1dk9mZnNldDtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuICAgIHZfQ29sb3IgPSBhX0NvbG9yO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmJhc2ljLmZyYWdtZW50XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgZGlmZnVzZU1hcDtcXG51bmlmb3JtIHZlYzMgY29sb3IgOiBbMS4wLCAxLjAsIDEuMF07XFxudW5pZm9ybSB2ZWMzIGVtaXNzaW9uIDogWzAuMCwgMC4wLCAwLjBdO1xcbnVuaWZvcm0gZmxvYXQgYWxwaGEgOiAxLjA7XFxuI2lmZGVmIEFMUEhBX1RFU1RcXG51bmlmb3JtIGZsb2F0IGFscGhhQ3V0b2ZmOiAwLjk7XFxuI2VuZGlmXFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoIDogMC4wO1xcbnVuaWZvcm0gdmVjNCBsaW5lQ29sb3IgOiBbMC4wLCAwLjAsIDAuMCwgMC42XTtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG5AaW1wb3J0IGNsYXkudXRpbC5lZGdlX2ZhY3RvclxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5zcmdiXFxuQGltcG9ydCBjbGF5LnV0aWwuQUNFU1xcbnZvaWQgbWFpbigpXFxue1xcbiNpZmRlZiBSRU5ERVJfVEVYQ09PUkRcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2X1RleGNvb3JkLCAxLjAsIDEuMCk7XFxuICAgIHJldHVybjtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgYWxwaGEpO1xcbiNpZmRlZiBWRVJURVhfQ09MT1JcXG4gICAgZ2xfRnJhZ0NvbG9yICo9IHZfQ29sb3I7XFxuI2VuZGlmXFxuI2lmZGVmIERJRkZVU0VNQVBfRU5BQkxFRFxcbiAgICB2ZWM0IHRleCA9IGRlY29kZUhEUih0ZXh0dXJlMkQoZGlmZnVzZU1hcCwgdl9UZXhjb29yZCkpO1xcbiNpZmRlZiBTUkdCX0RFQ09ERVxcbiAgICB0ZXggPSBzUkdCVG9MaW5lYXIodGV4KTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZChESUZGVVNFTUFQX0FMUEhBX0FMUEhBKVxcbiAgICBnbF9GcmFnQ29sb3IuYSA9IHRleC5hO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IHRleC5yZ2I7XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKz0gZW1pc3Npb247XFxuICAgIGlmKCBsaW5lV2lkdGggPiAwLilcXG4gICAge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peChnbF9GcmFnQ29sb3IucmdiLCBsaW5lQ29sb3IucmdiLCAoMS4wIC0gZWRnZUZhY3RvcihsaW5lV2lkdGgpKSAqIGxpbmVDb2xvci5hKTtcXG4gICAgfVxcbiNpZmRlZiBHQU1NQV9FTkNPREVcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHBvdyhnbF9GcmFnQ29sb3IucmdiLCB2ZWMzKDEgLyAyLjIpKTtcXG4jZW5kaWZcXG4jaWZkZWYgQUxQSEFfVEVTVFxcbiAgICBpZiAoZ2xfRnJhZ0NvbG9yLmEgPCBhbHBoYUN1dG9mZikge1xcbiAgICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiNlbmRpZlxcbiNpZmRlZiBUT05FTUFQUElOR1xcbiAgICBnbF9GcmFnQ29sb3IucmdiID0gQUNFU1RvbmVNYXBwaW5nKGdsX0ZyYWdDb2xvci5yZ2IpO1xcbiNlbmRpZlxcbiNpZmRlZiBTUkdCX0VOQ09ERVxcbiAgICBnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb3NSR0IoZ2xfRnJhZ0NvbG9yKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGdsX0ZyYWdDb2xvcik7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LmxhbWJlcnQudmVydGV4XFxudW5pZm9ybSBtYXQ0IHdvcmxkVmlld1Byb2plY3Rpb24gOiBXT1JMRFZJRVdQUk9KRUNUSU9OO1xcbnVuaWZvcm0gbWF0NCB3b3JsZEludmVyc2VUcmFuc3Bvc2UgOiBXT1JMRElOVkVSU0VUUkFOU1BPU0U7XFxudW5pZm9ybSBtYXQ0IHdvcmxkIDogV09STEQ7XFxudW5pZm9ybSB2ZWMyIHV2UmVwZWF0IDogWzEuMCwgMS4wXTtcXG51bmlmb3JtIHZlYzIgdXZPZmZzZXQgOiBbMC4wLCAwLjBdO1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uIDogUE9TSVRJT047XFxuYXR0cmlidXRlIHZlYzIgdGV4Y29vcmQgOiBURVhDT09SRF8wO1xcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbCA6IE5PUk1BTDtcXG5hdHRyaWJ1dGUgdmVjMyBiYXJ5Y2VudHJpYztcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxuYXR0cmlidXRlIHZlYzQgYV9Db2xvciA6IENPTE9SO1xcbnZhcnlpbmcgdmVjNCB2X0NvbG9yO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMyBza2lubmVkUG9zaXRpb24gPSBwb3NpdGlvbjtcXG4gICAgdmVjMyBza2lubmVkTm9ybWFsID0gbm9ybWFsO1xcbiNpZmRlZiBTS0lOTklOR1xcbiAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgc2tpbm5lZFBvc2l0aW9uID0gKHNraW5NYXRyaXhXUyAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gICAgc2tpbm5lZE5vcm1hbCA9IChza2luTWF0cml4V1MgKiB2ZWM0KG5vcm1hbCwgMC4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KCBza2lubmVkUG9zaXRpb24sIDEuMCApO1xcbiAgICB2X1RleGNvb3JkID0gdGV4Y29vcmQgKiB1dlJlcGVhdCArIHV2T2Zmc2V0O1xcbiAgICB2X05vcm1hbCA9IG5vcm1hbGl6ZSggKCB3b3JsZEludmVyc2VUcmFuc3Bvc2UgKiB2ZWM0KHNraW5uZWROb3JtYWwsIDAuMCkgKS54eXogKTtcXG4gICAgdl9Xb3JsZFBvc2l0aW9uID0gKCB3b3JsZCAqIHZlYzQoIHNraW5uZWRQb3NpdGlvbiwgMS4wKSApLnh5ejtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbiNpZmRlZiBWRVJURVhfQ09MT1JcXG4gICAgdl9Db2xvciA9IGFfQ29sb3I7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkubGFtYmVydC5mcmFnbWVudFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnZhcnlpbmcgdmVjMyB2X05vcm1hbDtcXG52YXJ5aW5nIHZlYzMgdl9Xb3JsZFBvc2l0aW9uO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGRpZmZ1c2VNYXA7XFxudW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XFxudW5pZm9ybSB2ZWMzIGNvbG9yIDogWzEuMCwgMS4wLCAxLjBdO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2lvbiA6IFswLjAsIDAuMCwgMC4wXTtcXG51bmlmb3JtIGZsb2F0IGFscGhhIDogMS4wO1xcbiNpZmRlZiBBTFBIQV9URVNUXFxudW5pZm9ybSBmbG9hdCBhbHBoYUN1dG9mZjogMC45O1xcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoIDogMC4wO1xcbnVuaWZvcm0gdmVjNCBsaW5lQ29sb3IgOiBbMC4wLCAwLjAsIDAuMCwgMC42XTtcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG4jaWZkZWYgVkVSVEVYX0NPTE9SXFxudmFyeWluZyB2ZWM0IHZfQ29sb3I7XFxuI2VuZGlmXFxuI2lmZGVmIEFNQklFTlRfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLmFtYmllbnRfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgQU1CSUVOVF9TSF9MSUdIVF9DT1VOVFxcbkBpbXBvcnQgY2xheS5oZWFkZXIuYW1iaWVudF9zaF9saWdodFxcbiNlbmRpZlxcbiNpZmRlZiBQT0lOVF9MSUdIVF9DT1VOVFxcbkBpbXBvcnQgY2xheS5oZWFkZXIucG9pbnRfbGlnaHRcXG4jZW5kaWZcXG4jaWZkZWYgRElSRUNUSU9OQUxfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLmRpcmVjdGlvbmFsX2xpZ2h0XFxuI2VuZGlmXFxuI2lmZGVmIFNQT1RfTElHSFRfQ09VTlRcXG5AaW1wb3J0IGNsYXkuaGVhZGVyLnNwb3RfbGlnaHRcXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkudXRpbC5jYWxjdWxhdGVfYXR0ZW51YXRpb25cXG5AaW1wb3J0IGNsYXkudXRpbC5lZGdlX2ZhY3RvclxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkucGx1Z2luLmNvbXB1dGVfc2hhZG93X21hcFxcbkBpbXBvcnQgY2xheS51dGlsLkFDRVNcXG52b2lkIG1haW4oKVxcbntcXG4jaWZkZWYgUkVOREVSX05PUk1BTFxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZfTm9ybWFsICogMC41ICsgMC41LCAxLjApO1xcbiAgICByZXR1cm47XFxuI2VuZGlmXFxuI2lmZGVmIFJFTkRFUl9URVhDT09SRFxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZfVGV4Y29vcmQsIDEuMCwgMS4wKTtcXG4gICAgcmV0dXJuO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBhbHBoYSk7XFxuI2lmZGVmIFZFUlRFWF9DT0xPUlxcbiAgICBnbF9GcmFnQ29sb3IgKj0gdl9Db2xvcjtcXG4jZW5kaWZcXG4jaWZkZWYgRElGRlVTRU1BUF9FTkFCTEVEXFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCBkaWZmdXNlTWFwLCB2X1RleGNvb3JkICk7XFxuI2lmZGVmIFNSR0JfREVDT0RFXFxuICAgIHRleC5yZ2IgPSBwb3codGV4LnJnYiwgdmVjMygyLjIpKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiAqPSB0ZXgucmdiO1xcbiNpZmRlZiBESUZGVVNFTUFQX0FMUEhBX0FMUEhBXFxuICAgIGdsX0ZyYWdDb2xvci5hICo9IHRleC5hO1xcbiNlbmRpZlxcbiNlbmRpZlxcbiAgICB2ZWMzIGRpZmZ1c2VDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuI2lmZGVmIEFNQklFTlRfTElHSFRfQ09VTlRcXG4gICAgZm9yKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgQU1CSUVOVF9MSUdIVF9DT1VOVDsgX2lkeF8rKylcXG4gICAge1xcbiAgICAgICAgZGlmZnVzZUNvbG9yICs9IGFtYmllbnRMaWdodENvbG9yW19pZHhfXTtcXG4gICAgfVxcbiNlbmRpZlxcbiNpZmRlZiBBTUJJRU5UX1NIX0xJR0hUX0NPVU5UXFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IEFNQklFTlRfU0hfTElHSFRfQ09VTlQ7IF9pZHhfKyspXFxuICAgIHt7XFxuICAgICAgICBkaWZmdXNlQ29sb3IgKz0gY2FsY0FtYmllbnRTSExpZ2h0KF9pZHhfLCB2X05vcm1hbCkgKiBhbWJpZW50U0hMaWdodENvbG9yW19pZHhfXTtcXG4gICAgfX1cXG4jZW5kaWZcXG4jaWZkZWYgUE9JTlRfTElHSFRfQ09VTlRcXG4jaWYgZGVmaW5lZChQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWJzUG9pbnRbUE9JTlRfTElHSFRfQ09VTlRdO1xcbiAgICBpZiggc2hhZG93RW5hYmxlZCApXFxuICAgIHtcXG4gICAgICAgIGNvbXB1dGVTaGFkb3dPZlBvaW50TGlnaHRzKHZfV29ybGRQb3NpdGlvbiwgc2hhZG93Q29udHJpYnNQb2ludCk7XFxuICAgIH1cXG4jZW5kaWZcXG4gICAgZm9yKGludCBpID0gMDsgaSA8IFBPSU5UX0xJR0hUX0NPVU5UOyBpKyspXFxuICAgIHtcXG4gICAgICAgIHZlYzMgbGlnaHRQb3NpdGlvbiA9IHBvaW50TGlnaHRQb3NpdGlvbltpXTtcXG4gICAgICAgIHZlYzMgbGlnaHRDb2xvciA9IHBvaW50TGlnaHRDb2xvcltpXTtcXG4gICAgICAgIGZsb2F0IHJhbmdlID0gcG9pbnRMaWdodFJhbmdlW2ldO1xcbiAgICAgICAgdmVjMyBsaWdodERpcmVjdGlvbiA9IGxpZ2h0UG9zaXRpb24gLSB2X1dvcmxkUG9zaXRpb247XFxuICAgICAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIGZsb2F0IGF0dGVudWF0aW9uID0gbGlnaHRBdHRlbnVhdGlvbihkaXN0LCByYW5nZSk7XFxuICAgICAgICBsaWdodERpcmVjdGlvbiAvPSBkaXN0O1xcbiAgICAgICAgZmxvYXQgbmRsID0gZG90KCB2X05vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcXG4gICAgICAgIGZsb2F0IHNoYWRvd0NvbnRyaWIgPSAxLjA7XFxuI2lmIGRlZmluZWQoUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICAgICAgaWYoIHNoYWRvd0VuYWJsZWQgKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic1BvaW50W2ldO1xcbiAgICAgICAgfVxcbiNlbmRpZlxcbiAgICAgICAgZGlmZnVzZUNvbG9yICs9IGxpZ2h0Q29sb3IgKiBjbGFtcChuZGwsIDAuMCwgMS4wKSAqIGF0dGVudWF0aW9uICogc2hhZG93Q29udHJpYjtcXG4gICAgfVxcbiNlbmRpZlxcbiNpZmRlZiBESVJFQ1RJT05BTF9MSUdIVF9DT1VOVFxcbiNpZiBkZWZpbmVkKERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYnNEaXJbRElSRUNUSU9OQUxfTElHSFRfQ09VTlRdO1xcbiAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICB7XFxuICAgICAgICBjb21wdXRlU2hhZG93T2ZEaXJlY3Rpb25hbExpZ2h0cyh2X1dvcmxkUG9zaXRpb24sIHNoYWRvd0NvbnRyaWJzRGlyKTtcXG4gICAgfVxcbiNlbmRpZlxcbiAgICBmb3IoaW50IGkgPSAwOyBpIDwgRElSRUNUSU9OQUxfTElHSFRfQ09VTlQ7IGkrKylcXG4gICAge1xcbiAgICAgICAgdmVjMyBsaWdodERpcmVjdGlvbiA9IC1kaXJlY3Rpb25hbExpZ2h0RGlyZWN0aW9uW2ldO1xcbiAgICAgICAgdmVjMyBsaWdodENvbG9yID0gZGlyZWN0aW9uYWxMaWdodENvbG9yW2ldO1xcbiAgICAgICAgZmxvYXQgbmRsID0gZG90KHZfTm9ybWFsLCBub3JtYWxpemUobGlnaHREaXJlY3Rpb24pKTtcXG4gICAgICAgIGZsb2F0IHNoYWRvd0NvbnRyaWIgPSAxLjA7XFxuI2lmIGRlZmluZWQoRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiAgICAgICAgaWYoIHNoYWRvd0VuYWJsZWQgKVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBzaGFkb3dDb250cmlic0RpcltpXTtcXG4gICAgICAgIH1cXG4jZW5kaWZcXG4gICAgICAgIGRpZmZ1c2VDb2xvciArPSBsaWdodENvbG9yICogY2xhbXAobmRsLCAwLjAsIDEuMCkgKiBzaGFkb3dDb250cmliO1xcbiAgICB9XFxuI2VuZGlmXFxuI2lmZGVmIFNQT1RfTElHSFRfQ09VTlRcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYnNTcG90W1NQT1RfTElHSFRfQ09VTlRdO1xcbiAgICBpZihzaGFkb3dFbmFibGVkKVxcbiAgICB7XFxuICAgICAgICBjb21wdXRlU2hhZG93T2ZTcG90TGlnaHRzKHZfV29ybGRQb3NpdGlvbiwgc2hhZG93Q29udHJpYnNTcG90KTtcXG4gICAgfVxcbiNlbmRpZlxcbiAgICBmb3IoaW50IGkgPSAwOyBpIDwgU1BPVF9MSUdIVF9DT1VOVDsgaSsrKVxcbiAgICB7XFxuICAgICAgICB2ZWMzIGxpZ2h0UG9zaXRpb24gPSAtc3BvdExpZ2h0UG9zaXRpb25baV07XFxuICAgICAgICB2ZWMzIHNwb3RMaWdodERpcmVjdGlvbiA9IC1ub3JtYWxpemUoIHNwb3RMaWdodERpcmVjdGlvbltpXSApO1xcbiAgICAgICAgdmVjMyBsaWdodENvbG9yID0gc3BvdExpZ2h0Q29sb3JbaV07XFxuICAgICAgICBmbG9hdCByYW5nZSA9IHNwb3RMaWdodFJhbmdlW2ldO1xcbiAgICAgICAgZmxvYXQgYSA9IHNwb3RMaWdodFVtYnJhQW5nbGVDb3NpbmVbaV07XFxuICAgICAgICBmbG9hdCBiID0gc3BvdExpZ2h0UGVudW1icmFBbmdsZUNvc2luZVtpXTtcXG4gICAgICAgIGZsb2F0IGZhbGxvZmZGYWN0b3IgPSBzcG90TGlnaHRGYWxsb2ZmRmFjdG9yW2ldO1xcbiAgICAgICAgdmVjMyBsaWdodERpcmVjdGlvbiA9IGxpZ2h0UG9zaXRpb24gLSB2X1dvcmxkUG9zaXRpb247XFxuICAgICAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIGZsb2F0IGF0dGVudWF0aW9uID0gbGlnaHRBdHRlbnVhdGlvbihkaXN0LCByYW5nZSk7XFxuICAgICAgICBsaWdodERpcmVjdGlvbiAvPSBkaXN0O1xcbiAgICAgICAgZmxvYXQgYyA9IGRvdChzcG90TGlnaHREaXJlY3Rpb24sIGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIGZsb2F0IGZhbGxvZmY7XFxuICAgICAgICBmYWxsb2ZmID0gY2xhbXAoKGMgLSBhKSAvKCBiIC0gYSksIDAuMCwgMS4wKTtcXG4gICAgICAgIGZhbGxvZmYgPSBwb3coZmFsbG9mZiwgZmFsbG9mZkZhY3Rvcik7XFxuICAgICAgICBmbG9hdCBuZGwgPSBkb3Qodl9Ob3JtYWwsIGxpZ2h0RGlyZWN0aW9uKTtcXG4gICAgICAgIG5kbCA9IGNsYW1wKG5kbCwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4gICAgICAgIGlmKCBzaGFkb3dFbmFibGVkIClcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBzaGFkb3dDb250cmliID0gc2hhZG93Q29udHJpYnNTcG90W2ldO1xcbiAgICAgICAgfVxcbiNlbmRpZlxcbiAgICAgICAgZGlmZnVzZUNvbG9yICs9IGxpZ2h0Q29sb3IgKiBuZGwgKiBhdHRlbnVhdGlvbiAqICgxLjAtZmFsbG9mZikgKiBzaGFkb3dDb250cmliO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKj0gZGlmZnVzZUNvbG9yO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiICs9IGVtaXNzaW9uO1xcbiAgICBpZihsaW5lV2lkdGggPiAwLilcXG4gICAge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peChnbF9GcmFnQ29sb3IucmdiLCBsaW5lQ29sb3IucmdiLCAoMS4wIC0gZWRnZUZhY3RvcihsaW5lV2lkdGgpKSAqIGxpbmVDb2xvci5hKTtcXG4gICAgfVxcbiNpZmRlZiBBTFBIQV9URVNUXFxuICAgIGlmIChnbF9GcmFnQ29sb3IuYSA8IGFscGhhQ3V0b2ZmKSB7XFxuICAgICAgICBkaXNjYXJkO1xcbiAgICB9XFxuI2VuZGlmXFxuI2lmZGVmIFRPTkVNQVBQSU5HXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBBQ0VTVG9uZU1hcHBpbmcoZ2xfRnJhZ0NvbG9yLnJnYik7XFxuI2VuZGlmXFxuI2lmZGVmIFNSR0JfRU5DT0RFXFxuICAgIGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvc1JHQihnbF9GcmFnQ29sb3IpO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoZ2xfRnJhZ0NvbG9yKTtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkud2lyZWZyYW1lLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG51bmlmb3JtIG1hdDQgd29ybGQgOiBXT1JMRDtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMzIGJhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzMgdl9CYXJ5Y2VudHJpYztcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMyBza2lubmVkUG9zaXRpb24gPSBwb3NpdGlvbjtcXG4jaWZkZWYgU0tJTk5JTkdcXG4gICAgQGltcG9ydCBjbGF5LmNodW5rLnNraW5fbWF0cml4XFxuICAgIHNraW5uZWRQb3NpdGlvbiA9IChza2luTWF0cml4V1MgKiB2ZWM0KHBvc2l0aW9uLCAxLjApKS54eXo7XFxuI2VuZGlmXFxuICAgIGdsX1Bvc2l0aW9uID0gd29ybGRWaWV3UHJvamVjdGlvbiAqIHZlYzQoc2tpbm5lZFBvc2l0aW9uLCAxLjAgKTtcXG4gICAgdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LndpcmVmcmFtZS5mcmFnbWVudFxcbnVuaWZvcm0gdmVjMyBjb2xvciA6IFswLjAsIDAuMCwgMC4wXTtcXG51bmlmb3JtIGZsb2F0IGFscGhhIDogMS4wO1xcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoIDogMS4wO1xcbnZhcnlpbmcgdmVjMyB2X0JhcnljZW50cmljO1xcbkBpbXBvcnQgY2xheS51dGlsLmVkZ2VfZmFjdG9yXFxudm9pZCBtYWluKClcXG57XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBjb2xvcjtcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAoMS4wLWVkZ2VGYWN0b3IobGluZVdpZHRoKSkgKiBhbHBoYTtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuc2t5Ym94LnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZCA6IFdPUkxEO1xcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbnZhcnlpbmcgdmVjMyB2X1dvcmxkUG9zaXRpb247XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZfV29ybGRQb3NpdGlvbiA9ICh3b3JsZCAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4gICAgZ2xfUG9zaXRpb24gPSB3b3JsZFZpZXdQcm9qZWN0aW9uICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5za3lib3guZnJhZ21lbnRcXG51bmlmb3JtIG1hdDQgdmlld0ludmVyc2UgOiBWSUVXSU5WRVJTRTtcXG51bmlmb3JtIHNhbXBsZXJDdWJlIGVudmlyb25tZW50TWFwO1xcbnVuaWZvcm0gZmxvYXQgbG9kOiAwLjA7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzMgZXllUG9zID0gdmlld0ludmVyc2VbM10ueHl6O1xcbiAgICB2ZWMzIHZpZXdEaXJlY3Rpb24gPSBub3JtYWxpemUodl9Xb3JsZFBvc2l0aW9uIC0gZXllUG9zKTtcXG4gICAgdmVjMyB0ZXggPSBkZWNvZGVIRFIodGV4dHVyZUN1YmVMb2RFWFQoZW52aXJvbm1lbnRNYXAsIHZpZXdEaXJlY3Rpb24sIGxvZCkpLnJnYjtcXG4jaWZkZWYgU1JHQl9ERUNPREVcXG4gICAgdGV4LnJnYiA9IHBvdyh0ZXgucmdiLCB2ZWMzKDIuMikpO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNCh0ZXgsIDEuMCkpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmNvbG9yYWRqdXN0XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGJyaWdodG5lc3MgOiAwLjA7XFxudW5pZm9ybSBmbG9hdCBjb250cmFzdCA6IDEuMDtcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlIDogMC4wO1xcbnVuaWZvcm0gZmxvYXQgZ2FtbWEgOiAxLjA7XFxudW5pZm9ybSBmbG9hdCBzYXR1cmF0aW9uIDogMS4wO1xcbmNvbnN0IHZlYzMgdyA9IHZlYzMoMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSk7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCB0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IGNsYW1wKHRleC5yZ2IgKyB2ZWMzKGJyaWdodG5lc3MpLCAwLjAsIDEuMCk7XFxuICAgIGNvbG9yID0gY2xhbXAoIChjb2xvci12ZWMzKDAuNSkpKmNvbnRyYXN0K3ZlYzMoMC41KSwgMC4wLCAxLjApO1xcbiAgICBjb2xvciA9IGNsYW1wKCBjb2xvciAqIHBvdygyLjAsIGV4cG9zdXJlKSwgMC4wLCAxLjApO1xcbiAgICBjb2xvciA9IGNsYW1wKCBwb3coY29sb3IsIHZlYzMoZ2FtbWEpKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBsdW1pbmFuY2UgPSBkb3QoIGNvbG9yLCB3ICk7XFxuICAgIGNvbG9yID0gbWl4KHZlYzMobHVtaW5hbmNlKSwgY29sb3IsIHNhdHVyYXRpb24pO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXguYSk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5icmlnaHRuZXNzXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGJyaWdodG5lc3MgOiAwLjA7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCB0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHRleC5yZ2IgKyB2ZWMzKGJyaWdodG5lc3MpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXguYSk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5jb250cmFzdFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSBmbG9hdCBjb250cmFzdCA6IDEuMDtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjNCB0ZXggPSB0ZXh0dXJlMkQoIHRleHR1cmUsIHZfVGV4Y29vcmQpO1xcbiAgICB2ZWMzIGNvbG9yID0gKHRleC5yZ2ItdmVjMygwLjUpKSpjb250cmFzdCt2ZWMzKDAuNSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleC5hKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmV4cG9zdXJlXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlIDogMC4wO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleCA9IHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHRleC5yZ2IgKiBwb3coMi4wLCBleHBvc3VyZSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleC5hKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmdhbW1hXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IGdhbW1hIDogMS4wO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleCA9IHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHBvdyh0ZXgucmdiLCB2ZWMzKGdhbW1hKSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHRleC5hKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLnNhdHVyYXRpb25cXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gZmxvYXQgc2F0dXJhdGlvbiA6IDEuMDtcXG5jb25zdCB2ZWMzIHcgPSB2ZWMzKDAuMjEyNSwgMC43MTU0LCAwLjA3MjEpO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleCA9IHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKTtcXG4gICAgdmVjMyBjb2xvciA9IHRleC5yZ2I7XFxuICAgIGZsb2F0IGx1bWluYW5jZSA9IGRvdChjb2xvciwgdyk7XFxuICAgIGNvbG9yID0gbWl4KHZlYzMobHVtaW5hbmNlKSwgY29sb3IsIHNhdHVyYXRpb24pO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXguYSk7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3Iua2VybmVsLmdhdXNzaWFuXzlcXG5mbG9hdCBnYXVzc2lhbktlcm5lbFs5XTtcXG5nYXVzc2lhbktlcm5lbFswXSA9IDAuMDc7XFxuZ2F1c3NpYW5LZXJuZWxbMV0gPSAwLjA5O1xcbmdhdXNzaWFuS2VybmVsWzJdID0gMC4xMjtcXG5nYXVzc2lhbktlcm5lbFszXSA9IDAuMTQ7XFxuZ2F1c3NpYW5LZXJuZWxbNF0gPSAwLjE2O1xcbmdhdXNzaWFuS2VybmVsWzVdID0gMC4xNDtcXG5nYXVzc2lhbktlcm5lbFs2XSA9IDAuMTI7XFxuZ2F1c3NpYW5LZXJuZWxbN10gPSAwLjA5O1xcbmdhdXNzaWFuS2VybmVsWzhdID0gMC4wNztcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3Iua2VybmVsLmdhdXNzaWFuXzEzXFxuZmxvYXQgZ2F1c3NpYW5LZXJuZWxbMTNdO1xcbmdhdXNzaWFuS2VybmVsWzBdID0gMC4wMjtcXG5nYXVzc2lhbktlcm5lbFsxXSA9IDAuMDM7XFxuZ2F1c3NpYW5LZXJuZWxbMl0gPSAwLjA2O1xcbmdhdXNzaWFuS2VybmVsWzNdID0gMC4wODtcXG5nYXVzc2lhbktlcm5lbFs0XSA9IDAuMTE7XFxuZ2F1c3NpYW5LZXJuZWxbNV0gPSAwLjEzO1xcbmdhdXNzaWFuS2VybmVsWzZdID0gMC4xNDtcXG5nYXVzc2lhbktlcm5lbFs3XSA9IDAuMTM7XFxuZ2F1c3NpYW5LZXJuZWxbOF0gPSAwLjExO1xcbmdhdXNzaWFuS2VybmVsWzldID0gMC4wODtcXG5nYXVzc2lhbktlcm5lbFsxMF0gPSAwLjA2O1xcbmdhdXNzaWFuS2VybmVsWzExXSA9IDAuMDM7XFxuZ2F1c3NpYW5LZXJuZWxbMTJdID0gMC4wMjtcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZ2F1c3NpYW5fYmx1clxcbiNkZWZpbmUgU0hBREVSX05BTUUgZ2F1c3NpYW5fYmx1clxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7dmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBmbG9hdCBibHVyU2l6ZSA6IDIuMDtcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemUgOiBbNTEyLjAsIDUxMi4wXTtcXG51bmlmb3JtIGZsb2F0IGJsdXJEaXIgOiAwLjA7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS51dGlsLmNsYW1wX3NhbXBsZVxcbnZvaWQgbWFpbiAodm9pZClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5jb21wb3NpdG9yLmtlcm5lbC5nYXVzc2lhbl85XFxuICAgIHZlYzIgb2ZmID0gYmx1clNpemUgLyB0ZXh0dXJlU2l6ZTtcXG4gICAgb2ZmICo9IHZlYzIoMS4wIC0gYmx1ckRpciwgYmx1ckRpcik7XFxuICAgIHZlYzQgc3VtID0gdmVjNCgwLjApO1xcbiAgICBmbG9hdCB3ZWlnaHRBbGwgPSAwLjA7XFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7XFxuICAgICAgICBmbG9hdCB3ID0gZ2F1c3NpYW5LZXJuZWxbaV07XFxuICAgICAgICB2ZWM0IHRleGVsID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBmbG9hdChpIC0gNCkgKiBvZmYpKTtcXG4gICAgICAgIHN1bSArPSB0ZXhlbCAqIHc7XFxuICAgICAgICB3ZWlnaHRBbGwgKz0gdztcXG4gICAgfVxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoc3VtIC8gbWF4KHdlaWdodEFsbCwgMC4wMSkpO1xcbn1cXG5AZW5kXFxuXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmhkci5sb2dfbHVtXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG5jb25zdCB2ZWMzIHcgPSB2ZWMzKDAuMjEyNSwgMC43MTU0LCAwLjA3MjEpO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjNCB0ZXggPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHZfVGV4Y29vcmQpKTtcXG4gICAgZmxvYXQgbHVtaW5hbmNlID0gZG90KHRleC5yZ2IsIHcpO1xcbiAgICBsdW1pbmFuY2UgPSBsb2cobHVtaW5hbmNlICsgMC4wMDEpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNCh2ZWMzKGx1bWluYW5jZSksIDEuMCkpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuaGRyLmx1bV9hZGFwdGlvblxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGFkYXB0ZWRMdW07XFxudW5pZm9ybSBzYW1wbGVyMkQgY3VycmVudEx1bTtcXG51bmlmb3JtIGZsb2F0IGZyYW1lVGltZSA6IDAuMDI7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICBmbG9hdCBmQWRhcHRlZEx1bSA9IGRlY29kZUhEUih0ZXh0dXJlMkQoYWRhcHRlZEx1bSwgdmVjMigwLjUsIDAuNSkpKS5yO1xcbiAgICBmbG9hdCBmQ3VycmVudEx1bSA9IGV4cChlbmNvZGVIRFIodGV4dHVyZTJEKGN1cnJlbnRMdW0sIHZlYzIoMC41LCAwLjUpKSkucik7XFxuICAgIGZBZGFwdGVkTHVtICs9IChmQ3VycmVudEx1bSAtIGZBZGFwdGVkTHVtKSAqICgxLjAgLSBwb3coMC45OCwgMzAuMCAqIGZyYW1lVGltZSkpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNCh2ZWMzKGZBZGFwdGVkTHVtKSwgMS4wKSk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5sdW1cXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbmNvbnN0IHZlYzMgdyA9IHZlYzMoMC4yMTI1LCAwLjcxNTQsIDAuMDcyMSk7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKCB0ZXh0dXJlLCB2X1RleGNvb3JkICk7XFxuICAgIGZsb2F0IGx1bWluYW5jZSA9IGRvdCh0ZXgucmdiLCB3KTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2ZWMzKGx1bWluYW5jZSksIDEuMCk7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IubHV0XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIHNhbXBsZXIyRCBsb29rdXA7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKHRleHR1cmUsIHZfVGV4Y29vcmQpO1xcbiAgICBmbG9hdCBibHVlQ29sb3IgPSB0ZXguYiAqIDYzLjA7XFxuICAgIHZlYzIgcXVhZDE7XFxuICAgIHF1YWQxLnkgPSBmbG9vcihmbG9vcihibHVlQ29sb3IpIC8gOC4wKTtcXG4gICAgcXVhZDEueCA9IGZsb29yKGJsdWVDb2xvcikgLSAocXVhZDEueSAqIDguMCk7XFxuICAgIHZlYzIgcXVhZDI7XFxuICAgIHF1YWQyLnkgPSBmbG9vcihjZWlsKGJsdWVDb2xvcikgLyA4LjApO1xcbiAgICBxdWFkMi54ID0gY2VpbChibHVlQ29sb3IpIC0gKHF1YWQyLnkgKiA4LjApO1xcbiAgICB2ZWMyIHRleFBvczE7XFxuICAgIHRleFBvczEueCA9IChxdWFkMS54ICogMC4xMjUpICsgMC41LzUxMi4wICsgKCgwLjEyNSAtIDEuMC81MTIuMCkgKiB0ZXgucik7XFxuICAgIHRleFBvczEueSA9IChxdWFkMS55ICogMC4xMjUpICsgMC41LzUxMi4wICsgKCgwLjEyNSAtIDEuMC81MTIuMCkgKiB0ZXguZyk7XFxuICAgIHZlYzIgdGV4UG9zMjtcXG4gICAgdGV4UG9zMi54ID0gKHF1YWQyLnggKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIHRleC5yKTtcXG4gICAgdGV4UG9zMi55ID0gKHF1YWQyLnkgKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIHRleC5nKTtcXG4gICAgdmVjNCBuZXdDb2xvcjEgPSB0ZXh0dXJlMkQobG9va3VwLCB0ZXhQb3MxKTtcXG4gICAgdmVjNCBuZXdDb2xvcjIgPSB0ZXh0dXJlMkQobG9va3VwLCB0ZXhQb3MyKTtcXG4gICAgdmVjNCBuZXdDb2xvciA9IG1peChuZXdDb2xvcjEsIG5ld0NvbG9yMiwgZnJhY3QoYmx1ZUNvbG9yKSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobmV3Q29sb3IucmdiLCB0ZXgudyk7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IudmlnbmV0dGVcXG4jZGVmaW5lIE9VVFBVVF9BTFBIQVxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSBmbG9hdCBkYXJrbmVzczogMTtcXG51bmlmb3JtIGZsb2F0IG9mZnNldDogMTtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ZWwgPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHZfVGV4Y29vcmQpKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHRleGVsLnJnYjtcXG4gICAgdmVjMiB1diA9ICh2X1RleGNvb3JkIC0gdmVjMigwLjUpKSAqIHZlYzIob2Zmc2V0KTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKHZlYzQobWl4KHRleGVsLnJnYiwgdmVjMygxLjAgLSBkYXJrbmVzcyksIGRvdCh1diwgdXYpKSwgdGV4ZWwuYSkpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLm91dHB1dFxcbiNkZWZpbmUgT1VUUFVUX0FMUEhBXFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSk7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSB0ZXgucmdiO1xcbiNpZmRlZiBPVVRQVVRfQUxQSEFcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSB0ZXguYTtcXG4jZWxzZVxcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGdsX0ZyYWdDb2xvcik7XFxuI2lmZGVmIFBSRU1VTFRJUExZX0FMUEhBXFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuYnJpZ2h0XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIGZsb2F0IHRocmVzaG9sZCA6IDE7XFxudW5pZm9ybSBmbG9hdCBzY2FsZSA6IDEuMDtcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemU6IFs1MTIsIDUxMl07XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuY29uc3QgdmVjMyBsdW1XZWlnaHQgPSB2ZWMzKDAuMjEyNSwgMC43MTU0LCAwLjA3MjEpO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG52ZWM0IG1lZGlhbih2ZWM0IGEsIHZlYzQgYiwgdmVjNCBjKVxcbntcXG4gICAgcmV0dXJuIGEgKyBiICsgYyAtIG1pbihtaW4oYSwgYiksIGMpIC0gbWF4KG1heChhLCBiKSwgYyk7XFxufVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IHRleGVsID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSk7XFxuI2lmZGVmIEFOVElfRkxJQ0tFUlxcbiAgICB2ZWMzIGQgPSAxLjAgLyB0ZXh0dXJlU2l6ZS54eXggKiB2ZWMzKDEuMCwgMS4wLCAwLjApO1xcbiAgICB2ZWM0IHMxID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkIC0gZC54eikpO1xcbiAgICB2ZWM0IHMyID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54eikpO1xcbiAgICB2ZWM0IHMzID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkIC0gZC56eSkpO1xcbiAgICB2ZWM0IHM0ID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56eSkpO1xcbiAgICB0ZXhlbCA9IG1lZGlhbihtZWRpYW4odGV4ZWwsIHMxLCBzMiksIHMzLCBzNCk7XFxuI2VuZGlmXFxuICAgIGZsb2F0IGx1bSA9IGRvdCh0ZXhlbC5yZ2IgLCBsdW1XZWlnaHQpO1xcbiAgICB2ZWM0IGNvbG9yO1xcbiAgICBpZiAobHVtID4gdGhyZXNob2xkICYmIHRleGVsLmEgPiAwLjApXFxuICAgIHtcXG4gICAgICAgIGNvbG9yID0gdmVjNCh0ZXhlbC5yZ2IgKiBzY2FsZSwgdGV4ZWwuYSAqIHNjYWxlKTtcXG4gICAgfVxcbiAgICBlbHNlXFxuICAgIHtcXG4gICAgICAgIGNvbG9yID0gdmVjNCgwLjApO1xcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvcik7XFxufVxcbkBlbmRcXG5cIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG93bnNhbXBsZVxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuZmxvYXQgYnJpZ2h0bmVzcyh2ZWMzIGMpXFxue1xcbiAgICByZXR1cm4gbWF4KG1heChjLnIsIGMuZyksIGMuYik7XFxufVxcbkBpbXBvcnQgY2xheS51dGlsLmNsYW1wX3NhbXBsZVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsIDEuMCwgMS4wKSAvIHRleHR1cmVTaXplLnh5eHk7XFxuI2lmZGVmIEFOVElfRkxJQ0tFUlxcbiAgICB2ZWMzIHMxID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnh5KSkucmdiO1xcbiAgICB2ZWMzIHMyID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnp5KSkucmdiO1xcbiAgICB2ZWMzIHMzID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnh3KSkucmdiO1xcbiAgICB2ZWMzIHM0ID0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnp3KSkucmdiO1xcbiAgICBmbG9hdCBzMXcgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzMSkgKyAxLjApO1xcbiAgICBmbG9hdCBzMncgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzMikgKyAxLjApO1xcbiAgICBmbG9hdCBzM3cgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzMykgKyAxLjApO1xcbiAgICBmbG9hdCBzNHcgPSAxLjAgLyAoYnJpZ2h0bmVzcyhzNCkgKyAxLjApO1xcbiAgICBmbG9hdCBvbmVEaXZpZGVTdW0gPSAxLjAgLyAoczF3ICsgczJ3ICsgczN3ICsgczR3KTtcXG4gICAgdmVjNCBjb2xvciA9IHZlYzQoXFxuICAgICAgICAoczEgKiBzMXcgKyBzMiAqIHMydyArIHMzICogczN3ICsgczQgKiBzNHcpICogb25lRGl2aWRlU3VtLFxcbiAgICAgICAgMS4wXFxuICAgICk7XFxuI2Vsc2VcXG4gICAgdmVjNCBjb2xvciA9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54eSkpO1xcbiAgICBjb2xvciArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQuenkpKTtcXG4gICAgY29sb3IgKz0gZGVjb2RlSERSKGNsYW1wU2FtcGxlKHRleHR1cmUsIHZfVGV4Y29vcmQgKyBkLnh3KSk7XFxuICAgIGNvbG9yICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56dykpO1xcbiAgICBjb2xvciAqPSAwLjI1O1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoY29sb3IpO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIlxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLnVwc2FtcGxlXFxuI2RlZmluZSBISUdIX1FVQUxJVFlcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gdmVjMiB0ZXh0dXJlU2l6ZSA6IFs1MTIsIDUxMl07XFxudW5pZm9ybSBmbG9hdCBzYW1wbGVTY2FsZTogMC41O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5jbGFtcF9zYW1wbGVcXG52b2lkIG1haW4oKVxcbntcXG4jaWZkZWYgSElHSF9RVUFMSVRZXFxuICAgIHZlYzQgZCA9IHZlYzQoMS4wLCAxLjAsIC0xLjAsIDAuMCkgLyB0ZXh0dXJlU2l6ZS54eXh5ICogc2FtcGxlU2NhbGU7XFxuICAgIHZlYzQgcztcXG4gICAgcyAgPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAtIGQueHkpKTtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAtIGQud3kpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAtIGQuenkpKTtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQuencpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCAgICAgICApKSAqIDQuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQueHcpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQuenkpKTtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQud3kpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVIRFIoY2xhbXBTYW1wbGUodGV4dHVyZSwgdl9UZXhjb29yZCArIGQueHkpKTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKHMgLyAxNi4wKTtcXG4jZWxzZVxcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsICsxLjAsICsxLjApIC8gdGV4dHVyZVNpemUueHl4eTtcXG4gICAgdmVjNCBzO1xcbiAgICBzICA9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54eSkpO1xcbiAgICBzICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56eSkpO1xcbiAgICBzICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC54dykpO1xcbiAgICBzICs9IGRlY29kZUhEUihjbGFtcFNhbXBsZSh0ZXh0dXJlLCB2X1RleGNvb3JkICsgZC56dykpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIocyAvIDQuMCk7XFxuI2VuZGlmXFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuaGRyLmNvbXBvc2l0ZVxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxuI2lmZGVmIEJMT09NX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBibG9vbTtcXG4jZW5kaWZcXG4jaWZkZWYgTEVOU0ZMQVJFX0VOQUJMRURcXG51bmlmb3JtIHNhbXBsZXIyRCBsZW5zZmxhcmU7XFxudW5pZm9ybSBzYW1wbGVyMkQgbGVuc2RpcnQ7XFxuI2VuZGlmXFxuI2lmZGVmIExVTV9FTkFCTEVEXFxudW5pZm9ybSBzYW1wbGVyMkQgbHVtO1xcbiNlbmRpZlxcbiNpZmRlZiBMVVRfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIGx1dDtcXG4jZW5kaWZcXG4jaWZkZWYgQ09MT1JfQ09SUkVDVElPTlxcbnVuaWZvcm0gZmxvYXQgYnJpZ2h0bmVzcyA6IDAuMDtcXG51bmlmb3JtIGZsb2F0IGNvbnRyYXN0IDogMS4wO1xcbnVuaWZvcm0gZmxvYXQgc2F0dXJhdGlvbiA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVklHTkVUVEVcXG51bmlmb3JtIGZsb2F0IHZpZ25ldHRlRGFya25lc3M6IDEuMDtcXG51bmlmb3JtIGZsb2F0IHZpZ25ldHRlT2Zmc2V0OiAxLjA7XFxuI2VuZGlmXFxudW5pZm9ybSBmbG9hdCBleHBvc3VyZSA6IDEuMDtcXG51bmlmb3JtIGZsb2F0IGJsb29tSW50ZW5zaXR5IDogMC4yNTtcXG51bmlmb3JtIGZsb2F0IGxlbnNmbGFyZUludGVuc2l0eSA6IDE7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwuc3JnYlxcbnZlYzMgQUNFU1RvbmVNYXBwaW5nKHZlYzMgY29sb3IpXFxue1xcbiAgICBjb25zdCBmbG9hdCBBID0gMi41MTtcXG4gICAgY29uc3QgZmxvYXQgQiA9IDAuMDM7XFxuICAgIGNvbnN0IGZsb2F0IEMgPSAyLjQzO1xcbiAgICBjb25zdCBmbG9hdCBEID0gMC41OTtcXG4gICAgY29uc3QgZmxvYXQgRSA9IDAuMTQ7XFxuICAgIHJldHVybiAoY29sb3IgKiAoQSAqIGNvbG9yICsgQikpIC8gKGNvbG9yICogKEMgKiBjb2xvciArIEQpICsgRSk7XFxufVxcbmZsb2F0IGV5ZUFkYXB0aW9uKGZsb2F0IGZMdW0pXFxue1xcbiAgICByZXR1cm4gbWl4KDAuMiwgZkx1bSwgMC41KTtcXG59XFxuI2lmZGVmIExVVF9FTkFCTEVEXFxudmVjMyBsdXRUcmFuc2Zvcm0odmVjMyBjb2xvcikge1xcbiAgICBmbG9hdCBibHVlQ29sb3IgPSBjb2xvci5iICogNjMuMDtcXG4gICAgdmVjMiBxdWFkMTtcXG4gICAgcXVhZDEueSA9IGZsb29yKGZsb29yKGJsdWVDb2xvcikgLyA4LjApO1xcbiAgICBxdWFkMS54ID0gZmxvb3IoYmx1ZUNvbG9yKSAtIChxdWFkMS55ICogOC4wKTtcXG4gICAgdmVjMiBxdWFkMjtcXG4gICAgcXVhZDIueSA9IGZsb29yKGNlaWwoYmx1ZUNvbG9yKSAvIDguMCk7XFxuICAgIHF1YWQyLnggPSBjZWlsKGJsdWVDb2xvcikgLSAocXVhZDIueSAqIDguMCk7XFxuICAgIHZlYzIgdGV4UG9zMTtcXG4gICAgdGV4UG9zMS54ID0gKHF1YWQxLnggKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIGNvbG9yLnIpO1xcbiAgICB0ZXhQb3MxLnkgPSAocXVhZDEueSAqIDAuMTI1KSArIDAuNS81MTIuMCArICgoMC4xMjUgLSAxLjAvNTEyLjApICogY29sb3IuZyk7XFxuICAgIHZlYzIgdGV4UG9zMjtcXG4gICAgdGV4UG9zMi54ID0gKHF1YWQyLnggKiAwLjEyNSkgKyAwLjUvNTEyLjAgKyAoKDAuMTI1IC0gMS4wLzUxMi4wKSAqIGNvbG9yLnIpO1xcbiAgICB0ZXhQb3MyLnkgPSAocXVhZDIueSAqIDAuMTI1KSArIDAuNS81MTIuMCArICgoMC4xMjUgLSAxLjAvNTEyLjApICogY29sb3IuZyk7XFxuICAgIHZlYzQgbmV3Q29sb3IxID0gdGV4dHVyZTJEKGx1dCwgdGV4UG9zMSk7XFxuICAgIHZlYzQgbmV3Q29sb3IyID0gdGV4dHVyZTJEKGx1dCwgdGV4UG9zMik7XFxuICAgIHZlYzQgbmV3Q29sb3IgPSBtaXgobmV3Q29sb3IxLCBuZXdDb2xvcjIsIGZyYWN0KGJsdWVDb2xvcikpO1xcbiAgICByZXR1cm4gbmV3Q29sb3IucmdiO1xcbn1cXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ZWwgPSB2ZWM0KDAuMCk7XFxuICAgIHZlYzQgb3JpZ2luYWxUZXhlbCA9IHZlYzQoMC4wKTtcXG4jaWZkZWYgVEVYVFVSRV9FTkFCTEVEXFxuICAgIHRleGVsID0gZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSk7XFxuICAgIG9yaWdpbmFsVGV4ZWwgPSB0ZXhlbDtcXG4jZW5kaWZcXG4jaWZkZWYgQkxPT01fRU5BQkxFRFxcbiAgICB2ZWM0IGJsb29tVGV4ZWwgPSBkZWNvZGVIRFIodGV4dHVyZTJEKGJsb29tLCB2X1RleGNvb3JkKSk7XFxuICAgIHRleGVsLnJnYiArPSBibG9vbVRleGVsLnJnYiAqIGJsb29tSW50ZW5zaXR5O1xcbiAgICB0ZXhlbC5hICs9IGJsb29tVGV4ZWwuYSAqIGJsb29tSW50ZW5zaXR5O1xcbiNlbmRpZlxcbiNpZmRlZiBMRU5TRkxBUkVfRU5BQkxFRFxcbiAgICB0ZXhlbCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKGxlbnNmbGFyZSwgdl9UZXhjb29yZCkpICogdGV4dHVyZTJEKGxlbnNkaXJ0LCB2X1RleGNvb3JkKSAqIGxlbnNmbGFyZUludGVuc2l0eTtcXG4jZW5kaWZcXG4gICAgdGV4ZWwuYSA9IG1pbih0ZXhlbC5hLCAxLjApO1xcbiNpZmRlZiBMVU1fRU5BQkxFRFxcbiAgICBmbG9hdCBmTHVtID0gdGV4dHVyZTJEKGx1bSwgdmVjMigwLjUsIDAuNSkpLnI7XFxuICAgIGZsb2F0IGFkYXB0ZWRMdW1EZXN0ID0gMy4wIC8gKG1heCgwLjEsIDEuMCArIDEwLjAqZXllQWRhcHRpb24oZkx1bSkpKTtcXG4gICAgZmxvYXQgZXhwb3N1cmVCaWFzID0gYWRhcHRlZEx1bURlc3QgKiBleHBvc3VyZTtcXG4jZWxzZVxcbiAgICBmbG9hdCBleHBvc3VyZUJpYXMgPSBleHBvc3VyZTtcXG4jZW5kaWZcXG4gICAgdGV4ZWwucmdiICo9IGV4cG9zdXJlQmlhcztcXG4gICAgdGV4ZWwucmdiID0gQUNFU1RvbmVNYXBwaW5nKHRleGVsLnJnYik7XFxuICAgIHRleGVsID0gbGluZWFyVG9zUkdCKHRleGVsKTtcXG4jaWZkZWYgTFVUX0VOQUJMRURcXG4gICAgdGV4ZWwucmdiID0gbHV0VHJhbnNmb3JtKGNsYW1wKHRleGVsLnJnYix2ZWMzKDAuMCksdmVjMygxLjApKSk7XFxuI2VuZGlmXFxuI2lmZGVmIENPTE9SX0NPUlJFQ1RJT05cXG4gICAgdGV4ZWwucmdiID0gY2xhbXAodGV4ZWwucmdiICsgdmVjMyhicmlnaHRuZXNzKSwgMC4wLCAxLjApO1xcbiAgICB0ZXhlbC5yZ2IgPSBjbGFtcCgodGV4ZWwucmdiIC0gdmVjMygwLjUpKSpjb250cmFzdCt2ZWMzKDAuNSksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgbHVtID0gZG90KHRleGVsLnJnYiwgdmVjMygwLjIxMjUsIDAuNzE1NCwgMC4wNzIxKSk7XFxuICAgIHRleGVsLnJnYiA9IG1peCh2ZWMzKGx1bSksIHRleGVsLnJnYiwgc2F0dXJhdGlvbik7XFxuI2VuZGlmXFxuI2lmZGVmIFZJR05FVFRFXFxuICAgIHZlYzIgdXYgPSAodl9UZXhjb29yZCAtIHZlYzIoMC41KSkgKiB2ZWMyKHZpZ25ldHRlT2Zmc2V0KTtcXG4gICAgdGV4ZWwucmdiID0gbWl4KHRleGVsLnJnYiwgdmVjMygxLjAgLSB2aWduZXR0ZURhcmtuZXNzKSwgZG90KHV2LCB1dikpO1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodGV4ZWwpO1xcbiNpZmRlZiBERUJVR1xcbiAgICAjaWYgREVCVUcgPT0gMVxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB2X1RleGNvb3JkKSkpO1xcbiAgICAjZWxpZiBERUJVRyA9PSAyXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihkZWNvZGVIRFIodGV4dHVyZTJEKGJsb29tLCB2X1RleGNvb3JkKSkgKiBibG9vbUludGVuc2l0eSk7XFxuICAgICNlbGlmIERFQlVHID09IDNcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGRlY29kZUhEUih0ZXh0dXJlMkQobGVuc2ZsYXJlLCB2X1RleGNvb3JkKSAqIGxlbnNmbGFyZUludGVuc2l0eSkpO1xcbiAgICAjZW5kaWZcXG4jZW5kaWZcXG4gICAgaWYgKG9yaWdpbmFsVGV4ZWwuYSA8PSAwLjAxICYmIGdsX0ZyYWdDb2xvci5hID4gMWUtNSkge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yLmEgPSBkb3QoZ2xfRnJhZ0NvbG9yLnJnYiwgdmVjMygwLjIxMjUsIDAuNzE1NCwgMC4wNzIxKSk7XFxuICAgIH1cXG4jaWZkZWYgUFJFTVVMVElQTFlfQUxQSEFcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuY29jXFxudW5pZm9ybSBzYW1wbGVyMkQgZGVwdGg7XFxudW5pZm9ybSBmbG9hdCB6TmVhcjogMC4xO1xcbnVuaWZvcm0gZmxvYXQgekZhcjogMjAwMDtcXG51bmlmb3JtIGZsb2F0IGZvY2FsRGlzdDogMztcXG51bmlmb3JtIGZsb2F0IGZvY2FsUmFuZ2U6IDE7XFxudW5pZm9ybSBmbG9hdCBmb2NhbExlbmd0aDogMzA7XFxudW5pZm9ybSBmbG9hdCBmc3RvcDogMi44O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLmVuY29kZV9mbG9hdFxcbnZvaWQgbWFpbigpXFxue1xcbiAgICBmbG9hdCB6ID0gdGV4dHVyZTJEKGRlcHRoLCB2X1RleGNvb3JkKS5yICogMi4wIC0gMS4wO1xcbiAgICBmbG9hdCBkaXN0ID0gMi4wICogek5lYXIgKiB6RmFyIC8gKHpGYXIgKyB6TmVhciAtIHogKiAoekZhciAtIHpOZWFyKSk7XFxuICAgIGZsb2F0IGFwZXJ0dXJlID0gZm9jYWxMZW5ndGggLyBmc3RvcDtcXG4gICAgZmxvYXQgY29jO1xcbiAgICBmbG9hdCB1cHBwZXIgPSBmb2NhbERpc3QgKyBmb2NhbFJhbmdlO1xcbiAgICBmbG9hdCBsb3dlciA9IGZvY2FsRGlzdCAtIGZvY2FsUmFuZ2U7XFxuICAgIGlmIChkaXN0IDw9IHVwcHBlciAmJiBkaXN0ID49IGxvd2VyKSB7XFxuICAgICAgICBjb2MgPSAwLjU7XFxuICAgIH1cXG4gICAgZWxzZSB7XFxuICAgICAgICBmbG9hdCBmb2NhbEFkanVzdGVkID0gZGlzdCA+IHVwcHBlciA/IHVwcHBlciA6IGxvd2VyO1xcbiAgICAgICAgY29jID0gYWJzKGFwZXJ0dXJlICogKGZvY2FsTGVuZ3RoICogKGRpc3QgLSBmb2NhbEFkanVzdGVkKSkgLyAoZGlzdCAqIChmb2NhbEFkanVzdGVkIC0gZm9jYWxMZW5ndGgpKSk7XFxuICAgICAgICBjb2MgPSBjbGFtcChjb2MsIDAuMCwgMC40KSAvIDAuNDAwMDAwMTtcXG4gICAgICAgIGlmIChkaXN0IDwgbG93ZXIpIHtcXG4gICAgICAgICAgICBjb2MgPSAtY29jO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29jID0gY29jICogMC41ICsgMC41O1xcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KGNvYyk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YucHJlbXVsdGlwbHlcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNvYztcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuQGltcG9ydCBjbGF5LnV0aWwuZGVjb2RlX2Zsb2F0XFxudm9pZCBtYWluKCkge1xcbiAgICBmbG9hdCBmQ29jID0gbWF4KGFicyhkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkKSkgKiAyLjAgLSAxLjApLCAwLjEpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIoXFxuICAgICAgICB2ZWM0KGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgdl9UZXhjb29yZCkpLnJnYiAqIGZDb2MsIDEuMClcXG4gICAgKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmRvZi5taW5fY29jXFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gdmVjMiB0ZXh0dXJlU2l6ZSA6IFs1MTIuMCwgNTEyLjBdO1xcbkBpbXBvcnQgY2xheS51dGlsLmZsb2F0XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgZCA9IHZlYzQoLTEuMCwgLTEuMCwgMS4wLCAxLjApIC8gdGV4dHVyZVNpemUueHl4eTtcXG4gICAgZmxvYXQgZkNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnh5KSk7XFxuICAgIGZDb2MgPSBtaW4oZkNvYywgZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuenkpKSk7XFxuICAgIGZDb2MgPSBtaW4oZkNvYywgZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQueHcpKSk7XFxuICAgIGZDb2MgPSBtaW4oZkNvYywgZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuencpKSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KGZDb2MpO1xcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLm1heF9jb2NcXG51bmlmb3JtIHNhbXBsZXIyRCBjb2M7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMi4wLCA1MTIuMF07XFxuQGltcG9ydCBjbGF5LnV0aWwuZmxvYXRcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjNCBkID0gdmVjNCgtMS4wLCAtMS4wLCAxLjAsIDEuMCkgLyB0ZXh0dXJlU2l6ZS54eXh5O1xcbiAgICBmbG9hdCBmQ29jID0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQueHkpKTtcXG4gICAgZkNvYyA9IG1heChmQ29jLCBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC56eSkpKTtcXG4gICAgZkNvYyA9IG1heChmQ29jLCBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC54dykpKTtcXG4gICAgZkNvYyA9IG1heChmQ29jLCBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC56dykpKTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlRmxvYXQoZkNvYyk7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuY29jX3Vwc2FtcGxlXFxuI2RlZmluZSBISUdIX1FVQUxJVFlcXG51bmlmb3JtIHNhbXBsZXIyRCBjb2M7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG51bmlmb3JtIGZsb2F0IHNhbXBsZVNjYWxlOiAwLjU7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwuZmxvYXRcXG52b2lkIG1haW4oKVxcbntcXG4jaWZkZWYgSElHSF9RVUFMSVRZXFxuICAgIHZlYzQgZCA9IHZlYzQoMS4wLCAxLjAsIC0xLjAsIDAuMCkgLyB0ZXh0dXJlU2l6ZS54eXh5ICogc2FtcGxlU2NhbGU7XFxuICAgIGZsb2F0IHM7XFxuICAgIHMgID0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCAtIGQueHkpKTtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkIC0gZC53eSkpICogMi4wO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgLSBkLnp5KSk7XFxuICAgIHMgKz0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuencpKSAqIDIuMDtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICAgICAgICkpICogNC4wO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnh3KSkgKiAyLjA7XFxuICAgIHMgKz0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQuenkpKTtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC53eSkpICogMi4wO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnh5KSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KHMgLyAxNi4wKTtcXG4jZWxzZVxcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsICsxLjAsICsxLjApIC8gdGV4dHVyZVNpemUueHl4eTtcXG4gICAgZmxvYXQgcztcXG4gICAgcyAgPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC54eSkpO1xcbiAgICBzICs9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQgKyBkLnp5KSk7XFxuICAgIHMgKz0gZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCArIGQueHcpKTtcXG4gICAgcyArPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkICsgZC56dykpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdChzIC8gNC4wKTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmRvZi51cHNhbXBsZVxcbiNkZWZpbmUgSElHSF9RVUFMSVRZXFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG51bmlmb3JtIGZsb2F0IHNhbXBsZVNjYWxlOiAwLjU7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbmZsb2F0IHRhcCh2ZWMyIHV2LCBpbm91dCB2ZWM0IGNvbG9yLCBmbG9hdCBiYXNlV2VpZ2h0KSB7XFxuICAgIGZsb2F0IHdlaWdodCA9IGFicyhkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB1dikpICogMi4wIC0gMS4wKSAqIGJhc2VXZWlnaHQ7XFxuICAgIGNvbG9yICs9IGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgdXYpKSAqIHdlaWdodDtcXG4gICAgcmV0dXJuIHdlaWdodDtcXG59XFxudm9pZCBtYWluKClcXG57XFxuI2lmZGVmIEhJR0hfUVVBTElUWVxcbiAgICB2ZWM0IGQgPSB2ZWM0KDEuMCwgMS4wLCAtMS4wLCAwLjApIC8gdGV4dHVyZVNpemUueHl4eSAqIHNhbXBsZVNjYWxlO1xcbiAgICB2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcbiAgICBmbG9hdCBiYXNlV2VpZ2h0ID0gMS4wIC8gMTYuMDtcXG4gICAgZmxvYXQgdyAgPSB0YXAodl9UZXhjb29yZCAtIGQueHksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCAtIGQud3ksIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCAtIGQuenksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQuencsIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCAgICAgICAsIGNvbG9yLCBiYXNlV2VpZ2h0ICogNC4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQueHcsIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQuenksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQud3ksIGNvbG9yLCBiYXNlV2VpZ2h0ICogMi4wKTtcXG4gICAgdyArPSB0YXAodl9UZXhjb29yZCArIGQueHksIGNvbG9yLCBiYXNlV2VpZ2h0KTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGNvbG9yIC8gdyk7XFxuI2Vsc2VcXG4gICAgdmVjNCBkID0gdmVjNCgtMS4wLCAtMS4wLCArMS4wLCArMS4wKSAvIHRleHR1cmVTaXplLnh5eHk7XFxuICAgIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XFxuICAgIGZsb2F0IGJhc2VXZWlnaHQgPSAxLjAgLyA0LjA7XFxuICAgIGZsb2F0IHcgID0gdGFwKHZfVGV4Y29vcmQgKyBkLnh5LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIHcgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnp5LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIHcgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnh3LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIHcgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnp3LCBjb2xvciwgYmFzZVdlaWdodCk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvciAvIHcpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmRvd25zYW1wbGVcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNvYztcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemUgOiBbNTEyLCA1MTJdO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkudXRpbC5kZWNvZGVfZmxvYXRcXG5mbG9hdCB0YXAodmVjMiB1diwgaW5vdXQgdmVjNCBjb2xvcikge1xcbiAgICBmbG9hdCB3ZWlnaHQgPSBhYnMoZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdXYpKSAqIDIuMCAtIDEuMCkgKiAwLjI1O1xcbiAgICBjb2xvciArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHV2KSkgKiB3ZWlnaHQ7XFxuICAgIHJldHVybiB3ZWlnaHQ7XFxufVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWM0IGQgPSB2ZWM0KC0xLjAsIC0xLjAsIDEuMCwgMS4wKSAvIHRleHR1cmVTaXplLnh5eHk7XFxuICAgIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XFxuICAgIGZsb2F0IHdlaWdodCA9IHRhcCh2X1RleGNvb3JkICsgZC54eSwgY29sb3IpO1xcbiAgICB3ZWlnaHQgKz0gdGFwKHZfVGV4Y29vcmQgKyBkLnp5LCBjb2xvcik7XFxuICAgIHdlaWdodCArPSB0YXAodl9UZXhjb29yZCArIGQueHcsIGNvbG9yKTtcXG4gICAgd2VpZ2h0ICs9IHRhcCh2X1RleGNvb3JkICsgZC56dywgY29sb3IpO1xcbiAgICBjb2xvciAvPSB3ZWlnaHQ7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvcik7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuaGV4YWdvbmFsX2JsdXJfZnJhZ1xcbkBpbXBvcnQgY2xheS51dGlsLmZsb2F0XFxudmVjNCBkb0JsdXIoc2FtcGxlcjJEIHRhcmdldFRleHR1cmUsIHZlYzIgb2Zmc2V0KSB7XFxuI2lmZGVmIEJMVVJfQ09DXFxuICAgIGZsb2F0IGNvY1N1bSA9IDAuMDtcXG4jZWxzZVxcbiAgICB2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcbiNlbmRpZlxcbiAgICBmbG9hdCB3ZWlnaHRTdW0gPSAwLjA7XFxuICAgIGZsb2F0IGtlcm5lbFdlaWdodCA9IDEuMCAvIGZsb2F0KEtFUk5FTF9TSVpFKTtcXG4gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBLRVJORUxfU0laRTsgaSsrKSB7XFxuICAgICAgICB2ZWMyIGNvb3JkID0gdl9UZXhjb29yZCArIG9mZnNldCAqIGZsb2F0KGkpO1xcbiAgICAgICAgZmxvYXQgdyA9IGtlcm5lbFdlaWdodDtcXG4jaWZkZWYgQkxVUl9DT0NcXG4gICAgICAgIGZsb2F0IGZDb2MgPSBkZWNvZGVGbG9hdCh0ZXh0dXJlMkQodGFyZ2V0VGV4dHVyZSwgY29vcmQpKSAqIDIuMCAtIDEuMDtcXG4gICAgICAgIGNvY1N1bSArPSBjbGFtcChmQ29jLCAtMS4wLCAwLjApICogdztcXG4jZWxzZVxcbiAgICAgICAgZmxvYXQgZkNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIGNvb3JkKSkgKiAyLjAgLSAxLjA7XFxuICAgICAgICB2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHRhcmdldFRleHR1cmUsIGNvb3JkKTtcXG4gICAgI2lmICFkZWZpbmVkKEJMVVJfTkVBUkZJRUxEKVxcbiAgICAgICAgdyAqPSBhYnMoZkNvYyk7XFxuICAgICNlbmRpZlxcbiAgICAgICAgY29sb3IgKz0gZGVjb2RlSERSKHRleGVsKSAqIHc7XFxuI2VuZGlmXFxuICAgICAgICB3ZWlnaHRTdW0gKz0gdztcXG4gICAgfVxcbiNpZmRlZiBCTFVSX0NPQ1xcbiAgICByZXR1cm4gZW5jb2RlRmxvYXQoY2xhbXAoY29jU3VtIC8gd2VpZ2h0U3VtLCAtMS4wLCAwLjApICogMC41ICsgMC41KTtcXG4jZWxzZVxcbiAgICByZXR1cm4gY29sb3IgLyB3ZWlnaHRTdW07XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuaGV4YWdvbmFsX2JsdXJfMVxcbiNkZWZpbmUgS0VSTkVMX1NJWkUgNVxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnVuaWZvcm0gZmxvYXQgYmx1clNpemUgOiAxLjA7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMi4wLCA1MTIuMF07XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS5jb21wb3NpdG9yLmRvZi5oZXhhZ29uYWxfYmx1cl9mcmFnXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzIgb2Zmc2V0ID0gYmx1clNpemUgLyB0ZXh0dXJlU2l6ZTtcXG4jaWYgIWRlZmluZWQoQkxVUl9ORUFSRklFTEQpICYmICFkZWZpbmVkKEJMVVJfQ09DKVxcbiAgICBvZmZzZXQgKj0gYWJzKGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQpKSAqIDIuMCAtIDEuMCk7XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvciA9IGRvQmx1cih0ZXh0dXJlLCB2ZWMyKDAuMCwgb2Zmc2V0LnkpKTtcXG4jaWYgIWRlZmluZWQoQkxVUl9DT0MpXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihnbF9GcmFnQ29sb3IpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmhleGFnb25hbF9ibHVyXzJcXG4jZGVmaW5lIEtFUk5FTF9TSVpFIDVcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNvYztcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG51bmlmb3JtIGZsb2F0IGJsdXJTaXplIDogMS4wO1xcbnVuaWZvcm0gdmVjMiB0ZXh0dXJlU2l6ZSA6IFs1MTIuMCwgNTEyLjBdO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5AaW1wb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuaGV4YWdvbmFsX2JsdXJfZnJhZ1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMyIG9mZnNldCA9IGJsdXJTaXplIC8gdGV4dHVyZVNpemU7XFxuI2lmICFkZWZpbmVkKEJMVVJfTkVBUkZJRUxEKSAmJiAhZGVmaW5lZChCTFVSX0NPQylcXG4gICAgb2Zmc2V0ICo9IGFicyhkZWNvZGVGbG9hdCh0ZXh0dXJlMkQoY29jLCB2X1RleGNvb3JkKSkgKiAyLjAgLSAxLjApO1xcbiNlbmRpZlxcbiAgICBvZmZzZXQueSAvPSAyLjA7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGRvQmx1cih0ZXh0dXJlLCAtb2Zmc2V0KTtcXG4jaWYgIWRlZmluZWQoQkxVUl9DT0MpXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihnbF9GcmFnQ29sb3IpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmhleGFnb25hbF9ibHVyXzNcXG4jZGVmaW5lIEtFUk5FTF9TSVpFIDVcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMTtcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMjtcXG51bmlmb3JtIHNhbXBsZXIyRCBjb2M7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudW5pZm9ybSBmbG9hdCBibHVyU2l6ZSA6IDEuMDtcXG51bmlmb3JtIHZlYzIgdGV4dHVyZVNpemUgOiBbNTEyLjAsIDUxMi4wXTtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxuQGltcG9ydCBjbGF5LmNvbXBvc2l0b3IuZG9mLmhleGFnb25hbF9ibHVyX2ZyYWdcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMiBvZmZzZXQgPSBibHVyU2l6ZSAvIHRleHR1cmVTaXplO1xcbiNpZiAhZGVmaW5lZChCTFVSX05FQVJGSUVMRCkgJiYgIWRlZmluZWQoQkxVUl9DT0MpXFxuICAgIG9mZnNldCAqPSBhYnMoZGVjb2RlRmxvYXQodGV4dHVyZTJEKGNvYywgdl9UZXhjb29yZCkpICogMi4wIC0gMS4wKTtcXG4jZW5kaWZcXG4gICAgb2Zmc2V0LnkgLz0gMi4wO1xcbiAgICB2ZWMyIHZEb3duUmlnaHQgPSB2ZWMyKG9mZnNldC54LCAtb2Zmc2V0LnkpO1xcbiAgICB2ZWM0IHRleGVsMSA9IGRvQmx1cih0ZXh0dXJlMSwgLW9mZnNldCk7XFxuICAgIHZlYzQgdGV4ZWwyID0gZG9CbHVyKHRleHR1cmUxLCB2RG93blJpZ2h0KTtcXG4gICAgdmVjNCB0ZXhlbDMgPSBkb0JsdXIodGV4dHVyZTIsIHZEb3duUmlnaHQpO1xcbiNpZmRlZiBCTFVSX0NPQ1xcbiAgICBmbG9hdCBjb2MxID0gZGVjb2RlRmxvYXQodGV4ZWwxKSAqIDIuMCAtIDEuMDtcXG4gICAgZmxvYXQgY29jMiA9IGRlY29kZUZsb2F0KHRleGVsMikgKiAyLjAgLSAxLjA7XFxuICAgIGZsb2F0IGNvYzMgPSBkZWNvZGVGbG9hdCh0ZXhlbDMpICogMi4wIC0gMS4wO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdChcXG4gICAgICAgICgoY29jMSArIGNvYzIgKyBjb2MzKSAvIDMuMCkgKiAwLjUgKyAwLjVcXG4gICAgKTtcXG4jZWxzZVxcbiAgICB2ZWM0IGNvbG9yID0gKHRleGVsMSArIHRleGVsMiArIHRleGVsMykgLyAzLjA7XFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihjb2xvcik7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuY29tcG9zaXRvci5kb2YuY29tcG9zaXRlXFxuI2RlZmluZSBERUJVRyAwXFxudW5pZm9ybSBzYW1wbGVyMkQgb3JpZ2luYWw7XFxudW5pZm9ybSBzYW1wbGVyMkQgYmx1cnJlZDtcXG51bmlmb3JtIHNhbXBsZXIyRCBuZWFyZmllbGQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgY29jO1xcbnVuaWZvcm0gc2FtcGxlcjJEIG5lYXJjb2M7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbkBpbXBvcnQgY2xheS51dGlsLmZsb2F0XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgYmx1cnJlZENvbG9yID0gZGVjb2RlSERSKHRleHR1cmUyRChibHVycmVkLCB2X1RleGNvb3JkKSk7XFxuICAgIHZlYzQgb3JpZ2luYWxDb2xvciA9IGRlY29kZUhEUih0ZXh0dXJlMkQob3JpZ2luYWwsIHZfVGV4Y29vcmQpKTtcXG4gICAgZmxvYXQgZkNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChjb2MsIHZfVGV4Y29vcmQpKTtcXG4gICAgZkNvYyA9IGFicyhmQ29jICogMi4wIC0gMS4wKTtcXG4gICAgZmxvYXQgd2VpZ2h0ID0gc21vb3Roc3RlcCgwLjAsIDEuMCwgZkNvYyk7XFxuI2lmZGVmIE5FQVJGSUVMRF9FTkFCTEVEXFxuICAgIHZlYzQgbmVhcmZpZWxkQ29sb3IgPSBkZWNvZGVIRFIodGV4dHVyZTJEKG5lYXJmaWVsZCwgdl9UZXhjb29yZCkpO1xcbiAgICBmbG9hdCBmTmVhckNvYyA9IGRlY29kZUZsb2F0KHRleHR1cmUyRChuZWFyY29jLCB2X1RleGNvb3JkKSk7XFxuICAgIGZOZWFyQ29jID0gYWJzKGZOZWFyQ29jICogMi4wIC0gMS4wKTtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKFxcbiAgICAgICAgbWl4KFxcbiAgICAgICAgICAgIG5lYXJmaWVsZENvbG9yLCBtaXgob3JpZ2luYWxDb2xvciwgYmx1cnJlZENvbG9yLCB3ZWlnaHQpLFxcbiAgICAgICAgICAgIHBvdygxLjAgLSBmTmVhckNvYywgNC4wKVxcbiAgICAgICAgKVxcbiAgICApO1xcbiNlbHNlXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUhEUihtaXgob3JpZ2luYWxDb2xvciwgYmx1cnJlZENvbG9yLCB3ZWlnaHQpKTtcXG4jZW5kaWZcXG4jaWYgREVCVUcgPT0gMVxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoZkNvYyksIDEuMCk7XFxuI2VsaWYgREVCVUcgPT0gMlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoZk5lYXJDb2MpLCAxLjApO1xcbiNlbGlmIERFQlVHID09IDNcXG4gICAgZ2xfRnJhZ0NvbG9yID0gZW5jb2RlSERSKGJsdXJyZWRDb2xvcik7XFxuI2VsaWYgREVCVUcgPT0gNFxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIobmVhcmZpZWxkQ29sb3IpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5jb21wb3NpdG9yLmxlbnNmbGFyZVxcbiNkZWZpbmUgU0FNUExFX05VTUJFUiA4XFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIHNhbXBsZXIyRCBsZW5zY29sb3I7XFxudW5pZm9ybSB2ZWMyIHRleHR1cmVTaXplIDogWzUxMiwgNTEyXTtcXG51bmlmb3JtIGZsb2F0IGRpc3BlcnNhbCA6IDAuMztcXG51bmlmb3JtIGZsb2F0IGhhbG9XaWR0aCA6IDAuNDtcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb24gOiAxLjA7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbnZlYzQgdGV4dHVyZURpc3RvcnRlZChcXG4gICAgaW4gdmVjMiB0ZXhjb29yZCxcXG4gICAgaW4gdmVjMiBkaXJlY3Rpb24sXFxuICAgIGluIHZlYzMgZGlzdG9ydGlvblxcbikge1xcbiAgICByZXR1cm4gdmVjNChcXG4gICAgICAgIGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgdGV4Y29vcmQgKyBkaXJlY3Rpb24gKiBkaXN0b3J0aW9uLnIpKS5yLFxcbiAgICAgICAgZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCB0ZXhjb29yZCArIGRpcmVjdGlvbiAqIGRpc3RvcnRpb24uZykpLmcsXFxuICAgICAgICBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHRleGNvb3JkICsgZGlyZWN0aW9uICogZGlzdG9ydGlvbi5iKSkuYixcXG4gICAgICAgIDEuMFxcbiAgICApO1xcbn1cXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMiB0ZXhjb29yZCA9IC12X1RleGNvb3JkICsgdmVjMigxLjApOyAgICB2ZWMyIHRleHR1cmVPZmZzZXQgPSAxLjAgLyB0ZXh0dXJlU2l6ZTtcXG4gICAgdmVjMiBnaG9zdFZlYyA9ICh2ZWMyKDAuNSkgLSB0ZXhjb29yZCkgKiBkaXNwZXJzYWw7XFxuICAgIHZlYzIgaGFsb1ZlYyA9IG5vcm1hbGl6ZShnaG9zdFZlYykgKiBoYWxvV2lkdGg7XFxuICAgIHZlYzMgZGlzdG9ydGlvbiA9IHZlYzMoLXRleHR1cmVPZmZzZXQueCAqIGRpc3RvcnRpb24sIDAuMCwgdGV4dHVyZU9mZnNldC54ICogZGlzdG9ydGlvbik7XFxuICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNBTVBMRV9OVU1CRVI7IGkrKylcXG4gICAge1xcbiAgICAgICAgdmVjMiBvZmZzZXQgPSBmcmFjdCh0ZXhjb29yZCArIGdob3N0VmVjICogZmxvYXQoaSkpO1xcbiAgICAgICAgZmxvYXQgd2VpZ2h0ID0gbGVuZ3RoKHZlYzIoMC41KSAtIG9mZnNldCkgLyBsZW5ndGgodmVjMigwLjUpKTtcXG4gICAgICAgIHdlaWdodCA9IHBvdygxLjAgLSB3ZWlnaHQsIDEwLjApO1xcbiAgICAgICAgcmVzdWx0ICs9IHRleHR1cmVEaXN0b3J0ZWQob2Zmc2V0LCBub3JtYWxpemUoZ2hvc3RWZWMpLCBkaXN0b3J0aW9uKSAqIHdlaWdodDtcXG4gICAgfVxcbiAgICByZXN1bHQgKj0gdGV4dHVyZTJEKGxlbnNjb2xvciwgdmVjMihsZW5ndGgodmVjMigwLjUpIC0gdGV4Y29vcmQpKSAvIGxlbmd0aCh2ZWMyKDAuNSkpKTtcXG4gICAgZmxvYXQgd2VpZ2h0ID0gbGVuZ3RoKHZlYzIoMC41KSAtIGZyYWN0KHRleGNvb3JkICsgaGFsb1ZlYykpIC8gbGVuZ3RoKHZlYzIoMC41KSk7XFxuICAgIHdlaWdodCA9IHBvdygxLjAgLSB3ZWlnaHQsIDEwLjApO1xcbiAgICB2ZWMyIG9mZnNldCA9IGZyYWN0KHRleGNvb3JkICsgaGFsb1ZlYyk7XFxuICAgIHJlc3VsdCArPSB0ZXh0dXJlRGlzdG9ydGVkKG9mZnNldCwgbm9ybWFsaXplKGdob3N0VmVjKSwgZGlzdG9ydGlvbikgKiB3ZWlnaHQ7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHJlc3VsdDtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5ibGVuZFxcbiNkZWZpbmUgU0hBREVSX05BTUUgYmxlbmRcXG4jaWZkZWYgVEVYVFVSRTFfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUxO1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0MSA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTJfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUyO1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0MiA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTNfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUzO1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0MyA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTRfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU0O1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0NCA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTVfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU1O1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0NSA6IDEuMDtcXG4jZW5kaWZcXG4jaWZkZWYgVEVYVFVSRTZfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU2O1xcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0NiA6IDEuMDtcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgdGV4ID0gdmVjNCgwLjApO1xcbiNpZmRlZiBURVhUVVJFMV9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUxLCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQxO1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFMl9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUyLCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQyO1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFM19FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUzLCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQzO1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFNF9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmU0LCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQ0O1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFNV9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmU1LCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQ1O1xcbiNlbmRpZlxcbiNpZmRlZiBURVhUVVJFNl9FTkFCTEVEXFxuICAgIHRleCArPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmU2LCB2X1RleGNvb3JkKSkgKiB3ZWlnaHQ2O1xcbiNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodGV4KTtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5meGFhXFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcXG51bmlmb3JtIHZlYzQgdmlld3BvcnQgOiBWSUVXUE9SVDtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG4jZGVmaW5lIEZYQUFfUkVEVUNFX01JTiAgICgxLjAvMTI4LjApXFxuI2RlZmluZSBGWEFBX1JFRFVDRV9NVUwgICAoMS4wLzguMClcXG4jZGVmaW5lIEZYQUFfU1BBTl9NQVggICAgIDguMFxcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG52b2lkIG1haW4oKVxcbntcXG4gICAgdmVjMiByZXNvbHV0aW9uID0gMS4wIC8gdmlld3BvcnQuenc7XFxuICAgIHZlYzMgcmdiTlcgPSAgZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggLTEuMCwgLTEuMCApICkgKiByZXNvbHV0aW9uICkgKS54eXo7XFxuICAgIHZlYzMgcmdiTkUgPSBkZWNvZGVIRFIoIHRleHR1cmUyRCggdGV4dHVyZSwgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAxLjAsIC0xLjAgKSApICogcmVzb2x1dGlvbiApICkueHl6O1xcbiAgICB2ZWMzIHJnYlNXID0gZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggLTEuMCwgMS4wICkgKSAqIHJlc29sdXRpb24gKSApLnh5ejtcXG4gICAgdmVjMyByZ2JTRSA9IGRlY29kZUhEUiggdGV4dHVyZTJEKCB0ZXh0dXJlLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDEuMCwgMS4wICkgKSAqIHJlc29sdXRpb24gKSApLnh5ejtcXG4gICAgdmVjNCByZ2JhTSAgPSBkZWNvZGVIRFIoIHRleHR1cmUyRCggdGV4dHVyZSwgIGdsX0ZyYWdDb29yZC54eSAgKiByZXNvbHV0aW9uICkgKTtcXG4gICAgdmVjMyByZ2JNICA9IHJnYmFNLnh5ejtcXG4gICAgZmxvYXQgb3BhY2l0eSAgPSByZ2JhTS53O1xcbiAgICB2ZWMzIGx1bWEgPSB2ZWMzKCAwLjI5OSwgMC41ODcsIDAuMTE0ICk7XFxuICAgIGZsb2F0IGx1bWFOVyA9IGRvdCggcmdiTlcsIGx1bWEgKTtcXG4gICAgZmxvYXQgbHVtYU5FID0gZG90KCByZ2JORSwgbHVtYSApO1xcbiAgICBmbG9hdCBsdW1hU1cgPSBkb3QoIHJnYlNXLCBsdW1hICk7XFxuICAgIGZsb2F0IGx1bWFTRSA9IGRvdCggcmdiU0UsIGx1bWEgKTtcXG4gICAgZmxvYXQgbHVtYU0gID0gZG90KCByZ2JNLCAgbHVtYSApO1xcbiAgICBmbG9hdCBsdW1hTWluID0gbWluKCBsdW1hTSwgbWluKCBtaW4oIGx1bWFOVywgbHVtYU5FICksIG1pbiggbHVtYVNXLCBsdW1hU0UgKSApICk7XFxuICAgIGZsb2F0IGx1bWFNYXggPSBtYXgoIGx1bWFNLCBtYXgoIG1heCggbHVtYU5XLCBsdW1hTkUpICwgbWF4KCBsdW1hU1csIGx1bWFTRSApICkgKTtcXG4gICAgdmVjMiBkaXI7XFxuICAgIGRpci54ID0gLSgobHVtYU5XICsgbHVtYU5FKSAtIChsdW1hU1cgKyBsdW1hU0UpKTtcXG4gICAgZGlyLnkgPSAgKChsdW1hTlcgKyBsdW1hU1cpIC0gKGx1bWFORSArIGx1bWFTRSkpO1xcbiAgICBmbG9hdCBkaXJSZWR1Y2UgPSBtYXgoICggbHVtYU5XICsgbHVtYU5FICsgbHVtYVNXICsgbHVtYVNFICkgKiAoIDAuMjUgKiBGWEFBX1JFRFVDRV9NVUwgKSwgRlhBQV9SRURVQ0VfTUlOICk7XFxuICAgIGZsb2F0IHJjcERpck1pbiA9IDEuMCAvICggbWluKCBhYnMoIGRpci54ICksIGFicyggZGlyLnkgKSApICsgZGlyUmVkdWNlICk7XFxuICAgIGRpciA9IG1pbiggdmVjMiggRlhBQV9TUEFOX01BWCwgIEZYQUFfU1BBTl9NQVgpLFxcbiAgICAgICAgICBtYXgoIHZlYzIoLUZYQUFfU1BBTl9NQVgsIC1GWEFBX1NQQU5fTUFYKSxcXG4gICAgICAgICAgICAgICAgZGlyICogcmNwRGlyTWluKSkgKiByZXNvbHV0aW9uO1xcbiAgICB2ZWMzIHJnYkEgPSBkZWNvZGVIRFIoIHRleHR1cmUyRCggdGV4dHVyZSwgZ2xfRnJhZ0Nvb3JkLnh5ICAqIHJlc29sdXRpb24gKyBkaXIgKiAoIDEuMCAvIDMuMCAtIDAuNSApICkgKS54eXo7XFxuICAgIHJnYkEgKz0gZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsIGdsX0ZyYWdDb29yZC54eSAgKiByZXNvbHV0aW9uICsgZGlyICogKCAyLjAgLyAzLjAgLSAwLjUgKSApICkueHl6O1xcbiAgICByZ2JBICo9IDAuNTtcXG4gICAgdmVjMyByZ2JCID0gZGVjb2RlSERSKCB0ZXh0dXJlMkQoIHRleHR1cmUsIGdsX0ZyYWdDb29yZC54eSAgKiByZXNvbHV0aW9uICsgZGlyICogLTAuNSApICkueHl6O1xcbiAgICByZ2JCICs9IGRlY29kZUhEUiggdGV4dHVyZTJEKCB0ZXh0dXJlLCBnbF9GcmFnQ29vcmQueHkgICogcmVzb2x1dGlvbiArIGRpciAqIDAuNSApICkueHl6O1xcbiAgICByZ2JCICo9IDAuMjU7XFxuICAgIHJnYkIgKz0gcmdiQSAqIDAuNTtcXG4gICAgZmxvYXQgbHVtYUIgPSBkb3QoIHJnYkIsIGx1bWEgKTtcXG4gICAgaWYgKCAoIGx1bWFCIDwgbHVtYU1pbiApIHx8ICggbHVtYUIgPiBsdW1hTWF4ICkgKVxcbiAgICB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KCByZ2JBLCBvcGFjaXR5ICk7XFxuICAgIH1cXG4gICAgZWxzZSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KCByZ2JCLCBvcGFjaXR5ICk7XFxuICAgIH1cXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuY29tcG9zaXRvci5meGFhM1xcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XFxudW5pZm9ybSB2ZWM0IHZpZXdwb3J0IDogVklFV1BPUlQ7XFxudW5pZm9ybSBmbG9hdCBzdWJwaXhlbDogMC43NTtcXG51bmlmb3JtIGZsb2F0IGVkZ2VUaHJlc2hvbGQ6IDAuMTI1O1xcbnVuaWZvcm0gZmxvYXQgZWRnZVRocmVzaG9sZE1pbjogMC4wNjI1O1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLnJnYm1cXG5mbG9hdCBGeGFhTHVtYSh2ZWM0IHJnYmEpIHsgcmV0dXJuIHJnYmEueTsgfVxcbnZlYzQgRnhhYVBpeGVsU2hhZGVyKFxcbiAgICB2ZWMyIHBvc1xcbiAgICAsc2FtcGxlcjJEIHRleFxcbiAgICAsdmVjMiBmeGFhUXVhbGl0eVJjcEZyYW1lXFxuICAgICxmbG9hdCBmeGFhUXVhbGl0eVN1YnBpeFxcbiAgICAsZmxvYXQgZnhhYVF1YWxpdHlFZGdlVGhyZXNob2xkXFxuICAgICxmbG9hdCBmeGFhUXVhbGl0eUVkZ2VUaHJlc2hvbGRNaW5cXG4pIHtcXG4gICAgdmVjMiBwb3NNO1xcbiAgICBwb3NNLnggPSBwb3MueDtcXG4gICAgcG9zTS55ID0gcG9zLnk7XFxuICAgIHZlYzQgcmdieU0gPSBkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc00sIDAuMCkpO1xcbiAgICBmbG9hdCBsdW1hUyA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAwLjAsIDEuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hRSA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAxLjAsIDAuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hTiA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAwLjAsLTEuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hVyA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKC0xLjAsIDAuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBtYXhTTSA9IG1heChsdW1hUywgcmdieU0ueSk7XFxuICAgIGZsb2F0IG1pblNNID0gbWluKGx1bWFTLCByZ2J5TS55KTtcXG4gICAgZmxvYXQgbWF4RVNNID0gbWF4KGx1bWFFLCBtYXhTTSk7XFxuICAgIGZsb2F0IG1pbkVTTSA9IG1pbihsdW1hRSwgbWluU00pO1xcbiAgICBmbG9hdCBtYXhXTiA9IG1heChsdW1hTiwgbHVtYVcpO1xcbiAgICBmbG9hdCBtaW5XTiA9IG1pbihsdW1hTiwgbHVtYVcpO1xcbiAgICBmbG9hdCByYW5nZU1heCA9IG1heChtYXhXTiwgbWF4RVNNKTtcXG4gICAgZmxvYXQgcmFuZ2VNaW4gPSBtaW4obWluV04sIG1pbkVTTSk7XFxuICAgIGZsb2F0IHJhbmdlTWF4U2NhbGVkID0gcmFuZ2VNYXggKiBmeGFhUXVhbGl0eUVkZ2VUaHJlc2hvbGQ7XFxuICAgIGZsb2F0IHJhbmdlID0gcmFuZ2VNYXggLSByYW5nZU1pbjtcXG4gICAgZmxvYXQgcmFuZ2VNYXhDbGFtcGVkID0gbWF4KGZ4YWFRdWFsaXR5RWRnZVRocmVzaG9sZE1pbiwgcmFuZ2VNYXhTY2FsZWQpO1xcbiAgICBib29sIGVhcmx5RXhpdCA9IHJhbmdlIDwgcmFuZ2VNYXhDbGFtcGVkO1xcbiAgICBpZihlYXJseUV4aXQpIHJldHVybiByZ2J5TTtcXG4gICAgZmxvYXQgbHVtYU5XID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NNICsgKHZlYzIoLTEuMCwtMS4wKSAqIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpLCAwLjApKSk7XFxuICAgIGZsb2F0IGx1bWFTRSA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSArICh2ZWMyKCAxLjAsIDEuMCkgKiBmeGFhUXVhbGl0eVJjcEZyYW1lLnh5KSwgMC4wKSkpO1xcbiAgICBmbG9hdCBsdW1hTkUgPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc00gKyAodmVjMiggMS4wLC0xLjApICogZnhhYVF1YWxpdHlSY3BGcmFtZS54eSksIDAuMCkpKTtcXG4gICAgZmxvYXQgbHVtYVNXID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NNICsgKHZlYzIoLTEuMCwgMS4wKSAqIGZ4YWFRdWFsaXR5UmNwRnJhbWUueHkpLCAwLjApKSk7XFxuICAgIGZsb2F0IGx1bWFOUyA9IGx1bWFOICsgbHVtYVM7XFxuICAgIGZsb2F0IGx1bWFXRSA9IGx1bWFXICsgbHVtYUU7XFxuICAgIGZsb2F0IHN1YnBpeFJjcFJhbmdlID0gMS4wL3JhbmdlO1xcbiAgICBmbG9hdCBzdWJwaXhOU1dFID0gbHVtYU5TICsgbHVtYVdFO1xcbiAgICBmbG9hdCBlZGdlSG9yejEgPSAoLTIuMCAqIHJnYnlNLnkpICsgbHVtYU5TO1xcbiAgICBmbG9hdCBlZGdlVmVydDEgPSAoLTIuMCAqIHJnYnlNLnkpICsgbHVtYVdFO1xcbiAgICBmbG9hdCBsdW1hTkVTRSA9IGx1bWFORSArIGx1bWFTRTtcXG4gICAgZmxvYXQgbHVtYU5XTkUgPSBsdW1hTlcgKyBsdW1hTkU7XFxuICAgIGZsb2F0IGVkZ2VIb3J6MiA9ICgtMi4wICogbHVtYUUpICsgbHVtYU5FU0U7XFxuICAgIGZsb2F0IGVkZ2VWZXJ0MiA9ICgtMi4wICogbHVtYU4pICsgbHVtYU5XTkU7XFxuICAgIGZsb2F0IGx1bWFOV1NXID0gbHVtYU5XICsgbHVtYVNXO1xcbiAgICBmbG9hdCBsdW1hU1dTRSA9IGx1bWFTVyArIGx1bWFTRTtcXG4gICAgZmxvYXQgZWRnZUhvcno0ID0gKGFicyhlZGdlSG9yejEpICogMi4wKSArIGFicyhlZGdlSG9yejIpO1xcbiAgICBmbG9hdCBlZGdlVmVydDQgPSAoYWJzKGVkZ2VWZXJ0MSkgKiAyLjApICsgYWJzKGVkZ2VWZXJ0Mik7XFxuICAgIGZsb2F0IGVkZ2VIb3J6MyA9ICgtMi4wICogbHVtYVcpICsgbHVtYU5XU1c7XFxuICAgIGZsb2F0IGVkZ2VWZXJ0MyA9ICgtMi4wICogbHVtYVMpICsgbHVtYVNXU0U7XFxuICAgIGZsb2F0IGVkZ2VIb3J6ID0gYWJzKGVkZ2VIb3J6MykgKyBlZGdlSG9yejQ7XFxuICAgIGZsb2F0IGVkZ2VWZXJ0ID0gYWJzKGVkZ2VWZXJ0MykgKyBlZGdlVmVydDQ7XFxuICAgIGZsb2F0IHN1YnBpeE5XU1dORVNFID0gbHVtYU5XU1cgKyBsdW1hTkVTRTtcXG4gICAgZmxvYXQgbGVuZ3RoU2lnbiA9IGZ4YWFRdWFsaXR5UmNwRnJhbWUueDtcXG4gICAgYm9vbCBob3J6U3BhbiA9IGVkZ2VIb3J6ID49IGVkZ2VWZXJ0O1xcbiAgICBmbG9hdCBzdWJwaXhBID0gc3VicGl4TlNXRSAqIDIuMCArIHN1YnBpeE5XU1dORVNFO1xcbiAgICBpZighaG9yelNwYW4pIGx1bWFOID0gbHVtYVc7XFxuICAgIGlmKCFob3J6U3BhbikgbHVtYVMgPSBsdW1hRTtcXG4gICAgaWYoaG9yelNwYW4pIGxlbmd0aFNpZ24gPSBmeGFhUXVhbGl0eVJjcEZyYW1lLnk7XFxuICAgIGZsb2F0IHN1YnBpeEIgPSAoc3VicGl4QSAqICgxLjAvMTIuMCkpIC0gcmdieU0ueTtcXG4gICAgZmxvYXQgZ3JhZGllbnROID0gbHVtYU4gLSByZ2J5TS55O1xcbiAgICBmbG9hdCBncmFkaWVudFMgPSBsdW1hUyAtIHJnYnlNLnk7XFxuICAgIGZsb2F0IGx1bWFOTiA9IGx1bWFOICsgcmdieU0ueTtcXG4gICAgZmxvYXQgbHVtYVNTID0gbHVtYVMgKyByZ2J5TS55O1xcbiAgICBib29sIHBhaXJOID0gYWJzKGdyYWRpZW50TikgPj0gYWJzKGdyYWRpZW50Uyk7XFxuICAgIGZsb2F0IGdyYWRpZW50ID0gbWF4KGFicyhncmFkaWVudE4pLCBhYnMoZ3JhZGllbnRTKSk7XFxuICAgIGlmKHBhaXJOKSBsZW5ndGhTaWduID0gLWxlbmd0aFNpZ247XFxuICAgIGZsb2F0IHN1YnBpeEMgPSBjbGFtcChhYnMoc3VicGl4QikgKiBzdWJwaXhSY3BSYW5nZSwgMC4wLCAxLjApO1xcbiAgICB2ZWMyIHBvc0I7XFxuICAgIHBvc0IueCA9IHBvc00ueDtcXG4gICAgcG9zQi55ID0gcG9zTS55O1xcbiAgICB2ZWMyIG9mZk5QO1xcbiAgICBvZmZOUC54ID0gKCFob3J6U3BhbikgPyAwLjAgOiBmeGFhUXVhbGl0eVJjcEZyYW1lLng7XFxuICAgIG9mZk5QLnkgPSAoIGhvcnpTcGFuKSA/IDAuMCA6IGZ4YWFRdWFsaXR5UmNwRnJhbWUueTtcXG4gICAgaWYoIWhvcnpTcGFuKSBwb3NCLnggKz0gbGVuZ3RoU2lnbiAqIDAuNTtcXG4gICAgaWYoIGhvcnpTcGFuKSBwb3NCLnkgKz0gbGVuZ3RoU2lnbiAqIDAuNTtcXG4gICAgdmVjMiBwb3NOO1xcbiAgICBwb3NOLnggPSBwb3NCLnggLSBvZmZOUC54ICogMS4wO1xcbiAgICBwb3NOLnkgPSBwb3NCLnkgLSBvZmZOUC55ICogMS4wO1xcbiAgICB2ZWMyIHBvc1A7XFxuICAgIHBvc1AueCA9IHBvc0IueCArIG9mZk5QLnggKiAxLjA7XFxuICAgIHBvc1AueSA9IHBvc0IueSArIG9mZk5QLnkgKiAxLjA7XFxuICAgIGZsb2F0IHN1YnBpeEQgPSAoKC0yLjApKnN1YnBpeEMpICsgMy4wO1xcbiAgICBmbG9hdCBsdW1hRW5kTiA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTiwgMC4wKSkpO1xcbiAgICBmbG9hdCBzdWJwaXhFID0gc3VicGl4QyAqIHN1YnBpeEM7XFxuICAgIGZsb2F0IGx1bWFFbmRQID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NQLCAwLjApKSk7XFxuICAgIGlmKCFwYWlyTikgbHVtYU5OID0gbHVtYVNTO1xcbiAgICBmbG9hdCBncmFkaWVudFNjYWxlZCA9IGdyYWRpZW50ICogMS4wLzQuMDtcXG4gICAgZmxvYXQgbHVtYU1NID0gcmdieU0ueSAtIGx1bWFOTiAqIDAuNTtcXG4gICAgZmxvYXQgc3VicGl4RiA9IHN1YnBpeEQgKiBzdWJwaXhFO1xcbiAgICBib29sIGx1bWFNTFRaZXJvID0gbHVtYU1NIDwgMC4wO1xcbiAgICBsdW1hRW5kTiAtPSBsdW1hTk4gKiAwLjU7XFxuICAgIGx1bWFFbmRQIC09IGx1bWFOTiAqIDAuNTtcXG4gICAgYm9vbCBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgIGJvb2wgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICBpZighZG9uZU4pIHBvc04ueCAtPSBvZmZOUC54ICogMS41O1xcbiAgICBpZighZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogMS41O1xcbiAgICBib29sIGRvbmVOUCA9ICghZG9uZU4pIHx8ICghZG9uZVApO1xcbiAgICBpZighZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogMS41O1xcbiAgICBpZighZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogMS41O1xcbiAgICBpZihkb25lTlApIHtcXG4gICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc04ueHksIDAuMCkpKTtcXG4gICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc1AueHksIDAuMCkpKTtcXG4gICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBsdW1hRW5kTiAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgIGRvbmVOID0gYWJzKGx1bWFFbmROKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgIGRvbmVQID0gYWJzKGx1bWFFbmRQKSA+PSBncmFkaWVudFNjYWxlZDtcXG4gICAgICAgIGlmKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiAyLjA7XFxuICAgICAgICBpZighZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogMi4wO1xcbiAgICAgICAgZG9uZU5QID0gKCFkb25lTikgfHwgKCFkb25lUCk7XFxuICAgICAgICBpZighZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogMi4wO1xcbiAgICAgICAgaWYoIWRvbmVQKSBwb3NQLnkgKz0gb2ZmTlAueSAqIDIuMDtcXG4gICAgICAgIGlmKGRvbmVOUCkge1xcbiAgICAgICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc04ueHksIDAuMCkpKTtcXG4gICAgICAgICAgICBpZighZG9uZVApIGx1bWFFbmRQID0gRnhhYUx1bWEoZGVjb2RlSERSKHRleHR1cmUyRCh0ZXh0dXJlLCBwb3NQLnh5LCAwLjApKSk7XFxuICAgICAgICAgICAgaWYoIWRvbmVOKSBsdW1hRW5kTiA9IGx1bWFFbmROIC0gbHVtYU5OICogMC41O1xcbiAgICAgICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICBkb25lTiA9IGFicyhsdW1hRW5kTikgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgZG9uZVAgPSBhYnMobHVtYUVuZFApID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgIGlmKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiA0LjA7XFxuICAgICAgICAgICAgaWYoIWRvbmVOKSBwb3NOLnkgLT0gb2ZmTlAueSAqIDQuMDtcXG4gICAgICAgICAgICBkb25lTlAgPSAoIWRvbmVOKSB8fCAoIWRvbmVQKTtcXG4gICAgICAgICAgICBpZighZG9uZVApIHBvc1AueCArPSBvZmZOUC54ICogNC4wO1xcbiAgICAgICAgICAgIGlmKCFkb25lUCkgcG9zUC55ICs9IG9mZk5QLnkgKiA0LjA7XFxuICAgICAgICAgICAgaWYoZG9uZU5QKSB7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lTikgbHVtYUVuZE4gPSBGeGFhTHVtYShkZWNvZGVIRFIodGV4dHVyZTJEKHRleHR1cmUsIHBvc04ueHksIDAuMCkpKTtcXG4gICAgICAgICAgICAgICAgaWYoIWRvbmVQKSBsdW1hRW5kUCA9IEZ4YWFMdW1hKGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zUC54eSwgMC4wKSkpO1xcbiAgICAgICAgICAgICAgICBpZighZG9uZU4pIGx1bWFFbmROID0gbHVtYUVuZE4gLSBsdW1hTk4gKiAwLjU7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lUCkgbHVtYUVuZFAgPSBsdW1hRW5kUCAtIGx1bWFOTiAqIDAuNTtcXG4gICAgICAgICAgICAgICAgZG9uZU4gPSBhYnMobHVtYUVuZE4pID49IGdyYWRpZW50U2NhbGVkO1xcbiAgICAgICAgICAgICAgICBkb25lUCA9IGFicyhsdW1hRW5kUCkgPj0gZ3JhZGllbnRTY2FsZWQ7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lTikgcG9zTi54IC09IG9mZk5QLnggKiAxMi4wO1xcbiAgICAgICAgICAgICAgICBpZighZG9uZU4pIHBvc04ueSAtPSBvZmZOUC55ICogMTIuMDtcXG4gICAgICAgICAgICAgICAgZG9uZU5QID0gKCFkb25lTikgfHwgKCFkb25lUCk7XFxuICAgICAgICAgICAgICAgIGlmKCFkb25lUCkgcG9zUC54ICs9IG9mZk5QLnggKiAxMi4wO1xcbiAgICAgICAgICAgICAgICBpZighZG9uZVApIHBvc1AueSArPSBvZmZOUC55ICogMTIuMDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZmxvYXQgZHN0TiA9IHBvc00ueCAtIHBvc04ueDtcXG4gICAgZmxvYXQgZHN0UCA9IHBvc1AueCAtIHBvc00ueDtcXG4gICAgaWYoIWhvcnpTcGFuKSBkc3ROID0gcG9zTS55IC0gcG9zTi55O1xcbiAgICBpZighaG9yelNwYW4pIGRzdFAgPSBwb3NQLnkgLSBwb3NNLnk7XFxuICAgIGJvb2wgZ29vZFNwYW5OID0gKGx1bWFFbmROIDwgMC4wKSAhPSBsdW1hTUxUWmVybztcXG4gICAgZmxvYXQgc3Bhbkxlbmd0aCA9IChkc3RQICsgZHN0Tik7XFxuICAgIGJvb2wgZ29vZFNwYW5QID0gKGx1bWFFbmRQIDwgMC4wKSAhPSBsdW1hTUxUWmVybztcXG4gICAgZmxvYXQgc3Bhbkxlbmd0aFJjcCA9IDEuMC9zcGFuTGVuZ3RoO1xcbiAgICBib29sIGRpcmVjdGlvbk4gPSBkc3ROIDwgZHN0UDtcXG4gICAgZmxvYXQgZHN0ID0gbWluKGRzdE4sIGRzdFApO1xcbiAgICBib29sIGdvb2RTcGFuID0gZGlyZWN0aW9uTiA/IGdvb2RTcGFuTiA6IGdvb2RTcGFuUDtcXG4gICAgZmxvYXQgc3VicGl4RyA9IHN1YnBpeEYgKiBzdWJwaXhGO1xcbiAgICBmbG9hdCBwaXhlbE9mZnNldCA9IChkc3QgKiAoLXNwYW5MZW5ndGhSY3ApKSArIDAuNTtcXG4gICAgZmxvYXQgc3VicGl4SCA9IHN1YnBpeEcgKiBmeGFhUXVhbGl0eVN1YnBpeDtcXG4gICAgZmxvYXQgcGl4ZWxPZmZzZXRHb29kID0gZ29vZFNwYW4gPyBwaXhlbE9mZnNldCA6IDAuMDtcXG4gICAgZmxvYXQgcGl4ZWxPZmZzZXRTdWJwaXggPSBtYXgocGl4ZWxPZmZzZXRHb29kLCBzdWJwaXhIKTtcXG4gICAgaWYoIWhvcnpTcGFuKSBwb3NNLnggKz0gcGl4ZWxPZmZzZXRTdWJwaXggKiBsZW5ndGhTaWduO1xcbiAgICBpZiggaG9yelNwYW4pIHBvc00ueSArPSBwaXhlbE9mZnNldFN1YnBpeCAqIGxlbmd0aFNpZ247XFxuICAgIHJldHVybiB2ZWM0KGRlY29kZUhEUih0ZXh0dXJlMkQodGV4dHVyZSwgcG9zTSwgMC4wKSkueHl6LCByZ2J5TS55KTtcXG59XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzQgY29sb3IgPSBGeGFhUGl4ZWxTaGFkZXIoXFxuICAgICAgICB2X1RleGNvb3JkLFxcbiAgICAgICAgdGV4dHVyZSxcXG4gICAgICAgIHZlYzIoMS4wKSAvIHZpZXdwb3J0Lnp3LFxcbiAgICAgICAgc3VicGl4ZWwsXFxuICAgICAgICBlZGdlVGhyZXNob2xkLFxcbiAgICAgICAgZWRnZVRocmVzaG9sZE1pblxcbiAgICApO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiwgMS4wKTtcXG59XFxuQGVuZFwiO1xuIiwiaW1wb3J0IGxpZ2h0RXNzbCBmcm9tICcuL3NvdXJjZS9oZWFkZXIvbGlnaHQnO1xuaW1wb3J0IHV0aWxFc3NsIGZyb20gJy4vc291cmNlL3V0aWwuZ2xzbC5qcyc7XG5cbmltcG9ydCBiYXNpY0Vzc2wgZnJvbSAnLi9zb3VyY2UvYmFzaWMuZ2xzbC5qcyc7XG5pbXBvcnQgbGFtYmVydEVzc2wgZnJvbSAnLi9zb3VyY2UvbGFtYmVydC5nbHNsLmpzJztcbmltcG9ydCBzdGFuZGFyZEVzc2wgZnJvbSAnLi9zb3VyY2Uvc3RhbmRhcmQuZ2xzbC5qcyc7XG5pbXBvcnQgd2lyZWZyYW1lRXNzbCBmcm9tICcuL3NvdXJjZS93aXJlZnJhbWUuZ2xzbC5qcyc7XG5pbXBvcnQgc2t5Ym94RXNzbCBmcm9tICcuL3NvdXJjZS9za3lib3guZ2xzbC5qcyc7XG5pbXBvcnQgcHJlekVzc2wgZnJvbSAnLi9zb3VyY2UvcHJlei5nbHNsLmpzJztcblxuaW1wb3J0IGxpYnJhcnkgZnJvbSAnLi9saWJyYXJ5JztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcblxuXG5TaGFkZXJbJ2ltcG9ydCddKGxpZ2h0RXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKHV0aWxFc3NsKTtcblxuLy8gU29tZSBidWlsZCBpbiBzaGFkZXJzXG5TaGFkZXJbJ2ltcG9ydCddKGJhc2ljRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGxhbWJlcnRFc3NsKTtcblNoYWRlclsnaW1wb3J0J10oc3RhbmRhcmRFc3NsKTtcblNoYWRlclsnaW1wb3J0J10od2lyZWZyYW1lRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKHNreWJveEVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShwcmV6RXNzbCk7XG5cbmxpYnJhcnkudGVtcGxhdGUoJ2NsYXkuYmFzaWMnLCBTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLmZyYWdtZW50JykpO1xubGlicmFyeS50ZW1wbGF0ZSgnY2xheS5sYW1iZXJ0JywgU2hhZGVyLnNvdXJjZSgnY2xheS5sYW1iZXJ0LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LmxhbWJlcnQuZnJhZ21lbnQnKSk7XG5saWJyYXJ5LnRlbXBsYXRlKCdjbGF5LndpcmVmcmFtZScsIFNoYWRlci5zb3VyY2UoJ2NsYXkud2lyZWZyYW1lLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LndpcmVmcmFtZS5mcmFnbWVudCcpKTtcbmxpYnJhcnkudGVtcGxhdGUoJ2NsYXkuc2t5Ym94JywgU2hhZGVyLnNvdXJjZSgnY2xheS5za3lib3gudmVydGV4JyksIFNoYWRlci5zb3VyY2UoJ2NsYXkuc2t5Ym94LmZyYWdtZW50JykpO1xubGlicmFyeS50ZW1wbGF0ZSgnY2xheS5wcmV6JywgU2hhZGVyLnNvdXJjZSgnY2xheS5wcmV6LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnByZXouZnJhZ21lbnQnKSk7XG5saWJyYXJ5LnRlbXBsYXRlKCdjbGF5LnN0YW5kYXJkJywgU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZC52ZXJ0ZXgnKSwgU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZC5mcmFnbWVudCcpKTtcbmxpYnJhcnkudGVtcGxhdGUoJ2NsYXkuc3RhbmRhcmRNUicsIFNoYWRlci5zb3VyY2UoJ2NsYXkuc3RhbmRhcmRNUi52ZXJ0ZXgnKSwgU2hhZGVyLnNvdXJjZSgnY2xheS5zdGFuZGFyZE1SLmZyYWdtZW50JykpO1xuXG5cbmltcG9ydCBjb2xvcmFkanVzdEVzc2wgZnJvbSAnLi9zb3VyY2UvY29tcG9zaXRvci9jb2xvcmFkanVzdC5nbHNsLmpzJztcbmltcG9ydCBibHVyRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2JsdXIuZ2xzbC5qcyc7XG5pbXBvcnQgbHVtRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2x1bS5nbHNsLmpzJztcbmltcG9ydCBsdXRFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvbHV0Lmdsc2wuanMnO1xuaW1wb3J0IHZpZ2VudHRlRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL3ZpZ25ldHRlLmdsc2wuanMnO1xuaW1wb3J0IG91dHB1dEVzc2wgZnJvbSAnLi9zb3VyY2UvY29tcG9zaXRvci9vdXRwdXQuZ2xzbC5qcyc7XG5pbXBvcnQgYnJpZ2h0RXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2JyaWdodC5nbHNsLmpzJztcbmltcG9ydCBkb3duc2FtcGxlRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2Rvd25zYW1wbGUuZ2xzbC5qcyc7XG5pbXBvcnQgdXBzYW1wbGVFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvdXBzYW1wbGUuZ2xzbC5qcyc7XG5pbXBvcnQgaGRyRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2hkci5nbHNsLmpzJztcbmltcG9ydCBkb2ZFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvZG9mLmdsc2wuanMnO1xuaW1wb3J0IGxlbnNmbGFyZUVzc2wgZnJvbSAnLi9zb3VyY2UvY29tcG9zaXRvci9sZW5zZmxhcmUuZ2xzbC5qcyc7XG5pbXBvcnQgYmxlbmRFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvYmxlbmQuZ2xzbC5qcyc7XG5cbmltcG9ydCBmeGFhRXNzbCBmcm9tICcuL3NvdXJjZS9jb21wb3NpdG9yL2Z4YWEuZ2xzbC5qcyc7XG5pbXBvcnQgZnhhYTNFc3NsIGZyb20gJy4vc291cmNlL2NvbXBvc2l0b3IvZnhhYTMuZ2xzbC5qcyc7XG5cbi8vIFNvbWUgYnVpbGQgaW4gc2hhZGVyc1xuU2hhZGVyWydpbXBvcnQnXShjb2xvcmFkanVzdEVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShibHVyRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGx1bUVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShsdXRFc3NsKTtcblNoYWRlclsnaW1wb3J0J10odmlnZW50dGVFc3NsKTtcblNoYWRlclsnaW1wb3J0J10ob3V0cHV0RXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGJyaWdodEVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShkb3duc2FtcGxlRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKHVwc2FtcGxlRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGhkckVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShkb2ZFc3NsKTtcblNoYWRlclsnaW1wb3J0J10obGVuc2ZsYXJlRXNzbCk7XG5TaGFkZXJbJ2ltcG9ydCddKGJsZW5kRXNzbCk7XG5cblNoYWRlclsnaW1wb3J0J10oZnhhYUVzc2wpO1xuU2hhZGVyWydpbXBvcnQnXShmeGFhM0Vzc2wpO1xuIiwiLyoqXG4gKiBnbFRGIExvYWRlclxuICogU3BlY2lmaWNhdGlvbiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi9SRUFETUUubWRcbiAqXG4gKiBUT0RPIE1vcnBoIHRhcmdldHNcbiAqL1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vY29yZS9CYXNlJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL2NvcmUvcmVxdWVzdCc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9jb3JlL3V0aWwnO1xuaW1wb3J0IHZlbmRvciBmcm9tICcuLi9jb3JlL3ZlbmRvcic7XG5cbmltcG9ydCBTY2VuZSBmcm9tICcuLi9TY2VuZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IFN0YW5kYXJkTWF0ZXJpYWwgZnJvbSAnLi4vU3RhbmRhcmRNYXRlcmlhbCc7XG5pbXBvcnQgTWVzaCBmcm9tICcuLi9NZXNoJztcbmltcG9ydCBOb2RlIGZyb20gJy4uL05vZGUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgc2hhZGVyTGlicmFyeSBmcm9tICcuLi9zaGFkZXIvbGlicmFyeSc7XG5pbXBvcnQgU2tlbGV0b24gZnJvbSAnLi4vU2tlbGV0b24nO1xuaW1wb3J0IEpvaW50IGZyb20gJy4uL0pvaW50JztcbmltcG9ydCBQZXJzcGVjdGl2ZUNhbWVyYSBmcm9tICcuLi9jYW1lcmEvUGVyc3BlY3RpdmUnO1xuaW1wb3J0IE9ydGhvZ3JhcGhpY0NhbWVyYSBmcm9tICcuLi9jYW1lcmEvT3J0aG9ncmFwaGljJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi4vY29yZS9nbGVudW0nO1xuXG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi4vbWF0aC9Cb3VuZGluZ0JveCc7XG5cbmltcG9ydCBUcmFja0NsaXAgZnJvbSAnLi4vYW5pbWF0aW9uL1RyYWNrQ2xpcCc7XG5pbXBvcnQgU2FtcGxlclRyYWNrIGZyb20gJy4uL2FuaW1hdGlvbi9TYW1wbGVyVHJhY2snO1xuXG5pbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuXG4vLyBJbXBvcnQgYnVpbHRpbiBzaGFkZXJcbmltcG9ydCAnLi4vc2hhZGVyL2J1aWx0aW4nO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuXG52YXIgc2VtYW50aWNBdHRyaWJ1dGVNYXAgPSB7XG4gICAgJ05PUk1BTCc6ICdub3JtYWwnLFxuICAgICdQT1NJVElPTic6ICdwb3NpdGlvbicsXG4gICAgJ1RFWENPT1JEXzAnOiAndGV4Y29vcmQwJyxcbiAgICAnVEVYQ09PUkRfMSc6ICd0ZXhjb29yZDEnLFxuICAgICdXRUlHSFRTXzAnOiAnd2VpZ2h0JyxcbiAgICAnSk9JTlRTXzAnOiAnam9pbnQnLFxuICAgICdDT0xPUic6ICdjb2xvcidcbn07XG5cbnZhciBBUlJBWV9DVE9SX01BUCA9IHtcbiAgICA1MTIwOiB2ZW5kb3IuSW50OEFycmF5LFxuICAgIDUxMjE6IHZlbmRvci5VaW50OEFycmF5LFxuICAgIDUxMjI6IHZlbmRvci5JbnQxNkFycmF5LFxuICAgIDUxMjM6IHZlbmRvci5VaW50MTZBcnJheSxcbiAgICA1MTI1OiB2ZW5kb3IuVWludDMyQXJyYXksXG4gICAgNTEyNjogdmVuZG9yLkZsb2F0MzJBcnJheVxufTtcbnZhciBTSVpFX01BUCA9IHtcbiAgICBTQ0FMQVI6IDEsXG4gICAgVkVDMjogMixcbiAgICBWRUMzOiAzLFxuICAgIFZFQzQ6IDQsXG4gICAgTUFUMjogNCxcbiAgICBNQVQzOiA5LFxuICAgIE1BVDQ6IDE2XG59O1xuXG5mdW5jdGlvbiBnZXRBY2Nlc3NvckRhdGEoanNvbiwgbGliLCBhY2Nlc3NvcklkeCwgaXNJbmRpY2VzKSB7XG4gICAgdmFyIGFjY2Vzc29ySW5mbyA9IGpzb24uYWNjZXNzb3JzW2FjY2Vzc29ySWR4XTtcblxuICAgIHZhciBidWZmZXIgPSBsaWIuYnVmZmVyVmlld3NbYWNjZXNzb3JJbmZvLmJ1ZmZlclZpZXddO1xuICAgIHZhciBieXRlT2Zmc2V0ID0gYWNjZXNzb3JJbmZvLmJ5dGVPZmZzZXQgfHwgMDtcbiAgICB2YXIgQXJyYXlDdG9yID0gQVJSQVlfQ1RPUl9NQVBbYWNjZXNzb3JJbmZvLmNvbXBvbmVudFR5cGVdIHx8IHZlbmRvci5GbG9hdDMyQXJyYXk7XG5cbiAgICB2YXIgc2l6ZSA9IFNJWkVfTUFQW2FjY2Vzc29ySW5mby50eXBlXTtcbiAgICBpZiAoc2l6ZSA9PSBudWxsICYmIGlzSW5kaWNlcykge1xuICAgICAgICBzaXplID0gMTtcbiAgICB9XG4gICAgdmFyIGFyciA9IG5ldyBBcnJheUN0b3IoYnVmZmVyLCBieXRlT2Zmc2V0LCBzaXplICogYWNjZXNzb3JJbmZvLmNvdW50KTtcblxuICAgIHZhciBxdWFudGl6ZUV4dGVuc2lvbiA9IGFjY2Vzc29ySW5mby5leHRlbnNpb25zICYmIGFjY2Vzc29ySW5mby5leHRlbnNpb25zWydXRUIzRF9xdWFudGl6ZWRfYXR0cmlidXRlcyddO1xuICAgIGlmIChxdWFudGl6ZUV4dGVuc2lvbikge1xuICAgICAgICB2YXIgZGVjb2RlZEFyciA9IG5ldyB2ZW5kb3IuRmxvYXQzMkFycmF5KHNpemUgKiBhY2Nlc3NvckluZm8uY291bnQpO1xuICAgICAgICB2YXIgZGVjb2RlTWF0cml4ID0gcXVhbnRpemVFeHRlbnNpb24uZGVjb2RlTWF0cml4O1xuICAgICAgICB2YXIgZGVjb2RlT2Zmc2V0LCBkZWNvZGVTY2FsZTtcbiAgICAgICAgdmFyIGRlY29kZU9mZnNldCA9IG5ldyBBcnJheShzaXplKTtcbiAgICAgICAgdmFyIGRlY29kZVNjYWxlID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNpemU7IGsrKykge1xuICAgICAgICAgICAgZGVjb2RlT2Zmc2V0W2tdID0gZGVjb2RlTWF0cml4W3NpemUgKiAoc2l6ZSArIDEpICsga107XG4gICAgICAgICAgICBkZWNvZGVTY2FsZVtrXSA9IGRlY29kZU1hdHJpeFtrICogKHNpemUgKyAxKSArIGtdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXNzb3JJbmZvLmNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlZEFycltpICogc2l6ZSArIGtdID0gYXJyW2kgKiBzaXplICsga10gKiBkZWNvZGVTY2FsZVtrXSArIGRlY29kZU9mZnNldFtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFyciA9IGRlY29kZWRBcnI7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gY2xheS5sb2FkZXIuR0xURi5JUmVzdWx0XG4gKiBAcHJvcGVydHkge09iamVjdH0ganNvblxuICogQHByb3BlcnR5IHtjbGF5LlNjZW5lfSBzY2VuZVxuICogQHByb3BlcnR5IHtjbGF5Lk5vZGV9IHJvb3ROb2RlXG4gKiBAcHJvcGVydHkge2NsYXkuQ2FtZXJhW119IGNhbWVyYXNcbiAqIEBwcm9wZXJ0eSB7Y2xheS5UZXh0dXJlW119IHRleHR1cmVzXG4gKiBAcHJvcGVydHkge2NsYXkuTWF0ZXJpYWxbXX0gbWF0ZXJpYWxzXG4gKiBAcHJvcGVydHkge2NsYXkuU2tlbGV0b25bXX0gc2tlbGV0b25zXG4gKiBAcHJvcGVydHkge2NsYXkuTWVzaFtdfSBtZXNoZXNcbiAqIEBwcm9wZXJ0eSB7Y2xheS5hbmltYXRpb24uVHJhY2tDbGlwW119IGNsaXBzXG4gKiBAcHJvcGVydHkge2NsYXkuTm9kZVtdfSBub2Rlc1xuICovXG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkubG9hZGVyLkdMVEZcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBHTFRGTG9hZGVyID0gQmFzZS5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkubG9hZGVyLkdMVEYjICovXG57XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Y2xheS5Ob2RlfVxuICAgICAqL1xuICAgIHJvb3ROb2RlOiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJvb3QgcGF0aCBmb3IgdXJpIHBhcnNpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICByb290UGF0aDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFJvb3QgcGF0aCBmb3IgdGV4dHVyZSB1cmkgcGFyc2luZy4gRGVmYXVsdGx5IHVzZSB0aGUgcm9vdFBhdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRleHR1cmVSb290UGF0aDogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFJvb3QgcGF0aCBmb3IgYnVmZmVyIHVyaSBwYXJzaW5nLiBEZWZhdWx0bHkgdXNlIHRoZSByb290UGF0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgYnVmZmVyUm9vdFBhdGg6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBTaGFkZXIgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBtYXRlcmlhbHMuXG4gICAgICogQHR5cGUge3N0cmluZ3xjbGF5LlNoYWRlcn1cbiAgICAgKiBAZGVmYXVsdCAnY2xheS5zdGFuZGFyZCdcbiAgICAgKi9cbiAgICBzaGFkZXI6ICdjbGF5LnN0YW5kYXJkJyxcblxuICAgIC8qKlxuICAgICAqIElmIHVzZSB7QGxpbmsgY2xheS5TdGFuZGFyZE1hdGVyaWFsfVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdXNlU3RhbmRhcmRNYXRlcmlhbDogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBJZiBsb2FkaW5nIHRoZSBjYW1lcmFzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGluY2x1ZGVDYW1lcmE6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBJZiBsb2FkaW5nIHRoZSBhbmltYXRpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIGluY2x1ZGVBbmltYXRpb246IHRydWUsXG4gICAgLyoqXG4gICAgICogSWYgbG9hZGluZyB0aGUgbWVzaGVzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5jbHVkZU1lc2g6IHRydWUsXG4gICAgLyoqXG4gICAgICogSWYgbG9hZGluZyB0aGUgdGV4dHVyZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5jbHVkZVRleHR1cmU6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGNyb3NzT3JpZ2luOiAnJyxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9pc3N1ZXMvNjc0XG4gICAgICovXG4gICAgdGV4dHVyZUZsaXBZOiBmYWxzZSxcblxuICAgIHNoYWRlckxpYnJhcnk6IG51bGxcbn0sXG5mdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNoYWRlckxpYnJhcnkpIHtcbiAgICAgICAgdGhpcy5zaGFkZXJMaWJyYXJ5ID0gc2hhZGVyTGlicmFyeS5jcmVhdGVMaWJyYXJ5KCk7XG4gICAgfVxufSxcbi8qKiBAbGVuZHMgY2xheS5sb2FkZXIuR0xURi5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24gKHVybCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBpc0JpbmFyeSA9IHVybC5lbmRzV2l0aCgnLmdsYicpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvb3RQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdFBhdGggPSB1cmwuc2xpY2UoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5nZXQoe1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBvbnByb2dyZXNzOiBmdW5jdGlvbiAocGVyY2VudCwgbG9hZGVkLCB0b3RhbCkge1xuICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigncHJvZ3Jlc3MnLCBwZXJjZW50LCBsb2FkZWQsIHRvdGFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcignZXJyb3InLCBlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IGlzQmluYXJ5ID8gJ2FycmF5YnVmZmVyJyA6ICd0ZXh0JyxcbiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZUJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2UoSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgZ2xURiBiaW5hcnlcbiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBidWZmZXJcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmxvYWRlci5HTFRGLklSZXN1bHR9XG4gICAgICovXG4gICAgcGFyc2VCaW5hcnk6IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IG5ldyBVaW50MzJBcnJheShidWZmZXIsIDAsIDQpO1xuICAgICAgICBpZiAoaGVhZGVyWzBdICE9PSAweDQ2NTQ2QzY3KSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgJ0ludmFsaWQgZ2xURiBiaW5hcnkgZm9ybWF0OiBJbnZhbGlkIGhlYWRlcicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJbMF0gPCAyKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgJ09ubHkgZ2xURjIuMCBpcyBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyLCAxMik7XG5cbiAgICAgICAgdmFyIGpzb247XG4gICAgICAgIHZhciBidWZmZXJzID0gW107XG4gICAgICAgIC8vIFJlYWQgY2h1bmtzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YVZpZXcuYnl0ZUxlbmd0aDspIHtcbiAgICAgICAgICAgIHZhciBjaHVua0xlbmd0aCA9IGRhdGFWaWV3LmdldFVpbnQzMihpLCB0cnVlKTtcbiAgICAgICAgICAgIGkgKz0gNDtcbiAgICAgICAgICAgIHZhciBjaHVua1R5cGUgPSBkYXRhVmlldy5nZXRVaW50MzIoaSwgdHJ1ZSk7XG4gICAgICAgICAgICBpICs9IDQ7XG5cbiAgICAgICAgICAgIC8vIGpzb25cbiAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPT09IDB4NEU0RjUzNEEpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLCBpICsgMTIsIGNodW5rTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPLCBmb3IgdGhlIGJyb3dzZXIgbm90IHN1cHBvcnQgVGV4dERlY29kZXIuXG4gICAgICAgICAgICAgICAgdmFyIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gZGVjb2Rlci5kZWNvZGUoYXJyKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgJ0pTT04gUGFyc2UgZXJyb3I6JyArIGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaHVua1R5cGUgPT09IDB4MDA0RTQ5NDIpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyLnNsaWNlKGkgKyAxMiwgaSArIDEyICsgY2h1bmtMZW5ndGgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSArPSBjaHVua0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWpzb24pIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCAnSW52YWxpZCBnbFRGIGJpbmFyeSBmb3JtYXQ6IENhblxcJ3QgZmluZCBKU09OLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoanNvbiwgYnVmZmVycyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBqc29uXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcltdfSBbYnVmZmVyXVxuICAgICAqIEByZXR1cm4ge2NsYXkubG9hZGVyLkdMVEYuSVJlc3VsdH1cbiAgICAgKi9cbiAgICBwYXJzZTogZnVuY3Rpb24gKGpzb24sIGJ1ZmZlcnMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBsaWIgPSB7XG4gICAgICAgICAgICBqc29uOiBqc29uLFxuICAgICAgICAgICAgYnVmZmVyczogW10sXG4gICAgICAgICAgICBidWZmZXJWaWV3czogW10sXG4gICAgICAgICAgICBtYXRlcmlhbHM6IFtdLFxuICAgICAgICAgICAgdGV4dHVyZXM6IFtdLFxuICAgICAgICAgICAgbWVzaGVzOiBbXSxcbiAgICAgICAgICAgIGpvaW50czogW10sXG4gICAgICAgICAgICBza2VsZXRvbnM6IFtdLFxuICAgICAgICAgICAgY2FtZXJhczogW10sXG4gICAgICAgICAgICBub2RlczogW10sXG4gICAgICAgICAgICBjbGlwczogW11cbiAgICAgICAgfTtcbiAgICAgICAgLy8gTW91bnQgb24gdGhlIHJvb3Qgbm9kZSBpZiBnaXZlblxuICAgICAgICB2YXIgcm9vdE5vZGUgPSB0aGlzLnJvb3ROb2RlIHx8IG5ldyBTY2VuZSgpO1xuXG4gICAgICAgIHZhciBsb2FkaW5nID0gMDtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2FkKCkge1xuICAgICAgICAgICAgbG9hZGluZy0tO1xuICAgICAgICAgICAgaWYgKGxvYWRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhZnRlckxvYWRCdWZmZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhbHJlYWR5IGxvYWQgYnVmZmVyc1xuICAgICAgICBpZiAoYnVmZmVycykge1xuICAgICAgICAgICAgbGliLmJ1ZmZlcnMgPSBidWZmZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBhZnRlckxvYWRCdWZmZXIodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMb2FkIGJ1ZmZlcnNcbiAgICAgICAgICAgIHV0aWwuZWFjaChqc29uLmJ1ZmZlcnMsIGZ1bmN0aW9uIChidWZmZXJJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nKys7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGggPSBidWZmZXJJbmZvLnVyaTtcblxuICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRCdWZmZXIocGF0aCwgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBsaWIuYnVmZmVyc1tpZHhdID0gYnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWQoKTtcbiAgICAgICAgICAgICAgICB9LCBjaGVja0xvYWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBnZXRSZXN1bHQoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGpzb246IGpzb24sXG4gICAgICAgICAgICAgICAgc2NlbmU6IHNlbGYucm9vdE5vZGUgPyBudWxsIDogcm9vdE5vZGUsXG4gICAgICAgICAgICAgICAgcm9vdE5vZGU6IHNlbGYucm9vdE5vZGUgPyByb290Tm9kZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgY2FtZXJhczogbGliLmNhbWVyYXMsXG4gICAgICAgICAgICAgICAgdGV4dHVyZXM6IGxpYi50ZXh0dXJlcyxcbiAgICAgICAgICAgICAgICBtYXRlcmlhbHM6IGxpYi5tYXRlcmlhbHMsXG4gICAgICAgICAgICAgICAgc2tlbGV0b25zOiBsaWIuc2tlbGV0b25zLFxuICAgICAgICAgICAgICAgIG1lc2hlczogbGliLm1lc2hlcyxcbiAgICAgICAgICAgICAgICBjbGlwczogbGliLmNsaXBzLFxuICAgICAgICAgICAgICAgIG5vZGVzOiBsaWIubm9kZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhZnRlckxvYWRCdWZmZXIoaW1tZWRpYXRlbHkpIHtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBub3QgbG9hZCBjb21wbGV0ZS5cbiAgICAgICAgICAgIGlmIChsaWIuYnVmZmVycy5sZW5ndGggIT09IGpzb24uYnVmZmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCdlcnJvcicsICdCdWZmZXIgbm90IGxvYWQgY29tcGxldGUuJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBqc29uLmJ1ZmZlclZpZXdzLmZvckVhY2goZnVuY3Rpb24gKGJ1ZmZlclZpZXdJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgICAgICAvLyBQRU5ESU5HIFBlcmZvcm1hbmNlXG4gICAgICAgICAgICAgICAgbGliLmJ1ZmZlclZpZXdzW2lkeF0gPSBsaWIuYnVmZmVyc1tidWZmZXJWaWV3SW5mby5idWZmZXJdXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShidWZmZXJWaWV3SW5mby5ieXRlT2Zmc2V0IHx8IDAsIChidWZmZXJWaWV3SW5mby5ieXRlT2Zmc2V0IHx8IDApICsgKGJ1ZmZlclZpZXdJbmZvLmJ5dGVMZW5ndGggfHwgMCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsaWIuYnVmZmVycyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoc2VsZi5pbmNsdWRlTWVzaCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmluY2x1ZGVUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlVGV4dHVyZXMoanNvbiwgbGliKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VNYXRlcmlhbHMoanNvbiwgbGliKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZU1lc2hlcyhqc29uLCBsaWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5fcGFyc2VOb2Rlcyhqc29uLCBsaWIpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgb25lIHNjZW5lLlxuICAgICAgICAgICAgaWYgKGpzb24uc2NlbmVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjZW5lSW5mbyA9IGpzb24uc2NlbmVzW2pzb24uc2NlbmUgfHwgMF07IC8vIERlZmF1bHQgdXNlIHRoZSBmaXJzdCBzY2VuZS5cbiAgICAgICAgICAgICAgICBpZiAoc2NlbmVJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmVJbmZvLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGxpYi5ub2Rlc1tzY2VuZUluZm8ubm9kZXNbaV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlLmFkZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNlbGYuaW5jbHVkZU1lc2gpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZVNraW5zKGpzb24sIGxpYik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmluY2x1ZGVBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZUFuaW1hdGlvbnMoanNvbiwgbGliKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbW1lZGlhdGVseSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBnZXRSZXN1bHQoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBnZXRSZXN1bHQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEJpbmFyeSBmaWxlIHBhdGggcmVzb2x2ZXIuIFVzZXIgY2FuIG92ZXJyaWRlIGl0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKi9cbiAgICByZXNvbHZlQmluYXJ5UGF0aDogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgaWYgKHBhdGggJiYgcGF0aC5tYXRjaCgvXmRhdGE6KC4qPyliYXNlNjQsLykpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvb3RQYXRoID0gdGhpcy5idWZmZXJSb290UGF0aDtcbiAgICAgICAgaWYgKHJvb3RQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3RQYXRoID0gdGhpcy5yb290UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5yZWxhdGl2ZTJhYnNvbHV0ZShwYXRoLCByb290UGF0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRleHR1cmUgZmlsZSBwYXRoIHJlc29sdmVyLiBVc2VyIGNhbiBvdmVycmlkZSBpdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICovXG4gICAgcmVzb2x2ZVRleHR1cmVQYXRoOiBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICBpZiAocGF0aCAmJiBwYXRoLm1hdGNoKC9eZGF0YTooLio/KWJhc2U2NCwvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcm9vdFBhdGggPSB0aGlzLnRleHR1cmVSb290UGF0aDtcbiAgICAgICAgaWYgKHJvb3RQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3RQYXRoID0gdGhpcy5yb290UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5yZWxhdGl2ZTJhYnNvbHV0ZShwYXRoLCByb290UGF0aCk7XG4gICAgfSxcblxuICAgIF9nZXRTaGFkZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNoYWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRlckxpYnJhcnkuZ2V0KHRoaXMuc2hhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNoYWRlciBpbnN0YW5jZW9mIFNoYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZGVyO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9sb2FkQnVmZmVyOiBmdW5jdGlvbiAocGF0aCwgb25zdWNjZXNzLCBvbmVycm9yKSB7XG4gICAgICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgICAgICAgIHVybDogdGhpcy5yZXNvbHZlQmluYXJ5UGF0aChwYXRoKSxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIG9uc3VjY2VzcyAmJiBvbnN1Y2Nlc3MoYnVmZmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgb25lcnJvciAmJiBvbmVycm9yKGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvaXNzdWVzLzEwMFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9pc3N1ZXMvMTkzXG4gICAgX3BhcnNlU2tpbnM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcblxuICAgICAgICAvLyBDcmVhdGUgc2tlbGV0b25zIGFuZCBqb2ludHNcbiAgICAgICAgdmFyIGhhdmVJbnZCaW5kTWF0cmljZXMgPSBmYWxzZTtcbiAgICAgICAgdXRpbC5lYWNoKGpzb24uc2tpbnMsIGZ1bmN0aW9uIChza2luSW5mbywgaWR4KSB7XG4gICAgICAgICAgICB2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oe1xuICAgICAgICAgICAgICAgIG5hbWU6IHNraW5JbmZvLm5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBza2luSW5mby5qb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZUlkeCA9IHNraW5JbmZvLmpvaW50c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGxpYi5ub2Rlc1tub2RlSWR4XTtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSBuZXcgSm9pbnQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBza2VsZXRvbi5qb2ludHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2tlbGV0b24uam9pbnRzLnB1c2goam9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2tlbGV0b24ucmVsYXRpdmVSb290Tm9kZSA9IGxpYi5ub2Rlc1tza2luSW5mby5za2VsZXRvbl0gfHwgdGhpcy5yb290Tm9kZTtcbiAgICAgICAgICAgIGlmIChza2luSW5mby5pbnZlcnNlQmluZE1hdHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgaGF2ZUludkJpbmRNYXRyaWNlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIElCTUluZm8gPSBqc29uLmFjY2Vzc29yc1tza2luSW5mby5pbnZlcnNlQmluZE1hdHJpY2VzXTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gbGliLmJ1ZmZlclZpZXdzW0lCTUluZm8uYnVmZmVyVmlld107XG5cbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gSUJNSW5mby5ieXRlT2Zmc2V0IHx8IDA7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSBJQk1JbmZvLmNvdW50ICogMTY7XG5cbiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheShidWZmZXIsIG9mZnNldCwgc2l6ZSk7XG5cbiAgICAgICAgICAgICAgICBza2VsZXRvbi5zZXRKb2ludE1hdHJpY2VzQXJyYXkoYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2tlbGV0b24udXBkYXRlSm9pbnRNYXRyaWNlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGliLnNrZWxldG9uc1tpZHhdID0gc2tlbGV0b247XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVuYWJsZVNraW5uaW5nRm9yTWVzaChtZXNoLCBza2VsZXRvbiwgam9pbnRJbmRpY2VzKSB7XG4gICAgICAgICAgICBtZXNoLnNrZWxldG9uID0gc2tlbGV0b247XG4gICAgICAgICAgICBtZXNoLmpvaW50cyA9IGpvaW50SW5kaWNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldEpvaW50SW5kZXgoam9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBqb2ludC5pbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHV0aWwuZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbiAobm9kZUluZm8sIG5vZGVJZHgpIHtcbiAgICAgICAgICAgIGlmIChub2RlSW5mby5za2luICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2tpbklkeCA9IG5vZGVJbmZvLnNraW47XG4gICAgICAgICAgICAgICAgdmFyIHNrZWxldG9uID0gbGliLnNrZWxldG9uc1tza2luSWR4XTtcblxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gbGliLm5vZGVzW25vZGVJZHhdO1xuICAgICAgICAgICAgICAgIHZhciBqb2ludEluZGljZXMgPSBza2VsZXRvbi5qb2ludHMubWFwKGdldEpvaW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTWVzaCkge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVTa2lubmluZ0Zvck1lc2gobm9kZSwgc2tlbGV0b24sIGpvaW50SW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNZXNoIGhhdmUgbXVsdGlwbGUgcHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVNraW5uaW5nRm9yTWVzaChjaGlsZHJlbltpXSwgc2tlbGV0b24sIGpvaW50SW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKGpzb24sIGxpYikge1xuICAgICAgICB1dGlsLmVhY2goanNvbi50ZXh0dXJlcywgZnVuY3Rpb24gKHRleHR1cmVJbmZvLCBpZHgpe1xuICAgICAgICAgICAgLy8gc2FtcGxlcnMgaXMgb3B0aW9uYWxcbiAgICAgICAgICAgIHZhciBzYW1wbGVySW5mbyA9IChqc29uLnNhbXBsZXJzICYmIGpzb24uc2FtcGxlcnNbdGV4dHVyZUluZm8uc2FtcGxlcl0pIHx8IHt9O1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB7fTtcbiAgICAgICAgICAgIFsnd3JhcFMnLCAnd3JhcFQnLCAnbWFnRmlsdGVyJywgJ21pbkZpbHRlciddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzYW1wbGVySW5mb1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1dGlsLmRlZmF1bHRzKHBhcmFtZXRlcnMsIHtcbiAgICAgICAgICAgICAgICB3cmFwUzogVGV4dHVyZS5SRVBFQVQsXG4gICAgICAgICAgICAgICAgd3JhcFQ6IFRleHR1cmUuUkVQRUFULFxuICAgICAgICAgICAgICAgIGZsaXBZOiB0aGlzLnRleHR1cmVGbGlwWVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0ZXh0dXJlSW5mby50YXJnZXQgfHwgZ2xlbnVtLlRFWFRVUkVfMkQ7XG4gICAgICAgICAgICB2YXIgZm9ybWF0ID0gdGV4dHVyZUluZm8uZm9ybWF0O1xuICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGdsZW51bS5URVhUVVJFXzJEKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIHZhciBpbWFnZUluZm8gPSBqc29uLmltYWdlc1t0ZXh0dXJlSW5mby5zb3VyY2VdO1xuICAgICAgICAgICAgICAgIHZhciB1cmk7XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlSW5mby51cmkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpID0gdGhpcy5yZXNvbHZlVGV4dHVyZVBhdGgoaW1hZ2VJbmZvLnVyaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGltYWdlSW5mby5idWZmZXJWaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJpID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbbGliLmJ1ZmZlclZpZXdzW2ltYWdlSW5mby5idWZmZXJWaWV3XV0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGltYWdlSW5mby5taW1lVHlwZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1cmkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5sb2FkKHVyaSwgdGhpcy5jcm9zc09yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGxpYi50ZXh0dXJlc1tpZHhdID0gdGV4dHVyZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfS0hSQ29tbW9uTWF0ZXJpYWxUb1N0YW5kYXJkOiBmdW5jdGlvbiAobWF0ZXJpYWxJbmZvLCBsaWIpIHtcbiAgICAgICAgdmFyIHVuaWZvcm1zID0ge307XG4gICAgICAgIHZhciBjb21tb25NYXRlcmlhbEluZm8gPSBtYXRlcmlhbEluZm8uZXh0ZW5zaW9uc1snS0hSX21hdGVyaWFsc19jb21tb24nXTtcbiAgICAgICAgdW5pZm9ybXMgPSBjb21tb25NYXRlcmlhbEluZm8udmFsdWVzIHx8IHt9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybXMuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHVuaWZvcm1zLmRpZmZ1c2UgPSBsaWIudGV4dHVyZXNbdW5pZm9ybXMuZGlmZnVzZV0gfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1zLmVtaXNzaW9uID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdW5pZm9ybXMuZW1pc3Npb24gPSBsaWIudGV4dHVyZXNbdW5pZm9ybXMuZW1pc3Npb25dIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5hYmxlZFRleHR1cmVzID0gW107XG4gICAgICAgIGlmICh1bmlmb3Jtc1snZGlmZnVzZSddIGluc3RhbmNlb2YgVGV4dHVyZTJEKSB7XG4gICAgICAgICAgICBlbmFibGVkVGV4dHVyZXMucHVzaCgnZGlmZnVzZU1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8ubm9ybWFsVGV4dHVyZSkge1xuICAgICAgICAgICAgZW5hYmxlZFRleHR1cmVzLnB1c2goJ25vcm1hbE1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlmb3Jtc1snZW1pc3Npb24nXSBpbnN0YW5jZW9mIFRleHR1cmUyRCkge1xuICAgICAgICAgICAgZW5hYmxlZFRleHR1cmVzLnB1c2goJ2VtaXNzaXZlTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hdGVyaWFsO1xuICAgICAgICB2YXIgaXNTdGFuZGFyZE1hdGVyaWFsID0gdGhpcy51c2VTdGFuZGFyZE1hdGVyaWFsO1xuICAgICAgICBpZiAoaXNTdGFuZGFyZE1hdGVyaWFsKSB7XG4gICAgICAgICAgICBtYXRlcmlhbCA9IG5ldyBTdGFuZGFyZE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICBkb3VibGVTaWRlZDogbWF0ZXJpYWxJbmZvLmRvdWJsZVNpZGVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICBzaGFkZXI6IHRoaXMuX2dldFNoYWRlcigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfUk9VR0hORVNTJyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9NRVRBTE5FU1MnKTtcblxuICAgICAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5kb3VibGVTaWRlZCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pZm9ybXMudHJhbnNwYXJlbnQpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICAgICAgbWF0ZXJpYWwuZGVwdGhUZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmdXNlUHJvcCA9IHVuaWZvcm1zWydkaWZmdXNlJ107XG4gICAgICAgIGlmIChkaWZmdXNlUHJvcCkge1xuICAgICAgICAgICAgLy8gQ29sb3JcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpZmZ1c2VQcm9wKSkge1xuICAgICAgICAgICAgICAgIGRpZmZ1c2VQcm9wID0gZGlmZnVzZVByb3Auc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICAgICAgaXNTdGFuZGFyZE1hdGVyaWFsID8gKG1hdGVyaWFsLmNvbG9yID0gZGlmZnVzZVByb3ApXG4gICAgICAgICAgICAgICAgICAgIDogbWF0ZXJpYWwuc2V0KCdjb2xvcicsIGRpZmZ1c2VQcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBUZXh0dXJlXG4gICAgICAgICAgICAgICAgaXNTdGFuZGFyZE1hdGVyaWFsID8gKG1hdGVyaWFsLmRpZmZ1c2VNYXAgPSBkaWZmdXNlUHJvcClcbiAgICAgICAgICAgICAgICAgICAgOiBtYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlUHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtaXNzaW9uUHJvcCA9IHVuaWZvcm1zWydlbWlzc2lvbiddO1xuICAgICAgICBpZiAoZW1pc3Npb25Qcm9wICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENvbG9yXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbWlzc2lvblByb3ApKSB7XG4gICAgICAgICAgICAgICAgZW1pc3Npb25Qcm9wID0gZW1pc3Npb25Qcm9wLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgICAgIGlzU3RhbmRhcmRNYXRlcmlhbCA/IChtYXRlcmlhbC5lbWlzc2lvbiA9IGVtaXNzaW9uUHJvcClcbiAgICAgICAgICAgICAgICAgICAgOiBtYXRlcmlhbC5zZXQoJ2VtaXNzaW9uJywgZW1pc3Npb25Qcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBUZXh0dXJlXG4gICAgICAgICAgICAgICAgaXNTdGFuZGFyZE1hdGVyaWFsID8gKG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZW1pc3Npb25Qcm9wKVxuICAgICAgICAgICAgICAgICAgICA6IG1hdGVyaWFsLnNldCgnZW1pc3NpdmVNYXAnLCBlbWlzc2lvblByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8ubm9ybWFsVGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHRleENvb3JkXG4gICAgICAgICAgICB2YXIgbm9ybWFsVGV4dHVyZUluZGV4ID0gbWF0ZXJpYWxJbmZvLm5vcm1hbFRleHR1cmUuaW5kZXg7XG4gICAgICAgICAgICBpZiAoaXNTdGFuZGFyZE1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwubm9ybWFsTWFwID0gbGliLnRleHR1cmVzW25vcm1hbFRleHR1cmVJbmRleF0gfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnbm9ybWFsTWFwJywgbGliLnRleHR1cmVzW25vcm1hbFRleHR1cmVJbmRleF0gfHwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaWZvcm1zWydzaGluaW5lc3MnXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZ2xvc3NpbmVzcyA9IE1hdGgubG9nKHVuaWZvcm1zWydzaGluaW5lc3MnXSkgLyBNYXRoLmxvZyg4MTkyKTtcbiAgICAgICAgICAgIC8vIFVuaWZvcm0gZ2xvc3NpbmVzc1xuICAgICAgICAgICAgbWF0ZXJpYWwuc2V0KCdnbG9zc2luZXNzJywgZ2xvc3NpbmVzcyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5zZXQoJ3JvdWdobmVzcycsIDEgLSBnbG9zc2luZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnZ2xvc3NpbmVzcycsIDAuMyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5zZXQoJ3JvdWdobmVzcycsIDAuMyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaWZvcm1zWydzcGVjdWxhciddICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnc3BlY3VsYXJDb2xvcicsIHVuaWZvcm1zWydzcGVjdWxhciddLnNsaWNlKDAsIDMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pZm9ybXNbJ3RyYW5zcGFyZW5jeSddICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnYWxwaGEnLCB1bmlmb3Jtc1sndHJhbnNwYXJlbmN5J10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGVyaWFsO1xuICAgIH0sXG5cbiAgICBfcGJyTWV0YWxsaWNSb3VnaG5lc3NUb1N0YW5kYXJkOiBmdW5jdGlvbiAobWF0ZXJpYWxJbmZvLCBtZXRhbGxpY1JvdWdobmVzc01hdEluZm8sIGxpYikge1xuICAgICAgICB2YXIgYWxwaGFUZXN0ID0gbWF0ZXJpYWxJbmZvLmFscGhhTW9kZSA9PT0gJ01BU0snO1xuXG4gICAgICAgIHZhciBpc1N0YW5kYXJkTWF0ZXJpYWwgPSB0aGlzLnVzZVN0YW5kYXJkTWF0ZXJpYWw7XG4gICAgICAgIHZhciBtYXRlcmlhbDtcbiAgICAgICAgdmFyIGRpZmZ1c2VNYXAsIHJvdWdobmVzc01hcCwgbWV0YWxuZXNzTWFwLCBub3JtYWxNYXAsIGVtaXNzaXZlTWFwO1xuICAgICAgICB2YXIgZW5hYmxlZFRleHR1cmVzID0gW107XG4gICAgICAgICAgICAvLyBUT0RPIHRleENvb3JkXG4gICAgICAgIGlmIChtZXRhbGxpY1JvdWdobmVzc01hdEluZm8uYmFzZUNvbG9yVGV4dHVyZSkge1xuICAgICAgICAgICAgZGlmZnVzZU1hcCA9IGxpYi50ZXh0dXJlc1ttZXRhbGxpY1JvdWdobmVzc01hdEluZm8uYmFzZUNvbG9yVGV4dHVyZS5pbmRleF0gfHwgbnVsbDtcbiAgICAgICAgICAgIGRpZmZ1c2VNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ2RpZmZ1c2VNYXAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWxsaWNSb3VnaG5lc3NNYXRJbmZvLm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZSkge1xuICAgICAgICAgICAgcm91Z2huZXNzTWFwID0gbWV0YWxuZXNzTWFwID0gbGliLnRleHR1cmVzW21ldGFsbGljUm91Z2huZXNzTWF0SW5mby5tZXRhbGxpY1JvdWdobmVzc1RleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICByb3VnaG5lc3NNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ21ldGFsbmVzc01hcCcsICdyb3VnaG5lc3NNYXAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0ZXJpYWxJbmZvLm5vcm1hbFRleHR1cmUpIHtcbiAgICAgICAgICAgIG5vcm1hbE1hcCA9IGxpYi50ZXh0dXJlc1ttYXRlcmlhbEluZm8ubm9ybWFsVGV4dHVyZS5pbmRleF0gfHwgbnVsbDtcbiAgICAgICAgICAgIG5vcm1hbE1hcCAmJiBlbmFibGVkVGV4dHVyZXMucHVzaCgnbm9ybWFsTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5lbWlzc2l2ZVRleHR1cmUpIHtcbiAgICAgICAgICAgIGVtaXNzaXZlTWFwID0gbGliLnRleHR1cmVzW21hdGVyaWFsSW5mby5lbWlzc2l2ZVRleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICBlbWlzc2l2ZU1hcCAmJiBlbmFibGVkVGV4dHVyZXMucHVzaCgnZW1pc3NpdmVNYXAnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFzZUNvbG9yID0gbWV0YWxsaWNSb3VnaG5lc3NNYXRJbmZvLmJhc2VDb2xvckZhY3RvciB8fCBbMSwgMSwgMSwgMV07XG5cbiAgICAgICAgdmFyIGNvbW1vblByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBkaWZmdXNlTWFwOiBkaWZmdXNlTWFwIHx8IG51bGwsXG4gICAgICAgICAgICByb3VnaG5lc3NNYXA6IHJvdWdobmVzc01hcCB8fCBudWxsLFxuICAgICAgICAgICAgbWV0YWxuZXNzTWFwOiBtZXRhbG5lc3NNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIG5vcm1hbE1hcDogbm9ybWFsTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBlbWlzc2l2ZU1hcDogZW1pc3NpdmVNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIGNvbG9yOiBiYXNlQ29sb3Iuc2xpY2UoMCwgMyksXG4gICAgICAgICAgICBhbHBoYTogYmFzZUNvbG9yWzNdLFxuICAgICAgICAgICAgbWV0YWxuZXNzOiBtZXRhbGxpY1JvdWdobmVzc01hdEluZm8ubWV0YWxsaWNGYWN0b3IgfHwgMCxcbiAgICAgICAgICAgIHJvdWdobmVzczogbWV0YWxsaWNSb3VnaG5lc3NNYXRJbmZvLnJvdWdobmVzc0ZhY3RvciB8fCAwLFxuICAgICAgICAgICAgZW1pc3Npb246IG1hdGVyaWFsSW5mby5lbWlzc2l2ZUZhY3RvciB8fCBbMCwgMCwgMF0sXG4gICAgICAgICAgICBhbHBoYUN1dG9mZjogbWF0ZXJpYWxJbmZvLmFscGhhQ3V0b2ZmIHx8IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbW1vblByb3BlcnRpZXMucm91Z2huZXNzTWFwKSB7XG4gICAgICAgICAgICAvLyBJbiBnbFRGIG1ldGFsbGljRmFjdG9yIHdpbGwgZG8gbXVsdGlwbHksIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFN0YW5kYXJkTWF0ZXJpYWwuXG4gICAgICAgICAgICAvLyBTbyBzaW1wbHkgaWdub3JlIGl0XG4gICAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLm1ldGFsbmVzcyA9IDAuNTtcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMucm91Z2huZXNzID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0YW5kYXJkTWF0ZXJpYWwpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IFN0YW5kYXJkTWF0ZXJpYWwodXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IG1hdGVyaWFsSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIGFscGhhVGVzdDogYWxwaGFUZXN0LFxuICAgICAgICAgICAgICAgIGRvdWJsZVNpZGVkOiBtYXRlcmlhbEluZm8uZG91YmxlU2lkZWQsXG4gICAgICAgICAgICAgICAgLy8gRyBjaGFubmVsXG4gICAgICAgICAgICAgICAgcm91Z2huZXNzQ2hhbm5lbDogMSxcbiAgICAgICAgICAgICAgICAvLyBCIENoYW5uZWxcbiAgICAgICAgICAgICAgICBtZXRhbG5lc3NDaGFubmVsOiAyXG4gICAgICAgICAgICB9LCBjb21tb25Qcm9wZXJ0aWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXRlcmlhbEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICBzaGFkZXI6IHRoaXMuX2dldFNoYWRlcigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfUk9VR0hORVNTJyk7XG4gICAgICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9NRVRBTE5FU1MnKTtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUk9VR0hORVNTX0NIQU5ORUwnLCAxKTtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnTUVUQUxORVNTX0NIQU5ORUwnLCAyKTtcblxuICAgICAgICAgICAgaWYgKGFscGhhVGVzdCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnQUxQSEFfVEVTVCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5kb3VibGVTaWRlZCkge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hdGVyaWFsLnNldChjb21tb25Qcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8uYWxwaGFNb2RlID09PSAnQkxFTkQnKSB7XG4gICAgICAgICAgICBtYXRlcmlhbC5kZXB0aE1hc2sgPSBmYWxzZTtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoVGVzdCA9IHRydWU7XG4gICAgICAgICAgICBtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfSxcblxuICAgIF9wYnJTcGVjdWxhckdsb3NzaW5lc3NUb1N0YW5kYXJkOiBmdW5jdGlvbiAobWF0ZXJpYWxJbmZvLCBzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLCBsaWIpIHtcbiAgICAgICAgdmFyIGFscGhhVGVzdCA9IG1hdGVyaWFsSW5mby5hbHBoYU1vZGUgPT09ICdNQVNLJztcblxuICAgICAgICBpZiAodGhpcy51c2VTdGFuZGFyZE1hdGVyaWFsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTdGFuZGFyZE1hdGVyaWFsIGRvZXNuXFwndCBzdXBwb3J0IHNwZWN1bGFyIGdsb3NzaW5lc3Mgd29ya2Zsb3cgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWF0ZXJpYWw7XG4gICAgICAgIHZhciBkaWZmdXNlTWFwLCBnbG9zc2luZXNzTWFwLCBzcGVjdWxhck1hcCwgbm9ybWFsTWFwLCBlbWlzc2l2ZU1hcDtcbiAgICAgICAgdmFyIGVuYWJsZWRUZXh0dXJlcyA9IFtdO1xuICAgICAgICAgICAgLy8gVE9ETyB0ZXhDb29yZFxuICAgICAgICBpZiAoc3BlY3VsYXJHbG9zc2luZXNzTWF0SW5mby5kaWZmdXNlVGV4dHVyZSkge1xuICAgICAgICAgICAgZGlmZnVzZU1hcCA9IGxpYi50ZXh0dXJlc1tzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLmRpZmZ1c2VUZXh0dXJlLmluZGV4XSB8fCBudWxsO1xuICAgICAgICAgICAgZGlmZnVzZU1hcCAmJiBlbmFibGVkVGV4dHVyZXMucHVzaCgnZGlmZnVzZU1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLnNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUpIHtcbiAgICAgICAgICAgIGdsb3NzaW5lc3NNYXAgPSBzcGVjdWxhck1hcCA9IGxpYi50ZXh0dXJlc1tzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLnNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICBnbG9zc2luZXNzTWFwICYmIGVuYWJsZWRUZXh0dXJlcy5wdXNoKCdzcGVjdWxhck1hcCcsICdnbG9zc2luZXNzTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5ub3JtYWxUZXh0dXJlKSB7XG4gICAgICAgICAgICBub3JtYWxNYXAgPSBsaWIudGV4dHVyZXNbbWF0ZXJpYWxJbmZvLm5vcm1hbFRleHR1cmUuaW5kZXhdIHx8IG51bGw7XG4gICAgICAgICAgICBub3JtYWxNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ25vcm1hbE1hcCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8uZW1pc3NpdmVUZXh0dXJlKSB7XG4gICAgICAgICAgICBlbWlzc2l2ZU1hcCA9IGxpYi50ZXh0dXJlc1ttYXRlcmlhbEluZm8uZW1pc3NpdmVUZXh0dXJlLmluZGV4XSB8fCBudWxsO1xuICAgICAgICAgICAgZW1pc3NpdmVNYXAgJiYgZW5hYmxlZFRleHR1cmVzLnB1c2goJ2VtaXNzaXZlTWFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpZmZ1c2VDb2xvciA9IHNwZWN1bGFyR2xvc3NpbmVzc01hdEluZm8uZGlmZnVzZUZhY3RvciB8fCBbMSwgMSwgMSwgMV07XG5cbiAgICAgICAgdmFyIGNvbW1vblByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBkaWZmdXNlTWFwOiBkaWZmdXNlTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBnbG9zc2luZXNzTWFwOiBnbG9zc2luZXNzTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBzcGVjdWxhck1hcDogc3BlY3VsYXJNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIG5vcm1hbE1hcDogbm9ybWFsTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBlbWlzc2l2ZU1hcDogZW1pc3NpdmVNYXAgfHwgbnVsbCxcbiAgICAgICAgICAgIGNvbG9yOiBkaWZmdXNlQ29sb3Iuc2xpY2UoMCwgMyksXG4gICAgICAgICAgICBhbHBoYTogZGlmZnVzZUNvbG9yWzNdLFxuICAgICAgICAgICAgc3BlY3VsYXJDb2xvcjogc3BlY3VsYXJHbG9zc2luZXNzTWF0SW5mby5zcGVjdWxhckZhY3RvciB8fCBbMSwgMSwgMV0sXG4gICAgICAgICAgICBnbG9zc2luZXNzOiBzcGVjdWxhckdsb3NzaW5lc3NNYXRJbmZvLmdsb3NzaW5lc3NGYWN0b3IgfHwgMCxcbiAgICAgICAgICAgIGVtaXNzaW9uOiBtYXRlcmlhbEluZm8uZW1pc3NpdmVGYWN0b3IgfHwgWzAsIDAsIDBdLFxuICAgICAgICAgICAgYWxwaGFDdXRvZmY6IG1hdGVyaWFsSW5mby5hbHBoYUN1dG9mZiA9PSBudWxsID8gMC45IDogbWF0ZXJpYWxJbmZvLmFscGhhQ3V0b2ZmXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb21tb25Qcm9wZXJ0aWVzLmdsb3NzaW5lc3NNYXApIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBzcGVjdWxhckZhY3RvclxuICAgICAgICAgICAgY29tbW9uUHJvcGVydGllcy5nbG9zc2luZXNzID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb25Qcm9wZXJ0aWVzLnNwZWN1bGFyTWFwKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgc3BlY3VsYXJGYWN0b3JcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuc3BlY3VsYXJDb2xvciA9IFsxLCAxLCAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgIG5hbWU6IG1hdGVyaWFsSW5mby5uYW1lLFxuICAgICAgICAgICAgc2hhZGVyOiB0aGlzLl9nZXRTaGFkZXIoKVxuICAgICAgICB9KTtcblxuICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ0dMT1NTSU5FU1NfQ0hBTk5FTCcsIDMpO1xuXG4gICAgICAgIGlmIChhbHBoYVRlc3QpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnQUxQSEFfVEVTVCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRlcmlhbEluZm8uZG91YmxlU2lkZWQpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRlcmlhbC5zZXQoY29tbW9uUHJvcGVydGllcyk7XG5cbiAgICAgICAgaWYgKG1hdGVyaWFsSW5mby5hbHBoYU1vZGUgPT09ICdCTEVORCcpIHtcbiAgICAgICAgICAgIG1hdGVyaWFsLmRlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICAgICAgbWF0ZXJpYWwuZGVwdGhUZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRlcmlhbDtcbiAgICB9LFxuXG4gICAgX3BhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoanNvbiwgbGliKSB7XG4gICAgICAgIHV0aWwuZWFjaChqc29uLm1hdGVyaWFscywgZnVuY3Rpb24gKG1hdGVyaWFsSW5mbywgaWR4KSB7XG4gICAgICAgICAgICBpZiAobWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnNbJ0tIUl9tYXRlcmlhbHNfY29tbW9uJ10pIHtcbiAgICAgICAgICAgICAgICBsaWIubWF0ZXJpYWxzW2lkeF0gPSB0aGlzLl9LSFJDb21tb25NYXRlcmlhbFRvU3RhbmRhcmQobWF0ZXJpYWxJbmZvLCBsaWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnNbJ0tIUl9tYXRlcmlhbHNfcGJyU3BlY3VsYXJHbG9zc2luZXNzJ10pIHtcbiAgICAgICAgICAgICAgICBsaWIubWF0ZXJpYWxzW2lkeF0gPSB0aGlzLl9wYnJTcGVjdWxhckdsb3NzaW5lc3NUb1N0YW5kYXJkKG1hdGVyaWFsSW5mbywgbWF0ZXJpYWxJbmZvLmV4dGVuc2lvbnNbJ0tIUl9tYXRlcmlhbHNfcGJyU3BlY3VsYXJHbG9zc2luZXNzJ10sIGxpYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaWIubWF0ZXJpYWxzW2lkeF0gPSB0aGlzLl9wYnJNZXRhbGxpY1JvdWdobmVzc1RvU3RhbmRhcmQobWF0ZXJpYWxJbmZvLCBtYXRlcmlhbEluZm8ucGJyTWV0YWxsaWNSb3VnaG5lc3MgfHwge30sIGxpYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICBfcGFyc2VNZXNoZXM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHV0aWwuZWFjaChqc29uLm1lc2hlcywgZnVuY3Rpb24gKG1lc2hJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgIGxpYi5tZXNoZXNbaWR4XSA9IFtdO1xuICAgICAgICAgICAgLy8gR2VvbWV0cnlcbiAgICAgICAgICAgIGZvciAodmFyIHBwID0gMDsgcHAgPCBtZXNoSW5mby5wcmltaXRpdmVzLmxlbmd0aDsgcHArKykge1xuICAgICAgICAgICAgICAgIHZhciBwcmltaXRpdmVJbmZvID0gbWVzaEluZm8ucHJpbWl0aXZlc1twcF07XG4gICAgICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIFBFTkRJR05cbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbWVzaEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdCb3g6IG5ldyBCb3VuZGluZ0JveCgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpY3MgPSBPYmplY3Qua2V5cyhwcmltaXRpdmVJbmZvLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHNzID0gMDsgc3MgPCBzZW1hbnRpY3MubGVuZ3RoOyBzcysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpYyA9IHNlbWFudGljc1tzc107XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY2Nlc3NvcklkeCA9IHByaW1pdGl2ZUluZm8uYXR0cmlidXRlc1tzZW1hbnRpY107XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVJbmZvID0ganNvbi5hY2Nlc3NvcnNbYWNjZXNzb3JJZHhdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHNlbWFudGljQXR0cmlidXRlTWFwW3NlbWFudGljXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IFNJWkVfTUFQW2F0dHJpYnV0ZUluZm8udHlwZV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVBcnJheSA9IGdldEFjY2Vzc29yRGF0YShqc29uLCBsaWIsIGFjY2Vzc29ySWR4KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2ViR0wgYXR0cmlidXRlIGJ1ZmZlciBub3Qgc3VwcG9ydCB1aW50MzIuXG4gICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCB1c2UgRmxvYXQzMkFycmF5IG1heSBhbHNvIGhhdmUgaXNzdWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5VaW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGF0dHJpYnV0ZUFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMgPT09ICdXRUlHSFRTXzAnICYmIHNpemUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlaWdodCBkYXRhIGluIFFURUsgaGFzIG9ubHkgMyBjb21wb25lbnQsIHRoZSBsYXN0IGNvbXBvbmVudCBjYW4gYmUgZXZhbHVhdGVkIHNpbmNlIGl0IGlzIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ZWlnaHRBcnJheSA9IG5ldyBhdHRyaWJ1dGVBcnJheS5jb25zdHJ1Y3RvcihhdHRyaWJ1dGVJbmZvLmNvdW50ICogMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZUluZm8uY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpNCA9IGkgKiA0LCBpMyA9IGkgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3MSA9IGF0dHJpYnV0ZUFycmF5W2k0XSwgdzIgPSBhdHRyaWJ1dGVBcnJheVtpNCArIDFdLCB3MyA9IGF0dHJpYnV0ZUFycmF5W2k0ICsgMl0sIHc0ID0gYXR0cmlidXRlQXJyYXlbaTQgKyAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd1N1bSA9IHcxICsgdzIgKyB3MyArIHc0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodEFycmF5W2kzXSA9IHcxIC8gd1N1bTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRBcnJheVtpMyArIDFdID0gdzIgLyB3U3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodEFycmF5W2kzICsgMl0gPSB3MyAvIHdTdW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnZhbHVlID0gd2VpZ2h0QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnZhbHVlID0gYXR0cmlidXRlQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZVR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlQXJyYXkgaW5zdGFuY2VvZiB2ZW5kb3IuVWludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUgPSAndXNob3J0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5JbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVUeXBlID0gJ3Nob3J0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5VaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVUeXBlID0gJ3VieXRlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVBcnJheSBpbnN0YW5jZW9mIHZlbmRvci5JbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUgPSAnYnl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS50eXBlID0gYXR0cmlidXRlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VtYW50aWMgPT09ICdQT1NJVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIEJveFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IGF0dHJpYnV0ZUluZm8ubWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IGF0dHJpYnV0ZUluZm8ubWF4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi5zZXQobWluWzBdLCBtaW5bMV0sIG1pblsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnNldChtYXhbMF0sIG1heFsxXSwgbWF4WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGluZGljZXNcbiAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlSW5mby5pbmRpY2VzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IGdldEFjY2Vzc29yRGF0YShqc29uLCBsaWIsIHByaW1pdGl2ZUluZm8uaW5kaWNlcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW9tZXRyeS52ZXJ0ZXhDb3VudCA8PSAweGZmZmYgJiYgZ2VvbWV0cnkuaW5kaWNlcyBpbnN0YW5jZW9mIHZlbmRvci5VaW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyB2ZW5kb3IuVWludDE2QXJyYXkoZ2VvbWV0cnkuaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoZ2VvbWV0cnkuaW5kaWNlcyBpbnN0YW5jZW9mIHZlbmRvci5VaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzID0gbmV3IHZlbmRvci5VaW50MTZBcnJheShnZW9tZXRyeS5pbmRpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IGxpYi5tYXRlcmlhbHNbcHJpbWl0aXZlSW5mby5tYXRlcmlhbF07XG4gICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsSW5mbyA9IChqc29uLm1hdGVyaWFscyB8fCBbXSlbcHJpbWl0aXZlSW5mby5tYXRlcmlhbF07XG4gICAgICAgICAgICAgICAgLy8gVXNlIGRlZmF1bHQgbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcjogc2VsZi5fZ2V0U2hhZGVyKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBtZXNoID0gbmV3IE1lc2goe1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogW01lc2guUE9JTlRTLCBNZXNoLkxJTkVTLCBNZXNoLkxJTkVfTE9PUCwgTWVzaC5MSU5FX1NUUklQLCBNZXNoLlRSSUFOR0xFUywgTWVzaC5UUklBTkdMRV9TVFJJUCwgTWVzaC5UUklBTkdMRV9GQU5dW3ByaW1pdGl2ZUluZm8ubW9kZV0gfHwgTWVzaC5UUklBTkdMRVMsXG4gICAgICAgICAgICAgICAgICAgIGlnbm9yZUdCdWZmZXI6IG1hdGVyaWFsLnRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsSW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc2guY3VsbGluZyA9ICFtYXRlcmlhbEluZm8uZG91YmxlU2lkZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWVzaC5nZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBtZXNoLmdlb21ldHJ5LmdlbmVyYXRlVmVydGV4Tm9ybWFscygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKChtYXRlcmlhbCBpbnN0YW5jZW9mIFN0YW5kYXJkTWF0ZXJpYWwpICYmIG1hdGVyaWFsLm5vcm1hbE1hcClcbiAgICAgICAgICAgICAgICAgICAgfHwgKG1hdGVyaWFsLmlzVGV4dHVyZUVuYWJsZWQoJ25vcm1hbE1hcCcpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1lc2guZ2VvbWV0cnkuYXR0cmlidXRlcy50YW5nZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNoLmdlb21ldHJ5LmdlbmVyYXRlVGFuZ2VudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG1lc2gubmFtZSA9IEdMVEZMb2FkZXIuZ2VuZXJhdGVNZXNoTmFtZShqc29uLm1lc2hlcywgaWR4LCBwcCk7XG5cbiAgICAgICAgICAgICAgICBsaWIubWVzaGVzW2lkeF0ucHVzaChtZXNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfSxcblxuICAgIF9pbnN0YW5jZUNhbWVyYTogZnVuY3Rpb24gKGpzb24sIG5vZGVJbmZvKSB7XG4gICAgICAgIHZhciBjYW1lcmFJbmZvID0ganNvbi5jYW1lcmFzW25vZGVJbmZvLmNhbWVyYV07XG5cbiAgICAgICAgaWYgKGNhbWVyYUluZm8udHlwZSA9PT0gJ3BlcnNwZWN0aXZlJykge1xuICAgICAgICAgICAgdmFyIHBlcnNwZWN0aXZlSW5mbyA9IGNhbWVyYUluZm8ucGVyc3BlY3RpdmUgfHwge307XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIGFzcGVjdDogcGVyc3BlY3RpdmVJbmZvLmFzcGVjdFJhdGlvLFxuICAgICAgICAgICAgICAgIGZvdjogcGVyc3BlY3RpdmVJbmZvLnlmb3YsXG4gICAgICAgICAgICAgICAgZmFyOiBwZXJzcGVjdGl2ZUluZm8uemZhcixcbiAgICAgICAgICAgICAgICBuZWFyOiBwZXJzcGVjdGl2ZUluZm8uem5lYXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG9ydGhvZ3JhcGhpY0luZm8gPSBjYW1lcmFJbmZvLm9ydGhvZ3JhcGhpYyB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIHRvcDogb3J0aG9ncmFwaGljSW5mby55bWFnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBvcnRob2dyYXBoaWNJbmZvLnhtYWcsXG4gICAgICAgICAgICAgICAgbGVmdDogLW9ydGhvZ3JhcGhpY0luZm8ueG1hZyxcbiAgICAgICAgICAgICAgICBib3R0b206IC1vcnRob2dyYXBoaWNJbmZvLnltYWcsXG4gICAgICAgICAgICAgICAgbmVhcjogb3J0aG9ncmFwaGljSW5mby56bmVhcixcbiAgICAgICAgICAgICAgICBmYXI6IG9ydGhvZ3JhcGhpY0luZm8uemZhclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3BhcnNlTm9kZXM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbnN0YW5jZU1lc2gobWVzaCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtZXNoLm5hbWUsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IG1lc2guZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWw6IG1lc2gubWF0ZXJpYWwsXG4gICAgICAgICAgICAgICAgY3VsbGluZzogbWVzaC5jdWxsaW5nLFxuICAgICAgICAgICAgICAgIG1vZGU6IG1lc2gubW9kZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB1dGlsLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24gKG5vZGVJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBub2RlO1xuICAgICAgICAgICAgaWYgKG5vZGVJbmZvLmNhbWVyYSAhPSBudWxsICYmIHRoaXMuaW5jbHVkZUNhbWVyYSkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB0aGlzLl9pbnN0YW5jZUNhbWVyYShqc29uLCBub2RlSW5mbyk7XG4gICAgICAgICAgICAgICAgbGliLmNhbWVyYXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVJbmZvLm1lc2ggIT0gbnVsbCAmJiB0aGlzLmluY2x1ZGVNZXNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByaW1pdGl2ZXMgPSBsaWIubWVzaGVzW25vZGVJbmZvLm1lc2hdO1xuICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgbm9kZSB3aXRoIG1lc2ggZGlyZWN0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBpbnN0YW5jZU1lc2gocHJpbWl0aXZlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldE5hbWUobm9kZUluZm8ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0TmFtZShub2RlSW5mby5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJpbWl0aXZlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkKGluc3RhbmNlTWVzaChwcmltaXRpdmVzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTtcbiAgICAgICAgICAgICAgICAvLyBQRU5ESU5HIER1bHBsaWNhdGUgbmFtZS5cbiAgICAgICAgICAgICAgICBub2RlLnNldE5hbWUobm9kZUluZm8ubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZUluZm8ubWF0cml4KSB7XG4gICAgICAgICAgICAgICAgbm9kZS5sb2NhbFRyYW5zZm9ybS5zZXRBcnJheShub2RlSW5mby5tYXRyaXgpO1xuICAgICAgICAgICAgICAgIG5vZGUuZGVjb21wb3NlTG9jYWxUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5mby50cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnBvc2l0aW9uLnNldEFycmF5KG5vZGVJbmZvLnRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVJbmZvLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUucm90YXRpb24uc2V0QXJyYXkobm9kZUluZm8ucm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zY2FsZS5zZXRBcnJheShub2RlSW5mby5zY2FsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaWIubm9kZXNbaWR4XSA9IG5vZGU7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGhpZXJhcmNoeVxuICAgICAgICB1dGlsLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24gKG5vZGVJbmZvLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gbGliLm5vZGVzW2lkeF07XG4gICAgICAgICAgICBpZiAobm9kZUluZm8uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVJbmZvLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZElkeCA9IG5vZGVJbmZvLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBsaWIubm9kZXNbY2hpbGRJZHhdO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmFkZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgIF9wYXJzZUFuaW1hdGlvbnM6IGZ1bmN0aW9uIChqc29uLCBsaWIpIHtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2tDaGFubmVsUGF0aChjaGFubmVsSW5mbykge1xuICAgICAgICAgICAgaWYgKGNoYW5uZWxJbmZvLnBhdGggPT09ICd3ZWlnaHRzJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignR0xURkxvYWRlciBub3Qgc3VwcG9ydCBtb3JwaCB0YXJnZXRzIHlldC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldENoYW5uZWxIYXNoKGNoYW5uZWxJbmZvLCBhbmltYXRpb25JbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhbm5lbEluZm8udGFyZ2V0Lm5vZGUgKyAnXycgKyBhbmltYXRpb25JbmZvLnNhbXBsZXJzW2NoYW5uZWxJbmZvLnNhbXBsZXJdLmlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRpbWVBY2Nlc3Nvck11bHRpcGxpZWQgPSB7fTtcbiAgICAgICAgdXRpbC5lYWNoKGpzb24uYW5pbWF0aW9ucywgZnVuY3Rpb24gKGFuaW1hdGlvbkluZm8sIGlkeCkge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWxzID0gYW5pbWF0aW9uSW5mby5jaGFubmVscy5maWx0ZXIoY2hlY2tDaGFubmVsUGF0aCk7XG5cbiAgICAgICAgICAgIGlmICghY2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRyYWNrcyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGFubmVsSW5mbyA9IGNoYW5uZWxzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBjaGFubmVsSGFzaCA9IGdldENoYW5uZWxIYXNoKGNoYW5uZWxJbmZvLCBhbmltYXRpb25JbmZvKTtcblxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXROb2RlID0gbGliLm5vZGVzW2NoYW5uZWxJbmZvLnRhcmdldC5ub2RlXTtcbiAgICAgICAgICAgICAgICB2YXIgdHJhY2sgPSB0cmFja3NbY2hhbm5lbEhhc2hdO1xuICAgICAgICAgICAgICAgIHZhciBzYW1wbGVySW5mbyA9IGFuaW1hdGlvbkluZm8uc2FtcGxlcnNbY2hhbm5lbEluZm8uc2FtcGxlcl07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrID0gdHJhY2tzW2NoYW5uZWxIYXNoXSA9IG5ldyBTYW1wbGVyVHJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGFyZ2V0Tm9kZSA/IHRhcmdldE5vZGUubmFtZSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXROb2RlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cmFjay50YXJnZXROb2RlSW5kZXggPSBjaGFubmVsSW5mby50YXJnZXQubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2suY2hhbm5lbHMudGltZSA9IGdldEFjY2Vzc29yRGF0YShqc29uLCBsaWIsIHNhbXBsZXJJbmZvLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lTGVuID0gdHJhY2suY2hhbm5lbHMudGltZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGltZUFjY2Vzc29yTXVsdGlwbGllZFtzYW1wbGVySW5mby5pbnB1dF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZnJhbWVMZW47IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxzLnRpbWVba10gKj0gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVBY2Nlc3Nvck11bHRpcGxpZWRbc2FtcGxlckluZm8uaW5wdXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBpbnRlcnBvbGF0aW9uID0gc2FtcGxlckluZm8uaW50ZXJwb2xhdGlvbiB8fCAnTElORUFSJztcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbiAhPT0gJ0xJTkVBUicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdHTFRGTG9hZGVyIG9ubHkgc3VwcG9ydCBMSU5FQVIgaW50ZXJwb2xhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGNoYW5uZWxJbmZvLnRhcmdldC5wYXRoO1xuICAgICAgICAgICAgICAgIGlmIChwYXRoID09PSAndHJhbnNsYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSAncG9zaXRpb24nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxzW3BhdGhdID0gZ2V0QWNjZXNzb3JEYXRhKGpzb24sIGxpYiwgc2FtcGxlckluZm8ub3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbGlwID0gbmV3IFRyYWNrQ2xpcCh7XG4gICAgICAgICAgICAgICAgbmFtZTogYW5pbWF0aW9uSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIGxvb3A6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaGFzaCBpbiB0cmFja3MpIHtcbiAgICAgICAgICAgICAgICBjbGlwLmFkZFRyYWNrKHRyYWNrc1toYXNoXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGlwLmNhbGNMaWZlRnJvbVRyYWNrcygpO1xuICAgICAgICAgICAgbGliLmNsaXBzLnB1c2goY2xpcCk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG5cbiAgICAgICAgLy8gUEVORElOR1xuICAgICAgICB2YXIgbWF4TGlmZSA9IGxpYi5jbGlwcy5yZWR1Y2UoZnVuY3Rpb24gKG1heFRpbWUsIGNsaXApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChtYXhUaW1lLCBjbGlwLmxpZmUpO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgbGliLmNsaXBzLmZvckVhY2goZnVuY3Rpb24gKGNsaXApIHtcbiAgICAgICAgICAgIGNsaXAubGlmZSA9IG1heExpZmU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBsaWIuY2xpcHM7XG4gICAgfVxufSk7XG5cbkdMVEZMb2FkZXIuZ2VuZXJhdGVNZXNoTmFtZSA9IGZ1bmN0aW9uIChtZXNoZXMsIGlkeCwgcHJpbWl0aXZlSWR4KSB7XG4gICAgdmFyIG1lc2hJbmZvID0gbWVzaGVzW2lkeF07XG4gICAgdmFyIG1lc2hOYW1lID0gbWVzaEluZm8ubmFtZSB8fCAoJ21lc2hfJyArIGlkeCk7XG4gICAgcmV0dXJuIHByaW1pdGl2ZUlkeCA9PT0gMCA/IG1lc2hOYW1lIDogKG1lc2hOYW1lICsgJyQnICsgcHJpbWl0aXZlSWR4KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdMVEZMb2FkZXI7XG4iLCJpbXBvcnQgTGlnaHQgZnJvbSAnLi4vTGlnaHQnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5EaXJlY3Rpb25hbFxuICogQGV4dGVuZHMgY2xheS5MaWdodFxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgdmFyIGxpZ2h0ID0gbmV3IGNsYXkubGlnaHQuRGlyZWN0aW9uYWwoe1xuICogICAgICAgICBpbnRlbnNpdHk6IDAuNSxcbiAqICAgICAgICAgY29sb3I6IFsxLjAsIDAuMCwgMC4wXVxuICogICAgIH0pO1xuICogICAgIGxpZ2h0LnBvc2l0aW9uLnNldCgxMCwgMTAsIDEwKTtcbiAqICAgICBsaWdodC5sb29rQXQoY2xheS5tYXRoLlZlY3RvcjMuWkVSTyk7XG4gKiAgICAgc2NlbmUuYWRkKGxpZ2h0KTtcbiAqL1xudmFyIERpcmVjdGlvbmFsTGlnaHQgPSBMaWdodC5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkubGlnaHQuRGlyZWN0aW9uYWwjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBzaGFkb3dCaWFzOiAwLjAwMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNoYWRvd1Nsb3BlU2NhbGU6IDIuMCxcbiAgICAvKipcbiAgICAgKiBTaGFkb3cgY2FzY2FkZS5cbiAgICAgKiBVc2UgUFNTTSB0ZWNobmlxdWUgd2hlbiBpdCBpcyBsYXJnZXIgdGhhbiAxIGFuZCBoYXZlIGEgdW5pcXVlIGRpcmVjdGlvbmFsIGxpZ2h0IGluIHNjZW5lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2hhZG93Q2FzY2FkZTogMSxcblxuICAgIC8qKlxuICAgICAqIEF2YWlsYWJsZSB3aGVuIHNoYWRvd0Nhc2NhZGUgaXMgbGFyZ2VyIHRoYW4gMSBhbmQgaGF2ZSBhIHVuaXF1ZSBkaXJlY3Rpb25hbCBsaWdodCBpbiBzY2VuZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNhc2NhZGVTcGxpdExvZ0ZhY3RvcjogMC4yXG59LCB7XG5cbiAgICB0eXBlOiAnRElSRUNUSU9OQUxfTElHSFQnLFxuXG4gICAgdW5pZm9ybVRlbXBsYXRlczoge1xuICAgICAgICBkaXJlY3Rpb25hbExpZ2h0RGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLl9fZGlyID0gaW5zdGFuY2UuX19kaXIgfHwgbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Rpb24gaXMgdGFyZ2V0IHRvIGV5ZVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fX2Rpci5jb3B5KGluc3RhbmNlLndvcmxkVHJhbnNmb3JtLnopLm5vcm1hbGl6ZSgpLm5lZ2F0ZSgpLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkaXJlY3Rpb25hbExpZ2h0Q29sb3I6IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gaW5zdGFuY2UuY29sb3I7XG4gICAgICAgICAgICAgICAgdmFyIGludGVuc2l0eSA9IGluc3RhbmNlLmludGVuc2l0eTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2NvbG9yWzBdICogaW50ZW5zaXR5LCBjb2xvclsxXSAqIGludGVuc2l0eSwgY29sb3JbMl0gKiBpbnRlbnNpdHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmxpZ2h0LkRpcmVjdGlvbmFsfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmxpZ2h0LkRpcmVjdGlvbmFsLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaWdodCA9IExpZ2h0LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO1xuICAgICAgICBsaWdodC5zaGFkb3dCaWFzID0gdGhpcy5zaGFkb3dCaWFzO1xuICAgICAgICBsaWdodC5zaGFkb3dTbG9wZVNjYWxlID0gdGhpcy5zaGFkb3dTbG9wZVNjYWxlO1xuICAgICAgICByZXR1cm4gbGlnaHQ7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IERpcmVjdGlvbmFsTGlnaHQ7XG4iLCJpbXBvcnQgTGlnaHQgZnJvbSAnLi4vTGlnaHQnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LmxpZ2h0LlBvaW50XG4gKiBAZXh0ZW5kcyBjbGF5LkxpZ2h0XG4gKi9cbnZhciBQb2ludExpZ2h0ID0gTGlnaHQuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LmxpZ2h0LlBvaW50IyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFuZ2U6IDEwMCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgY2FzdFNoYWRvdzogZmFsc2Vcbn0sIHtcblxuICAgIHR5cGU6ICdQT0lOVF9MSUdIVCcsXG5cbiAgICB1bmlmb3JtVGVtcGxhdGVzOiB7XG4gICAgICAgIHBvaW50TGlnaHRQb3NpdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHBvaW50TGlnaHRSYW5nZToge1xuICAgICAgICAgICAgdHlwZTogJzFmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnRMaWdodENvbG9yOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gaW5zdGFuY2UuY29sb3IsXG4gICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGluc3RhbmNlLmludGVuc2l0eTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWyBjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5IF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkubGlnaHQuUG9pbnR9XG4gICAgICogQG1lbWJlck9mIGNsYXkubGlnaHQuUG9pbnQucHJvdG90eXBlXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbGlnaHQgPSBMaWdodC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtcbiAgICAgICAgbGlnaHQucmFuZ2UgPSB0aGlzLnJhbmdlO1xuICAgICAgICByZXR1cm4gbGlnaHQ7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50TGlnaHQ7XG4iLCJpbXBvcnQgTGlnaHQgZnJvbSAnLi4vTGlnaHQnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5TcG90XG4gKiBAZXh0ZW5kcyBjbGF5LkxpZ2h0XG4gKi9cbnZhciBTcG90TGlnaHQgPSBMaWdodC5leHRlbmQoXG4vKipAbGVuZHMgY2xheS5saWdodC5TcG90ICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICByYW5nZTogMjAsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB1bWJyYUFuZ2xlOiAzMCxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHBlbnVtYnJhQW5nbGU6IDQ1LFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZmFsbG9mZkZhY3RvcjogMi4wLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2hhZG93QmlhczogMC4wMDAyLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc2hhZG93U2xvcGVTY2FsZTogMi4wXG59LHtcblxuICAgIHR5cGU6ICdTUE9UX0xJR0hUJyxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgc3BvdExpZ2h0UG9zaXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLmdldFdvcmxkUG9zaXRpb24oKS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BvdExpZ2h0UmFuZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICcxZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJhbmdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzcG90TGlnaHRVbWJyYUFuZ2xlQ29zaW5lOiB7XG4gICAgICAgICAgICB0eXBlOiAnMWYnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmNvcyhpbnN0YW5jZS51bWJyYUFuZ2xlICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwb3RMaWdodFBlbnVtYnJhQW5nbGVDb3NpbmU6IHtcbiAgICAgICAgICAgIHR5cGU6ICcxZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguY29zKGluc3RhbmNlLnBlbnVtYnJhQW5nbGUgKiBNYXRoLlBJIC8gMTgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BvdExpZ2h0RmFsbG9mZkZhY3Rvcjoge1xuICAgICAgICAgICAgdHlwZTogJzFmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuZmFsbG9mZkZhY3RvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BvdExpZ2h0RGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLl9fZGlyID0gaW5zdGFuY2UuX19kaXIgfHwgbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Rpb24gaXMgdGFyZ2V0IHRvIGV5ZVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fX2Rpci5jb3B5KGluc3RhbmNlLndvcmxkVHJhbnNmb3JtLnopLm5lZ2F0ZSgpLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzcG90TGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBpbnN0YW5jZS5jb2xvcjtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZW5zaXR5ID0gaW5zdGFuY2UuaW50ZW5zaXR5O1xuICAgICAgICAgICAgICAgIHJldHVybiBbY29sb3JbMF0gKiBpbnRlbnNpdHksIGNvbG9yWzFdICogaW50ZW5zaXR5LCBjb2xvclsyXSAqIGludGVuc2l0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkubGlnaHQuU3BvdH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5TcG90LnByb3RvdHlwZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaWdodCA9IExpZ2h0LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO1xuICAgICAgICBsaWdodC5yYW5nZSA9IHRoaXMucmFuZ2U7XG4gICAgICAgIGxpZ2h0LnVtYnJhQW5nbGUgPSB0aGlzLnVtYnJhQW5nbGU7XG4gICAgICAgIGxpZ2h0LnBlbnVtYnJhQW5nbGUgPSB0aGlzLnBlbnVtYnJhQW5nbGU7XG4gICAgICAgIGxpZ2h0LmZhbGxvZmZGYWN0b3IgPSB0aGlzLmZhbGxvZmZGYWN0b3I7XG4gICAgICAgIGxpZ2h0LnNoYWRvd0JpYXMgPSB0aGlzLnNoYWRvd0JpYXM7XG4gICAgICAgIGxpZ2h0LnNoYWRvd1Nsb3BlU2NhbGUgPSB0aGlzLnNoYWRvd1Nsb3BlU2NhbGU7XG4gICAgICAgIHJldHVybiBsaWdodDtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU3BvdExpZ2h0O1xuIiwiaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5BbWJpZW50XG4gKiBAZXh0ZW5kcyBjbGF5LkxpZ2h0XG4gKi9cbnZhciBBbWJpZW50TGlnaHQgPSBMaWdodC5leHRlbmQoe1xuXG4gICAgY2FzdFNoYWRvdzogZmFsc2VcblxufSwge1xuXG4gICAgdHlwZTogJ0FNQklFTlRfTElHSFQnLFxuXG4gICAgdW5pZm9ybVRlbXBsYXRlczoge1xuICAgICAgICBhbWJpZW50TGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEByZXR1cm4ge2NsYXkubGlnaHQuQW1iaWVudH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50LnByb3RvdHlwZVxuICAgICAqL1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEFtYmllbnRMaWdodDtcbiIsImltcG9ydCBUZXh0dXJlIGZyb20gJy4vVGV4dHVyZSc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4vY29yZS9nbGVudW0nO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi9jb3JlL3V0aWwnO1xuaW1wb3J0IG1hdGhVdGlsIGZyb20gJy4vbWF0aC91dGlsJztcbnZhciBpc1Bvd2VyT2ZUd28gPSBtYXRoVXRpbC5pc1Bvd2VyT2ZUd287XG5cbnZhciB0YXJnZXRMaXN0ID0gWydweCcsICdueCcsICdweScsICdueScsICdweicsICdueiddO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LlRleHR1cmVDdWJlXG4gKiBAZXh0ZW5kcyBjbGF5LlRleHR1cmVcbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIC4uLlxuICogICAgIHZhciBtYXQgPSBuZXcgY2xheS5NYXRlcmlhbCh7XG4gKiAgICAgICAgIHNoYWRlcjogY2xheS5zaGFkZXIubGlicmFyeS5nZXQoJ2NsYXkucGhvbmcnLCAnZW52aXJvbm1lbnRNYXAnKVxuICogICAgIH0pO1xuICogICAgIHZhciBlbnZNYXAgPSBuZXcgY2xheS5UZXh0dXJlQ3ViZSgpO1xuICogICAgIGVudk1hcC5sb2FkKHtcbiAqICAgICAgICAgJ3B4JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvcHguanBnJyxcbiAqICAgICAgICAgJ254JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvbnguanBnJ1xuICogICAgICAgICAncHknOiAnYXNzZXRzL3RleHR1cmVzL3NreS9weS5qcGcnXG4gKiAgICAgICAgICdueSc6ICdhc3NldHMvdGV4dHVyZXMvc2t5L255LmpwZydcbiAqICAgICAgICAgJ3B6JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvcHouanBnJ1xuICogICAgICAgICAnbnonOiAnYXNzZXRzL3RleHR1cmVzL3NreS9uei5qcGcnXG4gKiAgICAgfSk7XG4gKiAgICAgbWF0LnNldCgnZW52aXJvbm1lbnRNYXAnLCBlbnZNYXApO1xuICogICAgIC4uLlxuICogICAgIGVudk1hcC5zdWNjZXNzKGZ1bmN0aW9uICgpIHtcbiAqICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNreSB0ZXh0dXJlIGxvYWRlZFxuICogICAgICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24gKGZyYW1lVGltZSkge1xuICogICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICogICAgICAgICB9KTtcbiAqICAgICB9KTtcbiAqL1xudmFyIFRleHR1cmVDdWJlID0gVGV4dHVyZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuVGV4dHVyZUN1YmUjICove1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gcHhcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gbnhcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gcHlcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gbnlcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gcHpcbiAgICAgICAgICogQHByb3BlcnR5IHs/SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbW5ldH0gbnpcbiAgICAgICAgICovXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICBweDogbnVsbCxcbiAgICAgICAgICAgIG54OiBudWxsLFxuICAgICAgICAgICAgcHk6IG51bGwsXG4gICAgICAgICAgICBueTogbnVsbCxcbiAgICAgICAgICAgIHB6OiBudWxsLFxuICAgICAgICAgICAgbno6IG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBpeGVscyBkYXRhIG9mIGVhY2ggc2lkZS4gV2lsbCBiZSBpZ25vcmVkIGlmIGltYWdlcyBhcmUgc2V0LlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBweFxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBueFxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBweVxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBueVxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBwelxuICAgICAgICAgKiBAcHJvcGVydHkgez9VaW50OEFycmF5fSBuelxuICAgICAgICAgKi9cbiAgICAgICAgcGl4ZWxzOiB7XG4gICAgICAgICAgICBweDogbnVsbCxcbiAgICAgICAgICAgIG54OiBudWxsLFxuICAgICAgICAgICAgcHk6IG51bGwsXG4gICAgICAgICAgICBueTogbnVsbCxcbiAgICAgICAgICAgIHB6OiBudWxsLFxuICAgICAgICAgICAgbno6IG51bGxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxPYmplY3Q+fVxuICAgICAgICAgKi9cbiAgICAgICAgbWlwbWFwczogW11cbiAgICB9O1xufSwge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLl9jYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21tb24ocmVuZGVyZXIpO1xuXG4gICAgICAgIHZhciBnbEZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgICAgICB2YXIgZ2xUeXBlID0gdGhpcy50eXBlO1xuXG4gICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHRoaXMuZ2V0QXZhaWxhYmxlV3JhcFMoKSk7XG4gICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJpKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIHRoaXMuZ2V0QXZhaWxhYmxlV3JhcFQoKSk7XG5cbiAgICAgICAgX2dsLnRleFBhcmFtZXRlcmkoX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIHRoaXMuZ2V0QXZhaWxhYmxlTWFnRmlsdGVyKCkpO1xuICAgICAgICBfZ2wudGV4UGFyYW1ldGVyaShfZ2wuVEVYVFVSRV9DVUJFX01BUCwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGhpcy5nZXRBdmFpbGFibGVNaW5GaWx0ZXIoKSk7XG5cbiAgICAgICAgdmFyIGFuaXNvdHJvcGljRXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpO1xuICAgICAgICBpZiAoYW5pc290cm9waWNFeHQgJiYgdGhpcy5hbmlzb3Ryb3BpYyA+IDEpIHtcbiAgICAgICAgICAgIF9nbC50ZXhQYXJhbWV0ZXJmKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBhbmlzb3Ryb3BpY0V4dC5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgdGhpcy5hbmlzb3Ryb3BpYyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsYmFjayB0byBmbG9hdCB0eXBlIGlmIGJyb3dzZXIgZG9uJ3QgaGF2ZSBoYWxmIGZsb2F0IGV4dGVuc2lvblxuICAgICAgICBpZiAoZ2xUeXBlID09PSAzNjE5Mykge1xuICAgICAgICAgICAgdmFyIGhhbGZGbG9hdEV4dCA9IHJlbmRlcmVyLmdldEdMRXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Jyk7XG4gICAgICAgICAgICBpZiAoIWhhbGZGbG9hdEV4dCkge1xuICAgICAgICAgICAgICAgIGdsVHlwZSA9IGdsZW51bS5GTE9BVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1pcG1hcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1pcG1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbWlwbWFwID0gdGhpcy5taXBtYXBzW2ldO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRleHR1cmVEYXRhKF9nbCwgbWlwbWFwLCBpLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlKTtcbiAgICAgICAgICAgICAgICB3aWR0aCAvPSAyO1xuICAgICAgICAgICAgICAgIGhlaWdodCAvPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dHVyZURhdGEoX2dsLCB0aGlzLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5OUE9UICYmIHRoaXMudXNlTWlwbWFwKSB7XG4gICAgICAgICAgICAgICAgX2dsLmdlbmVyYXRlTWlwbWFwKF9nbC5URVhUVVJFX0NVQkVfTUFQKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9nbC5iaW5kVGV4dHVyZShfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbnVsbCk7XG4gICAgfSxcblxuICAgIF91cGRhdGVUZXh0dXJlRGF0YTogZnVuY3Rpb24gKF9nbCwgZGF0YSwgbGV2ZWwsIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRMaXN0W2ldO1xuICAgICAgICAgICAgdmFyIGltZyA9IGRhdGEuaW1hZ2UgJiYgZGF0YS5pbWFnZVt0YXJnZXRdO1xuICAgICAgICAgICAgaWYgKGltZykge1xuICAgICAgICAgICAgICAgIF9nbC50ZXhJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBsZXZlbCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfZ2wudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgbGV2ZWwsIGdsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBkYXRhLnBpeGVscyAmJiBkYXRhLnBpeGVsc1t0YXJnZXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBtZW1iZXJPZiBjbGF5LlRleHR1cmVDdWJlLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGdlbmVyYXRlTWlwbWFwOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBpZiAodGhpcy51c2VNaXBtYXAgJiYgIXRoaXMuTlBPVCkge1xuICAgICAgICAgICAgX2dsLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLl9jYWNoZS5nZXQoJ3dlYmdsX3RleHR1cmUnKSk7XG4gICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfQ1VCRV9NQVApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLmdldFdlYkdMVGV4dHVyZShyZW5kZXJlcikpO1xuICAgIH0sXG5cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlci5nbC5iaW5kVGV4dHVyZShyZW5kZXJlci5nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcndyaXRlIHRoZSBpc1Bvd2VyT2ZUd28gbWV0aG9kXG4gICAgaXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlLnB4KSB7XG4gICAgICAgICAgICByZXR1cm4gaXNQb3dlck9mVHdvKHRoaXMuaW1hZ2UucHgud2lkdGgpXG4gICAgICAgICAgICAgICAgJiYgaXNQb3dlck9mVHdvKHRoaXMuaW1hZ2UucHguaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc1Bvd2VyT2ZUd28odGhpcy53aWR0aClcbiAgICAgICAgICAgICAgICAmJiBpc1Bvd2VyT2ZUd28odGhpcy5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGlzUmVuZGVyYWJsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZS5weCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzSW1hZ2VSZW5kZXJhYmxlKHRoaXMuaW1hZ2UucHgpXG4gICAgICAgICAgICAgICAgJiYgaXNJbWFnZVJlbmRlcmFibGUodGhpcy5pbWFnZS5ueClcbiAgICAgICAgICAgICAgICAmJiBpc0ltYWdlUmVuZGVyYWJsZSh0aGlzLmltYWdlLnB5KVxuICAgICAgICAgICAgICAgICYmIGlzSW1hZ2VSZW5kZXJhYmxlKHRoaXMuaW1hZ2UubnkpXG4gICAgICAgICAgICAgICAgJiYgaXNJbWFnZVJlbmRlcmFibGUodGhpcy5pbWFnZS5weilcbiAgICAgICAgICAgICAgICAmJiBpc0ltYWdlUmVuZGVyYWJsZSh0aGlzLmltYWdlLm56KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhISh0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkOiBmdW5jdGlvbiAoaW1hZ2VMaXN0LCBjcm9zc09yaWdpbikge1xuICAgICAgICB2YXIgbG9hZGluZyA9IDA7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdXRpbC5lYWNoKGltYWdlTGlzdCwgZnVuY3Rpb24gKHNyYywgdGFyZ2V0KXtcbiAgICAgICAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaWYgKGNyb3NzT3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nIC0tO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkaW5nID09PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmcgLS07XG4gICAgICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IG51bGw7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsb2FkaW5nKys7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBzcmM7XG4gICAgICAgICAgICBzZWxmLmltYWdlW3RhcmdldF0gPSBpbWFnZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZXh0dXJlQ3ViZS5wcm90b3R5cGUsICd3aWR0aCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UgJiYgdGhpcy5pbWFnZS5weCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2UucHgud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UgJiYgdGhpcy5pbWFnZS5weCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUZXh0dXJlIGZyb20gaW1hZ2UgY2FuXFwndCBzZXQgd2lkdGgnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dHVyZUN1YmUucHJvdG90eXBlLCAnaGVpZ2h0Jywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZSAmJiB0aGlzLmltYWdlLnB4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZS5weC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlICYmIHRoaXMuaW1hZ2UucHgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGV4dHVyZSBmcm9tIGltYWdlIGNhblxcJ3Qgc2V0IGhlaWdodCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuZnVuY3Rpb24gaXNJbWFnZVJlbmRlcmFibGUoaW1hZ2UpIHtcbiAgICByZXR1cm4gaW1hZ2Uubm9kZU5hbWUgPT09ICdDQU5WQVMnIHx8XG4gICAgICAgICAgICBpbWFnZS5ub2RlTmFtZSA9PT0gJ1ZJREVPJyB8fFxuICAgICAgICAgICAgaW1hZ2UuY29tcGxldGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHR1cmVDdWJlO1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9UZXh0dXJlJztcbmltcG9ydCBUZXh0dXJlQ3ViZSBmcm9tICcuL1RleHR1cmVDdWJlJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgQ2FjaGUgZnJvbSAnLi9jb3JlL0NhY2hlJztcblxudmFyIEtFWV9GUkFNRUJVRkZFUiA9ICdmcmFtZWJ1ZmZlcic7XG52YXIgS0VZX1JFTkRFUkJVRkZFUiA9ICdyZW5kZXJidWZmZXInO1xudmFyIEtFWV9SRU5ERVJCVUZGRVJfV0lEVEggPSBLRVlfUkVOREVSQlVGRkVSICsgJ193aWR0aCc7XG52YXIgS0VZX1JFTkRFUkJVRkZFUl9IRUlHSFQgPSBLRVlfUkVOREVSQlVGRkVSICsgJ19oZWlnaHQnO1xudmFyIEtFWV9SRU5ERVJCVUZGRVJfQVRUQUNIRUQgPSBLRVlfUkVOREVSQlVGRkVSICsgJ19hdHRhY2hlZCc7XG52YXIgS0VZX0RFUFRIVEVYVFVSRV9BVFRBQ0hFRCA9ICdkZXB0aHRleHR1cmVfYXR0YWNoZWQnO1xuXG52YXIgR0xfRlJBTUVCVUZGRVIgPSBnbGVudW0uRlJBTUVCVUZGRVI7XG52YXIgR0xfUkVOREVSQlVGRkVSID0gZ2xlbnVtLlJFTkRFUkJVRkZFUjtcbnZhciBHTF9ERVBUSF9BVFRBQ0hNRU5UID0gZ2xlbnVtLkRFUFRIX0FUVEFDSE1FTlQ7XG52YXIgR0xfQ09MT1JfQVRUQUNITUVOVDAgPSBnbGVudW0uQ09MT1JfQVRUQUNITUVOVDA7XG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LkZyYW1lQnVmZmVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRnJhbWVCdWZmZXIgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5GcmFtZUJ1ZmZlciMgKi9cbntcbiAgICAvKipcbiAgICAgKiBJZiB1c2UgZGVwdGggYnVmZmVyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZGVwdGhCdWZmZXI6IHRydWUsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZpZXdwb3J0OiBudWxsLFxuXG4gICAgX3dpZHRoOiAwLFxuICAgIF9oZWlnaHQ6IDAsXG5cbiAgICBfdGV4dHVyZXM6IG51bGwsXG5cbiAgICBfYm91bmRSZW5kZXJlcjogbnVsbCxcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBVc2UgY2FjaGVcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBDYWNoZSgpO1xuXG4gICAgdGhpcy5fdGV4dHVyZXMgPSB7fTtcbn0sXG5cbi8qKkBsZW5kcyBjbGF5LkZyYW1lQnVmZmVyLnByb3RvdHlwZS4gKi9cbntcbiAgICAvKipcbiAgICAgKiBHZXQgYXR0YWNoZWQgdGV4dHVyZSB3aWR0aFxuICAgICAqIHtudW1iZXJ9XG4gICAgICovXG4gICAgLy8gRklYTUUgQ2FuJ3QgdXNlIGJlZm9yZSAjYmluZFxuICAgIGdldFRleHR1cmVXaWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhdHRhY2hlZCB0ZXh0dXJlIGhlaWdodFxuICAgICAqIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0VGV4dHVyZUhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBCaW5kIHRoZSBmcmFtZWJ1ZmZlciB0byBnaXZlbiByZW5kZXJlciBiZWZvcmUgcmVuZGVyaW5nXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBiaW5kOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcblxuICAgICAgICBpZiAocmVuZGVyZXIuX19jdXJyZW50RnJhbWVCdWZmZXIpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYm91bmRcbiAgICAgICAgICAgIGlmIChyZW5kZXJlci5fX2N1cnJlbnRGcmFtZUJ1ZmZlciA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW5kZXJlciBhbHJlYWR5IGJvdW5kIHdpdGggYW5vdGhlciBmcmFtZWJ1ZmZlci4gVW5iaW5kIGl0IGZpcnN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZXIuX19jdXJyZW50RnJhbWVCdWZmZXIgPSB0aGlzO1xuXG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcblxuICAgICAgICBfZ2wuYmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCB0aGlzLl9nZXRGcmFtZUJ1ZmZlckdMKHJlbmRlcmVyKSk7XG4gICAgICAgIHRoaXMuX2JvdW5kUmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUucHV0KCd2aWV3cG9ydCcsIHJlbmRlcmVyLnZpZXdwb3J0KTtcblxuICAgICAgICB2YXIgaGFzVGV4dHVyZUF0dGFjaGVkID0gZmFsc2U7XG4gICAgICAgIHZhciB3aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodDtcbiAgICAgICAgZm9yICh2YXIgYXR0YWNobWVudCBpbiB0aGlzLl90ZXh0dXJlcykge1xuICAgICAgICAgICAgaGFzVGV4dHVyZUF0dGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLl90ZXh0dXJlc1thdHRhY2htZW50XTtcbiAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIERvIHdpZHRoLCBoZWlnaHQgY2hlY2tpbmcsIG1ha2Ugc3VyZSBzaXplIGFyZSBzYW1lXG4gICAgICAgICAgICAgICAgd2lkdGggPSBvYmoudGV4dHVyZS53aWR0aDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBvYmoudGV4dHVyZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRleHR1cmVzXG4gICAgICAgICAgICAgICAgdGhpcy5fZG9BdHRhY2gocmVuZGVyZXIsIG9iai50ZXh0dXJlLCBhdHRhY2htZW50LCBvYmoudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcblxuICAgICAgICBpZiAoIWhhc1RleHR1cmVBdHRhY2hlZCAmJiB0aGlzLmRlcHRoQnVmZmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdNdXN0IGF0dGFjaCB0ZXh0dXJlIGJlZm9yZSBiaW5kLCBvciByZW5kZXJidWZmZXIgbWF5IGhhdmUgaW5jb3JyZWN0IHdpZHRoIGFuZCBoZWlnaHQuJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0KSB7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCh0aGlzLnZpZXdwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF0dGFjaGVkVGV4dHVyZXMgPSBjYWNoZS5nZXQoJ2F0dGFjaGVkX3RleHR1cmVzJyk7XG4gICAgICAgIGlmIChhdHRhY2hlZFRleHR1cmVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIGF0dGFjaGVkVGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3RleHR1cmVzW2F0dGFjaG1lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb0RldGFjaChfZ2wsIGF0dGFjaG1lbnQsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2FjaGUuZ2V0KEtFWV9ERVBUSFRFWFRVUkVfQVRUQUNIRUQpICYmIHRoaXMuZGVwdGhCdWZmZXIpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByZW5kZXIgYnVmZmVyXG4gICAgICAgICAgICBpZiAoY2FjaGUubWlzcyhLRVlfUkVOREVSQlVGRkVSKSkge1xuICAgICAgICAgICAgICAgIGNhY2hlLnB1dChLRVlfUkVOREVSQlVGRkVSLCBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlbmRlcmJ1ZmZlciA9IGNhY2hlLmdldChLRVlfUkVOREVSQlVGRkVSKTtcblxuICAgICAgICAgICAgaWYgKHdpZHRoICE9PSBjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUl9XSURUSClcbiAgICAgICAgICAgICAgICAgICAgfHwgaGVpZ2h0ICE9PSBjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUl9IRUlHSFQpKSB7XG4gICAgICAgICAgICAgICAgX2dsLmJpbmRSZW5kZXJidWZmZXIoR0xfUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpO1xuICAgICAgICAgICAgICAgIF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKEdMX1JFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX0NPTVBPTkVOVDE2LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXQoS0VZX1JFTkRFUkJVRkZFUl9XSURUSCwgd2lkdGgpO1xuICAgICAgICAgICAgICAgIGNhY2hlLnB1dChLRVlfUkVOREVSQlVGRkVSX0hFSUdIVCwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBfZ2wuYmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUl9BVFRBQ0hFRCkpIHtcbiAgICAgICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsIEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXQoS0VZX1JFTkRFUkJVRkZFUl9BVFRBQ0hFRCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5iaW5kIHRoZSBmcmFtZSBidWZmZXIgYWZ0ZXIgcmVuZGVyaW5nXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICB1bmJpbmQ6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICAvLyBSZW1vdmUgc3RhdHVzIHJlY29yZCBvbiByZW5kZXJlclxuICAgICAgICByZW5kZXJlci5fX2N1cnJlbnRGcmFtZUJ1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIF9nbC5iaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB0aGlzLl9ib3VuZFJlbmRlcmVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9jYWNoZS51c2UocmVuZGVyZXIuX191aWRfXyk7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IHRoaXMuX2NhY2hlLmdldCgndmlld3BvcnQnKTtcbiAgICAgICAgLy8gUmVzZXQgdmlld3BvcnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0Vmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVNaXBtYXAocmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICAvLyBCZWNhdXNlIHRoZSBkYXRhIG9mIHRleHR1cmUgaXMgY2hhbmdlZCBvdmVyIHRpbWUsXG4gICAgLy8gSGVyZSB1cGRhdGUgdGhlIG1pcG1hcHMgb2YgdGV4dHVyZSBlYWNoIHRpbWUgYWZ0ZXIgcmVuZGVyZWQ7XG4gICAgdXBkYXRlTWlwbWFwOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIHRoaXMuX3RleHR1cmVzKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5fdGV4dHVyZXNbYXR0YWNobWVudF07XG4gICAgICAgICAgICBpZiAob2JqKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBvYmoudGV4dHVyZTtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBzb21lIHRleHR1cmUgZm9ybWF0IGNhbid0IGdlbmVyYXRlIG1pcG1hcFxuICAgICAgICAgICAgICAgIGlmICghdGV4dHVyZS5OUE9UICYmIHRleHR1cmUudXNlTWlwbWFwXG4gICAgICAgICAgICAgICAgICAgICYmIHRleHR1cmUubWluRmlsdGVyID09PSBUZXh0dXJlLkxJTkVBUl9NSVBNQVBfTElORUFSKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0ZXh0dXJlIGluc3RhbmNlb2YgVGV4dHVyZUN1YmUgPyBnbGVudW0uVEVYVFVSRV9DVUJFX01BUCA6IGdsZW51bS5URVhUVVJFXzJEO1xuICAgICAgICAgICAgICAgICAgICBfZ2wuYmluZFRleHR1cmUodGFyZ2V0LCB0ZXh0dXJlLmdldFdlYkdMVGV4dHVyZShyZW5kZXJlcikpO1xuICAgICAgICAgICAgICAgICAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgX2dsLmJpbmRUZXh0dXJlKHRhcmdldCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8gMHg4Q0Q1LCAzNjA1MywgRlJBTUVCVUZGRVJfQ09NUExFVEVcbiAgICAvLyAweDhDRDYsIDM2MDU0LCBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRcbiAgICAvLyAweDhDRDcsIDM2MDU1LCBGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVFxuICAgIC8vIDB4OENEOSwgMzYwNTcsIEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU1xuICAgIC8vIDB4OENERCwgMzYwNjEsIEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEXG4gICAgY2hlY2tTdGF0dXM6IGZ1bmN0aW9uIChfZ2wpIHtcbiAgICAgICAgcmV0dXJuIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTtcbiAgICB9LFxuXG4gICAgX2dldEZyYW1lQnVmZmVyR0w6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuXG4gICAgICAgIGlmIChjYWNoZS5taXNzKEtFWV9GUkFNRUJVRkZFUikpIHtcbiAgICAgICAgICAgIGNhY2hlLnB1dChLRVlfRlJBTUVCVUZGRVIsIHJlbmRlcmVyLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChLRVlfRlJBTUVCVUZGRVIpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2ggYSB0ZXh0dXJlKFJUVCkgdG8gdGhlIGZyYW1lYnVmZmVyXG4gICAgICogQHBhcmFtICB7Y2xheS5UZXh0dXJlfSB0ZXh0dXJlXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbYXR0YWNobWVudD1nbC5DT0xPUl9BVFRBQ0hNRU5UMF1cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IFt0YXJnZXQ9Z2wuVEVYVFVSRV8yRF1cbiAgICAgKi9cbiAgICBhdHRhY2g6IGZ1bmN0aW9uICh0ZXh0dXJlLCBhdHRhY2htZW50LCB0YXJnZXQpIHtcblxuICAgICAgICBpZiAoIXRleHR1cmUud2lkdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHRleHR1cmUgYXR0YWNoZWQgdG8gY29sb3IgYnVmZmVyIGlzIG5vdCBhIHZhbGlkLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gd2lkdGggYW5kIGhlaWdodCBjaGVja1xuXG4gICAgICAgIC8vIElmIHRoZSBkZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBpcyBlbmFibGVkLCBkZXZlbG9wZXJzXG4gICAgICAgIC8vIENhbiBhdHRhY2ggYSBkZXB0aCB0ZXh0dXJlIHRvIHRoZSBkZXB0aCBidWZmZXJcbiAgICAgICAgLy8gaHR0cDovL2Jsb2cudG9qaWNvZGUuY29tLzIwMTIvMDcvdXNpbmctd2ViZ2xkZXB0aHRleHR1cmUuaHRtbFxuICAgICAgICBhdHRhY2htZW50ID0gYXR0YWNobWVudCB8fCBHTF9DT0xPUl9BVFRBQ0hNRU5UMDtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGdsZW51bS5URVhUVVJFXzJEO1xuXG4gICAgICAgIHZhciBib3VuZFJlbmRlcmVyID0gdGhpcy5fYm91bmRSZW5kZXJlcjtcbiAgICAgICAgdmFyIF9nbCA9IGJvdW5kUmVuZGVyZXIgJiYgYm91bmRSZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGF0dGFjaGVkVGV4dHVyZXM7XG5cbiAgICAgICAgaWYgKF9nbCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgICAgICAgICBjYWNoZS51c2UoYm91bmRSZW5kZXJlci5fX3VpZF9fKTtcbiAgICAgICAgICAgIGF0dGFjaGVkVGV4dHVyZXMgPSBjYWNoZS5nZXQoJ2F0dGFjaGVkX3RleHR1cmVzJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0ZXh0dXJlIGF0dGFjaGVkXG4gICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuX3RleHR1cmVzW2F0dGFjaG1lbnRdO1xuICAgICAgICBpZiAocHJldmlvdXMgJiYgcHJldmlvdXMudGFyZ2V0ID09PSB0YXJnZXRcbiAgICAgICAgICAgICYmIHByZXZpb3VzLnRleHR1cmUgPT09IHRleHR1cmVcbiAgICAgICAgICAgICYmIChhdHRhY2hlZFRleHR1cmVzICYmIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0gIT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FuQXR0YWNoID0gdHJ1ZTtcbiAgICAgICAgaWYgKGJvdW5kUmVuZGVyZXIpIHtcbiAgICAgICAgICAgIGNhbkF0dGFjaCA9IHRoaXMuX2RvQXR0YWNoKGJvdW5kUmVuZGVyZXIsIHRleHR1cmUsIGF0dGFjaG1lbnQsIHRhcmdldCk7XG4gICAgICAgICAgICAvLyBTZXQgdmlld3BvcnQgYWdhaW4gaW5jYXNlIGF0dGFjaGVkIHRvIGRpZmZlcmVudCBzaXplIHRleHR1cmVzLlxuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgYm91bmRSZW5kZXJlci5zZXRWaWV3cG9ydCgwLCAwLCB0ZXh0dXJlLndpZHRoLCB0ZXh0dXJlLmhlaWdodCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FuQXR0YWNoKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0dXJlc1thdHRhY2htZW50XSA9IHRoaXMuX3RleHR1cmVzW2F0dGFjaG1lbnRdIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZXNbYXR0YWNobWVudF0udGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICB0aGlzLl90ZXh0dXJlc1thdHRhY2htZW50XS50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2RvQXR0YWNoOiBmdW5jdGlvbiAocmVuZGVyZXIsIHRleHR1cmUsIGF0dGFjaG1lbnQsIHRhcmdldCkge1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0dXJlIGlzIGFsd2F5cyB1cGRhdGVkXG4gICAgICAgIC8vIEJlY2F1c2UgdGV4dHVyZSB3aWR0aCBvciBoZWlnaHQgbWF5IGJlIGNoYW5nZWQgYW5kIGluIHRoaXMgd2UgY2FuJ3QgYmUgbm90aWZpZWRcbiAgICAgICAgLy8gRklYTUUgYXdrd2FyZDtcbiAgICAgICAgdmFyIHdlYmdsVGV4dHVyZSA9IHRleHR1cmUuZ2V0V2ViR0xUZXh0dXJlKHJlbmRlcmVyKTtcbiAgICAgICAgLy8gQXNzdW1lIGNhY2hlIGhhcyBiZWVuIHVzZWQuXG4gICAgICAgIHZhciBhdHRhY2hlZFRleHR1cmVzID0gdGhpcy5fY2FjaGUuZ2V0KCdhdHRhY2hlZF90ZXh0dXJlcycpO1xuICAgICAgICBpZiAoYXR0YWNoZWRUZXh0dXJlcyAmJiBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gYXR0YWNoZWRUZXh0dXJlc1thdHRhY2htZW50XTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRleHR1cmUgYW5kIHRhcmdldCBub3QgY2hhbmdlZFxuICAgICAgICAgICAgaWYgKG9iai50ZXh0dXJlID09PSB0ZXh0dXJlICYmIG9iai50YXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhdHRhY2htZW50ID0gK2F0dGFjaG1lbnQ7XG5cbiAgICAgICAgdmFyIGNhbkF0dGFjaCA9IHRydWU7XG4gICAgICAgIGlmIChhdHRhY2htZW50ID09PSBHTF9ERVBUSF9BVFRBQ0hNRU5UIHx8IGF0dGFjaG1lbnQgPT09IGdsZW51bS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHtcbiAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSByZW5kZXJlci5nZXRHTEV4dGVuc2lvbignV0VCR0xfZGVwdGhfdGV4dHVyZScpO1xuXG4gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlcHRoIHRleHR1cmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYnJvd3NlcicpO1xuICAgICAgICAgICAgICAgIGNhbkF0dGFjaCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRleHR1cmUuZm9ybWF0ICE9PSBnbGVudW0uREVQVEhfQ09NUE9ORU5UXG4gICAgICAgICAgICAgICAgJiYgdGV4dHVyZS5mb3JtYXQgIT09IGdsZW51bS5ERVBUSF9TVEVOQ0lMXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgdGV4dHVyZSBhdHRhY2hlZCB0byBkZXB0aCBidWZmZXIgaXMgbm90IGEgdmFsaWQuJyk7XG4gICAgICAgICAgICAgICAgY2FuQXR0YWNoID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc3Bvc2UgcmVuZGVyIGJ1ZmZlciBjcmVhdGVkIHByZXZpb3VzXG4gICAgICAgICAgICBpZiAoY2FuQXR0YWNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbmRlcmJ1ZmZlciA9IHRoaXMuX2NhY2hlLmdldChLRVlfUkVOREVSQlVGRkVSKTtcbiAgICAgICAgICAgICAgICBpZiAocmVuZGVyYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgR0xfREVQVEhfQVRUQUNITUVOVCwgR0xfUkVOREVSQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5wdXQoS0VZX1JFTkRFUkJVRkZFUiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChLRVlfUkVOREVSQlVGRkVSX0FUVEFDSEVELCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KEtFWV9ERVBUSFRFWFRVUkVfQVRUQUNIRUQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWlwbWFwIGxldmVsIGNhbiBvbmx5IGJlIDBcbiAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0YXJnZXQsIHdlYmdsVGV4dHVyZSwgMCk7XG5cbiAgICAgICAgaWYgKCFhdHRhY2hlZFRleHR1cmVzKSB7XG4gICAgICAgICAgICBhdHRhY2hlZFRleHR1cmVzID0ge307XG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5wdXQoJ2F0dGFjaGVkX3RleHR1cmVzJywgYXR0YWNoZWRUZXh0dXJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNoZWRUZXh0dXJlc1thdHRhY2htZW50XSA9IGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0gfHwge307XG4gICAgICAgIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0udGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0udGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgICAgIHJldHVybiBjYW5BdHRhY2g7XG4gICAgfSxcblxuICAgIF9kb0RldGFjaDogZnVuY3Rpb24gKF9nbCwgYXR0YWNobWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIERldGFjaCBhIHRleHR1cmUgZnJvbSBmcmFtZWJ1ZmZlclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL1dlYkdML2Jsb2IvbWFzdGVyL2NvbmZvcm1hbmNlLXN1aXRlcy8xLjAuMC9jb25mb3JtYW5jZS9mcmFtZWJ1ZmZlci10ZXN0Lmh0bWwjTDE0NVxuICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRhcmdldCwgbnVsbCwgMCk7XG5cbiAgICAgICAgLy8gQXNzdW1lIGNhY2hlIGhhcyBiZWVuIHVzZWQuXG4gICAgICAgIHZhciBhdHRhY2hlZFRleHR1cmVzID0gdGhpcy5fY2FjaGUuZ2V0KCdhdHRhY2hlZF90ZXh0dXJlcycpO1xuICAgICAgICBpZiAoYXR0YWNoZWRUZXh0dXJlcyAmJiBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdKSB7XG4gICAgICAgICAgICBhdHRhY2hlZFRleHR1cmVzW2F0dGFjaG1lbnRdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdHRhY2htZW50ID09PSBHTF9ERVBUSF9BVFRBQ0hNRU5UIHx8IGF0dGFjaG1lbnQgPT09IGdsZW51bS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChLRVlfREVQVEhURVhUVVJFX0FUVEFDSEVELCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGV0YWNoIGEgdGV4dHVyZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gW2F0dGFjaG1lbnQ9Z2wuQ09MT1JfQVRUQUNITUVOVDBdXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbdGFyZ2V0PWdsLlRFWFRVUkVfMkRdXG4gICAgICovXG4gICAgZGV0YWNoOiBmdW5jdGlvbiAoYXR0YWNobWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIFRPRE8gZGVwdGggZXh0ZW5zaW9uIGNoZWNrID9cbiAgICAgICAgdGhpcy5fdGV4dHVyZXNbYXR0YWNobWVudF0gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fYm91bmRSZW5kZXJlcikge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG4gICAgICAgICAgICBjYWNoZS51c2UodGhpcy5fYm91bmRSZW5kZXJlci5fX3VpZF9fKTtcbiAgICAgICAgICAgIHRoaXMuX2RvRGV0YWNoKHRoaXMuX2JvdW5kUmVuZGVyZXIuZ2wsIGF0dGFjaG1lbnQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VcbiAgICAgKiBAcGFyYW0gIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IF9nbFxuICAgICAqL1xuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuXG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cbiAgICAgICAgY2FjaGUudXNlKHJlbmRlcmVyLl9fdWlkX18pO1xuXG4gICAgICAgIHZhciByZW5kZXJCdWZmZXIgPSBjYWNoZS5nZXQoS0VZX1JFTkRFUkJVRkZFUik7XG4gICAgICAgIGlmIChyZW5kZXJCdWZmZXIpIHtcbiAgICAgICAgICAgIF9nbC5kZWxldGVSZW5kZXJidWZmZXIocmVuZGVyQnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnJhbWVCdWZmZXIgPSBjYWNoZS5nZXQoS0VZX0ZSQU1FQlVGRkVSKTtcbiAgICAgICAgaWYgKGZyYW1lQnVmZmVyKSB7XG4gICAgICAgICAgICBfZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlLmRlbGV0ZUNvbnRleHQocmVuZGVyZXIuX191aWRfXyk7XG5cbiAgICAgICAgLy8gQ2xlYXIgY2FjaGUgZm9yIHJldXNpbmdcbiAgICAgICAgdGhpcy5fdGV4dHVyZXMgPSB7fTtcblxuICAgIH1cbn0pO1xuXG5GcmFtZUJ1ZmZlci5ERVBUSF9BVFRBQ0hNRU5UID0gR0xfREVQVEhfQVRUQUNITUVOVDtcbkZyYW1lQnVmZmVyLkNPTE9SX0FUVEFDSE1FTlQwID0gR0xfQ09MT1JfQVRUQUNITUVOVDA7XG5GcmFtZUJ1ZmZlci5TVEVOQ0lMX0FUVEFDSE1FTlQgPSBnbGVudW0uU1RFTkNJTF9BVFRBQ0hNRU5UO1xuRnJhbWVCdWZmZXIuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UID0gZ2xlbnVtLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDtcblxuZXhwb3J0IGRlZmF1bHQgRnJhbWVCdWZmZXI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIlxcbkBleHBvcnQgY2xheS5jb21wb3NpdG9yLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkIDogVEVYQ09PUkRfMDtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbn1cXG5AZW5kXCI7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IE9ydGhvQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9PcnRob2dyYXBoaWMnO1xuaW1wb3J0IFBsYW5lIGZyb20gJy4uL2dlb21ldHJ5L1BsYW5lJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5pbXBvcnQgTWVzaCBmcm9tICcuLi9NZXNoJztcbmltcG9ydCBnbGVudW0gZnJvbSAnLi4vY29yZS9nbGVudW0nO1xuaW1wb3J0IHZlcnRleEVzc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9jb21wb3NpdG9yL3ZlcnRleC5nbHNsLmpzJztcblxuU2hhZGVyWydpbXBvcnQnXSh2ZXJ0ZXhFc3NsKTtcblxudmFyIHBsYW5lR2VvID0gbmV3IFBsYW5lKCk7XG52YXIgbWVzaCA9IG5ldyBNZXNoKHtcbiAgICBnZW9tZXRyeTogcGxhbmVHZW8sXG4gICAgZnJ1c3R1bUN1bGxpbmc6IGZhbHNlXG59KTtcbnZhciBjYW1lcmEgPSBuZXcgT3J0aG9DYW1lcmEoKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jb21wb3NpdG9yLlBhc3NcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBQYXNzID0gQmFzZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuY29tcG9zaXRvci5QYXNzIyAqLyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGcmFnbWVudCBzaGFkZXIgc3RyaW5nXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICAvLyBQRU5ESU5HIHNoYWRlciBvciBmcmFnbWVudCA/XG4gICAgICAgIGZyYWdtZW50IDogJycsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRzIDogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2NsYXkuTWF0ZXJpYWx9XG4gICAgICAgICAqL1xuICAgICAgICBtYXRlcmlhbCA6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgYmxlbmRXaXRoUHJldmlvdXM6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGNsZWFyQ29sb3I6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGNsZWFyRGVwdGg6IHRydWVcbiAgICB9O1xufSwgZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIgc2hhZGVyID0gbmV3IFNoYWRlcihTaGFkZXIuc291cmNlKCdjbGF5LmNvbXBvc2l0b3IudmVydGV4JyksIHRoaXMuZnJhZ21lbnQpO1xuICAgIHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgIHNoYWRlcjogc2hhZGVyXG4gICAgfSk7XG4gICAgbWF0ZXJpYWwuZW5hYmxlVGV4dHVyZXNBbGwoKTtcblxuICAgIHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblxufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLlBhc3MucHJvdG90eXBlICovXG57XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge30gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRVbmlmb3JtIDogZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tYXRlcmlhbC5zZXRVbmlmb3JtKG5hbWUsIHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICAgICAqIEByZXR1cm4ge31cbiAgICAgKi9cbiAgICBnZXRVbmlmb3JtIDogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICB2YXIgdW5pZm9ybSA9IHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbbmFtZV07XG4gICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5pZm9ybS52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5UZXh0dXJlfSB0ZXh0dXJlXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBhdHRhY2htZW50XG4gICAgICovXG4gICAgYXR0YWNoT3V0cHV0IDogZnVuY3Rpb24odGV4dHVyZSwgYXR0YWNobWVudCkge1xuICAgICAgICBpZiAoIXRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNobWVudCA9IGF0dGFjaG1lbnQgfHwgZ2xlbnVtLkNPTE9SX0FUVEFDSE1FTlQwO1xuICAgICAgICB0aGlzLm91dHB1dHNbYXR0YWNobWVudF0gPSB0ZXh0dXJlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5UZXh0dXJlfSB0ZXh0dXJlXG4gICAgICovXG4gICAgZGV0YWNoT3V0cHV0IDogZnVuY3Rpb24odGV4dHVyZSkge1xuICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3V0cHV0c1thdHRhY2htZW50XSA9PT0gdGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0c1thdHRhY2htZW50XSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZCA6IGZ1bmN0aW9uKHJlbmRlcmVyLCBmcmFtZUJ1ZmZlcikge1xuXG4gICAgICAgIGlmICh0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGF0dGFjaG1lbnQgaW4gdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLm91dHB1dHNbYXR0YWNobWVudF07XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRleHR1cmUsIGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFtZUJ1ZmZlcikge1xuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdW5iaW5kIDogZnVuY3Rpb24ocmVuZGVyZXIsIGZyYW1lQnVmZmVyKSB7XG4gICAgICAgIGZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSAge2NsYXkuRnJhbWVCdWZmZXJ9IFtmcmFtZUJ1ZmZlcl1cbiAgICAgKi9cbiAgICByZW5kZXIgOiBmdW5jdGlvbihyZW5kZXJlciwgZnJhbWVCdWZmZXIpIHtcblxuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgaWYgKGZyYW1lQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmQocmVuZGVyZXIsIGZyYW1lQnVmZmVyKTtcbiAgICAgICAgICAgIC8vIE1SVCBTdXBwb3J0IGluIGNocm9tZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc2RrL3Rlc3RzL2NvbmZvcm1hbmNlL2V4dGVuc2lvbnMvZXh0LWRyYXctYnVmZmVycy5odG1sXG4gICAgICAgICAgICB2YXIgZXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ0VYVF9kcmF3X2J1ZmZlcnMnKTtcbiAgICAgICAgICAgIGlmIChleHQgJiYgdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50ID0gK2F0dGFjaG1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50ID49IF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCAmJiBhdHRhY2htZW50IDw9IF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnMucHVzaChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleHQuZHJhd0J1ZmZlcnNFWFQoYnVmcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcicsIHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvLyBGSVhNRSBEb24ndCBjbGVhciBpbiBlYWNoIHBhc3MgaW4gZGVmYXVsdCwgbGV0IHRoZSBjb2xvciBvdmVyd3JpdGUgdGhlIGJ1ZmZlclxuICAgICAgICAvLyBGSVhNRSBwaXhlbHMgbWF5IGJlIGRpc2NhcmRcbiAgICAgICAgdmFyIGNsZWFyQml0ID0gdGhpcy5jbGVhckRlcHRoID8gX2dsLkRFUFRIX0JVRkZFUl9CSVQgOiAwO1xuICAgICAgICBfZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5jbGVhckNvbG9yKSB7XG4gICAgICAgICAgICBjbGVhckJpdCA9IGNsZWFyQml0IHwgX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG4gICAgICAgICAgICBfZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgdmFyIGNjID0gdGhpcy5jbGVhckNvbG9yO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2MpKSB7XG4gICAgICAgICAgICAgICAgX2dsLmNsZWFyQ29sb3IoY2NbMF0sIGNjWzFdLCBjY1syXSwgY2NbM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9nbC5jbGVhcihjbGVhckJpdCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYmxlbmRXaXRoUHJldmlvdXMpIHtcbiAgICAgICAgICAgIC8vIEJsZW5kIHdpdGggcHJldmlvdXMgcmVuZGVyZWQgc2NlbmUgaW4gdGhlIGZpbmFsIG91dHB1dFxuICAgICAgICAgICAgLy8gRklYTUUgQ29uZmlndXJlIGJsZW5kLlxuICAgICAgICAgICAgLy8gRklYTUUgSXQgd2lsbCBjYXVzZSBzY3JlZW4gYmxpbmvvvJ9cbiAgICAgICAgICAgIF9nbC5lbmFibGUoX2dsLkJMRU5EKTtcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX2dsLmRpc2FibGUoX2dsLkJMRU5EKTtcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyUXVhZChyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdhZnRlcnJlbmRlcicsIHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICBpZiAoZnJhbWVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMudW5iaW5kKHJlbmRlcmVyLCBmcmFtZUJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2ltcGx5IGRvIHF1YWQgcmVuZGVyaW5nXG4gICAgICovXG4gICAgcmVuZGVyUXVhZDogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIG1lc2gubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKFttZXNoXSwgY2FtZXJhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHt9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgUGFzcztcbiIsIi8vIFRPRE8gU2hvdWxkIG5vdCBkZXJpdmVkIGZyb20gbWVzaD9cbmltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IEN1YmVHZW9tZXRyeSBmcm9tICcuLi9nZW9tZXRyeS9DdWJlJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5cbmltcG9ydCBza3lib3hFc3NsIGZyb20gJy4uL3NoYWRlci9zb3VyY2Uvc2t5Ym94Lmdsc2wuanMnO1xuU2hhZGVyLmltcG9ydChza3lib3hFc3NsKTtcbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGx1Z2luLlNreWJveFxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgdmFyIHNreVRleCA9IG5ldyBjbGF5LlRleHR1cmVDdWJlKCk7XG4gKiAgICAgc2t5VGV4LmxvYWQoe1xuICogICAgICAgICAncHgnOiAnYXNzZXRzL3RleHR1cmVzL3NreS9weC5qcGcnLFxuICogICAgICAgICAnbngnOiAnYXNzZXRzL3RleHR1cmVzL3NreS9ueC5qcGcnXG4gKiAgICAgICAgICdweSc6ICdhc3NldHMvdGV4dHVyZXMvc2t5L3B5LmpwZydcbiAqICAgICAgICAgJ255JzogJ2Fzc2V0cy90ZXh0dXJlcy9za3kvbnkuanBnJ1xuICogICAgICAgICAncHonOiAnYXNzZXRzL3RleHR1cmVzL3NreS9wei5qcGcnXG4gKiAgICAgICAgICdueic6ICdhc3NldHMvdGV4dHVyZXMvc2t5L256LmpwZydcbiAqICAgICB9KTtcbiAqICAgICB2YXIgc2t5Ym94ID0gbmV3IGNsYXkucGx1Z2luLlNreWJveCh7XG4gKiAgICAgICAgIHNjZW5lOiBzY2VuZVxuICogICAgIH0pO1xuICogICAgIHNreWJveC5tYXRlcmlhbC5zZXQoJ2Vudmlyb25tZW50TWFwJywgc2t5VGV4KTtcbiAqL1xudmFyIFNreWJveCA9IE1lc2guZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBza3lib3hTaGFkZXIgPSBuZXcgU2hhZGVyKHtcbiAgICAgICAgdmVydGV4OiBTaGFkZXIuc291cmNlKCdjbGF5LnNreWJveC52ZXJ0ZXgnKSxcbiAgICAgICAgZnJhZ21lbnQ6IFNoYWRlci5zb3VyY2UoJ2NsYXkuc2t5Ym94LmZyYWdtZW50JylcbiAgICB9KTtcbiAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWwoe1xuICAgICAgICBzaGFkZXI6IHNreWJveFNoYWRlcixcbiAgICAgICAgZGVwdGhNYXNrOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlNjZW5lfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wbHVnaW4uU2t5Ym94LnByb3RvdHlwZVxuICAgICAgICAgKi9cbiAgICAgICAgc2NlbmU6IG51bGwsXG5cbiAgICAgICAgZ2VvbWV0cnk6IG5ldyBDdWJlR2VvbWV0cnkoKSxcblxuICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWwsXG5cbiAgICAgICAgZW52aXJvbm1lbnRNYXA6IG51bGwsXG5cbiAgICAgICAgY3VsbGluZzogZmFsc2VcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgaWYgKHNjZW5lKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoU2NlbmUoc2NlbmUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudE1hcCkge1xuICAgICAgICB0aGlzLnNldEVudmlyb25tZW50TWFwKHRoaXMuZW52aXJvbm1lbnRNYXApO1xuICAgIH1cbn0sIC8qKiBAbGVuZHMgY2xheS5wbHVnaW4uU2t5Ym94IyAqLyB7XG4gICAgLyoqXG4gICAgICogQXR0YWNoIHRoZSBza3lib3ggdG8gdGhlIHNjZW5lXG4gICAgICogQHBhcmFtICB7Y2xheS5TY2VuZX0gc2NlbmVcbiAgICAgKi9cbiAgICBhdHRhY2hTY2VuZTogZnVuY3Rpb24gKHNjZW5lKSB7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaFNjZW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICBzY2VuZS5vbignYmVmb3JlcmVuZGVyJywgdGhpcy5fYmVmb3JlUmVuZGVyU2NlbmUsIHRoaXMpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGV0YWNoIGZyb20gc2NlbmVcbiAgICAgKi9cbiAgICBkZXRhY2hTY2VuZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5vZmYoJ2JlZm9yZXJlbmRlcicsIHRoaXMuX2JlZm9yZVJlbmRlclNjZW5lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBza3lib3hcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqL1xuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB0aGlzLmRldGFjaFNjZW5lKCk7XG4gICAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXQgZW52aXJvbm1lbnQgbWFwXG4gICAgICogQHBhcmFtIHtjbGF5LlRleHR1cmVDdWJlfSBlbnZNYXBcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudE1hcDogZnVuY3Rpb24gKGVudk1hcCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnNldCgnZW52aXJvbm1lbnRNYXAnLCBlbnZNYXApO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IGVudmlyb25tZW50IG1hcFxuICAgICAqIEByZXR1cm4ge2NsYXkuVGV4dHVyZUN1YmV9XG4gICAgICovXG4gICAgZ2V0RW52aXJvbm1lbnRNYXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWwuZ2V0KCdlbnZpcm9ubWVudE1hcCcpO1xuICAgIH0sXG5cbiAgICBfYmVmb3JlUmVuZGVyU2NlbmU6IGZ1bmN0aW9uKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XG4gICAgICAgIHRoaXMucmVuZGVyU2t5Ym94KHJlbmRlcmVyLCBjYW1lcmEpO1xuICAgIH0sXG5cbiAgICByZW5kZXJTa3lib3g6IGZ1bmN0aW9uIChyZW5kZXJlciwgY2FtZXJhKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24uY29weShjYW1lcmEuZ2V0V29ybGRQb3NpdGlvbigpKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgLy8gRG9uJ3QgcmVtZW1iZXIgdG8gZGlzYWJsZSBibGVuZFxuICAgICAgICByZW5kZXJlci5nbC5kaXNhYmxlKHJlbmRlcmVyLmdsLkJMRU5EKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyUGFzcyhbdGhpc10sIGNhbWVyYSk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNreWJveDtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IFBlcnNwZWN0aXZlQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuXG52YXIgdGFyZ2V0cyA9IFsncHgnLCAnbngnLCAncHknLCAnbnknLCAncHonLCAnbnonXTtcblxuLyoqXG4gKiBQYXNzIHJlbmRlcmluZyBzY2VuZSB0byBhIGVudmlyb25tZW50IGN1YmUgbWFwXG4gKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcFxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqIEBleGFtcGxlXG4gKiAgICAgLy8gRXhhbXBsZSBvZiBjYXIgcmVmbGVjdGlvblxuICogICAgIHZhciBlbnZNYXAgPSBuZXcgY2xheS5UZXh0dXJlQ3ViZSh7XG4gKiAgICAgICAgIHdpZHRoOiAyNTYsXG4gKiAgICAgICAgIGhlaWdodDogMjU2XG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIGVudlBhc3MgPSBuZXcgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwKHtcbiAqICAgICAgICAgcG9zaXRpb246IGNhci5wb3NpdGlvbixcbiAqICAgICAgICAgdGV4dHVyZTogZW52TWFwXG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIGNhckJvZHkgPSBjYXIuZ2V0Q2hpbGRCeU5hbWUoJ2JvZHknKTtcbiAqICAgICBjYXJCb2R5Lm1hdGVyaWFsLmVuYWJsZVRleHR1cmUoJ2Vudmlyb25tZW50TWFwJyk7XG4gKiAgICAgY2FyQm9keS5tYXRlcmlhbC5zZXQoJ2Vudmlyb25tZW50TWFwJywgZW52TWFwKTtcbiAqICAgICAuLi5cbiAqICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24oZnJhbWVUaW1lKSB7XG4gKiAgICAgICAgIGVudlBhc3MucmVuZGVyKHJlbmRlcmVyLCBzY2VuZSk7XG4gKiAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAqICAgICB9KTtcbiAqL1xudmFyIEVudmlyb25tZW50TWFwUGFzcyA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXQgPSAvKiogQGxlbmRzIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIHBvc2l0aW9uXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcCNcbiAgICAgICAgICovXG4gICAgICAgIHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIGZhciBwbGFuZVxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwI1xuICAgICAgICAgKi9cbiAgICAgICAgZmFyOiAxMDAwLFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FtZXJhIG5lYXIgcGxhbmVcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5FbnZpcm9ubWVudE1hcCNcbiAgICAgICAgICovXG4gICAgICAgIG5lYXI6IDAuMSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudmlyb25tZW50IGN1YmUgbWFwXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlRleHR1cmVDdWJlfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwI1xuICAgICAgICAgKi9cbiAgICAgICAgdGV4dHVyZTogbnVsbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCBpZiB5b3Ugd2FuJ3QgaGF2ZSBzaGFkb3cgaW4gZW52aXJvbm1lbnQgbWFwXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LnByZVBhc3MuU2hhZG93TWFwfVxuICAgICAgICAgKi9cbiAgICAgICAgc2hhZG93TWFwUGFzczogbnVsbCxcbiAgICB9O1xuICAgIHZhciBjYW1lcmFzID0gcmV0Ll9jYW1lcmFzID0ge1xuICAgICAgICBweDogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHsgZm92OiA5MCB9KSxcbiAgICAgICAgbng6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7IGZvdjogOTAgfSksXG4gICAgICAgIHB5OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoeyBmb3Y6IDkwIH0pLFxuICAgICAgICBueTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHsgZm92OiA5MCB9KSxcbiAgICAgICAgcHo6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7IGZvdjogOTAgfSksXG4gICAgICAgIG56OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoeyBmb3Y6IDkwIH0pXG4gICAgfTtcbiAgICBjYW1lcmFzLnB4Lmxvb2tBdChWZWN0b3IzLlBPU0lUSVZFX1gsIFZlY3RvcjMuTkVHQVRJVkVfWSk7XG4gICAgY2FtZXJhcy5ueC5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9YLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgIGNhbWVyYXMucHkubG9va0F0KFZlY3RvcjMuUE9TSVRJVkVfWSwgVmVjdG9yMy5QT1NJVElWRV9aKTtcbiAgICBjYW1lcmFzLm55Lmxvb2tBdChWZWN0b3IzLk5FR0FUSVZFX1ksIFZlY3RvcjMuTkVHQVRJVkVfWik7XG4gICAgY2FtZXJhcy5wei5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9aLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgIGNhbWVyYXMubnoubG9va0F0KFZlY3RvcjMuTkVHQVRJVkVfWiwgVmVjdG9yMy5ORUdBVElWRV9ZKTtcblxuICAgIC8vIEZJWE1FIEluIHdpbmRvd3MsIHVzZSBvbmUgZnJhbWVidWZmZXIgb25seSByZW5kZXJzIG9uZSBzaWRlIG9mIGN1YmVtYXBcbiAgICByZXQuX2ZyYW1lQnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKCk7XG5cbiAgICByZXR1cm4gcmV0O1xufSwgIC8qKiBAbGVuZHMgY2xheS5wcmVQYXNzLkVudmlyb25tZW50TWFwIyAqLyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB0YXJnZXRcbiAgICAgKiBAcmV0dXJuICB7Y2xheS5DYW1lcmF9XG4gICAgICovXG4gICAgZ2V0Q2FtZXJhOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW1lcmFzW3RhcmdldF07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSAge2NsYXkuU2NlbmV9IHNjZW5lXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gW25vdFVwZGF0ZVNjZW5lPWZhbHNlXVxuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24ocmVuZGVyZXIsIHNjZW5lLCBub3RVcGRhdGVTY2VuZSkge1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIGlmICghbm90VXBkYXRlU2NlbmUpIHtcbiAgICAgICAgICAgIHNjZW5lLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFR3ZWFrIGZvdlxuICAgICAgICAvLyBodHRwOi8vdGhlLXdpdG5lc3MubmV0L25ld3MvMjAxMi8wMi9zZWFtbGVzcy1jdWJlLW1hcC1maWx0ZXJpbmcvXG4gICAgICAgIHZhciBuID0gdGhpcy50ZXh0dXJlLndpZHRoO1xuICAgICAgICB2YXIgZm92ID0gMiAqIE1hdGguYXRhbihuIC8gKG4gLSAwLjUpKSAvIE1hdGguUEkgKiAxODA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzW2ldO1xuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2NhbWVyYXNbdGFyZ2V0XTtcbiAgICAgICAgICAgIFZlY3RvcjMuY29weShjYW1lcmEucG9zaXRpb24sIHRoaXMucG9zaXRpb24pO1xuXG4gICAgICAgICAgICBjYW1lcmEuZmFyID0gdGhpcy5mYXI7XG4gICAgICAgICAgICBjYW1lcmEubmVhciA9IHRoaXMubmVhcjtcbiAgICAgICAgICAgIGNhbWVyYS5mb3YgPSBmb3Y7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvd01hcFBhc3MpIHtcbiAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYm91bmRpbmdCb3hMYXN0RnJhbWVcbiAgICAgICAgICAgICAgICB2YXIgYmJveCA9IHNjZW5lLmdldEJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICAgICAgYmJveC5hcHBseVRyYW5zZm9ybShjYW1lcmEudmlld01hdHJpeCk7XG4gICAgICAgICAgICAgICAgc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLmNvcHkoYmJveCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd01hcFBhc3MucmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaChcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgICAgICAgICBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqL1xuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRW52aXJvbm1lbnRNYXBQYXNzO1xuIiwiaW1wb3J0IE1lc2ggZnJvbSAnLi4vTWVzaCc7XG5pbXBvcnQgU3BoZXJlR2VvbWV0cnkgZnJvbSAnLi4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5cbmltcG9ydCBiYXNpY0Vzc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9iYXNpYy5nbHNsLmpzJztcblNoYWRlci5pbXBvcnQoYmFzaWNFc3NsKTtcbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGx1Z2luLlNreWRvbWVcbiAqXG4gKiBAZXhhbXBsZVxuICogICAgIHZhciBza3lUZXggPSBuZXcgY2xheS5UZXh0dXJlMkQoKTtcbiAqICAgICBza3lUZXgubG9hZCgnYXNzZXRzL3RleHR1cmVzL3NreS5qcGcnKTtcbiAqICAgICB2YXIgc2t5ZG9tZSA9IG5ldyBjbGF5LnBsdWdpbi5Ta3lkb21lKHtcbiAqICAgICAgICAgc2NlbmU6IHNjZW5lXG4gKiAgICAgfSk7XG4gKiAgICAgc2t5ZG9tZS5tYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCBza3lUZXgpO1xuICovXG52YXIgU2t5ZG9tZSA9IE1lc2guZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBza3lkb21lU2hhZGVyID0gbmV3IFNoYWRlcihTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LmJhc2ljLmZyYWdtZW50JykpO1xuXG4gICAgdmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgc2hhZGVyOiBza3lkb21lU2hhZGVyLFxuICAgICAgICBkZXB0aE1hc2s6IGZhbHNlXG4gICAgfSk7XG4gICAgbWF0ZXJpYWwuZW5hYmxlVGV4dHVyZSgnZGlmZnVzZU1hcCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlNjZW5lfVxuICAgICAgICAgKiBAbWVtYmVyT2YgY2xheS5wbHVnaW4uU2t5ZG9tZSNcbiAgICAgICAgICovXG4gICAgICAgIHNjZW5lOiBudWxsLFxuXG4gICAgICAgIGdlb21ldHJ5OiBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICAgICAgICAgICAgd2lkdGhTZWdtZW50czogMzAsXG4gICAgICAgICAgICBoZWlnaHRTZWdtZW50czogMzAsXG4gICAgICAgICAgICAvLyB0aGV0YUxlbmd0aDogTWF0aC5QSSAvIDJcbiAgICAgICAgfSksXG5cbiAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG4gICAgICAgIGVudmlyb25tZW50TWFwOiBudWxsLFxuXG4gICAgICAgIGN1bGxpbmc6IGZhbHNlXG4gICAgfTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgIGlmIChzY2VuZSkge1xuICAgICAgICB0aGlzLmF0dGFjaFNjZW5lKHNjZW5lKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudE1hcCkge1xuICAgICAgICB0aGlzLnNldEVudmlyb25tZW50TWFwKHRoaXMuZW52aXJvbm1lbnRNYXApO1xuICAgIH1cbn0sIHtcbiAgICAvKipcbiAgICAgKiBBdHRhY2ggdGhlIHNreWJveCB0byB0aGUgc2NlbmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnBsdWdpbi5Ta3lkb21lLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGF0dGFjaFNjZW5lOiBmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoU2NlbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHNjZW5lLm9uKCdiZWZvcmVyZW5kZXInLCB0aGlzLl9iZWZvcmVSZW5kZXJTY2VuZSwgdGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZXRhY2ggZnJvbSBzY2VuZVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnBsdWdpbi5Ta3lkb21lLnByb3RvdHlwZVxuICAgICAqL1xuICAgIGRldGFjaFNjZW5lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLm9mZignYmVmb3JlcmVuZGVyJywgdGhpcy5fYmVmb3JlUmVuZGVyU2NlbmUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgIH0sXG5cbiAgICBfYmVmb3JlUmVuZGVyU2NlbmU6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uLmNvcHkoY2FtZXJhLmdldFdvcmxkUG9zaXRpb24oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlclBhc3MoW3RoaXNdLCBjYW1lcmEpO1xuICAgIH0sXG5cbiAgICBzZXRFbnZpcm9ubWVudE1hcDogZnVuY3Rpb24gKGVudk1hcCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsLnNldCgnZGlmZnVzZU1hcCcsIGVudk1hcCk7XG4gICAgfSxcblxuICAgIGdldEVudmlyb25tZW50TWFwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsLmdldCgnZGlmZnVzZU1hcCcpO1xuICAgIH0sXG5cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5kZXRhY2hTY2VuZSgpO1xuICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTa3lkb21lO1xuIiwiaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2JiOTQzOTkxKHY9dnMuODUpLmFzcHhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90b2ppL3dlYmdsLXRleHR1cmUtdXRpbHMvYmxvYi9tYXN0ZXIvdGV4dHVyZS11dGlsL2Rkcy5qc1xudmFyIEREU19NQUdJQyA9IDB4MjA1MzQ0NDQ7XG5cbnZhciBERFNEX0NBUFMgPSAweDE7XG52YXIgRERTRF9IRUlHSFQgPSAweDI7XG52YXIgRERTRF9XSURUSCA9IDB4NDtcbnZhciBERFNEX1BJVENIID0gMHg4O1xudmFyIEREU0RfUElYRUxGT1JNQVQgPSAweDEwMDA7XG52YXIgRERTRF9NSVBNQVBDT1VOVCA9IDB4MjAwMDA7XG52YXIgRERTRF9MSU5FQVJTSVpFID0gMHg4MDAwMDtcbnZhciBERFNEX0RFUFRIID0gMHg4MDAwMDA7XG5cbnZhciBERFNDQVBTX0NPTVBMRVggPSAweDg7XG52YXIgRERTQ0FQU19NSVBNQVAgPSAweDQwMDAwMDtcbnZhciBERFNDQVBTX1RFWFRVUkUgPSAweDEwMDA7XG5cbnZhciBERFNDQVBTMl9DVUJFTUFQID0gMHgyMDA7XG52YXIgRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVggPSAweDQwMDtcbnZhciBERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWCA9IDB4ODAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVZID0gMHgxMDAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVZID0gMHgyMDAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVaID0gMHg0MDAwO1xudmFyIEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVaID0gMHg4MDAwO1xudmFyIEREU0NBUFMyX1ZPTFVNRSA9IDB4MjAwMDAwO1xuXG52YXIgRERQRl9BTFBIQVBJWEVMUyA9IDB4MTtcbnZhciBERFBGX0FMUEhBID0gMHgyO1xudmFyIEREUEZfRk9VUkNDID0gMHg0O1xudmFyIEREUEZfUkdCID0gMHg0MDtcbnZhciBERFBGX1lVViA9IDB4MjAwO1xudmFyIEREUEZfTFVNSU5BTkNFID0gMHgyMDAwMDtcblxuZnVuY3Rpb24gZm91ckNDVG9JbnQzMih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5jaGFyQ29kZUF0KDApICtcbiAgICAgICAgKHZhbHVlLmNoYXJDb2RlQXQoMSkgPDwgOCkgK1xuICAgICAgICAodmFsdWUuY2hhckNvZGVBdCgyKSA8PCAxNikgK1xuICAgICAgICAodmFsdWUuY2hhckNvZGVBdCgzKSA8PCAyNCk7XG59XG5cbmZ1bmN0aW9uIGludDMyVG9Gb3VyQ0ModmFsdWUpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgdmFsdWUgJiAweGZmLFxuICAgICAgICAodmFsdWUgPj4gOCkgJiAweGZmLFxuICAgICAgICAodmFsdWUgPj4gMTYpICYgMHhmZixcbiAgICAgICAgKHZhbHVlID4+IDI0KSAmIDB4ZmZcbiAgICApO1xufVxuXG52YXIgaGVhZGVyTGVuZ3RoSW50ID0gMzE7IC8vIFRoZSBoZWFkZXIgbGVuZ3RoIGluIDMyIGJpdCBpbnRzXG5cbnZhciBGT1VSQ0NfRFhUMSA9IGZvdXJDQ1RvSW50MzIoJ0RYVDEnKTtcbnZhciBGT1VSQ0NfRFhUMyA9IGZvdXJDQ1RvSW50MzIoJ0RYVDMnKTtcbnZhciBGT1VSQ0NfRFhUNSA9IGZvdXJDQ1RvSW50MzIoJ0RYVDUnKTtcbiAgICAvLyBPZmZzZXRzIGludG8gdGhlIGhlYWRlciBhcnJheVxudmFyIG9mZl9tYWdpYyA9IDA7XG5cbnZhciBvZmZfc2l6ZSA9IDE7XG52YXIgb2ZmX2ZsYWdzID0gMjtcbnZhciBvZmZfaGVpZ2h0ID0gMztcbnZhciBvZmZfd2lkdGggPSA0O1xuXG52YXIgb2ZmX21pcG1hcENvdW50ID0gNztcblxudmFyIG9mZl9wZkZsYWdzID0gMjA7XG52YXIgb2ZmX3BmRm91ckNDID0gMjE7XG5cbnZhciBvZmZfY2FwcyA9IDI3O1xudmFyIG9mZl9jYXBzMiA9IDI4O1xudmFyIG9mZl9jYXBzMyA9IDI5O1xudmFyIG9mZl9jYXBzNCA9IDMwO1xuXG52YXIgcmV0ID0ge1xuICAgIHBhcnNlOiBmdW5jdGlvbihhcnJheUJ1ZmZlciwgb3V0KSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSBuZXcgSW50MzJBcnJheShhcnJheUJ1ZmZlciwgMCwgaGVhZGVyTGVuZ3RoSW50KTtcbiAgICAgICAgaWYgKGhlYWRlcltvZmZfbWFnaWNdICE9PSBERFNfTUFHSUMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGVhZGVyKG9mZl9wZkZsYWdzKSAmIEREUEZfRk9VUkNDKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb3VyQ0MgPSBoZWFkZXIob2ZmX3BmRm91ckNDKTtcbiAgICAgICAgdmFyIHdpZHRoID0gaGVhZGVyW29mZl93aWR0aF07XG4gICAgICAgIHZhciBoZWlnaHQgPSBoZWFkZXJbb2ZmX2hlaWdodF07XG4gICAgICAgIHZhciBpc0N1YmVNYXAgPSBoZWFkZXJbb2ZmX2NhcHMyXSAmIEREU0NBUFMyX0NVQkVNQVA7XG4gICAgICAgIHZhciBoYXNNaXBtYXAgPSBoZWFkZXJbb2ZmX2ZsYWdzXSAmIEREU0RfTUlQTUFQQ09VTlQ7XG4gICAgICAgIHZhciBibG9ja0J5dGVzLCBpbnRlcm5hbEZvcm1hdDtcbiAgICAgICAgc3dpdGNoKGZvdXJDQykge1xuICAgICAgICAgICAgY2FzZSBGT1VSQ0NfRFhUMTpcbiAgICAgICAgICAgICAgICBibG9ja0J5dGVzID0gODtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IFRleHR1cmUuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRk9VUkNDX0RYVDM6XG4gICAgICAgICAgICAgICAgYmxvY2tCeXRlcyA9IDE2O1xuICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0ID0gVGV4dHVyZS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRk9VUkNDX0RYVDU6XG4gICAgICAgICAgICAgICAgYmxvY2tCeXRlcyA9IDE2O1xuICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0ID0gVGV4dHVyZS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGFPZmZzZXQgPSBoZWFkZXJbb2ZmX3NpemVdICsgNDtcbiAgICAgICAgLy8gVE9ETzogU3VwcG9zZSBhbGwgZmFjZSBhcmUgZXhpc3RlZFxuICAgICAgICB2YXIgZmFjZU51bWJlciA9IGlzQ3ViZU1hcCA/IDYgOiAxO1xuICAgICAgICB2YXIgbWlwbWFwQ291bnQgPSAxO1xuICAgICAgICBpZiAoaGFzTWlwbWFwKSB7XG4gICAgICAgICAgICBtaXBtYXBDb3VudCA9IE1hdGgubWF4KDEsIGhlYWRlcltvZmZfbWlwbWFwQ291bnRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0dXJlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGZhY2VOdW1iZXI7IGYrKykge1xuICAgICAgICAgICAgdmFyIF93aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgdmFyIF9oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB0ZXh0dXJlc1tmXSA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgICAgIHdpZHRoIDogX3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCA6IF9oZWlnaHQsXG4gICAgICAgICAgICAgICAgZm9ybWF0IDogaW50ZXJuYWxGb3JtYXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIG1pcG1hcHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWlwbWFwQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhTGVuZ3RoID0gTWF0aC5tYXgoNCwgX3dpZHRoKSAvIDQgKiBNYXRoLm1heCg0LCBfaGVpZ2h0KSAvIDQgKiBibG9ja0J5dGVzO1xuICAgICAgICAgICAgICAgIHZhciBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YUxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0ICs9IGRhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgX3dpZHRoICo9IDAuNTtcbiAgICAgICAgICAgICAgICBfaGVpZ2h0ICo9IDAuNTtcbiAgICAgICAgICAgICAgICBtaXBtYXBzW2ldID0gYnl0ZUFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dHVyZXNbZl0ucGl4ZWxzID0gbWlwbWFwc1swXTtcbiAgICAgICAgICAgIGlmIChoYXNNaXBtYXApIHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlc1tmXS5taXBtYXBzID0gbWlwbWFwcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIC8vIHJldHVybiBpc0N1YmVNYXAgPyB0ZXh0dXJlcyA6IHRleHR1cmVzWzBdO1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICBvdXQud2lkdGggPSB0ZXh0dXJlc1swXS53aWR0aDtcbiAgICAgICAgICAgIG91dC5oZWlnaHQgPSB0ZXh0dXJlc1swXS5oZWlnaHQ7XG4gICAgICAgICAgICBvdXQuZm9ybWF0ID0gdGV4dHVyZXNbMF0uZm9ybWF0O1xuICAgICAgICAgICAgb3V0LnBpeGVscyA9IHRleHR1cmVzWzBdLnBpeGVscztcbiAgICAgICAgICAgIG91dC5taXBtYXBzID0gdGV4dHVyZXNbMF0ubWlwbWFwcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlc1swXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJldDtcbiIsImltcG9ydCBUZXh0dXJlIGZyb20gJy4uL1RleHR1cmUnO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xudmFyIHRvQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbnZhciBNSU5FTEVOID0gODtcbnZhciBNQVhFTEVOID0gMHg3ZmZmO1xuZnVuY3Rpb24gcmdiZTJmbG9hdChyZ2JlLCBidWZmZXIsIG9mZnNldCwgZXhwb3N1cmUpIHtcbiAgICBpZiAocmdiZVszXSA+IDApIHtcbiAgICAgICAgdmFyIGYgPSBNYXRoLnBvdygyLjAsIHJnYmVbM10gLSAxMjggLSA4ICsgZXhwb3N1cmUpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0ICsgMF0gPSByZ2JlWzBdICogZjtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDFdID0gcmdiZVsxXSAqIGY7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQgKyAyXSA9IHJnYmVbMl0gKiBmO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDBdID0gMDtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDFdID0gMDtcbiAgICAgICAgYnVmZmVyW29mZnNldCArIDJdID0gMDtcbiAgICB9XG4gICAgYnVmZmVyW29mZnNldCArIDNdID0gMS4wO1xuICAgIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHVpbnQ4MnN0cmluZyhhcnJheSwgb2Zmc2V0LCBzaXplKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQ7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgc3RyICs9IHRvQ2hhcihhcnJheVtpXSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIGNvcHlyZ2JlKHMsIHQpIHtcbiAgICB0WzBdID0gc1swXTtcbiAgICB0WzFdID0gc1sxXTtcbiAgICB0WzJdID0gc1syXTtcbiAgICB0WzNdID0gc1szXTtcbn1cblxuLy8gVE9ETyA6IGNoZWNrXG5mdW5jdGlvbiBvbGRSZWFkQ29sb3JzKHNjYW4sIGJ1ZmZlciwgb2Zmc2V0LCB4bWF4KSB7XG4gICAgdmFyIHJzaGlmdCA9IDAsIHggPSAwLCBsZW4gPSB4bWF4O1xuICAgIHdoaWxlIChsZW4gPiAwKSB7XG4gICAgICAgIHNjYW5beF1bMF0gPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICBzY2FuW3hdWzFdID0gYnVmZmVyW29mZnNldCsrXTtcbiAgICAgICAgc2Nhblt4XVsyXSA9IGJ1ZmZlcltvZmZzZXQrK107XG4gICAgICAgIHNjYW5beF1bM10gPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICBpZiAoc2Nhblt4XVswXSA9PT0gMSAmJiBzY2FuW3hdWzFdID09PSAxICYmIHNjYW5beF1bMl0gPT09IDEpIHtcbiAgICAgICAgICAgIC8vIGV4cCBpcyBjb3VudCBvZiByZXBlYXRlZCBwaXhlbHNcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAoc2Nhblt4XVszXSA8PCByc2hpZnQpID4+PiAwOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29weXJnYmUoc2Nhblt4LTFdLCBzY2FuW3hdKTtcbiAgICAgICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICAgICAgbGVuLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByc2hpZnQgKz0gODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICAgICAgcnNoaWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5mdW5jdGlvbiByZWFkQ29sb3JzKHNjYW4sIGJ1ZmZlciwgb2Zmc2V0LCB4bWF4KSB7XG4gICAgaWYgKCh4bWF4IDwgTUlORUxFTikgfCAoeG1heCA+IE1BWEVMRU4pKSB7XG4gICAgICAgIHJldHVybiBvbGRSZWFkQ29sb3JzKHNjYW4sIGJ1ZmZlciwgb2Zmc2V0LCB4bWF4KTtcbiAgICB9XG4gICAgdmFyIGkgPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgIGlmIChpICE9IDIpIHtcbiAgICAgICAgcmV0dXJuIG9sZFJlYWRDb2xvcnMoc2NhbiwgYnVmZmVyLCBvZmZzZXQgLSAxLCB4bWF4KTtcbiAgICB9XG4gICAgc2NhblswXVsxXSA9IGJ1ZmZlcltvZmZzZXQrK107XG4gICAgc2NhblswXVsyXSA9IGJ1ZmZlcltvZmZzZXQrK107XG5cbiAgICBpID0gYnVmZmVyW29mZnNldCsrXTtcbiAgICBpZiAoKCgoc2NhblswXVsyXSA8PCA4KSA+Pj4gMCkgfCBpKSA+Pj4gMCAhPT0geG1heCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB4bWF4Oykge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICAgICAgaWYgKGNvZGUgPiAxMjgpIHtcbiAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgJiAxMjcpID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjb2RlLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2Nhblt4KytdW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvZGUtLSkge1xuICAgICAgICAgICAgICAgICAgICBzY2FuW3grK11baV0gPSBidWZmZXJbb2Zmc2V0KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5cbnZhciByZXQgPSB7XG4gICAgLy8gaHR0cDovL3d3dy5ncmFwaGljcy5jb3JuZWxsLmVkdS9+Ymp3L3JnYmUuaHRtbFxuICAgIC8vIEJsZW5kZXIgc291cmNlXG4gICAgLy8gaHR0cDovL3JhZHNpdGUubGJsLmdvdi9yYWRpYW5jZS9yZWZlci9Ob3Rlcy9waWN0dXJlX2Zvcm1hdC5odG1sXG4gICAgcGFyc2VSR0JFOiBmdW5jdGlvbihhcnJheUJ1ZmZlciwgdGV4dHVyZSwgZXhwb3N1cmUpIHtcbiAgICAgICAgaWYgKGV4cG9zdXJlID09IG51bGwpIHtcbiAgICAgICAgICAgIGV4cG9zdXJlID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdmFyIHNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKHVpbnQ4MnN0cmluZyhkYXRhLCAwLCAyKSAhPT0gJyM/Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZW1wdHkgbGluZSwgbmV4dCBsaW5lIGlzIHJlc29sdXRpb24gaW5mb1xuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRvQ2hhcihkYXRhW2ldKSA9PT0gJ1xcbicgJiYgdG9DaGFyKGRhdGFbaSsxXSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gc2l6ZSkgeyAvLyBub3QgZm91bmRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIHJlc29sdXRpb24gaW5mbyBsaW5lXG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jaGFyID0gdG9DaGFyKGRhdGFbaV0pO1xuICAgICAgICAgICAgaWYgKF9jaGFyID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyICs9IF9jaGFyO1xuICAgICAgICB9XG4gICAgICAgIC8vIC1ZIE0gK1ggTlxuICAgICAgICB2YXIgdG1wID0gc3RyLnNwbGl0KCcgJyk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBwYXJzZUludCh0bXBbMV0pO1xuICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUludCh0bXBbM10pO1xuICAgICAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlYWQgYW5kIGRlY29kZSBhY3R1YWwgZGF0YVxuICAgICAgICB2YXIgb2Zmc2V0ID0gaSsxO1xuICAgICAgICB2YXIgc2NhbmxpbmUgPSBbXTtcbiAgICAgICAgLy8gbWVtemVyb1xuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIHNjYW5saW5lW3hdID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgIHNjYW5saW5lW3hdW2pdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGl4ZWxzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgICAgICB2YXIgb2Zmc2V0MiA9IDA7XG4gICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkQ29sb3JzKHNjYW5saW5lLCBkYXRhLCBvZmZzZXQsIHdpZHRoKTtcbiAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICByZ2JlMmZsb2F0KHNjYW5saW5lW3hdLCBwaXhlbHMsIG9mZnNldDIsIGV4cG9zdXJlKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQyICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHR1cmUpIHtcbiAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dHVyZS53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0ZXh0dXJlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGV4dHVyZS5waXhlbHMgPSBwaXhlbHM7XG4gICAgICAgIC8vIEhBTEZfRkxPQVQgY2FuJ3QgdXNlIEZsb2F0MzJBcnJheVxuICAgICAgICB0ZXh0dXJlLnR5cGUgPSBUZXh0dXJlLkZMT0FUO1xuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9LFxuXG4gICAgcGFyc2VSR0JFRnJvbVBORzogZnVuY3Rpb24ocG5nKSB7XG5cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXQ7XG4iLCJpbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vY29yZS9yZXF1ZXN0JztcbmltcG9ydCBFbnZpcm9ubWVudE1hcFBhc3MgZnJvbSAnLi4vcHJlUGFzcy9FbnZpcm9ubWVudE1hcCc7XG5pbXBvcnQgU2t5ZG9tZSBmcm9tICcuLi9wbHVnaW4vU2t5ZG9tZSc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi4vU2NlbmUnO1xuXG5pbXBvcnQgZGRzIGZyb20gJy4vZGRzJztcbmltcG9ydCBoZHIgZnJvbSAnLi9oZHInO1xuXG4vKipcbiAqIEBhbGlhcyBjbGF5LnV0aWwudGV4dHVyZVxuICovXG52YXIgdGV4dHVyZVV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfG9iamVjdH0gcGF0aFxuICAgICAqIEBwYXJhbSAge29iamVjdH0gW29wdGlvbl1cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW29uc3VjY2Vzc11cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gW29uZXJyb3JdXG4gICAgICogQHJldHVybiB7Y2xheS5UZXh0dXJlfVxuICAgICAqL1xuICAgIGxvYWRUZXh0dXJlOiBmdW5jdGlvbiAocGF0aCwgb3B0aW9uLCBvbnN1Y2Nlc3MsIG9uZXJyb3IpIHtcbiAgICAgICAgdmFyIHRleHR1cmU7XG4gICAgICAgIGlmICh0eXBlb2Yob3B0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb25zdWNjZXNzID0gb3B0aW9uO1xuICAgICAgICAgICAgb25lcnJvciA9IG9uc3VjY2VzcztcbiAgICAgICAgICAgIG9wdGlvbiA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uIHx8IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YocGF0aCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5tYXRjaCgvLmhkciQvKSB8fCBvcHRpb24uZmlsZVR5cGUgPT09ICdoZHInKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZVV0aWwuX2ZldGNoVGV4dHVyZShcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhkci5wYXJzZVJHQkUoZGF0YSwgdGV4dHVyZSwgb3B0aW9uLmV4cG9zdXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uc3VjY2VzcyAmJiBvbnN1Y2Nlc3ModGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uZXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvLmRkcyQvKSB8fCBvcHRpb24uZmlsZVR5cGUgPT09ICdkZHMnKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZVV0aWwuX2ZldGNoVGV4dHVyZShcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRkcy5wYXJzZShkYXRhLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uc3VjY2VzcyAmJiBvbnN1Y2Nlc3ModGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9uZXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoKTtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLmxvYWQocGF0aCk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5zdWNjZXNzKG9uc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5lcnJvcihvbmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YocGF0aCkgPT0gJ29iamVjdCcgJiYgdHlwZW9mKHBhdGgucHgpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZUN1YmUoKTtcbiAgICAgICAgICAgIHRleHR1cmUubG9hZChwYXRoKTtcbiAgICAgICAgICAgIHRleHR1cmUuc3VjY2VzcyhvbnN1Y2Nlc3MpO1xuICAgICAgICAgICAgdGV4dHVyZS5lcnJvcihvbmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHBhbm9yYW1hIHRleHR1cmUgYW5kIHJlbmRlciBpdCB0byBhIGN1YmUgbWFwXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlRleHR1cmVDdWJlfSBjdWJlTWFwXG4gICAgICogQHBhcmFtICB7b2JqZWN0fSBbb3B0aW9uXVxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59IFtvcHRpb24uZW5jb2RlUkdCTV1cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IFtvcHRpb24uZXhwb3N1cmVdXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtvbnN1Y2Nlc3NdXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IFtvbmVycm9yXVxuICAgICAqL1xuICAgIGxvYWRQYW5vcmFtYTogZnVuY3Rpb24gKHJlbmRlcmVyLCBwYXRoLCBjdWJlTWFwLCBvcHRpb24sIG9uc3VjY2Vzcywgb25lcnJvcikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHR5cGVvZihvcHRpb24pID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbnN1Y2Nlc3MgPSBvcHRpb247XG4gICAgICAgICAgICBvbmVycm9yID0gb25zdWNjZXNzO1xuICAgICAgICAgICAgb3B0aW9uID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb24gPSBvcHRpb24gfHwge307XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0dXJlVXRpbC5sb2FkVGV4dHVyZShwYXRoLCBvcHRpb24sIGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgICAgICB0ZXh0dXJlLmZsaXBZID0gb3B0aW9uLmZsaXBZIHx8IGZhbHNlO1xuICAgICAgICAgICAgc2VsZi5wYW5vcmFtYVRvQ3ViZU1hcChyZW5kZXJlciwgdGV4dHVyZSwgY3ViZU1hcCwgb3B0aW9uKTtcbiAgICAgICAgICAgIHRleHR1cmUuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgICAgICAgICBvbnN1Y2Nlc3MgJiYgb25zdWNjZXNzKGN1YmVNYXApO1xuICAgICAgICB9LCBvbmVycm9yKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgcGFub3JhbWEgdGV4dHVyZSB0byBhIGN1YmUgbWFwXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlRleHR1cmUyRH0gcGFub3JhbWFNYXBcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlRleHR1cmVDdWJlfSBjdWJlTWFwXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25cbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbb3B0aW9uLmVuY29kZVJHQk1dXG4gICAgICovXG4gICAgcGFub3JhbWFUb0N1YmVNYXA6IGZ1bmN0aW9uIChyZW5kZXJlciwgcGFub3JhbWFNYXAsIGN1YmVNYXAsIG9wdGlvbikge1xuICAgICAgICB2YXIgZW52aXJvbm1lbnRNYXBQYXNzID0gbmV3IEVudmlyb25tZW50TWFwUGFzcygpO1xuICAgICAgICB2YXIgc2t5ZG9tZSA9IG5ldyBTa3lkb21lKHtcbiAgICAgICAgICAgIHNjZW5lOiBuZXcgU2NlbmUoKVxuICAgICAgICB9KTtcbiAgICAgICAgc2t5ZG9tZS5tYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCBwYW5vcmFtYU1hcCk7XG5cbiAgICAgICAgb3B0aW9uID0gb3B0aW9uIHx8IHt9O1xuICAgICAgICBpZiAob3B0aW9uLmVuY29kZVJHQk0pIHtcbiAgICAgICAgICAgIHNreWRvbWUubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdSR0JNX0VOQ09ERScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW52aXJvbm1lbnRNYXBQYXNzLnRleHR1cmUgPSBjdWJlTWFwO1xuICAgICAgICBlbnZpcm9ubWVudE1hcFBhc3MucmVuZGVyKHJlbmRlcmVyLCBza3lkb21lLnNjZW5lKTtcbiAgICAgICAgZW52aXJvbm1lbnRNYXBQYXNzLnRleHR1cmUgPSBudWxsO1xuICAgICAgICBlbnZpcm9ubWVudE1hcFBhc3MuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgICAgIHJldHVybiBjdWJlTWFwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGhlaWdodCBtYXAgdG8gbm9ybWFsIG1hcFxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudH0gaW1hZ2VcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGVja0J1bXA9ZmFsc2VdXG4gICAgICogQHJldHVybiB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICovXG4gICAgaGVpZ2h0VG9Ob3JtYWw6IGZ1bmN0aW9uIChpbWFnZSwgY2hlY2tCdW1wKSB7XG4gICAgICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdmFyIHdpZHRoID0gY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjaGVja0J1bXAgPSBjaGVja0J1bXAgfHwgZmFsc2U7XG4gICAgICAgIHZhciBzcmNEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdmFyIGRzdERhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNyY0RhdGEuZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgaWYgKGNoZWNrQnVtcCkge1xuICAgICAgICAgICAgICAgIHZhciByID0gc3JjRGF0YS5kYXRhW2ldO1xuICAgICAgICAgICAgICAgIHZhciBnID0gc3JjRGF0YS5kYXRhW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB2YXIgYiA9IHNyY0RhdGEuZGF0YVtpICsgMl07XG4gICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBNYXRoLmFicyhyIC0gZykgKyBNYXRoLmFicyhnIC0gYik7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAyMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0dpdmVuIGltYWdlIGlzIG5vdCBhIGhlaWdodCBtYXAnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE1vZGlmaWVkIGZyb20gaHR0cDovL21yZG9vYi5jb20vbGFiL2phdmFzY3JpcHQvaGVpZ2h0Mm5vcm1hbC9cbiAgICAgICAgICAgIHZhciB4MSwgeTEsIHgyLCB5MjtcbiAgICAgICAgICAgIGlmIChpICUgKHdpZHRoICogNCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBsZWZ0IGVkZ2VcbiAgICAgICAgICAgICAgICB4MSA9IHNyY0RhdGEuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICB4MiA9IHNyY0RhdGEuZGF0YVtpICsgNF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpICUgKHdpZHRoICogNCkgPT09ICh3aWR0aCAtIDEpICogNCkge1xuICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGVkZ2VcbiAgICAgICAgICAgICAgICB4MSA9IHNyY0RhdGEuZGF0YVtpIC0gNF07XG4gICAgICAgICAgICAgICAgeDIgPSBzcmNEYXRhLmRhdGFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4MSA9IHNyY0RhdGEuZGF0YVtpIC0gNF07XG4gICAgICAgICAgICAgICAgeDIgPSBzcmNEYXRhLmRhdGFbaSArIDRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA8IHdpZHRoICogNCkge1xuICAgICAgICAgICAgICAgIC8vIHRvcCBlZGdlXG4gICAgICAgICAgICAgICAgeTEgPSBzcmNEYXRhLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgeTIgPSBzcmNEYXRhLmRhdGFbaSArIHdpZHRoICogNF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpID4gd2lkdGggKiAoaGVpZ2h0IC0gMSkgKiA0KSB7XG4gICAgICAgICAgICAgICAgLy8gYm90dG9tIGVkZ2VcbiAgICAgICAgICAgICAgICB5MSA9IHNyY0RhdGEuZGF0YVtpIC0gd2lkdGggKiA0XTtcbiAgICAgICAgICAgICAgICB5MiA9IHNyY0RhdGEuZGF0YVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHkxID0gc3JjRGF0YS5kYXRhW2kgLSB3aWR0aCAqIDRdO1xuICAgICAgICAgICAgICAgIHkyID0gc3JjRGF0YS5kYXRhW2kgKyB3aWR0aCAqIDRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkc3REYXRhLmRhdGFbaV0gPSAoeDEgLSB4MikgKyAxMjc7XG4gICAgICAgICAgICBkc3REYXRhLmRhdGFbaSArIDFdID0gKHkxIC0geTIpICsgMTI3O1xuICAgICAgICAgICAgZHN0RGF0YS5kYXRhW2kgKyAyXSA9IDI1NTtcbiAgICAgICAgICAgIGRzdERhdGEuZGF0YVtpICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShkc3REYXRhLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBoZWlnaHQgbWFwIHRvIG5vcm1hbCBtYXBcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR9IGltYWdlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hlY2tCdW1wPWZhbHNlXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdGhyZXNob2xkPTIwXVxuICAgICAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fVxuICAgICAqL1xuICAgIGlzSGVpZ2h0SW1hZ2U6IGZ1bmN0aW9uIChpbWcsIGRvd25TY2FsZVNpemUsIHRocmVzaG9sZCkge1xuICAgICAgICBpZiAoIWltZyB8fCAhaW1nLndpZHRoIHx8ICFpbWcuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdmFyIHNpemUgPSBkb3duU2NhbGVTaXplIHx8IDMyO1xuICAgICAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMjA7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgc2l6ZSwgc2l6ZSk7XG4gICAgICAgIHZhciBzcmNEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBzaXplLCBzaXplKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcmNEYXRhLmRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgIHZhciByID0gc3JjRGF0YS5kYXRhW2ldO1xuICAgICAgICAgICAgdmFyIGcgPSBzcmNEYXRhLmRhdGFbaSArIDFdO1xuICAgICAgICAgICAgdmFyIGIgPSBzcmNEYXRhLmRhdGFbaSArIDJdO1xuICAgICAgICAgICAgdmFyIGRpZmYgPSBNYXRoLmFicyhyIC0gZykgKyBNYXRoLmFicyhnIC0gYik7XG4gICAgICAgICAgICBpZiAoZGlmZiA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX2ZldGNoVGV4dHVyZTogZnVuY3Rpb24gKHBhdGgsIG9uc3VjY2Vzcywgb25lcnJvcikge1xuICAgICAgICByZXF1ZXN0LmdldCh7XG4gICAgICAgICAgICB1cmw6IHBhdGgsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICAgICAgICBvbmxvYWQ6IG9uc3VjY2VzcyxcbiAgICAgICAgICAgIG9uZXJyb3I6IG9uZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNoZXNzYm9hcmQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gW3NpemVdXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBbdW5pdFNpemVdXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbY29sb3IxXVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW2NvbG9yMl1cbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBjcmVhdGVDaGVzc2JvYXJkOiBmdW5jdGlvbiAoc2l6ZSwgdW5pdFNpemUsIGNvbG9yMSwgY29sb3IyKSB7XG4gICAgICAgIHNpemUgPSBzaXplIHx8IDUxMjtcbiAgICAgICAgdW5pdFNpemUgPSB1bml0U2l6ZSB8fCA2NDtcbiAgICAgICAgY29sb3IxID0gY29sb3IxIHx8ICdibGFjayc7XG4gICAgICAgIGNvbG9yMiA9IGNvbG9yMiB8fCAnd2hpdGUnO1xuXG4gICAgICAgIHZhciByZXBlYXQgPSBNYXRoLmNlaWwoc2l6ZSAvIHVuaXRTaXplKTtcblxuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjI7XG4gICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBzaXplLCBzaXplKTtcblxuICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3IxO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcGVhdDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRmlsbCA9IGogJSAyID8gKGkgJSAyKSA6IChpICUgMiAtIDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGkgKiB1bml0U2l6ZSwgaiAqIHVuaXRTaXplLCB1bml0U2l6ZSwgdW5pdFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBpbWFnZTogY2FudmFzLFxuICAgICAgICAgICAgYW5pc290cm9waWM6IDhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGJsYW5rIHB1cmUgY29sb3IgMXgxIHRleHR1cmVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGNvbG9yXG4gICAgICogQHJldHVybiB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICovXG4gICAgY3JlYXRlQmxhbms6IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuXG4gICAgICAgIHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBpbWFnZTogY2FudmFzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRleHR1cmVVdGlsO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCIjZGVmaW5lIFNBTVBMRV9OVU1CRVIgMTAyNFxcbiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OVxcbnVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbERpc3RyaWJ1dGlvbjtcXG51bmlmb3JtIHZlYzIgdmlld3BvcnRTaXplIDogWzUxMiwgMjU2XTtcXG5jb25zdCB2ZWMzIE4gPSB2ZWMzKDAuMCwgMC4wLCAxLjApO1xcbmNvbnN0IGZsb2F0IGZTYW1wbGVOdW1iZXIgPSBmbG9hdChTQU1QTEVfTlVNQkVSKTtcXG52ZWMzIGltcG9ydGFuY2VTYW1wbGVOb3JtYWwoZmxvYXQgaSwgZmxvYXQgcm91Z2huZXNzLCB2ZWMzIE4pIHtcXG4gICAgdmVjMyBIID0gdGV4dHVyZTJEKG5vcm1hbERpc3RyaWJ1dGlvbiwgdmVjMihyb3VnaG5lc3MsIGkpKS5yZ2I7XFxuICAgIHZlYzMgdXBWZWN0b3IgPSBhYnMoTi56KSA8IDAuOTk5ID8gdmVjMygwLjAsIDAuMCwgMS4wKSA6IHZlYzMoMS4wLCAwLjAsIDAuMCk7XFxuICAgIHZlYzMgdGFuZ2VudFggPSBub3JtYWxpemUoY3Jvc3ModXBWZWN0b3IsIE4pKTtcXG4gICAgdmVjMyB0YW5nZW50WSA9IGNyb3NzKE4sIHRhbmdlbnRYKTtcXG4gICAgcmV0dXJuIHRhbmdlbnRYICogSC54ICsgdGFuZ2VudFkgKiBILnkgKyBOICogSC56O1xcbn1cXG5mbG9hdCBHX1NtaXRoKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcXG4gICAgZmxvYXQgayA9IHJvdWdobmVzcyAqIHJvdWdobmVzcyAvIDIuMDtcXG4gICAgZmxvYXQgRzFWID0gTm9WIC8gKE5vViAqICgxLjAgLSBrKSArIGspO1xcbiAgICBmbG9hdCBHMUwgPSBOb0wgLyAoTm9MICogKDEuMCAtIGspICsgayk7XFxuICAgIHJldHVybiBHMUwgKiBHMVY7XFxufVxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjMiB1diA9IGdsX0ZyYWdDb29yZC54eSAvIHZpZXdwb3J0U2l6ZTtcXG4gICAgZmxvYXQgTm9WID0gdXYueDtcXG4gICAgZmxvYXQgcm91Z2huZXNzID0gdXYueTtcXG4gICAgdmVjMyBWO1xcbiAgICBWLnggPSBzcXJ0KDEuMCAtIE5vViAqIE5vVik7XFxuICAgIFYueSA9IDAuMDtcXG4gICAgVi56ID0gTm9WO1xcbiAgICBmbG9hdCBBID0gMC4wO1xcbiAgICBmbG9hdCBCID0gMC4wO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNBTVBMRV9OVU1CRVI7IGkrKykge1xcbiAgICAgICAgdmVjMyBIID0gaW1wb3J0YW5jZVNhbXBsZU5vcm1hbChmbG9hdChpKSAvIGZTYW1wbGVOdW1iZXIsIHJvdWdobmVzcywgTik7XFxuICAgICAgICB2ZWMzIEwgPSByZWZsZWN0KC1WLCBIKTtcXG4gICAgICAgIGZsb2F0IE5vTCA9IGNsYW1wKEwueiwgMC4wLCAxLjApO1xcbiAgICAgICAgZmxvYXQgTm9IID0gY2xhbXAoSC56LCAwLjAsIDEuMCk7XFxuICAgICAgICBmbG9hdCBWb0ggPSBjbGFtcChkb3QoViwgSCksIDAuMCwgMS4wKTtcXG4gICAgICAgIGlmIChOb0wgPiAwLjApIHtcXG4gICAgICAgICAgICBmbG9hdCBHID0gR19TbWl0aChyb3VnaG5lc3MsIE5vViwgTm9MKTtcXG4gICAgICAgICAgICBmbG9hdCBHX1ZpcyA9IEcgKiBWb0ggLyAoTm9IICogTm9WKTtcXG4gICAgICAgICAgICBmbG9hdCBGYyA9IHBvdygxLjAgLSBWb0gsIDUuMCk7XFxuICAgICAgICAgICAgQSArPSAoMS4wIC0gRmMpICogR19WaXM7XFxuICAgICAgICAgICAgQiArPSBGYyAqIEdfVmlzO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodmVjMihBLCBCKSAvIGZTYW1wbGVOdW1iZXIsIDAuMCwgMS4wKTtcXG59XFxuXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIiNkZWZpbmUgU0FNUExFX05VTUJFUiAxMDI0XFxuI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5XFxudW5pZm9ybSBtYXQ0IHZpZXdJbnZlcnNlIDogVklFV0lOVkVSU0U7XFxudW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZpcm9ubWVudE1hcDtcXG51bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxEaXN0cmlidXRpb247XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3MgOiAwLjU7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG5jb25zdCBmbG9hdCBmU2FtcGxlTnVtYmVyID0gZmxvYXQoU0FNUExFX05VTUJFUik7XFxuQGltcG9ydCBjbGF5LnV0aWwucmdibVxcbnZlYzMgaW1wb3J0YW5jZVNhbXBsZU5vcm1hbChmbG9hdCBpLCBmbG9hdCByb3VnaG5lc3MsIHZlYzMgTikge1xcbiAgICB2ZWMzIEggPSB0ZXh0dXJlMkQobm9ybWFsRGlzdHJpYnV0aW9uLCB2ZWMyKHJvdWdobmVzcywgaSkpLnJnYjtcXG4gICAgdmVjMyB1cFZlY3RvciA9IGFicyhOLnopIDwgMC45OTkgPyB2ZWMzKDAuMCwgMC4wLCAxLjApIDogdmVjMygxLjAsIDAuMCwgMC4wKTtcXG4gICAgdmVjMyB0YW5nZW50WCA9IG5vcm1hbGl6ZShjcm9zcyh1cFZlY3RvciwgTikpO1xcbiAgICB2ZWMzIHRhbmdlbnRZID0gY3Jvc3MoTiwgdGFuZ2VudFgpO1xcbiAgICByZXR1cm4gdGFuZ2VudFggKiBILnggKyB0YW5nZW50WSAqIEgueSArIE4gKiBILno7XFxufVxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjMyBleWVQb3MgPSB2aWV3SW52ZXJzZVszXS54eXo7XFxuICAgIHZlYzMgViA9IG5vcm1hbGl6ZSh2X1dvcmxkUG9zaXRpb24gLSBleWVQb3MpO1xcbiAgICB2ZWMzIE4gPSBWO1xcbiAgICB2ZWMzIFIgPSBWO1xcbiAgICB2ZWMzIHByZWZpbHRlcmVkQ29sb3IgPSB2ZWMzKDAuMCk7XFxuICAgIGZsb2F0IHRvdGFsV2VpZ2h0ID0gMC4wO1xcbiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNBTVBMRV9OVU1CRVI7IGkrKykge1xcbiAgICAgICAgdmVjMyBIID0gaW1wb3J0YW5jZVNhbXBsZU5vcm1hbChmbG9hdChpKSAvIGZTYW1wbGVOdW1iZXIsIHJvdWdobmVzcywgTik7XFxuICAgICAgICB2ZWMzIEwgPSByZWZsZWN0KC1WLCBIKTtcXG4gICAgICAgIGZsb2F0IE5vTCA9IGNsYW1wKGRvdChOLCBMKSwgMC4wLCAxLjApO1xcbiAgICAgICAgaWYgKE5vTCA+IDAuMCkge1xcbiAgICAgICAgICAgIHByZWZpbHRlcmVkQ29sb3IgKz0gZGVjb2RlSERSKHRleHR1cmVDdWJlKGVudmlyb25tZW50TWFwLCBMKSkucmdiICogTm9MO1xcbiAgICAgICAgICAgIHRvdGFsV2VpZ2h0ICs9IE5vTDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIRFIodmVjNChwcmVmaWx0ZXJlZENvbG9yIC8gdG90YWxXZWlnaHQsIDEuMCkpO1xcbn1cXG5cIjtcbiIsIi8vIEN1YmVtYXAgcHJlZmlsdGVyIHV0aWxpdHlcbi8vIGh0dHA6Ly93d3cudW5yZWFsZW5naW5lLmNvbS9maWxlcy9kb3dubG9hZHMvMjAxM1NpZ2dyYXBoUHJlc2VudGF0aW9uc05vdGVzLnBkZlxuLy8gaHR0cDovL2h0dHAuZGV2ZWxvcGVyLm52aWRpYS5jb20vR1BVR2VtczMvZ3B1Z2VtczNfY2gyMC5odG1sXG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IFBhc3MgZnJvbSAnLi4vY29tcG9zaXRvci9QYXNzJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5pbXBvcnQgU2hhZGVyIGZyb20gJy4uL1NoYWRlcic7XG5pbXBvcnQgU2t5Ym94IGZyb20gJy4uL3BsdWdpbi9Ta3lib3gnO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4uL1NjZW5lJztcbmltcG9ydCBFbnZpcm9ubWVudE1hcFBhc3MgZnJvbSAnLi4vcHJlUGFzcy9FbnZpcm9ubWVudE1hcCc7XG5pbXBvcnQgdmVuZG9yIGZyb20gJy4uL2NvcmUvdmVuZG9yJztcbmltcG9ydCB0ZXh0dXJlVXRpbCBmcm9tICcuL3RleHR1cmUnO1xuXG5pbXBvcnQgaW50ZWdyYXRlQlJERlNoYWRlckNvZGUgZnJvbSAnLi9zaGFkZXIvaW50ZWdyYXRlQlJERi5nbHNsLmpzJztcbmltcG9ydCBwcmVmaWx0ZXJGcmFnQ29kZSBmcm9tICcuL3NoYWRlci9wcmVmaWx0ZXIuZ2xzbC5qcyc7XG5cbnZhciBjdWJlbWFwVXRpbCA9IHt9O1xuXG52YXIgdGFyZ2V0cyA9IFsncHgnLCAnbngnLCAncHknLCAnbnknLCAncHonLCAnbnonXTtcblxuLyoqXG4gKiBAbmFtZSBjbGF5LnV0aWwuY3ViZW1hcC5wcmVmaWx0ZXJFbnZpcm9ubWVudE1hcFxuICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAqIEBwYXJhbSAge2NsYXkuVGV4dHVyZX0gZW52TWFwXG4gKiBAcGFyYW0gIHtPYmplY3R9IFt0ZXh0dXJlT3B0c11cbiAqIEBwYXJhbSAge251bWJlcn0gW3RleHR1cmVPcHRzLndpZHRoPTY0XVxuICogQHBhcmFtICB7bnVtYmVyfSBbdGV4dHVyZU9wdHMuaGVpZ2h0PTY0XVxuICogQHBhcmFtICB7bnVtYmVyfSBbdGV4dHVyZU9wdHMudHlwZV1cbiAqIEBwYXJhbSAge2Jvb2xlYW59IFt0ZXh0dXJlT3B0cy5lbmNvZGVSR0JNPWZhbHNlXVxuICogQHBhcmFtICB7Ym9vbGVhbn0gW3RleHR1cmVPcHRzLmRlY29kZVJHQk09ZmFsc2VdXG4gKiBAcGFyYW0gIHtjbGF5LlRleHR1cmUyRH0gW25vcm1hbERpc3RyaWJ1dGlvbl1cbiAqIEBwYXJhbSAge2NsYXkuVGV4dHVyZTJEfSBbYnJkZkxvb2t1cF1cbiAqL1xuY3ViZW1hcFV0aWwucHJlZmlsdGVyRW52aXJvbm1lbnRNYXAgPSBmdW5jdGlvbiAoXG4gICAgcmVuZGVyZXIsIGVudk1hcCwgdGV4dHVyZU9wdHMsIG5vcm1hbERpc3RyaWJ1dGlvbiwgYnJkZkxvb2t1cFxuKSB7XG4gICAgLy8gTm90IGNyZWF0ZSBvdGhlciByZW5kZXJlciwgaXQgaXMgZWFzeSBoYXZpbmcgaXNzdWUgb2YgY3Jvc3MgcmVmZXJlbmNlIG9mIHJlc291cmNlcyBsaWtlIGZyYW1lYnVmZmVyXG4gICAgLy8gUEVORElORyBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI/XG4gICAgaWYgKCFicmRmTG9va3VwIHx8ICFub3JtYWxEaXN0cmlidXRpb24pIHtcbiAgICAgICAgbm9ybWFsRGlzdHJpYnV0aW9uID0gY3ViZW1hcFV0aWwuZ2VuZXJhdGVOb3JtYWxEaXN0cmlidXRpb24oKTtcbiAgICAgICAgYnJkZkxvb2t1cCA9IGN1YmVtYXBVdGlsLmludGVncmF0ZUJSREYocmVuZGVyZXIsIG5vcm1hbERpc3RyaWJ1dGlvbik7XG4gICAgfVxuICAgIHRleHR1cmVPcHRzID0gdGV4dHVyZU9wdHMgfHwge307XG5cbiAgICB2YXIgd2lkdGggPSB0ZXh0dXJlT3B0cy53aWR0aCB8fCA2NDtcbiAgICB2YXIgaGVpZ2h0ID0gdGV4dHVyZU9wdHMuaGVpZ2h0IHx8IDY0O1xuXG4gICAgdmFyIHRleHR1cmVUeXBlID0gdGV4dHVyZU9wdHMudHlwZSB8fCBlbnZNYXAudHlwZTtcblxuICAgIC8vIFVzZSBzYW1lIHR5cGUgd2l0aCBnaXZlbiBlbnZNYXBcbiAgICB2YXIgcHJlZmlsdGVyZWRDdWJlTWFwID0gbmV3IFRleHR1cmVDdWJlKHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgdHlwZTogdGV4dHVyZVR5cGUsXG4gICAgICAgIGZsaXBZOiBmYWxzZSxcbiAgICAgICAgbWlwbWFwczogW11cbiAgICB9KTtcblxuICAgIGlmICghcHJlZmlsdGVyZWRDdWJlTWFwLmlzUG93ZXJPZlR3bygpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHBvd2VyIG9mIHR3byB0byBlbmFibGUgbWlwbWFwLicpO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gICAgdmFyIG1pcG1hcE51bSA9IE1hdGgubG9nKHNpemUpIC8gTWF0aC5sb2coMikgKyAxO1xuXG4gICAgdmFyIHByZWZpbHRlck1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgc2hhZGVyOiBuZXcgU2hhZGVyKHtcbiAgICAgICAgICAgIHZlcnRleDogU2hhZGVyLnNvdXJjZSgnY2xheS5za3lib3gudmVydGV4JyksXG4gICAgICAgICAgICBmcmFnbWVudDogcHJlZmlsdGVyRnJhZ0NvZGVcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICBwcmVmaWx0ZXJNYXRlcmlhbC5zZXQoJ25vcm1hbERpc3RyaWJ1dGlvbicsIG5vcm1hbERpc3RyaWJ1dGlvbik7XG5cbiAgICB0ZXh0dXJlT3B0cy5lbmNvZGVSR0JNICYmIHByZWZpbHRlck1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUkdCTV9FTkNPREUnKTtcbiAgICB0ZXh0dXJlT3B0cy5kZWNvZGVSR0JNICYmIHByZWZpbHRlck1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUkdCTV9ERUNPREUnKTtcblxuICAgIHZhciBkdW1teVNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdmFyIHNreUVudjtcblxuICAgIGlmIChlbnZNYXAgaW5zdGFuY2VvZiBUZXh0dXJlMkQpIHtcbiAgICAgICAgLy8gQ29udmVydCBwYW5vcmFtYSB0byBjdWJlbWFwXG4gICAgICAgIHZhciBlbnZDdWJlbWFwID0gbmV3IFRleHR1cmVDdWJlKHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgLy8gRklYTUUgRkxPQVQgdHlwZSB3aWxsIGNhdXNlIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCBlcnJvciBvbiBpT1NcbiAgICAgICAgICAgIHR5cGU6IHRleHR1cmVUeXBlID09PSBUZXh0dXJlLkZMT0FUID9cbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS5IQUxGX0ZMT0FUIDogdGV4dHVyZVR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHR1cmVVdGlsLnBhbm9yYW1hVG9DdWJlTWFwKHJlbmRlcmVyLCBlbnZNYXAsIGVudkN1YmVtYXAsIHtcbiAgICAgICAgICAgIC8vIFBFTkRJTkcgZW5jb2RlUkdCTSBzbyBpdCBjYW4gYmUgZGVjb2RlZCBhcyBSR0JNXG4gICAgICAgICAgICBlbmNvZGVSR0JNOiB0ZXh0dXJlT3B0cy5kZWNvZGVSR0JNXG4gICAgICAgIH0pO1xuICAgICAgICBlbnZNYXAgPSBlbnZDdWJlbWFwO1xuICAgIH1cbiAgICBza3lFbnYgPSBuZXcgU2t5Ym94KHtcbiAgICAgICAgc2NlbmU6IGR1bW15U2NlbmUsXG4gICAgICAgIG1hdGVyaWFsOiBwcmVmaWx0ZXJNYXRlcmlhbFxuICAgIH0pO1xuICAgIHNreUVudi5tYXRlcmlhbC5zZXQoJ2Vudmlyb25tZW50TWFwJywgZW52TWFwKTtcblxuICAgIHZhciBlbnZNYXBQYXNzID0gbmV3IEVudmlyb25tZW50TWFwUGFzcyh7XG4gICAgICAgIHRleHR1cmU6IHByZWZpbHRlcmVkQ3ViZU1hcFxuICAgIH0pO1xuXG4gICAgLy8gRm9yY2UgdG8gYmUgVU5TSUdORURfQllURVxuICAgIGlmICh0ZXh0dXJlT3B0cy5lbmNvZGVSR0JNKSB7XG4gICAgICAgIHRleHR1cmVUeXBlID0gcHJlZmlsdGVyZWRDdWJlTWFwLnR5cGUgPSBUZXh0dXJlLlVOU0lHTkVEX0JZVEU7XG4gICAgfVxuXG4gICAgdmFyIHJlbmRlclRhcmdldFRtcCA9IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICB0eXBlOiB0ZXh0dXJlVHlwZVxuICAgIH0pO1xuICAgIHZhciBmcmFtZUJ1ZmZlciA9IG5ldyBGcmFtZUJ1ZmZlcih7XG4gICAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIHZhciBBcnJheUN0b3IgPSB2ZW5kb3JbdGV4dHVyZVR5cGUgPT09IFRleHR1cmUuVU5TSUdORURfQllURSA/ICdVaW50OEFycmF5JyA6ICdGbG9hdDMyQXJyYXknXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pcG1hcE51bTsgaSsrKSB7XG4gICAgICAgIHByZWZpbHRlcmVkQ3ViZU1hcC5taXBtYXBzW2ldID0ge1xuICAgICAgICAgICAgcGl4ZWxzOiB7fVxuICAgICAgICB9O1xuICAgICAgICBza3lFbnYubWF0ZXJpYWwuc2V0KCdyb3VnaG5lc3MnLCBpIC8gKHRhcmdldHMubGVuZ3RoIC0gMSkpO1xuXG4gICAgICAgIC8vIFR3ZWFrIGZvdlxuICAgICAgICAvLyBodHRwOi8vdGhlLXdpdG5lc3MubmV0L25ld3MvMjAxMi8wMi9zZWFtbGVzcy1jdWJlLW1hcC1maWx0ZXJpbmcvXG4gICAgICAgIHZhciBuID0gcmVuZGVyVGFyZ2V0VG1wLndpZHRoO1xuICAgICAgICB2YXIgZm92ID0gMiAqIE1hdGguYXRhbihuIC8gKG4gLSAwLjUpKSAvIE1hdGguUEkgKiAxODA7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0YXJnZXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGl4ZWxzID0gbmV3IEFycmF5Q3RvcihyZW5kZXJUYXJnZXRUbXAud2lkdGggKiByZW5kZXJUYXJnZXRUbXAuaGVpZ2h0ICogNCk7XG4gICAgICAgICAgICBmcmFtZUJ1ZmZlci5hdHRhY2gocmVuZGVyVGFyZ2V0VG1wKTtcbiAgICAgICAgICAgIGZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICB2YXIgY2FtZXJhID0gZW52TWFwUGFzcy5nZXRDYW1lcmEodGFyZ2V0c1tqXSk7XG4gICAgICAgICAgICBjYW1lcmEuZm92ID0gZm92O1xuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKGR1bW15U2NlbmUsIGNhbWVyYSk7XG4gICAgICAgICAgICByZW5kZXJlci5nbC5yZWFkUGl4ZWxzKFxuICAgICAgICAgICAgICAgIDAsIDAsIHJlbmRlclRhcmdldFRtcC53aWR0aCwgcmVuZGVyVGFyZ2V0VG1wLmhlaWdodCxcbiAgICAgICAgICAgICAgICBUZXh0dXJlLlJHQkEsIHRleHR1cmVUeXBlLCBwaXhlbHNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIC8vIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgIC8vIGNhbnZhcy53aWR0aCA9IHJlbmRlclRhcmdldFRtcC53aWR0aDtcbiAgICAgICAgICAgIC8vIGNhbnZhcy5oZWlnaHQgPSByZW5kZXJUYXJnZXRUbXAuaGVpZ2h0O1xuICAgICAgICAgICAgLy8gdmFyIGltYWdlRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEocmVuZGVyVGFyZ2V0VG1wLndpZHRoLCByZW5kZXJUYXJnZXRUbXAuaGVpZ2h0KTtcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGsgPSAwOyBrIDwgcGl4ZWxzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAvLyAgICAgaW1hZ2VEYXRhLmRhdGFba10gPSBwaXhlbHNba107XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgICAgICAgICAvLyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG5cbiAgICAgICAgICAgIGZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG4gICAgICAgICAgICBwcmVmaWx0ZXJlZEN1YmVNYXAubWlwbWFwc1tpXS5waXhlbHNbdGFyZ2V0c1tqXV0gPSBwaXhlbHM7XG4gICAgICAgIH1cblxuICAgICAgICByZW5kZXJUYXJnZXRUbXAud2lkdGggLz0gMjtcbiAgICAgICAgcmVuZGVyVGFyZ2V0VG1wLmhlaWdodCAvPSAyO1xuICAgICAgICByZW5kZXJUYXJnZXRUbXAuZGlydHkoKTtcbiAgICB9XG5cbiAgICBmcmFtZUJ1ZmZlci5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICByZW5kZXJUYXJnZXRUbXAuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgc2t5RW52LmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIC8vIFJlbW92ZSBncHUgcmVzb3VyY2UgYWxsdWNhdGVkIGluIHJlbmRlcmVyXG4gICAgbm9ybWFsRGlzdHJpYnV0aW9uLmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgLy8gcmVuZGVyZXIuZGlzcG9zZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZW52aXJvbm1lbnRNYXA6IHByZWZpbHRlcmVkQ3ViZU1hcCxcbiAgICAgICAgYnJkZkxvb2t1cDogYnJkZkxvb2t1cCxcbiAgICAgICAgbm9ybWFsRGlzdHJpYnV0aW9uOiBub3JtYWxEaXN0cmlidXRpb24sXG4gICAgICAgIG1heE1pcG1hcExldmVsOiBtaXBtYXBOdW1cbiAgICB9O1xufTtcblxuY3ViZW1hcFV0aWwuaW50ZWdyYXRlQlJERiA9IGZ1bmN0aW9uIChyZW5kZXJlciwgbm9ybWFsRGlzdHJpYnV0aW9uKSB7XG4gICAgbm9ybWFsRGlzdHJpYnV0aW9uID0gbm9ybWFsRGlzdHJpYnV0aW9uIHx8IGN1YmVtYXBVdGlsLmdlbmVyYXRlTm9ybWFsRGlzdHJpYnV0aW9uKCk7XG4gICAgdmFyIGZyYW1lYnVmZmVyID0gbmV3IEZyYW1lQnVmZmVyKHtcbiAgICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIHBhc3MgPSBuZXcgUGFzcyh7XG4gICAgICAgIGZyYWdtZW50OiBpbnRlZ3JhdGVCUkRGU2hhZGVyQ29kZVxuICAgIH0pO1xuXG4gICAgdmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgd2lkdGg6IDUxMixcbiAgICAgICAgaGVpZ2h0OiAyNTYsXG4gICAgICAgIHR5cGU6IFRleHR1cmUuSEFMRl9GTE9BVCxcbiAgICAgICAgbWluRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1QsXG4gICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICB1c2VNaXBtYXA6IGZhbHNlXG4gICAgfSk7XG4gICAgcGFzcy5zZXRVbmlmb3JtKCdub3JtYWxEaXN0cmlidXRpb24nLCBub3JtYWxEaXN0cmlidXRpb24pO1xuICAgIHBhc3Muc2V0VW5pZm9ybSgndmlld3BvcnRTaXplJywgWzUxMiwgMjU2XSk7XG4gICAgcGFzcy5hdHRhY2hPdXRwdXQodGV4dHVyZSk7XG4gICAgcGFzcy5yZW5kZXIocmVuZGVyZXIsIGZyYW1lYnVmZmVyKTtcblxuICAgIC8vIEZJWE1FIE9ubHkgY2hyb21lIGFuZCBmaXJlZm94IGNhbiByZWFkUGl4ZWxzIHdpdGggZmxvYXQgdHlwZS5cbiAgICAvLyBmcmFtZWJ1ZmZlci5iaW5kKHJlbmRlcmVyKTtcbiAgICAvLyB2YXIgcGl4ZWxzID0gbmV3IEZsb2F0MzJBcnJheSg1MTIgKiAyNTYgKiA0KTtcbiAgICAvLyByZW5kZXJlci5nbC5yZWFkUGl4ZWxzKFxuICAgIC8vICAgICAwLCAwLCB0ZXh0dXJlLndpZHRoLCB0ZXh0dXJlLmhlaWdodCxcbiAgICAvLyAgICAgVGV4dHVyZS5SR0JBLCBUZXh0dXJlLkZMT0FULCBwaXhlbHNcbiAgICAvLyApO1xuICAgIC8vIHRleHR1cmUucGl4ZWxzID0gcGl4ZWxzO1xuICAgIC8vIHRleHR1cmUuZmxpcFkgPSBmYWxzZTtcbiAgICAvLyB0ZXh0dXJlLmRpcnR5KCk7XG4gICAgLy8gZnJhbWVidWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcblxuICAgIGZyYW1lYnVmZmVyLmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgcmV0dXJuIHRleHR1cmU7XG59O1xuXG5jdWJlbWFwVXRpbC5nZW5lcmF0ZU5vcm1hbERpc3RyaWJ1dGlvbiA9IGZ1bmN0aW9uIChyb3VnaG5lc3NMZXZlbHMsIHNhbXBsZVNpemUpIHtcblxuICAgIC8vIGh0dHA6Ly9ob2xnZXIuZGFtbWVydHoub3JnL3N0dWZmL25vdGVzX0hhbW1lcnNsZXlPbkhlbWlzcGhlcmUuaHRtbFxuICAgIC8vIEdMU0wgbm90IHN1cHBvcnQgYml0IG9wZXJhdGlvbiwgdXNlIGxvb2t1cCBpbnN0ZWFkXG4gICAgLy8gViAtPiBpIC8gTiwgVSAtPiByb3VnaG5lc3NcbiAgICB2YXIgcm91Z2huZXNzTGV2ZWxzID0gcm91Z2huZXNzTGV2ZWxzIHx8IDI1NjtcbiAgICB2YXIgc2FtcGxlU2l6ZSA9IHNhbXBsZVNpemUgfHwgMTAyNDtcblxuICAgIHZhciBub3JtYWxEaXN0cmlidXRpb24gPSBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgd2lkdGg6IHJvdWdobmVzc0xldmVscyxcbiAgICAgICAgaGVpZ2h0OiBzYW1wbGVTaXplLFxuICAgICAgICB0eXBlOiBUZXh0dXJlLkZMT0FULFxuICAgICAgICBtaW5GaWx0ZXI6IFRleHR1cmUuTkVBUkVTVCxcbiAgICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1QsXG4gICAgICAgIHVzZU1pcG1hcDogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgcGl4ZWxzID0gbmV3IEZsb2F0MzJBcnJheShzYW1wbGVTaXplICogcm91Z2huZXNzTGV2ZWxzICogNCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgdmFyIHggPSBpIC8gc2FtcGxlU2l6ZTtcbiAgICAgICAgLy8gaHR0cDovL2hvbGdlci5kYW1tZXJ0ei5vcmcvc3R1ZmYvbm90ZXNfSGFtbWVyc2xleU9uSGVtaXNwaGVyZS5odG1sXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9yc1xuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5MDg0OTIvdW5zaWduZWQtaW50ZWdlci1pbi1qYXZhc2NyaXB0XG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTgyMjM1MC93aGF0LWlzLXRoZS1qYXZhc2NyaXB0LW9wZXJhdG9yLWFuZC1ob3ctZG8teW91LXVzZS1pdFxuICAgICAgICB2YXIgeSA9IChpIDw8IDE2IHwgaSA+Pj4gMTYpID4+PiAwO1xuICAgICAgICB5ID0gKCh5ICYgMTQzMTY1NTc2NSkgPDwgMSB8ICh5ICYgMjg2MzMxMTUzMCkgPj4+IDEpID4+PiAwO1xuICAgICAgICB5ID0gKCh5ICYgODU4OTkzNDU5KSA8PCAyIHwgKHkgJiAzNDM1OTczODM2KSA+Pj4gMikgPj4+IDA7XG4gICAgICAgIHkgPSAoKHkgJiAyNTI2NDUxMzUpIDw8IDQgfCAoeSAmIDQwNDIzMjIxNjApID4+PiA0KSA+Pj4gMDtcbiAgICAgICAgeSA9ICgoKHkgJiAxNjcxMTkzNSkgPDwgOCB8ICh5ICYgNDI3ODI1NTM2MCkgPj4+IDgpID4+PiAwKSAvIDQyOTQ5NjcyOTY7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3VnaG5lc3NMZXZlbHM7IGorKykge1xuICAgICAgICAgICAgdmFyIHJvdWdobmVzcyA9IGogLyByb3VnaG5lc3NMZXZlbHM7XG4gICAgICAgICAgICB2YXIgYSA9IHJvdWdobmVzcyAqIHJvdWdobmVzcztcbiAgICAgICAgICAgIHZhciBwaGkgPSAyLjAgKiBNYXRoLlBJICogeDtcbiAgICAgICAgICAgIC8vIENERlxuICAgICAgICAgICAgdmFyIGNvc1RoZXRhID0gTWF0aC5zcXJ0KCgxIC0geSkgLyAoMSArIChhICogYSAtIDEuMCkgKiB5KSk7XG4gICAgICAgICAgICB2YXIgc2luVGhldGEgPSBNYXRoLnNxcnQoMS4wIC0gY29zVGhldGEgKiBjb3NUaGV0YSk7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gKGkgKiByb3VnaG5lc3NMZXZlbHMgKyBqKSAqIDQ7XG4gICAgICAgICAgICBwaXhlbHNbb2Zmc2V0XSA9IHNpblRoZXRhICogTWF0aC5jb3MocGhpKTtcbiAgICAgICAgICAgIHBpeGVsc1tvZmZzZXQgKyAxXSA9IHNpblRoZXRhICogTWF0aC5zaW4ocGhpKTtcbiAgICAgICAgICAgIHBpeGVsc1tvZmZzZXQgKyAyXSA9IGNvc1RoZXRhO1xuICAgICAgICAgICAgcGl4ZWxzW29mZnNldCArIDNdID0gMS4wO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5vcm1hbERpc3RyaWJ1dGlvbi5waXhlbHMgPSBwaXhlbHM7XG5cbiAgICByZXR1cm4gbm9ybWFsRGlzdHJpYnV0aW9uO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3ViZW1hcFV0aWw7XG4iLCIvLyBodHRwczovL2RvY3MudW5yZWFsZW5naW5lLmNvbS9sYXRlc3QvSU5UL0VuZ2luZS9SZW5kZXJpbmcvTGlnaHRpbmdBbmRTaGFkb3dzL0FtYmllbnRDdWJlbWFwL1xuaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcbmltcG9ydCBjdWJlbWFwVXRpbCBmcm9tICcuLi91dGlsL2N1YmVtYXAnO1xuXG4vKipcbiAqIEFtYmllbnQgY3ViZW1hcCBsaWdodCBwcm92aWRlcyBzcGVjdWxhciBwYXJ0cyBvZiBJbWFnZSBCYXNlZCBMaWdodGluZy5cbiAqIFdoaWNoIGlzIGEgYmFzaWMgcmVxdWlyZW1lbnQgZm9yIFBoeXNpY2FsbHkgQmFzZWQgUmVuZGVyaW5nXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5BbWJpZW50Q3ViZW1hcFxuICogQGV4dGVuZHMgY2xheS5MaWdodFxuICovXG52YXIgQW1iaWVudEN1YmVtYXBMaWdodCA9IExpZ2h0LmV4dGVuZCh7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlQ3ViZX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50Q3ViZW1hcCNcbiAgICAgKi9cbiAgICBjdWJlbWFwOiBudWxsLFxuXG4gICAgLy8gVE9ET1xuICAgIC8vIHJhbmdlOiAxMDAsXG5cbiAgICBjYXN0U2hhZG93OiBmYWxzZSxcblxuICAgIF9ub3JtYWxEaXN0cmlidXRpb246IG51bGwsXG4gICAgX2JyZGZMb29rdXA6IG51bGxcblxufSwgLyoqIEBsZW5kcyBjbGF5LmxpZ2h0LkFtYmllbnRDdWJlbWFwIyAqLyB7XG5cbiAgICB0eXBlOiAnQU1CSUVOVF9DVUJFTUFQX0xJR0hUJyxcblxuICAgIC8qKlxuICAgICAqIERvIHByZWZpdGVyaW5nIHRoZSBjdWJlbWFwXG4gICAgICogQHBhcmFtIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0zMl1cbiAgICAgKi9cbiAgICBwcmVmaWx0ZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2l6ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2JyZGZMb29rdXApIHtcbiAgICAgICAgICAgIHRoaXMuX25vcm1hbERpc3RyaWJ1dGlvbiA9IGN1YmVtYXBVdGlsLmdlbmVyYXRlTm9ybWFsRGlzdHJpYnV0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9icmRmTG9va3VwID0gY3ViZW1hcFV0aWwuaW50ZWdyYXRlQlJERihyZW5kZXJlciwgdGhpcy5fbm9ybWFsRGlzdHJpYnV0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3ViZW1hcCA9IHRoaXMuY3ViZW1hcDtcbiAgICAgICAgaWYgKGN1YmVtYXAuX19wcmVmaWx0ZXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IGN1YmVtYXBVdGlsLnByZWZpbHRlckVudmlyb25tZW50TWFwKFxuICAgICAgICAgICAgcmVuZGVyZXIsIGN1YmVtYXAsIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVSR0JNOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICAgICAgICAgIGhlaWdodDogc2l6ZVxuICAgICAgICAgICAgfSwgdGhpcy5fbm9ybWFsRGlzdHJpYnV0aW9uLCB0aGlzLl9icmRmTG9va3VwXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY3ViZW1hcCA9IHJlc3VsdC5lbnZpcm9ubWVudE1hcDtcbiAgICAgICAgdGhpcy5jdWJlbWFwLl9fcHJlZmlsdGVyZWQgPSB0cnVlO1xuXG4gICAgICAgIGN1YmVtYXAuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgfSxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgYW1iaWVudEN1YmVtYXBMaWdodENvbG9yOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhbWJpZW50Q3ViZW1hcExpZ2h0Q3ViZW1hcDoge1xuICAgICAgICAgICAgdHlwZTogJ3QnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5jdWJlbWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGFtYmllbnRDdWJlbWFwTGlnaHRCUkRGTG9va3VwOiB7XG4gICAgICAgICAgICB0eXBlOiAndCcsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLl9icmRmTG9va3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQHJldHVybiB7Y2xheS5saWdodC5BbWJpZW50Q3ViZW1hcH1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50Q3ViZW1hcC5wcm90b3R5cGVcbiAgICAgKi9cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBbWJpZW50Q3ViZW1hcExpZ2h0O1xuIiwiaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcbmltcG9ydCB2ZW5kb3IgZnJvbSAnLi4vY29yZS92ZW5kb3InO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBIYXJtb25pYyBBbWJpZW50IExpZ2h0XG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5BbWJpZW50U0hcbiAqIEBleHRlbmRzIGNsYXkuTGlnaHRcbiAqL1xudmFyIEFtYmllbnRTSExpZ2h0ID0gTGlnaHQuZXh0ZW5kKHtcblxuICAgIGNhc3RTaGFkb3c6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogU3BoZXJpY2FsIEhhcm1vbmljIENvZWZmaWNpZW50c1xuICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5saWdodC5BbWJpZW50U0gjXG4gICAgICovXG4gICAgY29lZmZpY2llbnRzOiBbXSxcblxufSwgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX2NvZWZmaWNpZW50c1RtcEFyciA9IG5ldyB2ZW5kb3IuRmxvYXQzMkFycmF5KDkgKiAzKTtcbn0sIHtcblxuICAgIHR5cGU6ICdBTUJJRU5UX1NIX0xJR0hUJyxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgYW1iaWVudFNITGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBpbnN0YW5jZS5jb2xvcjtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZW5zaXR5ID0gaW5zdGFuY2UuaW50ZW5zaXR5O1xuICAgICAgICAgICAgICAgIHJldHVybiBbY29sb3JbMF0gKiBpbnRlbnNpdHksIGNvbG9yWzFdICogaW50ZW5zaXR5LCBjb2xvclsyXSAqIGludGVuc2l0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYW1iaWVudFNITGlnaHRDb2VmZmljaWVudHM6IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZWZmaWNpZW50c1RtcEFyciA9IGluc3RhbmNlLl9jb2VmZmljaWVudHNUbXBBcnI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnN0YW5jZS5jb2VmZmljaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29lZmZpY2llbnRzVG1wQXJyW2ldID0gaW5zdGFuY2UuY29lZmZpY2llbnRzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29lZmZpY2llbnRzVG1wQXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQHJldHVybiB7Y2xheS5saWdodC5BbWJpZW50fVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LmxpZ2h0LkFtYmllbnQucHJvdG90eXBlXG4gICAgICovXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQW1iaWVudFNITGlnaHQ7XG4iLCJpbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4uL2NvcmUvZ2xlbnVtJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL2NvcmUvdXRpbCc7XG5cbnZhciBUZXh0dXJlUG9vbCA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHRoaXMuX3Bvb2wgPSB7fTtcblxuICAgIHRoaXMuX2FsbG9jYXRlZFRleHR1cmVzID0gW107XG59O1xuXG5UZXh0dXJlUG9vbC5wcm90b3R5cGUgPSB7XG5cbiAgICBjb25zdHJ1Y3RvcjogVGV4dHVyZVBvb2wsXG5cbiAgICBnZXQ6IGZ1bmN0aW9uIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHZhciBrZXkgPSBnZW5lcmF0ZUtleShwYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKCF0aGlzLl9wb29sLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Bvb2xba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fcG9vbFtrZXldO1xuICAgICAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB0aGlzLl9hbGxvY2F0ZWRUZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3QucG9wKCk7XG4gICAgfSxcblxuICAgIHB1dDogZnVuY3Rpb24gKHRleHR1cmUpIHtcbiAgICAgICAgdmFyIGtleSA9IGdlbmVyYXRlS2V5KHRleHR1cmUpO1xuICAgICAgICBpZiAoIXRoaXMuX3Bvb2wuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5fcG9vbFtrZXldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLl9wb29sW2tleV07XG4gICAgICAgIGxpc3QucHVzaCh0ZXh0dXJlKTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2FsbG9jYXRlZFRleHR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvY2F0ZWRUZXh0dXJlc1tpXS5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb29sID0ge307XG4gICAgICAgIHRoaXMuX2FsbG9jYXRlZFRleHR1cmVzID0gW107XG4gICAgfVxufTtcblxudmFyIGRlZmF1bHRQYXJhbXMgPSB7XG4gICAgd2lkdGg6IDUxMixcbiAgICBoZWlnaHQ6IDUxMixcbiAgICB0eXBlOiBnbGVudW0uVU5TSUdORURfQllURSxcbiAgICBmb3JtYXQ6IGdsZW51bS5SR0JBLFxuICAgIHdyYXBTOiBnbGVudW0uQ0xBTVBfVE9fRURHRSxcbiAgICB3cmFwVDogZ2xlbnVtLkNMQU1QX1RPX0VER0UsXG4gICAgbWluRmlsdGVyOiBnbGVudW0uTElORUFSX01JUE1BUF9MSU5FQVIsXG4gICAgbWFnRmlsdGVyOiBnbGVudW0uTElORUFSLFxuICAgIHVzZU1pcG1hcDogdHJ1ZSxcbiAgICBhbmlzb3Ryb3BpYzogMSxcbiAgICBmbGlwWTogdHJ1ZSxcbiAgICB1bnBhY2tBbGlnbm1lbnQ6IDQsXG4gICAgcHJlbXVsdGlwbHlBbHBoYTogZmFsc2Vcbn07XG5cbnZhciBkZWZhdWx0UGFyYW1Qcm9wTGlzdCA9IE9iamVjdC5rZXlzKGRlZmF1bHRQYXJhbXMpO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUtleShwYXJhbWV0ZXJzKSB7XG4gICAgdXRpbC5kZWZhdWx0c1dpdGhQcm9wTGlzdChwYXJhbWV0ZXJzLCBkZWZhdWx0UGFyYW1zLCBkZWZhdWx0UGFyYW1Qcm9wTGlzdCk7XG4gICAgZmFsbEJhY2socGFyYW1ldGVycyk7XG5cbiAgICB2YXIga2V5ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0UGFyYW1Qcm9wTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmFtZSA9IGRlZmF1bHRQYXJhbVByb3BMaXN0W2ldO1xuICAgICAgICB2YXIgY2h1bmsgPSBwYXJhbWV0ZXJzW25hbWVdLnRvU3RyaW5nKCk7XG4gICAgICAgIGtleSArPSBjaHVuaztcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gZmFsbEJhY2sodGFyZ2V0KSB7XG5cbiAgICB2YXIgSVBPVCA9IGlzUG93ZXJPZlR3byh0YXJnZXQud2lkdGgsIHRhcmdldC5oZWlnaHQpO1xuXG4gICAgaWYgKHRhcmdldC5mb3JtYXQgPT09IGdsZW51bS5ERVBUSF9DT01QT05FTlQpIHtcbiAgICAgICAgdGFyZ2V0LnVzZU1pcG1hcCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghSVBPVCB8fCAhdGFyZ2V0LnVzZU1pcG1hcCkge1xuICAgICAgICBpZiAodGFyZ2V0Lm1pbkZpbHRlciA9PSBnbGVudW0uTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCB8fFxuICAgICAgICAgICAgdGFyZ2V0Lm1pbkZpbHRlciA9PSBnbGVudW0uTkVBUkVTVF9NSVBNQVBfTElORUFSKSB7XG4gICAgICAgICAgICB0YXJnZXQubWluRmlsdGVyID0gZ2xlbnVtLk5FQVJFU1Q7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0YXJnZXQubWluRmlsdGVyID09IGdsZW51bS5MSU5FQVJfTUlQTUFQX0xJTkVBUiB8fFxuICAgICAgICAgICAgdGFyZ2V0Lm1pbkZpbHRlciA9PSBnbGVudW0uTElORUFSX01JUE1BUF9ORUFSRVNUXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGFyZ2V0Lm1pbkZpbHRlciA9IGdsZW51bS5MSU5FQVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFJUE9UKSB7XG4gICAgICAgIHRhcmdldC53cmFwUyA9IGdsZW51bS5DTEFNUF9UT19FREdFO1xuICAgICAgICB0YXJnZXQud3JhcFQgPSBnbGVudW0uQ0xBTVBfVE9fRURHRTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzUG93ZXJPZlR3byh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgcmV0dXJuICh3aWR0aCAmICh3aWR0aC0xKSkgPT09IDAgJiZcbiAgICAgICAgICAgIChoZWlnaHQgJiAoaGVpZ2h0LTEpKSA9PT0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZVBvb2w7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5zbS5kZXB0aC52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG4jaWZkZWYgU0hBRE9XX1RSQU5TUEFSRU5UXFxuYXR0cmlidXRlIHZlYzIgdGV4Y29vcmQgOiBURVhDT09SRF8wO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52YXJ5aW5nIHZlYzQgdl9WaWV3UG9zaXRpb247XFxuI2lmZGVmIFNIQURPV19UUkFOU1BBUkVOVFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpe1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiNpZmRlZiBTS0lOTklOR1xcbiAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgc2tpbm5lZFBvc2l0aW9uID0gKHNraW5NYXRyaXhXUyAqIHZlYzQocG9zaXRpb24sIDEuMCkpLnh5ejtcXG4jZW5kaWZcXG4gICAgdl9WaWV3UG9zaXRpb24gPSB3b3JsZFZpZXdQcm9qZWN0aW9uICogdmVjNChza2lubmVkUG9zaXRpb24sIDEuMCk7XFxuICAgIGdsX1Bvc2l0aW9uID0gdl9WaWV3UG9zaXRpb247XFxuI2lmZGVmIFNIQURPV19UUkFOU1BBUkVOVFxcbiAgICB2X1RleGNvb3JkID0gdGV4Y29vcmQ7XFxuI2VuZGlmXFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuc20uZGVwdGguZnJhZ21lbnRcXG52YXJ5aW5nIHZlYzQgdl9WaWV3UG9zaXRpb247XFxuI2lmZGVmIFNIQURPV19UUkFOU1BBUkVOVFxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgYmlhcyA6IDAuMDAxO1xcbnVuaWZvcm0gZmxvYXQgc2xvcGVTY2FsZSA6IDEuMDtcXG4jaWZkZWYgU0hBRE9XX1RSQU5TUEFSRU5UXFxudW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNwYXJlbnRNYXA7XFxuI2VuZGlmXFxuQGltcG9ydCBjbGF5LnV0aWwuZW5jb2RlX2Zsb2F0XFxudm9pZCBtYWluKCl7XFxuICAgIGZsb2F0IGRlcHRoID0gdl9WaWV3UG9zaXRpb24ueiAvIHZfVmlld1Bvc2l0aW9uLnc7XFxuI2lmZGVmIFVTRV9WU01cXG4gICAgZGVwdGggPSBkZXB0aCAqIDAuNSArIDAuNTtcXG4gICAgZmxvYXQgbW9tZW50MSA9IGRlcHRoO1xcbiAgICBmbG9hdCBtb21lbnQyID0gZGVwdGggKiBkZXB0aDtcXG4gICAgZmxvYXQgZHggPSBkRmR4KGRlcHRoKTtcXG4gICAgZmxvYXQgZHkgPSBkRmR5KGRlcHRoKTtcXG4gICAgbW9tZW50MiArPSAwLjI1KihkeCpkeCtkeSpkeSk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobW9tZW50MSwgbW9tZW50MiwgMC4wLCAxLjApO1xcbiNlbHNlXFxuICAgIGZsb2F0IGR4ID0gZEZkeChkZXB0aCk7XFxuICAgIGZsb2F0IGR5ID0gZEZkeShkZXB0aCk7XFxuICAgIGRlcHRoICs9IHNxcnQoZHgqZHggKyBkeSpkeSkgKiBzbG9wZVNjYWxlICsgYmlhcztcXG4jaWZkZWYgU0hBRE9XX1RSQU5TUEFSRU5UXFxuICAgIGlmICh0ZXh0dXJlMkQodHJhbnNwYXJlbnRNYXAsIHZfVGV4Y29vcmQpLmEgPD0gMC4xKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdCgwLjk5OTkpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICB9XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvciA9IGVuY29kZUZsb2F0KGRlcHRoICogMC41ICsgMC41KTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5zbS5kZWJ1Z19kZXB0aFxcbnVuaWZvcm0gc2FtcGxlcjJEIGRlcHRoTWFwO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbkBpbXBvcnQgY2xheS51dGlsLmRlY29kZV9mbG9hdFxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjNCB0ZXggPSB0ZXh0dXJlMkQoZGVwdGhNYXAsIHZfVGV4Y29vcmQpO1xcbiNpZmRlZiBVU0VfVlNNXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4LnJnYiwgMS4wKTtcXG4jZWxzZVxcbiAgICBmbG9hdCBkZXB0aCA9IGRlY29kZUZsb2F0KHRleCk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZGVwdGgsIGRlcHRoLCBkZXB0aCwgMS4wKTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5zbS5kaXN0YW5jZS52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSBtYXQ0IHdvcmxkIDogV09STEQ7XFxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24gOiBQT1NJVElPTjtcXG5AaW1wb3J0IGNsYXkuY2h1bmsuc2tpbm5pbmdfaGVhZGVyXFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG52b2lkIG1haW4gKCl7XFxuICAgIHZlYzMgc2tpbm5lZFBvc2l0aW9uID0gcG9zaXRpb247XFxuI2lmZGVmIFNLSU5OSU5HXFxuICAgIEBpbXBvcnQgY2xheS5jaHVuay5za2luX21hdHJpeFxcbiAgICBza2lubmVkUG9zaXRpb24gPSAoc2tpbk1hdHJpeFdTICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6O1xcbiNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiAsIDEuMCk7XFxuICAgIHZfV29ybGRQb3NpdGlvbiA9ICh3b3JsZCAqIHZlYzQoc2tpbm5lZFBvc2l0aW9uLCAxLjApKS54eXo7XFxufVxcbkBlbmRcXG5AZXhwb3J0IGNsYXkuc20uZGlzdGFuY2UuZnJhZ21lbnRcXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXG51bmlmb3JtIGZsb2F0IHJhbmdlIDogMTAwO1xcbnZhcnlpbmcgdmVjMyB2X1dvcmxkUG9zaXRpb247XFxuQGltcG9ydCBjbGF5LnV0aWwuZW5jb2RlX2Zsb2F0XFxudm9pZCBtYWluKCl7XFxuICAgIGZsb2F0IGRpc3QgPSBkaXN0YW5jZShsaWdodFBvc2l0aW9uLCB2X1dvcmxkUG9zaXRpb24pO1xcbiNpZmRlZiBVU0VfVlNNXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZGlzdCwgZGlzdCAqIGRpc3QsIDAuMCwgMC4wKTtcXG4jZWxzZVxcbiAgICBkaXN0ID0gZGlzdCAvIHJhbmdlO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVGbG9hdChkaXN0KTtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5wbHVnaW4uc2hhZG93X21hcF9jb21tb25cXG5AaW1wb3J0IGNsYXkudXRpbC5kZWNvZGVfZmxvYXRcXG5mbG9hdCB0YXBTaGFkb3dNYXAoc2FtcGxlcjJEIG1hcCwgdmVjMiB1diwgZmxvYXQgeil7XFxuICAgIHZlYzQgdGV4ID0gdGV4dHVyZTJEKG1hcCwgdXYpO1xcbiAgICByZXR1cm4gc3RlcCh6LCBkZWNvZGVGbG9hdCh0ZXgpICogMi4wIC0gMS4wKTtcXG59XFxuZmxvYXQgcGNmKHNhbXBsZXIyRCBtYXAsIHZlYzIgdXYsIGZsb2F0IHosIGZsb2F0IHRleHR1cmVTaXplLCB2ZWMyIHNjYWxlKSB7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWIgPSB0YXBTaGFkb3dNYXAobWFwLCB1diwgeik7XFxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigxLjAgLyB0ZXh0dXJlU2l6ZSkgKiBzY2FsZTtcXG4jaWZkZWYgUENGX0tFUk5FTF9TSVpFXFxuICAgIGZvciAoaW50IF9pZHhfID0gMDsgX2lkeF8gPCBQQ0ZfS0VSTkVMX1NJWkU7IF9pZHhfKyspIHt7XFxuICAgICAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2ICsgb2Zmc2V0ICogcGNmS2VybmVsW19pZHhfXSwgeik7XFxuICAgIH19XFxuICAgIHJldHVybiBzaGFkb3dDb250cmliIC8gZmxvYXQoUENGX0tFUk5FTF9TSVpFICsgMSk7XFxuI2Vsc2VcXG4gICAgc2hhZG93Q29udHJpYiArPSB0YXBTaGFkb3dNYXAobWFwLCB1dit2ZWMyKG9mZnNldC54LCAwLjApLCB6KTtcXG4gICAgc2hhZG93Q29udHJpYiArPSB0YXBTaGFkb3dNYXAobWFwLCB1dit2ZWMyKG9mZnNldC54LCBvZmZzZXQueSksIHopO1xcbiAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2K3ZlYzIoLW9mZnNldC54LCBvZmZzZXQueSksIHopO1xcbiAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2K3ZlYzIoMC4wLCBvZmZzZXQueSksIHopO1xcbiAgICBzaGFkb3dDb250cmliICs9IHRhcFNoYWRvd01hcChtYXAsIHV2K3ZlYzIoLW9mZnNldC54LCAwLjApLCB6KTtcXG4gICAgc2hhZG93Q29udHJpYiArPSB0YXBTaGFkb3dNYXAobWFwLCB1dit2ZWMyKC1vZmZzZXQueCwgLW9mZnNldC55KSwgeik7XFxuICAgIHNoYWRvd0NvbnRyaWIgKz0gdGFwU2hhZG93TWFwKG1hcCwgdXYrdmVjMihvZmZzZXQueCwgLW9mZnNldC55KSwgeik7XFxuICAgIHNoYWRvd0NvbnRyaWIgKz0gdGFwU2hhZG93TWFwKG1hcCwgdXYrdmVjMigwLjAsIC1vZmZzZXQueSksIHopO1xcbiAgICByZXR1cm4gc2hhZG93Q29udHJpYiAvIDkuMDtcXG4jZW5kaWZcXG59XFxuZmxvYXQgcGNmKHNhbXBsZXIyRCBtYXAsIHZlYzIgdXYsIGZsb2F0IHosIGZsb2F0IHRleHR1cmVTaXplKSB7XFxuICAgIHJldHVybiBwY2YobWFwLCB1diwgeiwgdGV4dHVyZVNpemUsIHZlYzIoMS4wKSk7XFxufVxcbmZsb2F0IGNoZWJ5c2hldlVwcGVyQm91bmQodmVjMiBtb21lbnRzLCBmbG9hdCB6KXtcXG4gICAgZmxvYXQgcCA9IDAuMDtcXG4gICAgeiA9IHogKiAwLjUgKyAwLjU7XFxuICAgIGlmICh6IDw9IG1vbWVudHMueCkge1xcbiAgICAgICAgcCA9IDEuMDtcXG4gICAgfVxcbiAgICBmbG9hdCB2YXJpYW5jZSA9IG1vbWVudHMueSAtIG1vbWVudHMueCAqIG1vbWVudHMueDtcXG4gICAgdmFyaWFuY2UgPSBtYXgodmFyaWFuY2UsIDAuMDAwMDAwMSk7XFxuICAgIGZsb2F0IG1EID0gbW9tZW50cy54IC0gejtcXG4gICAgZmxvYXQgcE1heCA9IHZhcmlhbmNlIC8gKHZhcmlhbmNlICsgbUQgKiBtRCk7XFxuICAgIHBNYXggPSBjbGFtcCgocE1heC0wLjQpLygxLjAtMC40KSwgMC4wLCAxLjApO1xcbiAgICByZXR1cm4gbWF4KHAsIHBNYXgpO1xcbn1cXG5mbG9hdCBjb21wdXRlU2hhZG93Q29udHJpYihcXG4gICAgc2FtcGxlcjJEIG1hcCwgbWF0NCBsaWdodFZQTSwgdmVjMyBwb3NpdGlvbiwgZmxvYXQgdGV4dHVyZVNpemUsIHZlYzIgc2NhbGUsIHZlYzIgb2Zmc2V0XFxuKSB7XFxuICAgIHZlYzQgcG9zSW5MaWdodFNwYWNlID0gbGlnaHRWUE0gKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbiAgICBwb3NJbkxpZ2h0U3BhY2UueHl6IC89IHBvc0luTGlnaHRTcGFjZS53O1xcbiAgICBmbG9hdCB6ID0gcG9zSW5MaWdodFNwYWNlLno7XFxuICAgIGlmKGFsbChncmVhdGVyVGhhbihwb3NJbkxpZ2h0U3BhY2UueHl6LCB2ZWMzKC0wLjk5LCAtMC45OSwgLTEuMCkpKSAmJlxcbiAgICAgICAgYWxsKGxlc3NUaGFuKHBvc0luTGlnaHRTcGFjZS54eXosIHZlYzMoMC45OSwgMC45OSwgMS4wKSkpKXtcXG4gICAgICAgIHZlYzIgdXYgPSAocG9zSW5MaWdodFNwYWNlLnh5KzEuMCkgLyAyLjA7XFxuICAgICAgICAjaWZkZWYgVVNFX1ZTTVxcbiAgICAgICAgICAgIHZlYzIgbW9tZW50cyA9IHRleHR1cmUyRChtYXAsIHV2ICogc2NhbGUgKyBvZmZzZXQpLnh5O1xcbiAgICAgICAgICAgIHJldHVybiBjaGVieXNoZXZVcHBlckJvdW5kKG1vbWVudHMsIHopO1xcbiAgICAgICAgI2Vsc2VcXG4gICAgICAgICAgICByZXR1cm4gcGNmKG1hcCwgdXYgKiBzY2FsZSArIG9mZnNldCwgeiwgdGV4dHVyZVNpemUsIHNjYWxlKTtcXG4gICAgICAgICNlbmRpZlxcbiAgICB9XFxuICAgIHJldHVybiAxLjA7XFxufVxcbmZsb2F0IGNvbXB1dGVTaGFkb3dDb250cmliKHNhbXBsZXIyRCBtYXAsIG1hdDQgbGlnaHRWUE0sIHZlYzMgcG9zaXRpb24sIGZsb2F0IHRleHR1cmVTaXplKSB7XFxuICAgIHJldHVybiBjb21wdXRlU2hhZG93Q29udHJpYihtYXAsIGxpZ2h0VlBNLCBwb3NpdGlvbiwgdGV4dHVyZVNpemUsIHZlYzIoMS4wKSwgdmVjMigwLjApKTtcXG59XFxuZmxvYXQgY29tcHV0ZVNoYWRvd0NvbnRyaWJPbW5pKHNhbXBsZXJDdWJlIG1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJhbmdlKVxcbntcXG4gICAgZmxvYXQgZGlzdCA9IGxlbmd0aChkaXJlY3Rpb24pO1xcbiAgICB2ZWM0IHNoYWRvd1RleCA9IHRleHR1cmVDdWJlKG1hcCwgZGlyZWN0aW9uKTtcXG4jaWZkZWYgVVNFX1ZTTVxcbiAgICB2ZWMyIG1vbWVudHMgPSBzaGFkb3dUZXgueHk7XFxuICAgIGZsb2F0IHZhcmlhbmNlID0gbW9tZW50cy55IC0gbW9tZW50cy54ICogbW9tZW50cy54O1xcbiAgICBmbG9hdCBtRCA9IG1vbWVudHMueCAtIGRpc3Q7XFxuICAgIGZsb2F0IHAgPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIG1EICogbUQpO1xcbiAgICBpZihtb21lbnRzLnggKyAwLjAwMSA8IGRpc3Qpe1xcbiAgICAgICAgcmV0dXJuIGNsYW1wKHAsIDAuMCwgMS4wKTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gMS4wO1xcbiAgICB9XFxuI2Vsc2VcXG4gICAgcmV0dXJuIHN0ZXAoZGlzdCwgKGRlY29kZUZsb2F0KHNoYWRvd1RleCkgKyAwLjAwMDIpICogcmFuZ2UpO1xcbiNlbmRpZlxcbn1cXG5AZW5kXFxuQGV4cG9ydCBjbGF5LnBsdWdpbi5jb21wdXRlX3NoYWRvd19tYXBcXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVCkgfHwgZGVmaW5lZChESVJFQ1RJT05BTF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpIHx8IGRlZmluZWQoUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UKVxcbiNpZmRlZiBTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVFxcbnVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodFNoYWRvd01hcHNbU1BPVF9MSUdIVF9TSEFET1dNQVBfQ09VTlRdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gbWF0NCBzcG90TGlnaHRNYXRyaWNlc1tTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVF06dW5jb25maWd1cmFibGU7XFxudW5pZm9ybSBmbG9hdCBzcG90TGlnaHRTaGFkb3dNYXBTaXplc1tTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVF06dW5jb25maWd1cmFibGU7XFxuI2VuZGlmXFxuI2lmZGVmIERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVFxcbiNpZiBkZWZpbmVkKFNIQURPV19DQVNDQURFKVxcbnVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzWzFdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbExpZ2h0TWF0cmljZXNbU0hBRE9XX0NBU0NBREVdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gZmxvYXQgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcFNpemVzWzFdOnVuY29uZmlndXJhYmxlO1xcbnVuaWZvcm0gZmxvYXQgc2hhZG93Q2FzY2FkZUNsaXBzTmVhcltTSEFET1dfQ0FTQ0FERV06dW5jb25maWd1cmFibGU7XFxudW5pZm9ybSBmbG9hdCBzaGFkb3dDYXNjYWRlQ2xpcHNGYXJbU0hBRE9XX0NBU0NBREVdOnVuY29uZmlndXJhYmxlO1xcbiNlbHNlXFxudW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcHNbRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UXTp1bmNvbmZpZ3VyYWJsZTtcXG51bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzW0RJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVF06dW5jb25maWd1cmFibGU7XFxudW5pZm9ybSBmbG9hdCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXNbRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UXTp1bmNvbmZpZ3VyYWJsZTtcXG4jZW5kaWZcXG4jZW5kaWZcXG4jaWZkZWYgUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UXFxudW5pZm9ybSBzYW1wbGVyQ3ViZSBwb2ludExpZ2h0U2hhZG93TWFwc1tQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlRdOnVuY29uZmlndXJhYmxlO1xcbiNlbmRpZlxcbnVuaWZvcm0gYm9vbCBzaGFkb3dFbmFibGVkIDogdHJ1ZTtcXG4jaWZkZWYgUENGX0tFUk5FTF9TSVpFXFxudW5pZm9ybSB2ZWMyIHBjZktlcm5lbFtQQ0ZfS0VSTkVMX1NJWkVdO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5wbHVnaW4uc2hhZG93X21hcF9jb21tb25cXG4jaWYgZGVmaW5lZChTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG52b2lkIGNvbXB1dGVTaGFkb3dPZlNwb3RMaWdodHModmVjMyBwb3NpdGlvbiwgaW5vdXQgZmxvYXQgc2hhZG93Q29udHJpYnNbU1BPVF9MSUdIVF9DT1VOVF0gKSB7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWI7XFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IFNQT1RfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgc2hhZG93Q29udHJpYiA9IGNvbXB1dGVTaGFkb3dDb250cmliKFxcbiAgICAgICAgICAgIHNwb3RMaWdodFNoYWRvd01hcHNbX2lkeF9dLCBzcG90TGlnaHRNYXRyaWNlc1tfaWR4X10sIHBvc2l0aW9uLFxcbiAgICAgICAgICAgIHNwb3RMaWdodFNoYWRvd01hcFNpemVzW19pZHhfXVxcbiAgICAgICAgKTtcXG4gICAgICAgIHNoYWRvd0NvbnRyaWJzW19pZHhfXSA9IHNoYWRvd0NvbnRyaWI7XFxuICAgIH19XFxuICAgIGZvcihpbnQgX2lkeF8gPSBTUE9UX0xJR0hUX1NIQURPV01BUF9DT1VOVDsgX2lkeF8gPCBTUE9UX0xJR0hUX0NPVU5UOyBfaWR4XysrKXt7XFxuICAgICAgICBzaGFkb3dDb250cmlic1tfaWR4X10gPSAxLjA7XFxuICAgIH19XFxufVxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVClcXG4jaWZkZWYgU0hBRE9XX0NBU0NBREVcXG52b2lkIGNvbXB1dGVTaGFkb3dPZkRpcmVjdGlvbmFsTGlnaHRzKHZlYzMgcG9zaXRpb24sIGlub3V0IGZsb2F0IHNoYWRvd0NvbnRyaWJzW0RJUkVDVElPTkFMX0xJR0hUX0NPVU5UXSl7XFxuICAgIGZsb2F0IGRlcHRoID0gKDIuMCAqIGdsX0ZyYWdDb29yZC56IC0gZ2xfRGVwdGhSYW5nZS5uZWFyIC0gZ2xfRGVwdGhSYW5nZS5mYXIpXFxuICAgICAgICAgICAgICAgICAgICAvIChnbF9EZXB0aFJhbmdlLmZhciAtIGdsX0RlcHRoUmFuZ2UubmVhcik7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWI7XFxuICAgIHNoYWRvd0NvbnRyaWJzWzBdID0gMS4wO1xcbiAgICBmb3IgKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgU0hBRE9XX0NBU0NBREU7IF9pZHhfKyspIHt7XFxuICAgICAgICBpZiAoXFxuICAgICAgICAgICAgZGVwdGggPj0gc2hhZG93Q2FzY2FkZUNsaXBzTmVhcltfaWR4X10gJiZcXG4gICAgICAgICAgICBkZXB0aCA8PSBzaGFkb3dDYXNjYWRlQ2xpcHNGYXJbX2lkeF9dXFxuICAgICAgICApIHtcXG4gICAgICAgICAgICBzaGFkb3dDb250cmliID0gY29tcHV0ZVNoYWRvd0NvbnRyaWIoXFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzWzBdLCBkaXJlY3Rpb25hbExpZ2h0TWF0cmljZXNbX2lkeF9dLCBwb3NpdGlvbixcXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcFNpemVzWzBdLFxcbiAgICAgICAgICAgICAgICB2ZWMyKDEuMCAvIGZsb2F0KFNIQURPV19DQVNDQURFKSwgMS4wKSxcXG4gICAgICAgICAgICAgICAgdmVjMihmbG9hdChfaWR4XykgLyBmbG9hdChTSEFET1dfQ0FTQ0FERSksIDAuMClcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWJzWzBdID0gc2hhZG93Q29udHJpYjtcXG4gICAgICAgIH1cXG4gICAgfX1cXG4gICAgZm9yKGludCBfaWR4XyA9IERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVDsgX2lkeF8gPCBESVJFQ1RJT05BTF9MSUdIVF9DT1VOVDsgX2lkeF8rKykge3tcXG4gICAgICAgIHNoYWRvd0NvbnRyaWJzW19pZHhfXSA9IDEuMDtcXG4gICAgfX1cXG59XFxuI2Vsc2VcXG52b2lkIGNvbXB1dGVTaGFkb3dPZkRpcmVjdGlvbmFsTGlnaHRzKHZlYzMgcG9zaXRpb24sIGlub3V0IGZsb2F0IHNoYWRvd0NvbnRyaWJzW0RJUkVDVElPTkFMX0xJR0hUX0NPVU5UXSl7XFxuICAgIGZsb2F0IHNoYWRvd0NvbnRyaWI7XFxuICAgIGZvcihpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IERJUkVDVElPTkFMX0xJR0hUX1NIQURPV01BUF9DT1VOVDsgX2lkeF8rKykge3tcXG4gICAgICAgIHNoYWRvd0NvbnRyaWIgPSBjb21wdXRlU2hhZG93Q29udHJpYihcXG4gICAgICAgICAgICBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwc1tfaWR4X10sIGRpcmVjdGlvbmFsTGlnaHRNYXRyaWNlc1tfaWR4X10sIHBvc2l0aW9uLFxcbiAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBTaXplc1tfaWR4X11cXG4gICAgICAgICk7XFxuICAgICAgICBzaGFkb3dDb250cmlic1tfaWR4X10gPSBzaGFkb3dDb250cmliO1xcbiAgICB9fVxcbiAgICBmb3IoaW50IF9pZHhfID0gRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XyA8IERJUkVDVElPTkFMX0xJR0hUX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgc2hhZG93Q29udHJpYnNbX2lkeF9dID0gMS4wO1xcbiAgICB9fVxcbn1cXG4jZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZChQT0lOVF9MSUdIVF9TSEFET1dNQVBfQ09VTlQpXFxudm9pZCBjb21wdXRlU2hhZG93T2ZQb2ludExpZ2h0cyh2ZWMzIHBvc2l0aW9uLCBpbm91dCBmbG9hdCBzaGFkb3dDb250cmlic1tQT0lOVF9MSUdIVF9DT1VOVF0gKXtcXG4gICAgdmVjMyBsaWdodFBvc2l0aW9uO1xcbiAgICB2ZWMzIGRpcmVjdGlvbjtcXG4gICAgZm9yKGludCBfaWR4XyA9IDA7IF9pZHhfIDwgUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgbGlnaHRQb3NpdGlvbiA9IHBvaW50TGlnaHRQb3NpdGlvbltfaWR4X107XFxuICAgICAgICBkaXJlY3Rpb24gPSBwb3NpdGlvbiAtIGxpZ2h0UG9zaXRpb247XFxuICAgICAgICBzaGFkb3dDb250cmlic1tfaWR4X10gPSBjb21wdXRlU2hhZG93Q29udHJpYk9tbmkocG9pbnRMaWdodFNoYWRvd01hcHNbX2lkeF9dLCBkaXJlY3Rpb24sIHBvaW50TGlnaHRSYW5nZVtfaWR4X10pO1xcbiAgICB9fVxcbiAgICBmb3IoaW50IF9pZHhfID0gUE9JTlRfTElHSFRfU0hBRE9XTUFQX0NPVU5UOyBfaWR4XyA8IFBPSU5UX0xJR0hUX0NPVU5UOyBfaWR4XysrKSB7e1xcbiAgICAgICAgc2hhZG93Q29udHJpYnNbX2lkeF9dID0gMS4wO1xcbiAgICB9fVxcbn1cXG4jZW5kaWZcXG4jZW5kaWZcXG5AZW5kXCI7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IGdsZW51bSBmcm9tICcuLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuaW1wb3J0IEZydXN0dW0gZnJvbSAnLi4vbWF0aC9GcnVzdHVtJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4uL21hdGgvTWF0cml4NCc7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi4vUmVuZGVyZXInO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcbmltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IFNwb3RMaWdodCBmcm9tICcuLi9saWdodC9TcG90JztcbmltcG9ydCBEaXJlY3Rpb25hbExpZ2h0IGZyb20gJy4uL2xpZ2h0L0RpcmVjdGlvbmFsJztcbmltcG9ydCBQb2ludExpZ2h0IGZyb20gJy4uL2xpZ2h0L1BvaW50JztcbmltcG9ydCBzaGFkZXJMaWJyYXJ5IGZyb20gJy4uL3NoYWRlci9saWJyYXJ5JztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9NYXRlcmlhbCc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZUN1YmUgZnJvbSAnLi4vVGV4dHVyZUN1YmUnO1xuaW1wb3J0IFBlcnNwZWN0aXZlQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgT3J0aG9DYW1lcmEgZnJvbSAnLi4vY2FtZXJhL09ydGhvZ3JhcGhpYyc7XG5cbmltcG9ydCBQYXNzIGZyb20gJy4uL2NvbXBvc2l0b3IvUGFzcyc7XG5pbXBvcnQgVGV4dHVyZVBvb2wgZnJvbSAnLi4vY29tcG9zaXRvci9UZXh0dXJlUG9vbCc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG52YXIgdGFyZ2V0cyA9IFsncHgnLCAnbngnLCAncHknLCAnbnknLCAncHonLCAnbnonXTtcblxuaW1wb3J0IHNoYWRvd21hcEVzc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9zaGFkb3dtYXAuZ2xzbC5qcyc7XG5TaGFkZXJbJ2ltcG9ydCddKHNoYWRvd21hcEVzc2wpO1xuXG4vKipcbiAqIFBhc3MgcmVuZGVyaW5nIHNoYWRvdyBtYXAuXG4gKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucHJlUGFzcy5TaGFkb3dNYXBcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKiBAZXhhbXBsZVxuICogICAgIHZhciBzaGFkb3dNYXBQYXNzID0gbmV3IGNsYXkucHJlUGFzcy5TaGFkb3dNYXAoe1xuICogICAgICAgICBzb2Z0U2hhZG93OiBjbGF5LnByZVBhc3MuU2hhZG93TWFwLlZTTVxuICogICAgIH0pO1xuICogICAgIC4uLlxuICogICAgIGFuaW1hdGlvbi5vbignZnJhbWUnLCBmdW5jdGlvbiAoZnJhbWVUaW1lKSB7XG4gKiAgICAgICAgIHNoYWRvd01hcFBhc3MucmVuZGVyKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcbiAqICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICogICAgIH0pO1xuICovXG52YXIgU2hhZG93TWFwUGFzcyA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LnByZVBhc3MuU2hhZG93TWFwIyAqLyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTb2Z0IHNoYWRvdyB0ZWNobmlxdWUuXG4gICAgICAgICAqIENhbiBiZSB7QGxpbmsgY2xheS5wcmVQYXNzLlNoYWRvd01hcC5QQ0Z9IG9yIHtAbGluayBjbGF5LnByZVBhc3MuU2hhZG93TWFwLlZTTX1cbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNvZnRTaGFkb3c6IFNoYWRvd01hcFBhc3MuUENGLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTb2Z0IHNoYWRvdyBibHVyIHNpemVcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNoYWRvd0JsdXI6IDEuMCxcblxuICAgICAgICBsaWdodEZydXN0dW1CaWFzOiAnYXV0bycsXG5cbiAgICAgICAga2VybmVsUENGOiBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgICAgIDEsIDAsXG4gICAgICAgICAgICAxLCAxLFxuICAgICAgICAgICAgLTEsIDEsXG4gICAgICAgICAgICAwLCAxLFxuICAgICAgICAgICAgLTEsIDAsXG4gICAgICAgICAgICAtMSwgLTEsXG4gICAgICAgICAgICAxLCAtMSxcbiAgICAgICAgICAgIDAsIC0xXG4gICAgICAgIF0pLFxuXG4gICAgICAgIHByZWNpc2lvbjogJ21lZGl1bXAnLFxuXG4gICAgICAgIF9sYXN0UmVuZGVyTm90Q2FzdFNoYWRvdzogZmFsc2UsXG5cbiAgICAgICAgX2ZyYW1lQnVmZmVyOiBuZXcgRnJhbWVCdWZmZXIoKSxcblxuICAgICAgICBfdGV4dHVyZXM6IHt9LFxuICAgICAgICBfc2hhZG93TWFwTnVtYmVyOiB7XG4gICAgICAgICAgICAnUE9JTlRfTElHSFQnOiAwLFxuICAgICAgICAgICAgJ0RJUkVDVElPTkFMX0xJR0hUJzogMCxcbiAgICAgICAgICAgICdTUE9UX0xJR0hUJzogMFxuICAgICAgICB9LFxuXG4gICAgICAgIF9kZXB0aE1hdGVyaWFsczoge30sXG4gICAgICAgIF9kaXN0YW5jZU1hdGVyaWFsczoge30sXG5cbiAgICAgICAgX29wYXF1ZUNhc3RlcnM6IFtdLFxuICAgICAgICBfcmVjZWl2ZXJzOiBbXSxcbiAgICAgICAgX2xpZ2h0c0Nhc3RTaGFkb3c6IFtdLFxuXG4gICAgICAgIF9saWdodENhbWVyYXM6IHt9LFxuICAgICAgICBfbGlnaHRNYXRlcmlhbHM6IHt9LFxuXG4gICAgICAgIF90ZXh0dXJlUG9vbDogbmV3IFRleHR1cmVQb29sKClcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuICAgIC8vIEdhdXNzaWFuIGZpbHRlciBwYXNzIGZvciBWU01cbiAgICB0aGlzLl9nYXVzc2lhblBhc3NIID0gbmV3IFBhc3Moe1xuICAgICAgICBmcmFnbWVudDogU2hhZGVyLnNvdXJjZSgnY2xheS5jb21wb3NpdG9yLmdhdXNzaWFuX2JsdXInKVxuICAgIH0pO1xuICAgIHRoaXMuX2dhdXNzaWFuUGFzc1YgPSBuZXcgUGFzcyh7XG4gICAgICAgIGZyYWdtZW50OiBTaGFkZXIuc291cmNlKCdjbGF5LmNvbXBvc2l0b3IuZ2F1c3NpYW5fYmx1cicpXG4gICAgfSk7XG4gICAgdGhpcy5fZ2F1c3NpYW5QYXNzSC5zZXRVbmlmb3JtKCdibHVyU2l6ZScsIHRoaXMuc2hhZG93Qmx1cik7XG4gICAgdGhpcy5fZ2F1c3NpYW5QYXNzSC5zZXRVbmlmb3JtKCdibHVyRGlyJywgMC4wKTtcbiAgICB0aGlzLl9nYXVzc2lhblBhc3NWLnNldFVuaWZvcm0oJ2JsdXJTaXplJywgdGhpcy5zaGFkb3dCbHVyKTtcbiAgICB0aGlzLl9nYXVzc2lhblBhc3NWLnNldFVuaWZvcm0oJ2JsdXJEaXInLCAxLjApO1xuXG4gICAgdGhpcy5fb3V0cHV0RGVwdGhQYXNzID0gbmV3IFBhc3Moe1xuICAgICAgICBmcmFnbWVudDogU2hhZGVyLnNvdXJjZSgnY2xheS5zbS5kZWJ1Z19kZXB0aCcpXG4gICAgfSk7XG59LCB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIHNjZW5lIHRvIHNoYWRvdyB0ZXh0dXJlc1xuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtICB7Y2xheS5TY2VuZX0gc2NlbmVcbiAgICAgKiBAcGFyYW0gIHtjbGF5LkNhbWVyYX0gc2NlbmVDYW1lcmFcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbbm90VXBkYXRlU2NlbmU9ZmFsc2VdXG4gICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5TaGFkb3dNYXAucHJvdG90eXBlXG4gICAgICovXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHNjZW5lLCBzY2VuZUNhbWVyYSwgbm90VXBkYXRlU2NlbmUpIHtcbiAgICAgICAgaWYgKCFzY2VuZUNhbWVyYSkge1xuICAgICAgICAgICAgc2NlbmVDYW1lcmEgPSBzY2VuZS5nZXRNYWluQ2FtZXJhKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVyZW5kZXInLCB0aGlzLCByZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyU2hhZG93UGFzcyhyZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhLCBub3RVcGRhdGVTY2VuZSk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignYWZ0ZXJyZW5kZXInLCB0aGlzLCByZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVidWcgcmVuZGVyaW5nIG9mIHNoYWRvdyB0ZXh0dXJlc1xuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSBzaXplXG4gICAgICogQG1lbWJlck9mIGNsYXkucHJlUGFzcy5TaGFkb3dNYXAucHJvdG90eXBlXG4gICAgICovXG4gICAgcmVuZGVyRGVidWc6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2l6ZSkge1xuICAgICAgICByZW5kZXJlci5zYXZlQ2xlYXIoKTtcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gcmVuZGVyZXIudmlld3BvcnQ7XG4gICAgICAgIHZhciB4ID0gMCwgeSA9IDA7XG4gICAgICAgIHZhciB3aWR0aCA9IHNpemUgfHwgdmlld3BvcnQud2lkdGggLyA0O1xuICAgICAgICB2YXIgaGVpZ2h0ID0gd2lkdGg7XG4gICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXREZXB0aFBhc3MubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfVlNNJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXREZXB0aFBhc3MubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9WU00nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuX3RleHR1cmVzKSB7XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuX3RleHR1cmVzW25hbWVdO1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0Vmlld3BvcnQoeCwgeSwgd2lkdGggKiB0ZXh0dXJlLndpZHRoIC8gdGV4dHVyZS5oZWlnaHQsIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXREZXB0aFBhc3Muc2V0VW5pZm9ybSgnZGVwdGhNYXAnLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dERlcHRoUGFzcy5yZW5kZXIocmVuZGVyZXIpO1xuICAgICAgICAgICAgeCArPSB3aWR0aCAqIHRleHR1cmUud2lkdGggLyB0ZXh0dXJlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7XG4gICAgICAgIHJlbmRlcmVyLnJlc3RvcmVDbGVhcigpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlQ2FzdGVyQW5kUmVjZWl2ZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgbWVzaCkge1xuICAgICAgICBpZiAobWVzaC5jYXN0U2hhZG93KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGFxdWVDYXN0ZXJzLnB1c2gobWVzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lc2gucmVjZWl2ZVNoYWRvdykge1xuICAgICAgICAgICAgdGhpcy5fcmVjZWl2ZXJzLnB1c2gobWVzaCk7XG4gICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldCgnc2hhZG93RW5hYmxlZCcsIDEpO1xuXG4gICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldCgncGNmS2VybmVsJywgdGhpcy5rZXJuZWxQQ0YpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXQoJ3NoYWRvd0VuYWJsZWQnLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVzaC5tYXRlcmlhbC5zaGFkZXIgJiYgbWVzaC5tYXRlcmlhbC51cGRhdGVTaGFkZXIpIHtcbiAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudXBkYXRlU2hhZGVyKHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb2Z0U2hhZG93ID09PSBTaGFkb3dNYXBQYXNzLlZTTSkge1xuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9WU00nKTtcbiAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BDRl9LRVJORUxfU0laRScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC51bmRlZmluZSgnZnJhZ21lbnQnLCAnVVNFX1ZTTScpO1xuICAgICAgICAgICAgdmFyIGtlcm5lbFBDRiA9IHRoaXMua2VybmVsUENGO1xuICAgICAgICAgICAgaWYgKGtlcm5lbFBDRiAmJiBrZXJuZWxQQ0YubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BDRl9LRVJORUxfU0laRScsIGtlcm5lbFBDRi5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BDRl9LRVJORUxfU0laRScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIF91cGRhdGU6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZS5vcGFxdWVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDYXN0ZXJBbmRSZWNlaXZlcihyZW5kZXJlciwgc2NlbmUub3BhcXVlTGlzdFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZS50cmFuc3BhcmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIFRPRE8gVHJhbnNwYXJlbnQgb2JqZWN0IHJlY2VpdmUgc2hhZG93IHdpbGwgYmUgdmVyeSBzbG93XG4gICAgICAgICAgICAvLyBpbiBzdGVhbHRoIGRlbW8sIHN0aWxsIG5vdCBmaW5kIHRoZSByZWFzb25cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNhc3RlckFuZFJlY2VpdmVyKHJlbmRlcmVyLCBzY2VuZS50cmFuc3BhcmVudExpc3RbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmUubGlnaHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbGlnaHQgPSBzY2VuZS5saWdodHNbaV07XG4gICAgICAgICAgICBpZiAobGlnaHQuY2FzdFNoYWRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0c0Nhc3RTaGFkb3cucHVzaChsaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3JlbmRlclNoYWRvd1Bhc3M6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIHNjZW5lQ2FtZXJhLCBub3RVcGRhdGVTY2VuZSkge1xuICAgICAgICAvLyByZXNldFxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuX3NoYWRvd01hcE51bWJlcikge1xuICAgICAgICAgICAgdGhpcy5fc2hhZG93TWFwTnVtYmVyW25hbWVdID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saWdodHNDYXN0U2hhZG93Lmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX29wYXF1ZUNhc3RlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXJzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIGlmICghbm90VXBkYXRlU2NlbmUpIHtcbiAgICAgICAgICAgIHNjZW5lLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2VuZUNhbWVyYSkge1xuICAgICAgICAgICAgc2NlbmVDYW1lcmEudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGUocmVuZGVyZXIsIHNjZW5lKTtcblxuICAgICAgICAvLyBOZWVkcyB0byB1cGRhdGUgdGhlIHJlY2VpdmVycyBhZ2FpbiBpZiBzaGFkb3dzIGNvbWUgZnJvbSAxIHRvIDAuXG4gICAgICAgIGlmICghdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdy5sZW5ndGggJiYgdGhpcy5fbGFzdFJlbmRlck5vdENhc3RTaGFkb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RSZW5kZXJOb3RDYXN0U2hhZG93ID0gdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdyA9PT0gMDtcblxuICAgICAgICBfZ2wuZW5hYmxlKF9nbC5ERVBUSF9URVNUKTtcbiAgICAgICAgX2dsLmRlcHRoTWFzayh0cnVlKTtcbiAgICAgICAgX2dsLmRpc2FibGUoX2dsLkJMRU5EKTtcblxuICAgICAgICAvLyBDbGVhciB3aXRoIGhpZ2gteiwgc28gdGhlIHBhcnQgbm90IHJlbmRlcmVkIHdpbGwgbm90IGJlZW4gc2hhZG93ZWRcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICAvLyBUT0RPIHJlc3RvcmVcbiAgICAgICAgX2dsLmNsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTtcblxuICAgICAgICAvLyBTaGFkb3cgdW5pZm9ybXNcbiAgICAgICAgdmFyIHNwb3RMaWdodFNoYWRvd01hcHMgPSBbXTtcbiAgICAgICAgdmFyIHNwb3RMaWdodE1hdHJpY2VzID0gW107XG4gICAgICAgIHZhciBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcyA9IFtdO1xuICAgICAgICB2YXIgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzID0gW107XG4gICAgICAgIHZhciBzaGFkb3dDYXNjYWRlQ2xpcHMgPSBbXTtcbiAgICAgICAgdmFyIHBvaW50TGlnaHRTaGFkb3dNYXBzID0gW107XG5cbiAgICAgICAgdmFyIGRpckxpZ2h0SGFzQ2FzY2FkZTtcbiAgICAgICAgLy8gQ3JlYXRlIHRleHR1cmVzIGZvciBzaGFkb3cgbWFwXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGxpZ2h0ID0gdGhpcy5fbGlnaHRzQ2FzdFNoYWRvd1tpXTtcbiAgICAgICAgICAgIGlmIChsaWdodCBpbnN0YW5jZW9mIERpcmVjdGlvbmFsTGlnaHQpIHtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJMaWdodEhhc0Nhc2NhZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdPbmx5IG9uZSBkaXJlZWN0aW9uYWwgbGlnaHQgc3VwcG9ydGVkIHdpdGggc2hhZG93IGNhc2NhZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsaWdodC5zaGFkb3dDYXNjYWRlID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1N1cHBvcnQgYXQgbW9zdCA0IGNhc2NhZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsaWdodC5zaGFkb3dDYXNjYWRlID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJMaWdodEhhc0Nhc2NhZGUgPSBsaWdodC5zaGFkb3dDYXNjYWRlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRGlyZWN0aW9uYWxMaWdodFNoYWRvdyhcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLFxuICAgICAgICAgICAgICAgICAgICBzY2VuZUNhbWVyYSxcbiAgICAgICAgICAgICAgICAgICAgbGlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wYXF1ZUNhc3RlcnMsXG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd0Nhc2NhZGVDbGlwcyxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzLFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaWdodCBpbnN0YW5jZW9mIFNwb3RMaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyU3BvdExpZ2h0U2hhZG93KFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGFxdWVDYXN0ZXJzLFxuICAgICAgICAgICAgICAgICAgICBzcG90TGlnaHRNYXRyaWNlcyxcbiAgICAgICAgICAgICAgICAgICAgc3BvdExpZ2h0U2hhZG93TWFwc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaWdodCBpbnN0YW5jZW9mIFBvaW50TGlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclBvaW50TGlnaHRTaGFkb3coXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICAgICAgICAgICAgICBzY2VuZSxcbiAgICAgICAgICAgICAgICAgICAgbGlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wYXF1ZUNhc3RlcnMsXG4gICAgICAgICAgICAgICAgICAgIHBvaW50TGlnaHRTaGFkb3dNYXBzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc2hhZG93TWFwTnVtYmVyW2xpZ2h0LnR5cGVdKys7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBsaWdodFR5cGUgaW4gdGhpcy5fc2hhZG93TWFwTnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgbnVtYmVyID0gdGhpcy5fc2hhZG93TWFwTnVtYmVyW2xpZ2h0VHlwZV07XG4gICAgICAgICAgICB2YXIga2V5ID0gbGlnaHRUeXBlICsgJ19TSEFET1dNQVBfQ09VTlQnO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9yZWNlaXZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMuX3JlY2VpdmVyc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSBtZXNoLm1hdGVyaWFsO1xuICAgICAgICAgICAgICAgIGlmIChtYXRlcmlhbC5mcmFnbWVudERlZmluZXNba2V5XSAhPT0gbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50Jywga2V5LCBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGVyaWFsLmlzRGVmaW5lZCgnZnJhZ21lbnQnLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC51bmRlZmluZSgnZnJhZ21lbnQnLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcmVjZWl2ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMuX3JlY2VpdmVyc1tpXTtcbiAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICAgICAgICBpZiAoZGlyTGlnaHRIYXNDYXNjYWRlKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdTSEFET1dfQ0FTQ0FERScsIGRpckxpZ2h0SGFzQ2FzY2FkZS5zaGFkb3dDYXNjYWRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnVuZGVmaW5lKCdmcmFnbWVudCcsICdTSEFET1dfQ0FTQ0FERScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNoYWRvd1VuaWZvcm1zID0gc2NlbmUuc2hhZG93VW5pZm9ybXM7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0U2l6ZSh0ZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dHVyZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXMgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcy5tYXAoZ2V0U2l6ZSk7XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcyA9IHsgdmFsdWU6IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dNYXBzLCB0eXBlOiAndHYnIH07XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0TWF0cmljZXMgPSB7IHZhbHVlOiBkaXJlY3Rpb25hbExpZ2h0TWF0cmljZXMsIHR5cGU6ICdtNHYnIH07XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXMgPSB7IHZhbHVlOiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwU2l6ZXMsIHR5cGU6ICcxZnYnIH07XG4gICAgICAgICAgICBpZiAoZGlyTGlnaHRIYXNDYXNjYWRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNoYWRvd0Nhc2NhZGVDbGlwc05lYXIgPSBzaGFkb3dDYXNjYWRlQ2xpcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgc2hhZG93Q2FzY2FkZUNsaXBzRmFyID0gc2hhZG93Q2FzY2FkZUNsaXBzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgc2hhZG93Q2FzY2FkZUNsaXBzTmVhci5wb3AoKTtcbiAgICAgICAgICAgICAgICBzaGFkb3dDYXNjYWRlQ2xpcHNGYXIuc2hpZnQoKTtcblxuICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgZnJvbSBmYXIgdG8gbmVhclxuICAgICAgICAgICAgICAgIHNoYWRvd0Nhc2NhZGVDbGlwc05lYXIucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIHNoYWRvd0Nhc2NhZGVDbGlwc0Zhci5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgLy8gZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcHMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbmFsTGlnaHRNYXRyaWNlcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93Q2FzY2FkZUNsaXBzTmVhciA9IHsgdmFsdWU6IHNoYWRvd0Nhc2NhZGVDbGlwc05lYXIsIHR5cGU6ICcxZnYnIH07XG4gICAgICAgICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93Q2FzY2FkZUNsaXBzRmFyID0geyB2YWx1ZTogc2hhZG93Q2FzY2FkZUNsaXBzRmFyLCB0eXBlOiAnMWZ2JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwb3RMaWdodFNoYWRvd01hcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHNwb3RMaWdodFNoYWRvd01hcFNpemVzID0gc3BvdExpZ2h0U2hhZG93TWFwcy5tYXAoZ2V0U2l6ZSk7XG4gICAgICAgICAgICB2YXIgc2hhZG93VW5pZm9ybXMgPSBzY2VuZS5zaGFkb3dVbmlmb3JtcztcbiAgICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNwb3RMaWdodFNoYWRvd01hcHMgPSB7IHZhbHVlOiBzcG90TGlnaHRTaGFkb3dNYXBzLCB0eXBlOiAndHYnIH07XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zcG90TGlnaHRNYXRyaWNlcyA9IHsgdmFsdWU6IHNwb3RMaWdodE1hdHJpY2VzLCB0eXBlOiAnbTR2JyB9O1xuICAgICAgICAgICAgc2hhZG93VW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93TWFwU2l6ZXMgPSB7IHZhbHVlOiBzcG90TGlnaHRTaGFkb3dNYXBTaXplcywgdHlwZTogJzFmdicgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludExpZ2h0U2hhZG93TWFwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5wb2ludExpZ2h0U2hhZG93TWFwcyA9IHsgdmFsdWU6IHBvaW50TGlnaHRTaGFkb3dNYXBzLCB0eXBlOiAndHYnIH07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyRGlyZWN0aW9uYWxMaWdodFNoYWRvdzogKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgc3BsaXRGcnVzdHVtID0gbmV3IEZydXN0dW0oKTtcbiAgICAgICAgdmFyIHNwbGl0UHJvak1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBjcm9wQkJveCA9IG5ldyBCb3VuZGluZ0JveCgpO1xuICAgICAgICB2YXIgY3JvcE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBsaWdodFZpZXdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICB2YXIgbGlnaHRWaWV3UHJvak1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIHZhciBsaWdodFByb2pNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVuZGVyZXIsIHNjZW5lLCBzY2VuZUNhbWVyYSwgbGlnaHQsIGNhc3RlcnMsIHNoYWRvd0Nhc2NhZGVDbGlwcywgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93TWFwcykge1xuXG4gICAgICAgICAgICB2YXIgZGVmYXVsdFNoYWRvd01hdGVyaWFsID0gdGhpcy5fZ2V0RGVwdGhNYXRlcmlhbChsaWdodCk7XG4gICAgICAgICAgICB2YXIgcGFzc0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBnZXRNYXRlcmlhbDogZnVuY3Rpb24gKHJlbmRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmFibGUuc2hhZG93RGVwdGhNYXRlcmlhbCB8fCBkZWZhdWx0U2hhZG93TWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzb3J0Q29tcGFyZTogUmVuZGVyZXIub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IGZyYW1lXG4gICAgICAgICAgICBpZiAoIXNjZW5lLnZpZXdCb3VuZGluZ0JveExhc3RGcmFtZS5pc0Zpbml0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gc2NlbmUuZ2V0Qm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBzY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWVcbiAgICAgICAgICAgICAgICAgICAgLmNvcHkoYm91bmRpbmdCb3gpLmFwcGx5VHJhbnNmb3JtKHNjZW5lQ2FtZXJhLnZpZXdNYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29uc2lkZXJpbmcgbW92aW5nIHNwZWVkIHNpbmNlIHRoZSBib3VuZGluZyBib3ggaXMgZnJvbSBsYXN0IGZyYW1lXG4gICAgICAgICAgICAvLyBUT0RPOiBhZGQgYSBiaWFzXG4gICAgICAgICAgICB2YXIgY2xpcHBlZEZhciA9IE1hdGgubWluKC1zY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWUubWluLnosIHNjZW5lQ2FtZXJhLmZhcik7XG4gICAgICAgICAgICB2YXIgY2xpcHBlZE5lYXIgPSBNYXRoLm1heCgtc2NlbmUudmlld0JvdW5kaW5nQm94TGFzdEZyYW1lLm1heC56LCBzY2VuZUNhbWVyYS5uZWFyKTtcblxuICAgICAgICAgICAgdmFyIGxpZ2h0Q2FtZXJhID0gdGhpcy5fZ2V0RGlyZWN0aW9uYWxMaWdodENhbWVyYShsaWdodCwgc2NlbmUsIHNjZW5lQ2FtZXJhKTtcblxuICAgICAgICAgICAgdmFyIGx2cE1hdDRBcnIgPSBsaWdodFZpZXdQcm9qTWF0cml4LmFycmF5O1xuICAgICAgICAgICAgbGlnaHRQcm9qTWF0cml4LmNvcHkobGlnaHRDYW1lcmEucHJvamVjdGlvbk1hdHJpeCk7XG4gICAgICAgICAgICBtYXQ0LmludmVydChsaWdodFZpZXdNYXRyaXguYXJyYXksIGxpZ2h0Q2FtZXJhLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobGlnaHRWaWV3TWF0cml4LmFycmF5LCBsaWdodFZpZXdNYXRyaXguYXJyYXksIHNjZW5lQ2FtZXJhLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobHZwTWF0NEFyciwgbGlnaHRQcm9qTWF0cml4LmFycmF5LCBsaWdodFZpZXdNYXRyaXguYXJyYXkpO1xuXG4gICAgICAgICAgICB2YXIgY2xpcFBsYW5lcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGlzUGVyc3BlY3RpdmUgPSBzY2VuZUNhbWVyYSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhO1xuXG4gICAgICAgICAgICB2YXIgc2NhbGVaID0gKHNjZW5lQ2FtZXJhLm5lYXIgKyBzY2VuZUNhbWVyYS5mYXIpIC8gKHNjZW5lQ2FtZXJhLm5lYXIgLSBzY2VuZUNhbWVyYS5mYXIpO1xuICAgICAgICAgICAgdmFyIG9mZnNldFogPSAyICogc2NlbmVDYW1lcmEubmVhciAqIHNjZW5lQ2FtZXJhLmZhciAvIChzY2VuZUNhbWVyYS5uZWFyIC0gc2NlbmVDYW1lcmEuZmFyKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxpZ2h0LnNoYWRvd0Nhc2NhZGU7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjbG9nID0gY2xpcHBlZE5lYXIgKiBNYXRoLnBvdyhjbGlwcGVkRmFyIC8gY2xpcHBlZE5lYXIsIGkgLyBsaWdodC5zaGFkb3dDYXNjYWRlKTtcbiAgICAgICAgICAgICAgICB2YXIgY3VuaSA9IGNsaXBwZWROZWFyICsgKGNsaXBwZWRGYXIgLSBjbGlwcGVkTmVhcikgKiBpIC8gbGlnaHQuc2hhZG93Q2FzY2FkZTtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGNsb2cgKiBsaWdodC5jYXNjYWRlU3BsaXRMb2dGYWN0b3IgKyBjdW5pICogKDEgLSBsaWdodC5jYXNjYWRlU3BsaXRMb2dGYWN0b3IpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGFuZXMucHVzaChjKTtcbiAgICAgICAgICAgICAgICBzaGFkb3dDYXNjYWRlQ2xpcHMucHVzaCgtKC1jICogc2NhbGVaICsgb2Zmc2V0WikgLyAtYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuX2dldFRleHR1cmUobGlnaHQsIGxpZ2h0LnNoYWRvd0Nhc2NhZGUpO1xuICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodFNoYWRvd01hcHMucHVzaCh0ZXh0dXJlKTtcblxuICAgICAgICAgICAgdmFyIHZpZXdwb3J0ID0gcmVuZGVyZXIudmlld3BvcnQ7XG5cbiAgICAgICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAgICAgX2dsLmNsZWFyKF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpZ2h0LnNoYWRvd0Nhc2NhZGU7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3BsaXR0ZWQgZnJ1c3R1bVxuICAgICAgICAgICAgICAgIHZhciBuZWFyUGxhbmUgPSBjbGlwUGxhbmVzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBmYXJQbGFuZSA9IGNsaXBQbGFuZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpc1BlcnNwZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdDQucGVyc3BlY3RpdmUoc3BsaXRQcm9qTWF0cml4LmFycmF5LCBzY2VuZUNhbWVyYS5mb3YgLyAxODAgKiBNYXRoLlBJLCBzY2VuZUNhbWVyYS5hc3BlY3QsIG5lYXJQbGFuZSwgZmFyUGxhbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0NC5vcnRobyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0UHJvak1hdHJpeC5hcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5lQ2FtZXJhLmxlZnQsIHNjZW5lQ2FtZXJhLnJpZ2h0LCBzY2VuZUNhbWVyYS5ib3R0b20sIHNjZW5lQ2FtZXJhLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lYXJQbGFuZSwgZmFyUGxhbmVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BsaXRGcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uKHNwbGl0UHJvak1hdHJpeCk7XG4gICAgICAgICAgICAgICAgc3BsaXRGcnVzdHVtLmdldFRyYW5zZm9ybWVkQm91bmRpbmdCb3goY3JvcEJCb3gsIGxpZ2h0Vmlld01hdHJpeCk7XG4gICAgICAgICAgICAgICAgY3JvcEJCb3guYXBwbHlQcm9qZWN0aW9uKGxpZ2h0UHJvak1hdHJpeCk7XG4gICAgICAgICAgICAgICAgdmFyIF9taW4gPSBjcm9wQkJveC5taW4uYXJyYXk7XG4gICAgICAgICAgICAgICAgdmFyIF9tYXggPSBjcm9wQkJveC5tYXguYXJyYXk7XG4gICAgICAgICAgICAgICAgX21pblswXSA9IE1hdGgubWF4KF9taW5bMF0sIC0xKTtcbiAgICAgICAgICAgICAgICBfbWluWzFdID0gTWF0aC5tYXgoX21pblsxXSwgLTEpO1xuICAgICAgICAgICAgICAgIF9tYXhbMF0gPSBNYXRoLm1pbihfbWF4WzBdLCAxKTtcbiAgICAgICAgICAgICAgICBfbWF4WzFdID0gTWF0aC5taW4oX21heFsxXSwgMSk7XG4gICAgICAgICAgICAgICAgY3JvcE1hdHJpeC5vcnRobyhfbWluWzBdLCBfbWF4WzBdLCBfbWluWzFdLCBfbWF4WzFdLCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgbGlnaHRDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5tdWx0aXBseUxlZnQoY3JvcE1hdHJpeCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2hhZG93U2l6ZSA9IGxpZ2h0LnNoYWRvd1Jlc29sdXRpb24gfHwgNTEyO1xuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJzZWQsIGxlZnQgdG8gcmlnaHQgPT4gZmFyIHRvIG5lYXJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCgobGlnaHQuc2hhZG93Q2FzY2FkZSAtIGkgLSAxKSAqIHNoYWRvd1NpemUsIDAsIHNoYWRvd1NpemUsIHNoYWRvd1NpemUsIDEpO1xuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyUGFzcyhjYXN0ZXJzLCBsaWdodENhbWVyYSwgcGFzc0NvbmZpZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgZm9yIFZTTVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dhdXNzaWFuRmlsdGVyKHJlbmRlcmVyLCB0ZXh0dXJlLCB0ZXh0dXJlLndpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgICAgICAgICBtYXRyaXguY29weShsaWdodENhbWVyYS52aWV3TWF0cml4KVxuICAgICAgICAgICAgICAgICAgICAubXVsdGlwbHlMZWZ0KGxpZ2h0Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uYWxMaWdodE1hdHJpY2VzLnB1c2gobWF0cml4LmFycmF5KTtcblxuICAgICAgICAgICAgICAgIGxpZ2h0Q2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weShsaWdodFByb2pNYXRyaXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICByZW5kZXJlci5zZXRWaWV3cG9ydCh2aWV3cG9ydCk7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIHJlbmRlclNwb3RMaWdodFNoYWRvdzogZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgbGlnaHQsIGNhc3RlcnMsIHNwb3RMaWdodE1hdHJpY2VzLCBzcG90TGlnaHRTaGFkb3dNYXBzKSB7XG5cbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLl9nZXRUZXh0dXJlKGxpZ2h0KTtcbiAgICAgICAgdmFyIGxpZ2h0Q2FtZXJhID0gdGhpcy5fZ2V0U3BvdExpZ2h0Q2FtZXJhKGxpZ2h0KTtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0ZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgX2dsLmNsZWFyKF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgIHZhciBkZWZhdWx0U2hhZG93TWF0ZXJpYWwgPSB0aGlzLl9nZXREZXB0aE1hdGVyaWFsKGxpZ2h0KTtcbiAgICAgICAgdmFyIHBhc3NDb25maWcgPSB7XG4gICAgICAgICAgICBnZXRNYXRlcmlhbDogZnVuY3Rpb24gKHJlbmRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyYWJsZS5zaGFkb3dEZXB0aE1hdGVyaWFsIHx8IGRlZmF1bHRTaGFkb3dNYXRlcmlhbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3J0Q29tcGFyZTogUmVuZGVyZXIub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgfTtcblxuICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKHJlbmRlcmVyLmN1bGxSZW5kZXJMaXN0KGNhc3RlcnMsIG51bGwsIGxpZ2h0Q2FtZXJhKSwgbGlnaHRDYW1lcmEsIHBhc3NDb25maWcpO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgLy8gRmlsdGVyIGZvciBWU01cbiAgICAgICAgaWYgKHRoaXMuc29mdFNoYWRvdyA9PT0gU2hhZG93TWFwUGFzcy5WU00pIHtcbiAgICAgICAgICAgIHRoaXMuX2dhdXNzaWFuRmlsdGVyKHJlbmRlcmVyLCB0ZXh0dXJlLCB0ZXh0dXJlLndpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICBtYXRyaXguY29weShsaWdodENhbWVyYS53b3JsZFRyYW5zZm9ybSlcbiAgICAgICAgICAgIC5pbnZlcnQoKVxuICAgICAgICAgICAgLm11bHRpcGx5TGVmdChsaWdodENhbWVyYS5wcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgICBzcG90TGlnaHRTaGFkb3dNYXBzLnB1c2godGV4dHVyZSk7XG4gICAgICAgIHNwb3RMaWdodE1hdHJpY2VzLnB1c2gobWF0cml4LmFycmF5KTtcbiAgICB9LFxuXG4gICAgcmVuZGVyUG9pbnRMaWdodFNoYWRvdzogZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgbGlnaHQsIGNhc3RlcnMsIHBvaW50TGlnaHRTaGFkb3dNYXBzKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fZ2V0VGV4dHVyZShsaWdodCk7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgcG9pbnRMaWdodFNoYWRvd01hcHMucHVzaCh0ZXh0dXJlKTtcblxuICAgICAgICB2YXIgZGVmYXVsdFNoYWRvd01hdGVyaWFsID0gdGhpcy5fZ2V0RGVwdGhNYXRlcmlhbChsaWdodCk7XG4gICAgICAgIHZhciBwYXNzQ29uZmlnID0ge1xuICAgICAgICAgICAgZ2V0TWF0ZXJpYWw6IGZ1bmN0aW9uIChyZW5kZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmFibGUuc2hhZG93RGVwdGhNYXRlcmlhbCB8fCBkZWZhdWx0U2hhZG93TWF0ZXJpYWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc29ydENvbXBhcmU6IFJlbmRlcmVyLm9wYXF1ZVNvcnRDb21wYXJlXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzW2ldO1xuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2dldFBvaW50TGlnaHRDYW1lcmEobGlnaHQsIHRhcmdldCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0ZXh0dXJlLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAgICAgX2dsLmNsZWFyKF9nbC5DT0xPUl9CVUZGRVJfQklUIHwgX2dsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKHJlbmRlcmVyLmN1bGxSZW5kZXJMaXN0KGNhc3RlcnMsIG51bGwsIGNhbWVyYSksIGNhbWVyYSwgcGFzc0NvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICBfZ2V0RGVwdGhNYXRlcmlhbDogZnVuY3Rpb24gKGxpZ2h0KSB7XG4gICAgICAgIHZhciBzaGFkb3dNYXRlcmlhbCA9IHRoaXMuX2xpZ2h0TWF0ZXJpYWxzW2xpZ2h0Ll9fdWlkX19dO1xuICAgICAgICB2YXIgaXNQb2ludExpZ2h0ID0gbGlnaHQgaW5zdGFuY2VvZiBQb2ludExpZ2h0O1xuICAgICAgICBpZiAoIXNoYWRvd01hdGVyaWFsKSB7XG4gICAgICAgICAgICB2YXIgc2hhZGVyUHJlZml4ID0gaXNQb2ludExpZ2h0ID8gJ2NsYXkuc20uZGlzdGFuY2UuJyA6ICdjbGF5LnNtLmRlcHRoLic7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiB0aGlzLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZShzaGFkZXJQcmVmaXggKyAndmVydGV4JyksIFNoYWRlci5zb3VyY2Uoc2hhZGVyUHJlZml4ICsgJ2ZyYWdtZW50JykpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5fbGlnaHRNYXRlcmlhbHNbbGlnaHQuX191aWRfX10gPSBzaGFkb3dNYXRlcmlhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlnaHQuc2hhZG93U2xvcGVTY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbC5zZXRVbmlmb3JtKCdzbG9wZVNjYWxlJywgbGlnaHQuc2hhZG93U2xvcGVTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpZ2h0LnNoYWRvd0JpYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2hhZG93TWF0ZXJpYWwuc2V0VW5pZm9ybSgnc2hhZG93QmlhcycsIGxpZ2h0LnNoYWRvd0JpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1VTRV9WU00nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNoYWRvd01hdGVyaWFsLnVuZGVmaW5lKCdmcmFnbWVudCcsICdVU0VfVlNNJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNQb2ludExpZ2h0KSB7XG4gICAgICAgICAgICBzaGFkb3dNYXRlcmlhbC5zZXQoJ2xpZ2h0UG9zaXRpb24nLCBsaWdodC5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXkpO1xuICAgICAgICAgICAgc2hhZG93TWF0ZXJpYWwuc2V0KCdyYW5nZScsIGxpZ2h0LnJhbmdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dNYXRlcmlhbDtcbiAgICB9LFxuXG4gICAgX2dhdXNzaWFuRmlsdGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHRleHR1cmUsIHNpemUpIHtcbiAgICAgICAgdmFyIHBhcmFtZXRlciA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICAgICAgdHlwZTogVGV4dHVyZS5GTE9BVFxuICAgICAgICB9O1xuICAgICAgICB2YXIgdG1wVGV4dHVyZSA9IHRoaXMuX3RleHR1cmVQb29sLmdldChwYXJhbWV0ZXIpO1xuXG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmF0dGFjaCh0bXBUZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIHRoaXMuX2dhdXNzaWFuUGFzc0guc2V0VW5pZm9ybSgndGV4dHVyZScsIHRleHR1cmUpO1xuICAgICAgICB0aGlzLl9nYXVzc2lhblBhc3NILnNldFVuaWZvcm0oJ3RleHR1cmVXaWR0aCcsIHNpemUpO1xuICAgICAgICB0aGlzLl9nYXVzc2lhblBhc3NILnJlbmRlcihyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYXR0YWNoKHRleHR1cmUpO1xuICAgICAgICB0aGlzLl9nYXVzc2lhblBhc3NWLnNldFVuaWZvcm0oJ3RleHR1cmUnLCB0bXBUZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fZ2F1c3NpYW5QYXNzVi5zZXRVbmlmb3JtKCd0ZXh0dXJlSGVpZ2h0Jywgc2l6ZSk7XG4gICAgICAgIHRoaXMuX2dhdXNzaWFuUGFzc1YucmVuZGVyKHJlbmRlcmVyKTtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLl90ZXh0dXJlUG9vbC5wdXQodG1wVGV4dHVyZSk7XG4gICAgfSxcblxuICAgIF9nZXRUZXh0dXJlOiBmdW5jdGlvbiAobGlnaHQsIGNhc2NhZGUpIHtcbiAgICAgICAgdmFyIGtleSA9IGxpZ2h0Ll9fdWlkX187XG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fdGV4dHVyZXNba2V5XTtcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSBsaWdodC5zaGFkb3dSZXNvbHV0aW9uIHx8IDUxMjtcbiAgICAgICAgY2FzY2FkZSA9IGNhc2NhZGUgfHwgMTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlKSB7XG4gICAgICAgICAgICBpZiAobGlnaHQgaW5zdGFuY2VvZiBQb2ludExpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlQ3ViZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlMkQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0IG1vc3QgNCBjYXNjYWRlXG4gICAgICAgICAgICAvLyBUT0RPIHNoYXJlIHdpdGggaGVpZ2h0ID9cbiAgICAgICAgICAgIHRleHR1cmUud2lkdGggPSByZXNvbHV0aW9uICogY2FzY2FkZTtcbiAgICAgICAgICAgIHRleHR1cmUuaGVpZ2h0ID0gcmVzb2x1dGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvZnRTaGFkb3cgPT09IFNoYWRvd01hcFBhc3MuVlNNKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS50eXBlID0gVGV4dHVyZS5GTE9BVDtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcGljID0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gZ2xlbnVtLk5FQVJFU1Q7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5tYWdGaWx0ZXIgPSBnbGVudW0uTkVBUkVTVDtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLnVzZU1pcG1hcCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZXNba2V5XSA9IHRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9LFxuXG4gICAgX2dldFBvaW50TGlnaHRDYW1lcmE6IGZ1bmN0aW9uIChsaWdodCwgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5fbGlnaHRDYW1lcmFzLnBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLl9saWdodENhbWVyYXMucG9pbnQgPSB7XG4gICAgICAgICAgICAgICAgcHg6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpLFxuICAgICAgICAgICAgICAgIG54OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSxcbiAgICAgICAgICAgICAgICBweTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCksXG4gICAgICAgICAgICAgICAgbnk6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpLFxuICAgICAgICAgICAgICAgIHB6OiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSxcbiAgICAgICAgICAgICAgICBuejogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2xpZ2h0Q2FtZXJhcy5wb2ludFt0YXJnZXRdO1xuXG4gICAgICAgIGNhbWVyYS5mYXIgPSBsaWdodC5yYW5nZTtcbiAgICAgICAgY2FtZXJhLmZvdiA9IDkwO1xuICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KDAsIDAsIDApO1xuICAgICAgICBzd2l0Y2ggKHRhcmdldCkge1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9YLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbngnOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9YLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHknOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9ZLCBWZWN0b3IzLlBPU0lUSVZFX1opO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnknOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9ZLCBWZWN0b3IzLk5FR0FUSVZFX1opO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHonOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5QT1NJVElWRV9aLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnonOlxuICAgICAgICAgICAgICAgIGNhbWVyYS5sb29rQXQoVmVjdG9yMy5ORUdBVElWRV9aLCBWZWN0b3IzLk5FR0FUSVZFX1kpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxpZ2h0LmdldFdvcmxkUG9zaXRpb24oY2FtZXJhLnBvc2l0aW9uKTtcbiAgICAgICAgY2FtZXJhLnVwZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBjYW1lcmE7XG4gICAgfSxcblxuICAgIF9nZXREaXJlY3Rpb25hbExpZ2h0Q2FtZXJhOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlnaHRWaWV3TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgdmFyIHNjZW5lVmlld0JvdW5kaW5nQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIHZhciBsaWdodFZpZXdCQm94ID0gbmV3IEJvdW5kaW5nQm94KCk7XG4gICAgICAgIC8vIENhbWVyYSBvZiBkaXJlY3Rpb25hbCBsaWdodCB3aWxsIGJlIGFkanVzdGVkXG4gICAgICAgIC8vIHRvIGNvbnRhaW4gdGhlIHZpZXcgZnJ1c3R1bSBhbmQgc2NlbmUgYm91bmRpbmcgYm94IGFzIHRpZ2h0bHkgYXMgcG9zc2libGVcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChsaWdodCwgc2NlbmUsIHNjZW5lQ2FtZXJhKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2xpZ2h0Q2FtZXJhcy5kaXJlY3Rpb25hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0Q2FtZXJhcy5kaXJlY3Rpb25hbCA9IG5ldyBPcnRob0NhbWVyYSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2xpZ2h0Q2FtZXJhcy5kaXJlY3Rpb25hbDtcblxuICAgICAgICAgICAgc2NlbmVWaWV3Qm91bmRpbmdCb3guY29weShzY2VuZS52aWV3Qm91bmRpbmdCb3hMYXN0RnJhbWUpO1xuICAgICAgICAgICAgc2NlbmVWaWV3Qm91bmRpbmdCb3guaW50ZXJzZWN0aW9uKHNjZW5lQ2FtZXJhLmZydXN0dW0uYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgY2VudGVyIG9mIGZydXN0dW0oaW4gd29ybGQgc3BhY2UpXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb25cbiAgICAgICAgICAgICAgICAuY29weShzY2VuZVZpZXdCb3VuZGluZ0JveC5taW4pXG4gICAgICAgICAgICAgICAgLmFkZChzY2VuZVZpZXdCb3VuZGluZ0JveC5tYXgpXG4gICAgICAgICAgICAgICAgLnNjYWxlKDAuNSlcbiAgICAgICAgICAgICAgICAudHJhbnNmb3JtTWF0NChzY2VuZUNhbWVyYS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICBjYW1lcmEucm90YXRpb24uY29weShsaWdodC5yb3RhdGlvbik7XG4gICAgICAgICAgICBjYW1lcmEuc2NhbGUuY29weShsaWdodC5zY2FsZSk7XG4gICAgICAgICAgICBjYW1lcmEudXBkYXRlV29ybGRUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHRvIGxpZ2h0IHZpZXcgc3BhY2VcbiAgICAgICAgICAgIE1hdHJpeDQuaW52ZXJ0KGxpZ2h0Vmlld01hdHJpeCwgY2FtZXJhLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIE1hdHJpeDQubXVsdGlwbHkobGlnaHRWaWV3TWF0cml4LCBsaWdodFZpZXdNYXRyaXgsIHNjZW5lQ2FtZXJhLndvcmxkVHJhbnNmb3JtKTtcblxuICAgICAgICAgICAgbGlnaHRWaWV3QkJveC5jb3B5KHNjZW5lVmlld0JvdW5kaW5nQm94KS5hcHBseVRyYW5zZm9ybShsaWdodFZpZXdNYXRyaXgpO1xuXG4gICAgICAgICAgICB2YXIgbWluID0gbGlnaHRWaWV3QkJveC5taW4uYXJyYXk7XG4gICAgICAgICAgICB2YXIgbWF4ID0gbGlnaHRWaWV3QkJveC5tYXguYXJyYXk7XG5cbiAgICAgICAgICAgIC8vIE1vdmUgY2FtZXJhIHRvIGFkanVzdCB0aGUgbmVhciB0byAwXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KChtaW5bMF0gKyBtYXhbMF0pIC8gMiwgKG1pblsxXSArIG1heFsxXSkgLyAyLCBtYXhbMl0pXG4gICAgICAgICAgICAgICAgLnRyYW5zZm9ybU1hdDQoY2FtZXJhLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIGNhbWVyYS5uZWFyID0gMDtcbiAgICAgICAgICAgIGNhbWVyYS5mYXIgPSAtbWluWzJdICsgbWF4WzJdO1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJlY2VpdmVycyBub3QgaW4gdGhlIGZydXN0dW0gd2lsbCBzdGlsIHJlY2VpdmUgdGhlIHNoYWRvdy5cbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLmxpZ2h0RnJ1c3R1bUJpYXMpKSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLmZhciAqPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLmZhciArPSB0aGlzLmxpZ2h0RnJ1c3R1bUJpYXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYW1lcmEubGVmdCA9IG1pblswXTtcbiAgICAgICAgICAgIGNhbWVyYS5yaWdodCA9IG1heFswXTtcbiAgICAgICAgICAgIGNhbWVyYS50b3AgPSBtYXhbMV07XG4gICAgICAgICAgICBjYW1lcmEuYm90dG9tID0gbWluWzFdO1xuICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZSh0cnVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTtcbiAgICAgICAgfTtcbiAgICB9KSgpLFxuXG4gICAgX2dldFNwb3RMaWdodENhbWVyYTogZnVuY3Rpb24gKGxpZ2h0KSB7XG4gICAgICAgIGlmICghdGhpcy5fbGlnaHRDYW1lcmFzLnNwb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpZ2h0Q2FtZXJhcy5zcG90ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuX2xpZ2h0Q2FtZXJhcy5zcG90O1xuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgICBjYW1lcmEuZm92ID0gbGlnaHQucGVudW1icmFBbmdsZSAqIDI7XG4gICAgICAgIGNhbWVyYS5mYXIgPSBsaWdodC5yYW5nZTtcbiAgICAgICAgY2FtZXJhLndvcmxkVHJhbnNmb3JtLmNvcHkobGlnaHQud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICBtYXQ0LmludmVydChjYW1lcmEudmlld01hdHJpeC5hcnJheSwgY2FtZXJhLndvcmxkVHJhbnNmb3JtLmFycmF5KTtcblxuICAgICAgICByZXR1cm4gY2FtZXJhO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfFdlYkdMUmVuZGVyaW5nQ29udGV4dH0gW3JlbmRlcmVyXVxuICAgICAqIEBtZW1iZXJPZiBjbGF5LnByZVBhc3MuU2hhZG93TWFwLnByb3RvdHlwZVxuICAgICAqL1xuICAgIC8vIFBFTkRJTkcgUmVuZGVyZXIgb3IgV2ViR0xSZW5kZXJpbmdDb250ZXh0XG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbCB8fCByZW5kZXJlcjtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmRpc3Bvc2UoX2dsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5fdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHR1cmVzW25hbWVdLmRpc3Bvc2UoX2dsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RleHR1cmVQb29sLmNsZWFyKHJlbmRlcmVyLmdsKTtcblxuICAgICAgICB0aGlzLl9kZXB0aE1hdGVyaWFscyA9IHt9O1xuICAgICAgICB0aGlzLl9kaXN0YW5jZU1hdGVyaWFscyA9IHt9O1xuICAgICAgICB0aGlzLl90ZXh0dXJlcyA9IHt9O1xuICAgICAgICB0aGlzLl9saWdodENhbWVyYXMgPSB7fTtcbiAgICAgICAgdGhpcy5fc2hhZG93TWFwTnVtYmVyID0ge1xuICAgICAgICAgICAgJ1BPSU5UX0xJR0hUJzogMCxcbiAgICAgICAgICAgICdESVJFQ1RJT05BTF9MSUdIVCc6IDAsXG4gICAgICAgICAgICAnU1BPVF9MSUdIVCc6IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fbWVzaE1hdGVyaWFscyA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcmVjZWl2ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMuX3JlY2VpdmVyc1tpXTtcbiAgICAgICAgICAgIC8vIE1lc2ggbWF5IGJlIGRpc3Bvc2VkXG4gICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCAmJiBtZXNoLm1hdGVyaWFsLnNoYWRlcikge1xuICAgICAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgdmFyIHNoYWRlciA9IG1hdGVyaWFsLnNoYWRlcjtcbiAgICAgICAgICAgICAgICBzaGFkZXIudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1BPSU5UX0xJR0hUX1NIQURPV19DT1VOVCcpO1xuICAgICAgICAgICAgICAgIHNoYWRlci51bmRlZmluZSgnZnJhZ21lbnQnLCAnRElSRUNUSU9OQUxfTElHSFRfU0hBRE9XX0NPVU5UJyk7XG4gICAgICAgICAgICAgICAgc2hhZGVyLnVuZGVmaW5lKCdmcmFnbWVudCcsICdBTUJJRU5UX0xJR0hUX1NIQURPV19DT1VOVCcpO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldCgnc2hhZG93RW5hYmxlZCcsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb3BhcXVlQ2FzdGVycyA9IFtdO1xuICAgICAgICB0aGlzLl9yZWNlaXZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fbGlnaHRzQ2FzdFNoYWRvdyA9IFtdO1xuICAgIH1cbn0pO1xuXG4vKipcbiAqIEBuYW1lIGNsYXkucHJlUGFzcy5TaGFkb3dNYXAuVlNNXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5TaGFkb3dNYXBQYXNzLlZTTSA9IDE7XG5cbi8qKlxuICogQG5hbWUgY2xheS5wcmVQYXNzLlNoYWRvd01hcC5QQ0ZcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cblNoYWRvd01hcFBhc3MuUENGID0gMjtcblxuZXhwb3J0IGRlZmF1bHQgU2hhZG93TWFwUGFzcztcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgUmF5IGZyb20gJy4uL21hdGgvUmF5JztcbmltcG9ydCBWZWN0b3IyIGZyb20gJy4uL21hdGgvVmVjdG9yMic7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IE1hdHJpeDQgZnJvbSAnLi4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBSZW5kZXJhYmxlIGZyb20gJy4uL1JlbmRlcmFibGUnO1xuaW1wb3J0IGdsZW51bSBmcm9tICcuLi9jb3JlL2dsZW51bSc7XG5pbXBvcnQgZ2xtYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcblxudmFyIHZlYzMgPSBnbG1hdHJpeC52ZWMzO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LnBpY2tpbmcuUmF5UGlja2luZ1xuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIFJheVBpY2tpbmcgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5waWNraW5nLlJheVBpY2tpbmcjICovXG57XG4gICAgLyoqXG4gICAgICogVGFyZ2V0IHNjZW5lXG4gICAgICogQHR5cGUge2NsYXkuU2NlbmV9XG4gICAgICovXG4gICAgc2NlbmU6IG51bGwsXG4gICAgLyoqXG4gICAgICogVGFyZ2V0IGNhbWVyYVxuICAgICAqIEB0eXBlIHtjbGF5LkNhbWVyYX1cbiAgICAgKi9cbiAgICBjYW1lcmE6IG51bGwsXG4gICAgLyoqXG4gICAgICogVGFyZ2V0IHJlbmRlcmVyXG4gICAgICogQHR5cGUge2NsYXkuUmVuZGVyZXJ9XG4gICAgICovXG4gICAgcmVuZGVyZXI6IG51bGxcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9yYXkgPSBuZXcgUmF5KCk7XG4gICAgdGhpcy5fbmRjID0gbmV3IFZlY3RvcjIoKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkucGlja2luZy5SYXlQaWNraW5nLnByb3RvdHlwZSAqL1xue1xuXG4gICAgLyoqXG4gICAgICogUGljayB0aGUgbmVhcmVzdCBpbnRlcnNlY3Rpb24gb2JqZWN0IGluIHRoZSBzY2VuZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCBNb3VzZSBwb3NpdGlvbiB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB5IE1vdXNlIHBvc2l0aW9uIHlcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbZm9yY2VQaWNrQWxsPWZhbHNlXSBpZ25vcmUgaWdub3JlUGlja2luZ1xuICAgICAqIEByZXR1cm4ge2NsYXkucGlja2luZy5SYXlQaWNraW5nfkludGVyc2VjdGlvbn1cbiAgICAgKi9cbiAgICBwaWNrOiBmdW5jdGlvbiAoeCwgeSwgZm9yY2VQaWNrQWxsKSB7XG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnBpY2tBbGwoeCwgeSwgW10sIGZvcmNlUGlja0FsbCk7XG4gICAgICAgIHJldHVybiBvdXRbMF0gfHwgbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGljayBhbGwgaW50ZXJzZWN0aW9uIG9iamVjdHMsIHdpY2ggd2lsbCBiZSBzb3J0ZWQgZnJvbSBuZWFyIHRvIGZhclxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCBNb3VzZSBwb3NpdGlvbiB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB5IE1vdXNlIHBvc2l0aW9uIHlcbiAgICAgKiBAcGFyYW0gIHtBcnJheX0gW291dHB1dF1cbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbZm9yY2VQaWNrQWxsPWZhbHNlXSBpZ25vcmUgaWdub3JlUGlja2luZ1xuICAgICAqIEByZXR1cm4ge0FycmF5LjxjbGF5LnBpY2tpbmcuUmF5UGlja2luZ35JbnRlcnNlY3Rpb24+fVxuICAgICAqL1xuICAgIHBpY2tBbGw6IGZ1bmN0aW9uICh4LCB5LCBvdXRwdXQsIGZvcmNlUGlja0FsbCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNjcmVlblRvTkRDKHgsIHksIHRoaXMuX25kYyk7XG4gICAgICAgIHRoaXMuY2FtZXJhLmNhc3RSYXkodGhpcy5fbmRjLCB0aGlzLl9yYXkpO1xuXG4gICAgICAgIG91dHB1dCA9IG91dHB1dCB8fCBbXTtcblxuICAgICAgICB0aGlzLl9pbnRlcnNlY3ROb2RlKHRoaXMuc2NlbmUsIG91dHB1dCwgZm9yY2VQaWNrQWxsIHx8IGZhbHNlKTtcblxuICAgICAgICBvdXRwdXQuc29ydCh0aGlzLl9pbnRlcnNlY3Rpb25Db21wYXJlRnVuYyk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9LFxuXG4gICAgX2ludGVyc2VjdE5vZGU6IGZ1bmN0aW9uIChub2RlLCBvdXQsIGZvcmNlUGlja0FsbCkge1xuICAgICAgICBpZiAoKG5vZGUgaW5zdGFuY2VvZiBSZW5kZXJhYmxlKSAmJiBub2RlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICBpZiAoKCFub2RlLmlnbm9yZVBpY2tpbmcgfHwgZm9yY2VQaWNrQWxsKVxuICAgICAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0cmlhbmdsZSBtZXNoIHN1cHBvcnQgcmF5IHBpY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgKG5vZGUubW9kZSA9PT0gZ2xlbnVtLlRSSUFOR0xFUyAmJiBub2RlLmdlb21ldHJ5LmlzVXNlSW5kaWNlcygpKVxuICAgICAgICAgICAgICAgICAgICAvLyBPciBpZiBnZW9tZXRyeSBoYXMgaXQncyBvd24gcGlja0J5UmF5LCBwaWNrLCBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlLmdlb21ldHJ5LnBpY2tCeVJheVxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlLmdlb21ldHJ5LnBpY2tcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcnNlY3RSZW5kZXJhYmxlKG5vZGUsIG91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLl9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5faW50ZXJzZWN0Tm9kZShub2RlLl9jaGlsZHJlbltpXSwgb3V0LCBmb3JjZVBpY2tBbGwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9pbnRlcnNlY3RSZW5kZXJhYmxlOiAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciB2MyA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciByYXkgPSBuZXcgUmF5KCk7XG4gICAgICAgIHZhciB3b3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVuZGVyYWJsZSwgb3V0KSB7XG5cbiAgICAgICAgICAgIHZhciBpc1NraW5uZWRNZXNoID0gcmVuZGVyYWJsZS5pc1NraW5uZWRNZXNoKCk7XG4gICAgICAgICAgICByYXkuY29weSh0aGlzLl9yYXkpO1xuICAgICAgICAgICAgTWF0cml4NC5pbnZlcnQod29ybGRJbnZlcnNlLCByZW5kZXJhYmxlLndvcmxkVHJhbnNmb3JtKTtcblxuICAgICAgICAgICAgLy8gU2tpbm5lZCBtZXNoIHdpbGwgaWdub3JlIHRoZSB3b3JsZCB0cmFuc2Zvcm0uXG4gICAgICAgICAgICBpZiAoIWlzU2tpbm5lZE1lc2gpIHtcbiAgICAgICAgICAgICAgICByYXkuYXBwbHlUcmFuc2Zvcm0od29ybGRJbnZlcnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gcmVuZGVyYWJsZS5nZW9tZXRyeTtcbiAgICAgICAgICAgIC8vIElnbm9yZSBib3VuZGluZyBib3ggb2Ygc2tpbm5lZCBtZXNoP1xuICAgICAgICAgICAgaWYgKCFpc1NraW5uZWRNZXNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdlb21ldHJ5LmJvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmF5LmludGVyc2VjdEJvdW5kaW5nQm94KGdlb21ldHJ5LmJvdW5kaW5nQm94KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHVzZXIgZGVmaW5lZCBwaWNraW5nIGFsZ29yaXRobVxuICAgICAgICAgICAgaWYgKGdlb21ldHJ5LnBpY2spIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5waWNrKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZGMueCwgdGhpcy5fbmRjLnksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FtZXJhLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJhYmxlLCBvdXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVzZSB1c2VyIGRlZmluZWQgcmF5IHBpY2tpbmcgYWxnb3JpdGhtXG4gICAgICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS5waWNrQnlSYXkpIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5waWNrQnlSYXkocmF5LCByZW5kZXJhYmxlLCBvdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGN1bGxCYWNrID0gKHJlbmRlcmFibGUuY3VsbEZhY2UgPT09IGdsZW51bS5CQUNLICYmIHJlbmRlcmFibGUuZnJvbnRGYWNlID09PSBnbGVudW0uQ0NXKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHJlbmRlcmFibGUuY3VsbEZhY2UgPT09IGdsZW51bS5GUk9OVCAmJiByZW5kZXJhYmxlLmZyb250RmFjZSA9PT0gZ2xlbnVtLkNXKTtcblxuICAgICAgICAgICAgdmFyIHBvaW50O1xuICAgICAgICAgICAgdmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRpY2VzO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG4gICAgICAgICAgICB2YXIgd2VpZ2h0QXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMud2VpZ2h0O1xuICAgICAgICAgICAgdmFyIGpvaW50QXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuam9pbnQ7XG4gICAgICAgICAgICB2YXIgc2tpbk1hdHJpY2VzQXJyYXk7XG4gICAgICAgICAgICB2YXIgc2tpbk1hdHJpY2VzID0gW107XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB2YWxpZC5cbiAgICAgICAgICAgIGlmICghcG9zaXRpb25BdHRyIHx8ICFwb3NpdGlvbkF0dHIudmFsdWUgfHwgIWluZGljZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTa2lubmVkTWVzaCkge1xuICAgICAgICAgICAgICAgIHNraW5NYXRyaWNlc0FycmF5ID0gcmVuZGVyYWJsZS5za2VsZXRvbi5nZXRTdWJTa2luTWF0cmljZXMocmVuZGVyYWJsZS5fX3VpZF9fLCByZW5kZXJhYmxlLmpvaW50cyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW5kZXJhYmxlLmpvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBza2luTWF0cmljZXNbaV0gPSBza2luTWF0cmljZXNbaV0gfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgMTY7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbk1hdHJpY2VzW2ldW2tdID0gc2tpbk1hdHJpY2VzQXJyYXlbaSAqIDE2ICsga107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciB3ZWlnaHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgam9pbnQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgc2tpbm5lZFBvcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciB0bXAgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgc2tpbm5lZFBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbm5lZFBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGlmICghc2tpbm5lZFBvc2l0aW9uQXR0ciB8fCAhc2tpbm5lZFBvc2l0aW9uQXR0ci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jcmVhdGVBdHRyaWJ1dGUoJ3NraW5uZWRQb3NpdGlvbicsICdmJywgMyk7XG4gICAgICAgICAgICAgICAgICAgIHNraW5uZWRQb3NpdGlvbkF0dHIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5uZWRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgc2tpbm5lZFBvc2l0aW9uQXR0ci5pbml0KGdlb21ldHJ5LnZlcnRleENvdW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS52ZXJ0ZXhDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQXR0ci5nZXQoaSwgcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QXR0ci5nZXQoaSwgd2VpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgam9pbnRBdHRyLmdldChpLCBqb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodFszXSA9IDEgLSB3ZWlnaHRbMF0gLSB3ZWlnaHRbMV0gLSB3ZWlnaHRbMl07XG4gICAgICAgICAgICAgICAgICAgIHZlYzMuc2V0KHNraW5uZWRQb3MsIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IDQ7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW50W2tdID49IDAgJiYgd2VpZ2h0W2tdID4gMWUtNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NCh0bXAsIHBvcywgc2tpbk1hdHJpY2VzW2pvaW50W2tdXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChza2lubmVkUG9zLCBza2lubmVkUG9zLCB0bXAsIHdlaWdodFtrXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2tpbm5lZFBvc2l0aW9uQXR0ci5zZXQoaSwgc2tpbm5lZFBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaTEgPSBpbmRpY2VzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBpMiA9IGluZGljZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgIHZhciBpMyA9IGluZGljZXNbaSArIDJdO1xuICAgICAgICAgICAgICAgIHZhciBmaW5hbFBvc0F0dHIgPSBpc1NraW5uZWRNZXNoXG4gICAgICAgICAgICAgICAgICAgID8gZ2VvbWV0cnkuYXR0cmlidXRlcy5za2lubmVkUG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgOiBwb3NpdGlvbkF0dHI7XG4gICAgICAgICAgICAgICAgZmluYWxQb3NBdHRyLmdldChpMSwgdjEuYXJyYXkpO1xuICAgICAgICAgICAgICAgIGZpbmFsUG9zQXR0ci5nZXQoaTIsIHYyLmFycmF5KTtcbiAgICAgICAgICAgICAgICBmaW5hbFBvc0F0dHIuZ2V0KGkzLCB2My5hcnJheSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VsbEJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUodjEsIHYyLCB2MywgcmVuZGVyYWJsZS5jdWxsaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKHYxLCB2MywgdjIsIHJlbmRlcmFibGUuY3VsbGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRXID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NraW5uZWRNZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IzLnRyYW5zZm9ybU1hdDQocG9pbnRXLCBwb2ludCwgcmVuZGVyYWJsZS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHBvaW50IG1heWJlIG5vdCByaWdodC5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjMuY29weShwb2ludFcsIHBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChuZXcgUmF5UGlja2luZy5JbnRlcnNlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludCwgcG9pbnRXLCByZW5kZXJhYmxlLCBbaTEsIGkyLCBpM10sIGkgLyAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yMy5kaXN0KHBvaW50VywgdGhpcy5fcmF5Lm9yaWdpbilcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pKCksXG5cbiAgICBfaW50ZXJzZWN0aW9uQ29tcGFyZUZ1bmM6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5waWNraW5nLlJheVBpY2tpbmd+SW50ZXJzZWN0aW9uXG4gKiBAcGFyYW0ge2NsYXkubWF0aC5WZWN0b3IzfSBwb2ludFxuICogQHBhcmFtIHtjbGF5Lm1hdGguVmVjdG9yM30gcG9pbnRXb3JsZFxuICogQHBhcmFtIHtjbGF5Lk5vZGV9IHRhcmdldFxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gdHJpYW5nbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmlhbmdsZUluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2VcbiAqL1xuUmF5UGlja2luZy5JbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAocG9pbnQsIHBvaW50V29ybGQsIHRhcmdldCwgdHJpYW5nbGUsIHRyaWFuZ2xlSW5kZXgsIGRpc3RhbmNlKSB7XG4gICAgLyoqXG4gICAgICogSW50ZXJzZWN0aW9uIHBvaW50IGluIGxvY2FsIHRyYW5zZm9ybSBjb29yZGluYXRlc1xuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0aGlzLnBvaW50ID0gcG9pbnQ7XG4gICAgLyoqXG4gICAgICogSW50ZXJzZWN0aW9uIHBvaW50IGluIHdvcmxkIHRyYW5zZm9ybSBjb29yZGluYXRlc1xuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0aGlzLnBvaW50V29ybGQgPSBwb2ludFdvcmxkO1xuICAgIC8qKlxuICAgICAqIEludGVyc2VjdGlvbiBzY2VuZSBub2RlXG4gICAgICogQHR5cGUge2NsYXkuTm9kZX1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAvKipcbiAgICAgKiBJbnRlcnNlY3Rpb24gdHJpYW5nbGUsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHZlcnRleCBpbmRleFxuICAgICAqIEB0eXBlIHtBcnJheS48bnVtYmVyPn1cbiAgICAgKi9cbiAgICB0aGlzLnRyaWFuZ2xlID0gdHJpYW5nbGU7XG4gICAgLyoqXG4gICAgICogSW5kZXggb2YgaW50ZXJzZWN0aW9uIHRyaWFuZ2xlLlxuICAgICAqL1xuICAgIHRoaXMudHJpYW5nbGVJbmRleCA9IHRyaWFuZ2xlSW5kZXg7XG4gICAgLyoqXG4gICAgICogRGlzdGFuY2UgZnJvbSBpbnRlcnNlY3Rpb24gcG9pbnQgdG8gcmF5IG9yaWdpblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUmF5UGlja2luZztcbiIsIi8vIFNwaGVyaWNhbCBIYXJtb25pYyBIZWxwZXJzXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9UZXh0dXJlJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgUGFzcyBmcm9tICcuLi9jb21wb3NpdG9yL1Bhc3MnO1xuaW1wb3J0IHZlbmRvciBmcm9tICcuLi9jb3JlL3ZlbmRvcic7XG5pbXBvcnQgU2t5Ym94IGZyb20gJy4uL3BsdWdpbi9Ta3lib3gnO1xuaW1wb3J0IFNreWRvbWUgZnJvbSAnLi4vcGx1Z2luL1NreWRvbWUnO1xuaW1wb3J0IEVudmlyb25tZW50TWFwUGFzcyBmcm9tICcuLi9wcmVQYXNzL0Vudmlyb25tZW50TWFwJztcbmltcG9ydCBTY2VuZSBmcm9tICcuLi9TY2VuZSc7XG5pbXBvcnQgZ2xtYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gZ2xtYXRyaXgudmVjMztcbnZhciBzaCA9IHt9O1xuXG5pbXBvcnQgcHJvamVjdEVudk1hcFNoYWRlckNvZGUgZnJvbSAnLi9zaGFkZXIvcHJvamVjdEVudk1hcC5nbHNsLmpzJztcblxudmFyIHRhcmdldHMgPSBbJ3B4JywgJ254JywgJ3B5JywgJ255JywgJ3B6JywgJ256J107XG5cbi8vIFByb2plY3Qgb24gZ3B1LCBidXQgbmVlZHMgYnJvd3NlciB0byBzdXBwb3J0IHJlYWRQaXhlbHMgYXMgRmxvYXQzMkFycmF5LlxuZnVuY3Rpb24gcHJvamVjdEVudmlyb25tZW50TWFwR1BVKHJlbmRlcmVyLCBlbnZNYXApIHtcbiAgICB2YXIgc2hUZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgIHdpZHRoOiA5LFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHR5cGU6IFRleHR1cmUuRkxPQVRcbiAgICB9KTtcbiAgICB2YXIgcGFzcyA9IG5ldyBQYXNzKHtcbiAgICAgICAgZnJhZ21lbnQ6IHByb2plY3RFbnZNYXBTaGFkZXJDb2RlXG4gICAgfSk7XG4gICAgcGFzcy5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1RFWFRVUkVfU0laRScsIGVudk1hcC53aWR0aCk7XG4gICAgcGFzcy5zZXRVbmlmb3JtKCdlbnZpcm9ubWVudE1hcCcsIGVudk1hcCk7XG5cbiAgICB2YXIgZnJhbWVidWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbiAgICBmcmFtZWJ1ZmZlci5hdHRhY2goc2hUZXh0dXJlKTtcbiAgICBwYXNzLnJlbmRlcihyZW5kZXJlciwgZnJhbWVidWZmZXIpO1xuXG4gICAgZnJhbWVidWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgLy8gVE9ETyBPbmx5IGNocm9tZSBhbmQgZmlyZWZveCBzdXBwb3J0IEZsb2F0MzJBcnJheVxuICAgIHZhciBwaXhlbHMgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheSg5ICogNCk7XG4gICAgcmVuZGVyZXIuZ2wucmVhZFBpeGVscygwLCAwLCA5LCAxLCBUZXh0dXJlLlJHQkEsIFRleHR1cmUuRkxPQVQsIHBpeGVscyk7XG5cbiAgICB2YXIgY29lZmYgPSBuZXcgdmVuZG9yLkZsb2F0MzJBcnJheSg5ICogMyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA5OyBpKyspIHtcbiAgICAgICAgY29lZmZbaSAqIDNdID0gcGl4ZWxzW2kgKiA0XTtcbiAgICAgICAgY29lZmZbaSAqIDMgKyAxXSA9IHBpeGVsc1tpICogNCArIDFdO1xuICAgICAgICBjb2VmZltpICogMyArIDJdID0gcGl4ZWxzW2kgKiA0ICsgMl07XG4gICAgfVxuICAgIGZyYW1lYnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG5cbiAgICBmcmFtZWJ1ZmZlci5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICBwYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIHJldHVybiBjb2VmZjtcbn1cblxuZnVuY3Rpb24gaGFybW9uaWNzKG5vcm1hbCwgaW5kZXgpe1xuICAgIHZhciB4ID0gbm9ybWFsWzBdO1xuICAgIHZhciB5ID0gbm9ybWFsWzFdO1xuICAgIHZhciB6ID0gbm9ybWFsWzJdO1xuXG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiAxLjA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGluZGV4ID09PSAxKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICBlbHNlIGlmIChpbmRleCA9PT0gMikge1xuICAgICAgICByZXR1cm4geTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5kZXggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIHo7XG4gICAgfVxuICAgIGVsc2UgaWYgKGluZGV4ID09PSA0KSB7XG4gICAgICAgIHJldHVybiB4ICogejtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5kZXggPT09IDUpIHtcbiAgICAgICAgcmV0dXJuIHkgKiB6O1xuICAgIH1cbiAgICBlbHNlIGlmIChpbmRleCA9PT0gNikge1xuICAgICAgICByZXR1cm4geCAqIHk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGluZGV4ID09PSA3KSB7XG4gICAgICAgIHJldHVybiAzLjAgKiB6ICogeiAtIDEuMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB4ICogeCAtIHkgKiB5O1xuICAgIH1cbn1cblxudmFyIG5vcm1hbFRyYW5zZm9ybSA9IHtcbiAgICBweDogWzIsIDEsIDAsIC0xLCAtMSwgMV0sXG4gICAgbng6IFsyLCAxLCAwLCAxLCAtMSwgLTFdLFxuICAgIHB5OiBbMCwgMiwgMSwgMSwgLTEsIC0xXSxcbiAgICBueTogWzAsIDIsIDEsIDEsIDEsIDFdLFxuICAgIHB6OiBbMCwgMSwgMiwgLTEsIC0xLCAtMV0sXG4gICAgbno6IFswLCAxLCAyLCAxLCAtMSwgMV1cbn07XG5cbi8vIFByb2plY3Qgb24gY3B1LlxuZnVuY3Rpb24gcHJvamVjdEVudmlyb25tZW50TWFwQ1BVKHJlbmRlcmVyLCBjdWJlUGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIGNvZWZmID0gbmV3IHZlbmRvci5GbG9hdDMyQXJyYXkoOSAqIDMpO1xuICAgIHZhciBub3JtYWwgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgIHZhciB0ZXhlbCA9IHZlYzMuY3JlYXRlKCk7XG4gICAgdmFyIGZldGNoTm9ybWFsID0gdmVjMy5jcmVhdGUoKTtcbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IDk7IG0rKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0YXJnZXRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgcGl4ZWxzID0gY3ViZVBpeGVsc1t0YXJnZXRzW2tdXTtcblxuICAgICAgICAgICAgdmFyIHNpZGVSZXN1bHQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdmFyIGRpdmlkZXIgPSAwO1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5vcm1hbFRyYW5zZm9ybVt0YXJnZXRzW2tdXTtcbiAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcblxuICAgICAgICAgICAgICAgICAgICBub3JtYWxbMF0gPSB4IC8gKHdpZHRoIC0gMS4wKSAqIDIuMCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBGbGlwIHk/XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbFsxXSA9IHkgLyAoaGVpZ2h0IC0gMS4wKSAqIDIuMCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsWzJdID0gLTEuMDtcbiAgICAgICAgICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUobm9ybWFsLCBub3JtYWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZldGNoTm9ybWFsWzBdID0gbm9ybWFsW3RyYW5zZm9ybVswXV0gKiB0cmFuc2Zvcm1bM107XG4gICAgICAgICAgICAgICAgICAgIGZldGNoTm9ybWFsWzFdID0gbm9ybWFsW3RyYW5zZm9ybVsxXV0gKiB0cmFuc2Zvcm1bNF07XG4gICAgICAgICAgICAgICAgICAgIGZldGNoTm9ybWFsWzJdID0gbm9ybWFsW3RyYW5zZm9ybVsyXV0gKiB0cmFuc2Zvcm1bNV07XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMF0gPSBwaXhlbHNbaSsrXSAvIDI1NTtcbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMV0gPSBwaXhlbHNbaSsrXSAvIDI1NTtcbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMl0gPSBwaXhlbHNbaSsrXSAvIDI1NTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUkdCTSBEZWNvZGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlID0gcGl4ZWxzW2krK10gLyAyNTUgKiA1MS41O1xuICAgICAgICAgICAgICAgICAgICB0ZXhlbFswXSAqPSBzY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdGV4ZWxbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRleGVsWzJdICo9IHNjYWxlO1xuXG4gICAgICAgICAgICAgICAgICAgIHZlYzMuc2NhbGVBbmRBZGQoc2lkZVJlc3VsdCwgc2lkZVJlc3VsdCwgdGV4ZWwsIGhhcm1vbmljcyhmZXRjaE5vcm1hbCwgbSkgKiAtbm9ybWFsWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gLW5vcm1hbC56IGVxdWFscyBjb3ModGhldGEpIG9mIExhbWJlcnRpYW5cbiAgICAgICAgICAgICAgICAgICAgZGl2aWRlciArPSAtbm9ybWFsWzJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlYzMuc2NhbGVBbmRBZGQocmVzdWx0LCByZXN1bHQsIHNpZGVSZXN1bHQsIDEgLyBkaXZpZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZWZmW20gKiAzXSA9IHJlc3VsdFswXSAvIDYuMDtcbiAgICAgICAgY29lZmZbbSAqIDMgKyAxXSA9IHJlc3VsdFsxXSAvIDYuMDtcbiAgICAgICAgY29lZmZbbSAqIDMgKyAyXSA9IHJlc3VsdFsyXSAvIDYuMDtcbiAgICB9XG4gICAgcmV0dXJuIGNvZWZmO1xufVxuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gKiBAcGFyYW0gIHtjbGF5LlRleHR1cmV9IGVudk1hcFxuICogQHBhcmFtICB7T2JqZWN0fSBbdGV4dHVyZU9wdHNdXG4gKiBAcGFyYW0gIHtPYmplY3R9IFt0ZXh0dXJlT3B0cy5sb2RdXG4gKiBAcGFyYW0gIHtib29sZWFufSBbdGV4dHVyZU9wdHMuZGVjb2RlUkdCTV1cbiAqL1xuc2gucHJvamVjdEVudmlyb25tZW50TWFwID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBlbnZNYXAsIG9wdHMpIHtcblxuICAgIC8vIFRPRE8gc1JHQlxuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgb3B0cy5sb2QgPSBvcHRzLmxvZCB8fCAwO1xuXG4gICAgdmFyIHNreWJveDtcbiAgICB2YXIgZHVtbXlTY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIHZhciBzaXplID0gNjQ7XG4gICAgaWYgKGVudk1hcCBpbnN0YW5jZW9mIFRleHR1cmUyRCkge1xuICAgICAgICBza3lib3ggPSBuZXcgU2t5ZG9tZSh7XG4gICAgICAgICAgICBzY2VuZTogZHVtbXlTY2VuZSxcbiAgICAgICAgICAgIGVudmlyb25tZW50TWFwOiBlbnZNYXBcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzaXplID0gKGVudk1hcC5pbWFnZSAmJiBlbnZNYXAuaW1hZ2UucHgpID8gZW52TWFwLmltYWdlLnB4LndpZHRoIDogZW52TWFwLndpZHRoO1xuICAgICAgICBza3lib3ggPSBuZXcgU2t5Ym94KHtcbiAgICAgICAgICAgIHNjZW5lOiBkdW1teVNjZW5lLFxuICAgICAgICAgICAgZW52aXJvbm1lbnRNYXA6IGVudk1hcFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ29udmVydCB0byByZ2JtXG4gICAgdmFyIHdpZHRoID0gTWF0aC5jZWlsKHNpemUgLyBNYXRoLnBvdygyLCBvcHRzLmxvZCkpO1xuICAgIHZhciBoZWlnaHQgPSBNYXRoLmNlaWwoc2l6ZSAvIE1hdGgucG93KDIsIG9wdHMubG9kKSk7XG4gICAgdmFyIHJnYm1UZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9KTtcbiAgICB2YXIgZnJhbWVidWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbiAgICBza3lib3gubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdSR0JNX0VOQ09ERScpO1xuICAgIGlmIChvcHRzLmRlY29kZVJHQk0pIHtcbiAgICAgICAgc2t5Ym94Lm1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCAnUkdCTV9ERUNPREUnKTtcbiAgICB9XG4gICAgc2t5Ym94Lm1hdGVyaWFsLnNldCgnbG9kJywgb3B0cy5sb2QpO1xuICAgIHZhciBlbnZNYXBQYXNzID0gbmV3IEVudmlyb25tZW50TWFwUGFzcyh7XG4gICAgICAgIHRleHR1cmU6IHJnYm1UZXh0dXJlXG4gICAgfSk7XG4gICAgdmFyIGN1YmVQaXhlbHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY3ViZVBpeGVsc1t0YXJnZXRzW2ldXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgICAgIHZhciBjYW1lcmEgPSBlbnZNYXBQYXNzLmdldENhbWVyYSh0YXJnZXRzW2ldKTtcbiAgICAgICAgY2FtZXJhLmZvdiA9IDkwO1xuICAgICAgICBmcmFtZWJ1ZmZlci5hdHRhY2gocmdibVRleHR1cmUpO1xuICAgICAgICBmcmFtZWJ1ZmZlci5iaW5kKHJlbmRlcmVyKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKGR1bW15U2NlbmUsIGNhbWVyYSk7XG4gICAgICAgIHJlbmRlcmVyLmdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgVGV4dHVyZS5SR0JBLCBUZXh0dXJlLlVOU0lHTkVEX0JZVEUsIGN1YmVQaXhlbHNbdGFyZ2V0c1tpXV1cbiAgICAgICAgKTtcbiAgICAgICAgZnJhbWVidWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcbiAgICB9XG5cbiAgICBza3lib3guZGlzcG9zZShyZW5kZXJlcik7XG4gICAgZnJhbWVidWZmZXIuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgcmdibVRleHR1cmUuZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICByZXR1cm4gcHJvamVjdEVudmlyb25tZW50TWFwQ1BVKHJlbmRlcmVyLCBjdWJlUGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNoO1xuIiwiXG4vKipcbiAqIEhlbHBlcnMgZm9yIGNyZWF0aW5nIGEgY29tbW9uIDNkIGFwcGxpY2F0aW9uLlxuICogQG5hbWVzcGFjZSBjbGF5LmFwcGxpY2F0aW9uXG4gKi9cblxuIC8vIFRPRE8gY3JlYXRlQ29tcG9zaXRvclxuIC8vIFRPRE8gbW9iaWxlLiBzY3JvbGwgZXZlbnRzLlxuIC8vIFRPRE8gRGlzcG9zZSB0ZXN0LiBnZW9DYWNoZSB0ZXN0LlxuIC8vIFRPRE8gZml0TW9kZWwsIG5vcm1hbCBnZW5lcmF0aW9uLlxuIC8vIFRPRE8gU2t5Ym94LCBTa3lkb21lLlxuIC8vIFRPRE8gUGFydGljbGUgP1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vUmVuZGVyZXInO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4vU2NlbmUnO1xuaW1wb3J0IFRpbWVsaW5lIGZyb20gJy4vYW5pbWF0aW9uL1RpbWVsaW5lJztcbmltcG9ydCBDdWJlR2VvIGZyb20gJy4vZ2VvbWV0cnkvQ3ViZSc7XG5pbXBvcnQgU3BoZXJlR2VvIGZyb20gJy4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCBQbGFuZUdlbyBmcm9tICcuL2dlb21ldHJ5L1BsYW5lJztcbmltcG9ydCBUZXh0dXJlMkQgZnJvbSAnLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9UZXh0dXJlJztcbmltcG9ydCBzaGFkZXJMaWJyYXJ5IGZyb20gJy4vc2hhZGVyL2xpYnJhcnknO1xuaW1wb3J0IE1lc2ggZnJvbSAnLi9NZXNoJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL01hdGVyaWFsJztcbmltcG9ydCBQZXJzcGVjdGl2ZUNhbWVyYSBmcm9tICcuL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgT3J0aG9ncmFwaGljQ2FtZXJhIGZyb20gJy4vY2FtZXJhL09ydGhvZ3JhcGhpYyc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgR0xURkxvYWRlciBmcm9tICcuL2xvYWRlci9HTFRGJztcbmltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5pbXBvcnQgRGlyZWN0aW9uYWxMaWdodCBmcm9tICcuL2xpZ2h0L0RpcmVjdGlvbmFsJztcbmltcG9ydCBQb2ludExpZ2h0IGZyb20gJy4vbGlnaHQvUG9pbnQnO1xuaW1wb3J0IFNwb3RMaWdodCBmcm9tICcuL2xpZ2h0L1Nwb3QnO1xuaW1wb3J0IEFtYmllbnRMaWdodCBmcm9tICcuL2xpZ2h0L0FtYmllbnQnO1xuaW1wb3J0IEFtYmllbnRDdWJlbWFwTGlnaHQgZnJvbSAnLi9saWdodC9BbWJpZW50Q3ViZW1hcCc7XG5pbXBvcnQgQW1iaWVudFNITGlnaHQgZnJvbSAnLi9saWdodC9BbWJpZW50U0gnO1xuaW1wb3J0IFNoYWRvd01hcFBhc3MgZnJvbSAnLi9wcmVQYXNzL1NoYWRvd01hcCc7XG5pbXBvcnQgUmF5UGlja2luZyBmcm9tICcuL3BpY2tpbmcvUmF5UGlja2luZyc7XG5pbXBvcnQgTFJVQ2FjaGUgZnJvbSAnLi9jb3JlL0xSVSc7XG5pbXBvcnQgdXRpbCBmcm9tICcuL2NvcmUvdXRpbCc7XG5pbXBvcnQgc2hVdGlsIGZyb20gJy4vdXRpbC9zaCc7XG5pbXBvcnQgdGV4dHVyZVV0aWwgZnJvbSAnLi91dGlsL3RleHR1cmUnO1xuXG5pbXBvcnQgY29sb3JVdGlsIGZyb20gJy4vY29yZS9jb2xvcic7XG52YXIgcGFyc2VDb2xvciA9IGNvbG9yVXRpbC5wYXJzZVRvRmxvYXQ7XG5cbmltcG9ydCAnLi9zaGFkZXIvYnVpbHRpbic7XG5pbXBvcnQgU2hhZGVyIGZyb20gJy4vU2hhZGVyJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfEhUTUxDYW52YXNFbGVtZW50fEhUTUxJbWFnZUVsZW1lbnR8SFRNTFZpZGVvRWxlbWVudH0gSW1hZ2VMaWtlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ3xBcnJheS48bnVtYmVyPn0gQ29sb3JcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7SFRNTERvbUVsZW1lbnR8c3RyaW5nfSBEb21RdWVyeVxuICovXG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5hcHBsaWNhdGlvbi5BcHAzRFxuICogQHBhcmFtIHtEb21RdWVyeX0gZG9tIENvbnRhaW5lciBkb20gZWxlbWVudCBvciBhIHNlbGVjdG9yIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGBxdWVyeVNlbGVjdG9yYFxuICogQHBhcmFtIHtPYmplY3R9IGFwcE5TXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcHBOUy5pbml0IEluaXRpYWxpemF0aW9uIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBpbml0aW5nIGFwcC5cbiAqICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gcmV0dXJuIGEgcHJvbWlzZSBpbiBpbml0IHRvIHN0YXJ0IHRoZSBsb29wIGFzeW5jaHJvbm91c2x5IHdoZW4gdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcHBOUy5sb29wIExvb3AgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCBlYWNoIGZyYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXBwTlMuYmVmb3JlUmVuZGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcHBOUy5hZnRlclJlbmRlclxuICogQHBhcmFtIHtudW1iZXJ9IFthcHBOUy53aWR0aF0gQ29udGFpbmVyIHdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcHBOUy5oZWlnaHRdIENvbnRhaW5lciBoZWlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FwcE5TLmRldmljZVBpeGVsUmF0aW9dXG4gKiBAcGFyYW0ge09iamVjdH0gW2FwcE5TLmdyYXBoaWNdIEdyYXBoaWMgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgc2hhZG93LCBwb3N0RWZmZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcHBOUy5ncmFwaGljLnNoYWRvdz1mYWxzZV0gSWYgZW5hYmxlIHNoYWRvd1xuICogQHBhcmFtIHtib29sZWFufSBbYXBwTlMuZ3JhcGhpYy5saW5lYXI9ZmFsc2VdIElmIHVzZSBsaW5lYXIgc3BhY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FwcE5TLmdyYXBoaWMudG9uZW1hcHBpbmc9ZmFsc2VdIElmIGVuYWJsZSBBQ0VTIHRvbmUgbWFwcGluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FwcE5TLmV2ZW50PWZhbHNlXSBJZiBlbmFibGUgbW91c2UvdG91Y2ggZXZlbnQuIEl0IHdpbGwgc2xvdyBkb3duIHRoZSBzeXN0ZW0gaWYgZ2VvbWV0cmllcyBhcmUgY29tcGxleC5cbiAqL1xuZnVuY3Rpb24gQXBwM0QoZG9tLCBhcHBOUykge1xuXG4gICAgYXBwTlMgPSBhcHBOUyB8fCB7fTtcbiAgICBhcHBOUy5ncmFwaGljID0gYXBwTlMuZ3JhcGhpYyB8fCB7fTtcblxuICAgIGlmICh0eXBlb2YgZG9tID09PSAnc3RyaW5nJykge1xuICAgICAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGRvbSk7XG4gICAgfVxuXG4gICAgaWYgKCFkb20pIHsgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRvbScpOyB9XG5cbiAgICB2YXIgaXNEb21DYW52YXMgPSBkb20ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0NBTlZBUyc7XG4gICAgdmFyIHJlbmRlcmVyT3B0cyA9IHt9O1xuICAgIGlzRG9tQ2FudmFzICYmIChyZW5kZXJlck9wdHMuY2FudmFzID0gZG9tKTtcbiAgICBhcHBOUy5kZXZpY2VQaXhlbFJhdGlvICYmIChyZW5kZXJlck9wdHMuZGV2aWNlUGl4ZWxSYXRpbyA9IGFwcE5TLmRldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgdmFyIGdSZW5kZXJlciA9IG5ldyBSZW5kZXJlcihyZW5kZXJlck9wdHMpO1xuICAgIHZhciBnV2lkdGggPSBhcHBOUy53aWR0aCB8fCBkb20uY2xpZW50V2lkdGg7XG4gICAgdmFyIGdIZWlnaHQgPSBhcHBOUy5oZWlnaHQgfHwgZG9tLmNsaWVudEhlaWdodDtcblxuICAgIHZhciBnU2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB2YXIgZ1RpbWVsaW5lID0gbmV3IFRpbWVsaW5lKCk7XG4gICAgdmFyIGdTaGFkb3dQYXNzID0gYXBwTlMuZ3JhcGhpYy5zaGFkb3cgJiYgbmV3IFNoYWRvd01hcFBhc3MoKTtcbiAgICB2YXIgZ1JheVBpY2tpbmcgPSBhcHBOUy5ldmVudCAmJiBuZXcgUmF5UGlja2luZyh7XG4gICAgICAgIHNjZW5lOiBnU2NlbmUsXG4gICAgICAgIHJlbmRlcmVyOiBnUmVuZGVyZXJcbiAgICB9KTtcblxuICAgICFpc0RvbUNhbnZhcyAmJiBkb20uYXBwZW5kQ2hpbGQoZ1JlbmRlcmVyLmNhbnZhcyk7XG5cbiAgICBnUmVuZGVyZXIucmVzaXplKGdXaWR0aCwgZ0hlaWdodCk7XG5cbiAgICB2YXIgZ0ZyYW1lVGltZSA9IDA7XG4gICAgdmFyIGdFbGFwc2VkVGltZSA9IDA7XG5cbiAgICBnVGltZWxpbmUuc3RhcnQoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnRhaW5lciBkb20gZWxlbWVudFxuICAgICAgICAgKiBAbmFtZSBjbGF5LmFwcGxpY2F0aW9uLkFwcDNEI2NvbnRhaW5lclxuICAgICAgICAgKiBAdHlwZSB7SFRNTERvbUVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBjb250YWluZXI6IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkb207IH0gfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIGNsYXkuYXBwbGljYXRpb24uQXBwM0QjcmVuZGVyZXJcbiAgICAgICAgICogQHR5cGUge2NsYXkuUmVuZGVyZXJ9XG4gICAgICAgICAqL1xuICAgICAgICByZW5kZXJlcjogeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdSZW5kZXJlcjsgfX0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBjbGF5LmFwcGxpY2F0aW9uLkFwcDNEI3NjZW5lXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LlJlbmRlcmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgc2NlbmU6IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnU2NlbmU7IH19LFxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgY2xheS5hcHBsaWNhdGlvbi5BcHAzRCN0aW1lbGluZVxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5SZW5kZXJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRpbWVsaW5lOiB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ1RpbWVsaW5lOyB9fSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IGZyYW1lLiBDYW4gYmUgdXNlZCBpbiBsb29wIHRvIGNhbGN1bGF0ZSB0aGUgbW92ZW1lbnQuXG4gICAgICAgICAqIEBuYW1lIGNsYXkuYXBwbGljYXRpb24uQXBwM0QjZnJhbWVUaW1lXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBmcmFtZVRpbWU6IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnRnJhbWVUaW1lOyB9fSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpbWUgZWxhcHNlZCBzaW5jZSBhcHBsaWNhdGlvbiBjcmVhdGVkLlxuICAgICAgICAgKiBAbmFtZSBjbGF5LmFwcGxpY2F0aW9uLkFwcDNEI2VsYXBzZWRUaW1lXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBlbGFwc2VkVGltZTogeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdFbGFwc2VkVGltZTsgfX1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgYXBwbGljYXRpb24uIFdpbGwgdXNlIHRoZSBjb250YWluZXIgY2xpZW50V2lkdGgvY2xpZW50SGVpZ2h0IGlmIHdpZHRoL2hlaWdodCBpbiBwYXJhbWV0ZXJzIGFyZSBub3QgZ2l2ZW4uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQG1lbWJlck9mIHtjbGF5LmFwcGxpY2F0aW9uLkFwcDNEfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdXG4gICAgICovXG4gICAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBnV2lkdGggPSB3aWR0aCB8fCBhcHBOUy53aWR0aCB8fCBkb20uY2xpZW50V2lkdGg7XG4gICAgICAgIGdIZWlnaHQgPSBoZWlnaHQgfHwgZG9tLmhlaWdodCB8fCBkb20uY2xpZW50SGVpZ2h0O1xuICAgICAgICBnUmVuZGVyZXIucmVzaXplKGdXaWR0aCwgZ0hlaWdodCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2UgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICovXG4gICAgdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGFwcE5TLmRpc3Bvc2UpIHtcbiAgICAgICAgICAgIGFwcE5TLmRpc3Bvc2UodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZ1RpbWVsaW5lLnN0b3AoKTtcbiAgICAgICAgZ1JlbmRlcmVyLmRpc3Bvc2VTY2VuZShnU2NlbmUpO1xuICAgICAgICBnU2hhZG93UGFzcyAmJiBnU2hhZG93UGFzcy5kaXNwb3NlKGdSZW5kZXJlcik7XG5cbiAgICAgICAgZG9tLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzW21ha2VIYW5kbGVyTmFtZShldmVUeXBlKV0gJiYgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobWFrZUhhbmRsZXJOYW1lKGV2ZVR5cGUpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGdSYXlQaWNraW5nICYmIHRoaXMuX2luaXRNb3VzZUV2ZW50cyhnUmF5UGlja2luZyk7XG5cbiAgICB0aGlzLl9nZW9DYWNoZSA9IG5ldyBMUlVDYWNoZSgyMCk7XG4gICAgdGhpcy5fdGV4Q2FjaGUgPSBuZXcgTFJVQ2FjaGUoMjApO1xuXG4gICAgLy8gRG8gaW5pdCB0aGUgYXBwbGljYXRpb24uXG4gICAgdmFyIGluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGFwcE5TLmluaXQgJiYgYXBwTlMuaW5pdCh0aGlzKSk7XG4gICAgLy8gVXNlIHRoZSBpbml0ZWQgY2FtZXJhLlxuICAgIGdSYXlQaWNraW5nICYmIChnUmF5UGlja2luZy5jYW1lcmEgPSBnU2NlbmUuZ2V0TWFpbkNhbWVyYSgpKTtcblxuICAgIHZhciBnVGV4dHVyZXNMaXN0ID0ge307XG4gICAgdmFyIGdHZW9tZXRyaWVzTGlzdCA9IHt9O1xuXG4gICAgaWYgKCFhcHBOUy5sb29wKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTWlzcyBsb29wIG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaW5pdFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFwcE5TLmxvb3AgJiYgZ1RpbWVsaW5lLm9uKCdmcmFtZScsIGZ1bmN0aW9uIChmcmFtZVRpbWUpIHtcbiAgICAgICAgICAgIGdGcmFtZVRpbWUgPSBmcmFtZVRpbWU7XG4gICAgICAgICAgICBnRWxhcHNlZFRpbWUgKz0gZnJhbWVUaW1lO1xuICAgICAgICAgICAgYXBwTlMubG9vcChzZWxmKTtcblxuICAgICAgICAgICAgZ1NjZW5lLnVwZGF0ZSgpO1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlR3JhcGhpY09wdGlvbnMoYXBwTlMuZ3JhcGhpYywgZ1NjZW5lLm9wYXF1ZUxpc3QpO1xuICAgICAgICAgICAgc2VsZi5fdXBkYXRlR3JhcGhpY09wdGlvbnMoYXBwTlMuZ3JhcGhpYywgZ1NjZW5lLnRyYW5zcGFyZW50TGlzdCk7XG5cbiAgICAgICAgICAgIGdSYXlQaWNraW5nICYmIChnUmF5UGlja2luZy5jYW1lcmEgPSBnU2NlbmUuZ2V0TWFpbkNhbWVyYSgpKTtcbiAgICAgICAgICAgIC8vIFJlbmRlciBzaGFkb3cgcGFzc1xuICAgICAgICAgICAgZ1NoYWRvd1Bhc3MgJiYgZ1NoYWRvd1Bhc3MucmVuZGVyKGdSZW5kZXJlciwgZ1NjZW5lLCBudWxsLCB0cnVlKTtcblxuICAgICAgICAgICAgYXBwTlMuYmVmb3JlUmVuZGVyICYmIGFwcE5TLmJlZm9yZVJlbmRlcihzZWxmKTtcbiAgICAgICAgICAgIHNlbGYuX2RvUmVuZGVyKGdSZW5kZXJlciwgZ1NjZW5lLCB0cnVlKTtcbiAgICAgICAgICAgIGFwcE5TLmFmdGVyUmVuZGVyICYmIGFwcE5TLmFmdGVyUmVuZGVyKHNlbGYpO1xuXG4gICAgICAgICAgICAvLyBNYXJrIGFsbCByZXNvdXJjZXMgdW51c2VkO1xuICAgICAgICAgICAgbWFya1VudXNlZChnVGV4dHVyZXNMaXN0KTtcbiAgICAgICAgICAgIG1hcmtVbnVzZWQoZ0dlb21ldHJpZXNMaXN0KTtcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCByZXNvdXJjZXMgdXNlZCBpbiB0aGlzIGZyYW1lLlxuICAgICAgICAgICAgdmFyIG5ld1RleHR1cmVzTGlzdCA9IFtdO1xuICAgICAgICAgICAgdmFyIG5ld0dlb21ldHJpZXNMaXN0ID0gW107XG4gICAgICAgICAgICBjb2xsZWN0UmVzb3VyY2VzKGdTY2VuZSwgbmV3VGV4dHVyZXNMaXN0LCBuZXdHZW9tZXRyaWVzTGlzdCk7XG5cbiAgICAgICAgICAgIC8vIERpc3Bvc2UgdGhvc2UgdW5zZWQgcmVzb3VyY2VzLlxuICAgICAgICAgICAgY2hlY2tBbmREaXNwb3NlKGdSZW5kZXJlciwgZ1RleHR1cmVzTGlzdCk7XG4gICAgICAgICAgICBjaGVja0FuZERpc3Bvc2UoZ1JlbmRlcmVyLCBnR2VvbWV0cmllc0xpc3QpO1xuXG4gICAgICAgICAgICBnVGV4dHVyZXNMaXN0ID0gbmV3VGV4dHVyZXNMaXN0O1xuICAgICAgICAgICAgZ0dlb21ldHJpZXNMaXN0ID0gbmV3R2VvbWV0cmllc0xpc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlTGlrZUVsZW1lbnQodmFsKSB7XG4gICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEltYWdlXG4gICAgICAgIHx8IHZhbCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50XG4gICAgICAgIHx8IHZhbCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEtleUZyb21JbWFnZUxpa2UodmFsKSB7XG4gICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyB2YWwgOiAodmFsLl9fa2V5X18gfHwgKHZhbC5fX2tleV9fID0gdXRpbC5nZW5HVUlEKCkpKTtcbn1cblxuZnVuY3Rpb24gbWFrZUhhbmRsZXJOYW1lKGV2ZVR5cGUpIHtcbiAgICByZXR1cm4gJ18nICsgZXZlVHlwZSArICdIYW5kbGVyJztcbn1cblxuZnVuY3Rpb24gcGFja2FnZUV2ZW50KGV2ZW50VHlwZSwgcGlja1Jlc3VsdCwgb2Zmc2V0WCwgb2Zmc2V0WSkge1xuICAgIHZhciBldmVudCA9IHV0aWwuY2xvbmUocGlja1Jlc3VsdCk7XG4gICAgZXZlbnQudHlwZSA9IGV2ZW50VHlwZTtcbiAgICBldmVudC5vZmZzZXRYID0gb2Zmc2V0WDtcbiAgICBldmVudC5vZmZzZXRZID0gb2Zmc2V0WTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG5cbmZ1bmN0aW9uIGJ1YmJsaW5nRXZlbnQodGFyZ2V0LCBldmVudCkge1xuICAgIHdoaWxlICh0YXJnZXQgJiYgIWV2ZW50LmNhbmNlbEJ1YmJsZSkge1xuICAgICAgICB0YXJnZXQudHJpZ2dlcihldmVudC50eXBlLCBldmVudCk7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5nZXRQYXJlbnQoKTtcbiAgICB9XG59XG5cbkFwcDNELnByb3RvdHlwZS5faW5pdE1vdXNlRXZlbnRzID0gZnVuY3Rpb24gKHJheVBpY2tpbmcpIHtcbiAgICB2YXIgZG9tID0gdGhpcy5jb250YWluZXI7XG5cbiAgICB2YXIgb2xkVGFyZ2V0ID0gbnVsbDtcbiAgICBbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVUeXBlKSB7XG4gICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKGV2ZVR5cGUsIHRoaXNbbWFrZUhhbmRsZXJOYW1lKGV2ZVR5cGUpXSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoIXJheVBpY2tpbmcuY2FtZXJhKSB7IC8vIE5vdCBoYXZlIGNhbWVyYSB5ZXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYm94ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIG9mZnNldFggPSBlLmNsaWVudFggLSBib3gubGVmdDtcbiAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZS5jbGllbnRZIC0gYm94LnRvcDtcblxuICAgICAgICAgICAgdmFyIHBpY2tSZXN1bHQgPSByYXlQaWNraW5nLnBpY2sob2Zmc2V0WCwgb2Zmc2V0WSk7XG5cbiAgICAgICAgICAgIGlmIChwaWNrUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgc2lsZW50IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgaWYgKHBpY2tSZXN1bHQudGFyZ2V0LnNpbGVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZVR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDaGFuZ2VkID0gcGlja1Jlc3VsdC50YXJnZXQgIT09IG9sZFRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFRhcmdldCAmJiBidWJibGluZ0V2ZW50KG9sZFRhcmdldCwgcGFja2FnZUV2ZW50KCdtb3VzZW91dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9sZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsaW5nRXZlbnQocGlja1Jlc3VsdC50YXJnZXQsIHBhY2thZ2VFdmVudCgnbW91c2Vtb3ZlJywgcGlja1Jlc3VsdCwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxpbmdFdmVudChwaWNrUmVzdWx0LnRhcmdldCwgcGFja2FnZUV2ZW50KCdtb3VzZW92ZXInLCBwaWNrUmVzdWx0LCBvZmZzZXRYLCBvZmZzZXRZKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1YmJsaW5nRXZlbnQocGlja1Jlc3VsdC50YXJnZXQsIHBhY2thZ2VFdmVudChldmVUeXBlLCBwaWNrUmVzdWx0LCBvZmZzZXRYLCBvZmZzZXRZKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9sZFRhcmdldCA9IHBpY2tSZXN1bHQudGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgYnViYmxpbmdFdmVudChvbGRUYXJnZXQsIHBhY2thZ2VFdmVudCgnbW91c2VvdXQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogb2xkVGFyZ2V0XG4gICAgICAgICAgICAgICAgfSwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xuICAgICAgICAgICAgICAgIG9sZFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIHRoaXMpO1xufTtcblxuQXBwM0QucHJvdG90eXBlLl91cGRhdGVHcmFwaGljT3B0aW9ucyA9IGZ1bmN0aW9uIChncmFwaGljT3B0cywgbGlzdCkge1xuICAgIHZhciBlbmFibGVUb25lbWFwcGluZyA9ICEhZ3JhcGhpY09wdHMudG9uZW1hcHBpbmc7XG4gICAgdmFyIGlzTGluZWFyU3BhY2UgPSAhIWdyYXBoaWNPcHRzLmxpbmVhcjtcblxuICAgIHZhciBwcmV2TWF0ZXJpYWw7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG1hdCA9IGxpc3RbaV0ubWF0ZXJpYWw7XG4gICAgICAgIGlmIChtYXQgPT09IHByZXZNYXRlcmlhbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlbmFibGVUb25lbWFwcGluZyA/IG1hdC5kZWZpbmUoJ2ZyYWdtZW50JywgJ1RPTkVNQVBQSU5HJykgOiBtYXQudW5kZWZpbmUoJ2ZyYWdtZW50JywgJ1RPTkVNQVBQSU5HJyk7XG4gICAgICAgIGlmIChpc0xpbmVhclNwYWNlKSB7XG4gICAgICAgICAgICBtYXQuZGVmaW5lKCdmcmFnbWVudCcsICdTUkdCX0VOQ09ERScpO1xuICAgICAgICAgICAgbWF0LmRlZmluZSgnZnJhZ21lbnQnLCAnU1JHQl9ERUNPREUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdC51bmRlZmluZSgnZnJhZ21lbnQnLCAnU1JHQl9FTkNPREUnKTtcbiAgICAgICAgICAgIG1hdC51bmRlZmluZSgnZnJhZ21lbnQnLCAnU1JHQl9ERUNPREUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZNYXRlcmlhbCA9IG1hdDtcbiAgICB9XG59O1xuXG5BcHAzRC5wcm90b3R5cGUuX2RvUmVuZGVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSkge1xuICAgIHZhciBjYW1lcmEgPSBzY2VuZS5nZXRNYWluQ2FtZXJhKCk7XG4gICAgY2FtZXJhLmFzcGVjdCA9IHJlbmRlcmVyLmdldFZpZXdwb3J0QXNwZWN0KCk7XG4gICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lKTtcbn07XG5cblxuZnVuY3Rpb24gbWFya1VudXNlZChyZXNvdXJjZUxpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc291cmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNvdXJjZUxpc3RbaV0uX191c2VkX18gPSAwO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tBbmREaXNwb3NlKHJlbmRlcmVyLCByZXNvdXJjZUxpc3QpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc291cmNlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXJlc291cmNlTGlzdFtpXS5fX3VzZWRfXykge1xuICAgICAgICAgICAgcmVzb3VyY2VMaXN0W2ldLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVVc2VkKHJlc291cmNlLCBsaXN0KSB7XG4gICAgcmVzb3VyY2UuX191c2VkX18gPSByZXNvdXJjZS5fX3VzZWRfXyB8fCAwO1xuICAgIHJlc291cmNlLl9fdXNlZF9fKys7XG4gICAgaWYgKHJlc291cmNlLl9fdXNlZF9fID09PSAxKSB7XG4gICAgICAgIC8vIERvbid0IHB1c2ggdG8gdGhlIGxpc3QgdHdpY2UuXG4gICAgICAgIGxpc3QucHVzaChyZXNvdXJjZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29sbGVjdFJlc291cmNlcyhzY2VuZSwgdGV4dHVyZVJlc291cmNlTGlzdCwgZ2VvbWV0cnlSZXNvdXJjZUxpc3QpIHtcbiAgICBmdW5jdGlvbiB0cmFja1F1ZXVlKHF1ZXVlKSB7XG4gICAgICAgIHZhciBwcmV2TWF0ZXJpYWw7XG4gICAgICAgIHZhciBwcmV2R2VvbWV0cnk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gcXVldWVbaV07XG4gICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSByZW5kZXJhYmxlLmdlb21ldHJ5O1xuICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gcmVuZGVyYWJsZS5tYXRlcmlhbDtcblxuICAgICAgICAgICAgLy8gVE9ETyBvcHRpbWl6ZSEhXG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwgIT09IHByZXZNYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlVW5pZm9ybXMgPSBtYXRlcmlhbC5nZXRUZXh0dXJlVW5pZm9ybXMoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IHRleHR1cmVVbmlmb3Jtcy5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5pZm9ybU5hbWUgPSB0ZXh0dXJlVW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBtYXRlcmlhbC51bmlmb3Jtc1t1bmlmb3JtTmFtZV0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgVGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlZCh2YWwsIHRleHR1cmVSZXNvdXJjZUxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHZhbC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxba10gaW5zdGFuY2VvZiBUZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVVzZWQodmFsW2tdLCB0ZXh0dXJlUmVzb3VyY2VMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2VvbWV0cnkgIT09IHByZXZHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVVzZWQoZ2VvbWV0cnksIGdlb21ldHJ5UmVzb3VyY2VMaXN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldk1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgICAgICAgICBwcmV2R2VvbWV0cnkgPSBnZW9tZXRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYWNrUXVldWUoc2NlbmUub3BhcXVlTGlzdCk7XG4gICAgdHJhY2tRdWV1ZShzY2VuZS50cmFuc3BhcmVudExpc3QpO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBzY2VuZS5saWdodHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gVHJhY2sgQW1iaWVudEN1YmVtYXBcbiAgICAgICAgaWYgKHNjZW5lLmxpZ2h0c1trXS5jdWJlbWFwKSB7XG4gICAgICAgICAgICB1cGRhdGVVc2VkKHNjZW5lLmxpZ2h0c1trXS5jdWJlbWFwLCB0ZXh0dXJlUmVzb3VyY2VMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogTG9hZCBhIHRleHR1cmUgZnJvbSBpbWFnZSBvciBzdHJpbmcuXG4gKiBAcGFyYW0ge0ltYWdlTGlrZX0gaW1nXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIFRleHR1cmUgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxpcFk9dHJ1ZV0gSWYgZmxpcFkuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmZsaXBZfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmFuaXNvdHJvcGljXSBBbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmFuaXNvdHJvcGljfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBTPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBTfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBUPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBUfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1pbkZpbHRlcj1jbGF5LlRleHR1cmUuTElORUFSX01JUE1BUF9MSU5FQVJdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLm1pbkZpbHRlcn1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYWdGaWx0ZXI9Y2xheS5UZXh0dXJlLkxJTkVBUl0gU2VlIHtAbGluayBjbGF5LlRleHR1cmUubWFnRmlsdGVyfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmV4cG9zdXJlXSBPbmx5IGJlIHVzZWQgd2hlbiBzb3VyY2UgaXMgYSBIRFIgaW1hZ2UuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VDYWNoZV0gSWYgdXNlIGNhY2hlLlxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqIEBleGFtcGxlXG4gKiAgYXBwLmxvYWRUZXh0dXJlKCdkaWZmdXNlTWFwLmpwZycpXG4gKiAgICAgIC50aGVuKGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gKiAgICAgICAgICBtYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCB0ZXh0dXJlKTtcbiAqICAgICAgfSk7XG4gKi9cbkFwcDNELnByb3RvdHlwZS5sb2FkVGV4dHVyZSA9IGZ1bmN0aW9uICh1cmxPckltZywgb3B0cywgdXNlQ2FjaGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JbWFnZUxpa2UodXJsT3JJbWcpO1xuICAgIGlmICh1c2VDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5fdGV4Q2FjaGUuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXhDYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUT0RPIFByb21pc2UgP1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IHNlbGYubG9hZFRleHR1cmVTeW5jKHVybE9ySW1nLCBvcHRzKTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICB0ZXh0dXJlLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUodGV4dHVyZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRleHR1cmUuZXJyb3IoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHVzZUNhY2hlKSB7XG4gICAgICAgIHRoaXMuX3RleENhY2hlLnB1dChrZXksIHByb21pc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgdGV4dHVyZSBmcm9tIGltYWdlIG9yIHN0cmluZyBzeW5jaHJvbm91c2x5LiBUZXh0dXJlIGNhbiBiZSB1c2UgZGlyZWN0bHkgYW5kIGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgaXQncyBsb2FkZWQuXG4gKiBAcGFyYW0ge0ltYWdlTGlrZX0gaW1nXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIFRleHR1cmUgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxpcFk9dHJ1ZV0gSWYgZmxpcFkuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmZsaXBZfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmFuaXNvdHJvcGljXSBBbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLmFuaXNvdHJvcGljfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBTPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBTfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLndyYXBUPWNsYXkuVGV4dHVyZS5SRVBFQVRdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLndyYXBUfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1pbkZpbHRlcj1jbGF5LlRleHR1cmUuTElORUFSX01JUE1BUF9MSU5FQVJdIFNlZSB7QGxpbmsgY2xheS5UZXh0dXJlLm1pbkZpbHRlcn1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYWdGaWx0ZXI9Y2xheS5UZXh0dXJlLkxJTkVBUl0gU2VlIHtAbGluayBjbGF5LlRleHR1cmUubWFnRmlsdGVyfVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmV4cG9zdXJlXSBPbmx5IGJlIHVzZWQgd2hlbiBzb3VyY2UgaXMgYSBIRFIgaW1hZ2UuXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogQGV4YW1wbGVcbiAqICB2YXIgdGV4dHVyZSA9IGFwcC5sb2FkVGV4dHVyZSgnZGlmZnVzZU1hcC5qcGcnLCB7XG4gKiAgICAgIGFuaXNvdHJvcGljOiA4LFxuICogICAgICBmbGlwWTogZmFsc2VcbiAqICB9KTtcbiAqICBtYXRlcmlhbC5zZXQoJ2RpZmZ1c2VNYXAnLCB0ZXh0dXJlKTtcbiAqL1xuQXBwM0QucHJvdG90eXBlLmxvYWRUZXh0dXJlU3luYyA9IGZ1bmN0aW9uICh1cmxPckltZywgb3B0cykge1xuICAgIHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUyRChvcHRzKTtcbiAgICBpZiAodHlwZW9mIHVybE9ySW1nID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodXJsT3JJbWcubWF0Y2goLy5oZHIkfF5kYXRhOmFwcGxpY2F0aW9uXFwvb2N0ZXQtc3RyZWFtLykpIHtcbiAgICAgICAgICAgIHRleHR1cmUgPSB0ZXh0dXJlVXRpbC5sb2FkVGV4dHVyZSh1cmxPckltZywge1xuICAgICAgICAgICAgICAgIGV4cG9zdXJlOiBvcHRzICYmIG9wdHMuZXhwb3N1cmUsXG4gICAgICAgICAgICAgICAgZmlsZVR5cGU6ICdoZHInXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHRleHR1cmUudHJpZ2dlcignc3VjY2VzcycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0dXJlLmxvYWQodXJsT3JJbWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzSW1hZ2VMaWtlRWxlbWVudCh1cmxPckltZykpIHtcbiAgICAgICAgdGV4dHVyZS5pbWFnZSA9IHVybE9ySW1nO1xuICAgICAgICB0ZXh0dXJlLmR5bmFtaWMgPSB1cmxPckltZyBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0dXJlO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBtYXRlcmlhbC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXRlcmlhbENvbmZpZy4gbWF0ZXJpYWxDb25maWcgY29udGFpbnMgYHNoYWRlcmAsIGB0cmFuc3BhcmVudGAgYW5kIHVuaWZvcm1zIHRoYXQgdXNlZCBpbiBjb3JyZXNwb25kaW5nIHVuaWZvcm1zLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlmb3JtcyBjYW4gYmUgYGNvbG9yYCwgYGFscGhhYCBgZGlmZnVzZU1hcGAgZXRjLlxuICogQHBhcmFtIHtzdHJpbmd8Y2xheS5TaGFkZXJ9IFtzaGFkZXI9J2NsYXkuc3RhbmRhcmRNUiddIERlZmF1bHQgdG8gYmUgc3RhbmRhcmQgc2hhZGVyIHdpdGggbWV0YWxuZXNzIGFuZCByb3VnaG5lc3Mgd29ya2Zsb3cuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0cmFuc3BhcmVudD1mYWxzZV0gSWYgbWF0ZXJpYWwgaXMgdHJhbnNwYXJlbnQuXG4gKiBAcmV0dXJuIHtjbGF5Lk1hdGVyaWFsfVxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlTWF0ZXJpYWwgPSBmdW5jdGlvbiAobWF0Q29uZmlnKSB7XG4gICAgbWF0Q29uZmlnID0gbWF0Q29uZmlnIHx8IHt9O1xuICAgIG1hdENvbmZpZy5zaGFkZXIgPSBtYXRDb25maWcuc2hhZGVyIHx8ICdjbGF5LnN0YW5kYXJkTVInO1xuICAgIHZhciBzaGFkZXIgPSBtYXRDb25maWcuc2hhZGVyIGluc3RhbmNlb2YgU2hhZGVyID8gbWF0Q29uZmlnLnNoYWRlciA6IHNoYWRlckxpYnJhcnkuZ2V0KG1hdENvbmZpZy5zaGFkZXIpO1xuICAgIHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgIHNoYWRlcjogc2hhZGVyXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gbWFrZVRleHR1cmVTZXR0ZXIoa2V5KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGV4dHVyZSkge1xuICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybShrZXksIHRleHR1cmUpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0Q29uZmlnKSB7XG4gICAgICAgIGlmIChtYXRlcmlhbC51bmlmb3Jtc1trZXldKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gbWF0Q29uZmlnW2tleV07XG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwudW5pZm9ybXNba2V5XS50eXBlID09PSAndCcgfHwgaXNJbWFnZUxpa2VFbGVtZW50KHZhbCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCBhIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGV4dHVyZSh2YWwpLnRoZW4obWFrZVRleHR1cmVTZXR0ZXIoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKGtleSwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYXRDb25maWcudHJhbnNwYXJlbnQpIHtcbiAgICAgICAgbWF0Q29uZmlnLmRlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICBtYXRDb25maWcudHJhbnNwYXJlbnQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0ZXJpYWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGN1YmUgbWVzaCBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZSBvciB0aGUgZ2l2ZW4gcGFyZW50IG5vZGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58bnVtYmVyfSBbc3ViZGl2aXNpb249MV0gU3ViZGl2aXNpb24gb2YgY3ViZS5cbiAqICAgICAgICAgIENhbiBiZSBhIG51bWJlciB0byByZXByZXNlbnQgYm90aCB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aCBkaW1lbnNpb25zLiBPciBhbiBhcnJheSB0byByZXByZXNlbnQgdGhlbSByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0ge09iamVjdHxjbGF5Lk1hdGVyaWFsfSBbbWF0ZXJpYWxdXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW3BhcmVudE5vZGVdIFBhcmVudCBub2RlIHRvIGFwcGVuZC4gRGVmYXVsdCB0byBiZSBzY2VuZS5cbiAqIEByZXR1cm4ge2NsYXkuTWVzaH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gQ3JlYXRlIGEgd2hpdGUgY3ViZS5cbiAqICBhcHAuY3JlYXRlQ3ViZSgpXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVDdWJlID0gZnVuY3Rpb24gKHN1YmRpdiwgbWF0ZXJpYWwsIHBhcmVudE5vZGUpIHtcbiAgICBpZiAoc3ViZGl2ID09IG51bGwpIHtcbiAgICAgICAgc3ViZGl2ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdWJkaXYgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHN1YmRpdiA9IFtzdWJkaXYsIHN1YmRpdiwgc3ViZGl2XTtcbiAgICB9XG5cbiAgICB2YXIgZ2VvS2V5ID0gJ2N1YmUtJyArIHN1YmRpdi5qb2luKCctJyk7XG4gICAgdmFyIGN1YmUgPSB0aGlzLl9nZW9DYWNoZS5nZXQoZ2VvS2V5KTtcbiAgICBpZiAoIWN1YmUpIHtcbiAgICAgICAgY3ViZSA9IG5ldyBDdWJlR2VvKHtcbiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHN1YmRpdlswXSxcbiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzdWJkaXZbMV0sXG4gICAgICAgICAgICBkZXB0aFNlZ21lbnRzOiBzdWJkaXZbMl1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2dlb0NhY2hlLnB1dChnZW9LZXksIGN1YmUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNoKGN1YmUsIG1hdGVyaWFsLCBwYXJlbnROb2RlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY3ViZSBtZXNoIHRoYXQgY2FtZXJhIGlzIGluc2lkZSB0aGUgY3ViZS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPnxudW1iZXJ9IFtzdWJkaXZpc2lvbj0xXSBTdWJkaXZpc2lvbiBvZiBjdWJlLlxuICogICAgICAgICAgQ2FuIGJlIGEgbnVtYmVyIHRvIHJlcHJlc2VudCBib3RoIHdpZHRoLCBoZWlnaHQgYW5kIGRlcHRoIGRpbWVuc2lvbnMuIE9yIGFuIGFycmF5IHRvIHJlcHJlc2VudCB0aGVtIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSB7T2JqZWN0fGNsYXkuTWF0ZXJpYWx9IFttYXRlcmlhbF1cbiAqIEBwYXJhbSB7Y2xheS5Ob2RlfSBbcGFyZW50Tm9kZV0gUGFyZW50IG5vZGUgdG8gYXBwZW5kLiBEZWZhdWx0IHRvIGJlIHNjZW5lLlxuICogQHJldHVybiB7Y2xheS5NZXNofVxuICogQGV4YW1wbGVcbiAqICAvLyBDcmVhdGUgYSB3aGl0ZSBjdWJlIGluc2lkZS5cbiAqICBhcHAuY3JlYXRlQ3ViZUluc2lkZSgpXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVDdWJlSW5zaWRlID0gZnVuY3Rpb24gKHN1YmRpdiwgbWF0ZXJpYWwsIHBhcmVudE5vZGUpIHtcbiAgICBpZiAoc3ViZGl2ID09IG51bGwpIHtcbiAgICAgICAgc3ViZGl2ID0gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdWJkaXYgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHN1YmRpdiA9IFtzdWJkaXYsIHN1YmRpdiwgc3ViZGl2XTtcbiAgICB9XG4gICAgdmFyIGdlb0tleSA9ICdjdWJlSW5zaWRlLScgKyBzdWJkaXYuam9pbignLScpO1xuICAgIHZhciBjdWJlID0gdGhpcy5fZ2VvQ2FjaGUuZ2V0KGdlb0tleSk7XG4gICAgaWYgKCFjdWJlKSB7XG4gICAgICAgIGN1YmUgPSBuZXcgQ3ViZUdlbyh7XG4gICAgICAgICAgICBpbnNpZGU6IHRydWUsXG4gICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiBzdWJkaXZbMF0sXG4gICAgICAgICAgICBoZWlnaHRTZWdtZW50czogc3ViZGl2WzFdLFxuICAgICAgICAgICAgZGVwdGhTZWdtZW50czogc3ViZGl2WzJdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9nZW9DYWNoZS5wdXQoZ2VvS2V5LCBjdWJlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNoKGN1YmUsIG1hdGVyaWFsLCBwYXJlbnROb2RlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgc3BoZXJlIG1lc2ggYW5kIGFkZCBpdCB0byB0aGUgc2NlbmUgb3IgdGhlIGdpdmVuIHBhcmVudCBub2RlLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N1YmRpdmlzaW9uPTIwXSBTdWJkaXZpc2lvbiBvZiBzcGhlcmUuXG4gKiBAcGFyYW0ge09iamVjdHxjbGF5Lk1hdGVyaWFsfSBbbWF0ZXJpYWxdXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW3BhcmVudE5vZGVdIFBhcmVudCBub2RlIHRvIGFwcGVuZC4gRGVmYXVsdCB0byBiZSBzY2VuZS5cbiAqIEByZXR1cm4ge2NsYXkuTWVzaH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gQ3JlYXRlIGEgc2VtaS10cmFuc3BhcmVudCBzcGhlcmUuXG4gKiAgYXBwLmNyZWF0ZVNwaGVyZSgyMCwge1xuICogICAgICBjb2xvcjogWzAsIDAsIDFdLFxuICogICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAqICAgICAgYWxwaGE6IDAuNVxuICogIH0pXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVTcGhlcmUgPSBmdW5jdGlvbiAoc3ViZGl2aXNpb24sIG1hdGVyaWFsLCBwYXJlbnROb2RlKSB7XG4gICAgaWYgKHN1YmRpdmlzaW9uID09IG51bGwpIHtcbiAgICAgICAgc3ViZGl2aXNpb24gPSAyMDtcbiAgICB9XG4gICAgdmFyIGdlb0tleSA9ICdzcGhlcmUtJyArIHN1YmRpdmlzaW9uO1xuICAgIHZhciBzcGhlcmUgPSB0aGlzLl9nZW9DYWNoZS5nZXQoZ2VvS2V5KTtcbiAgICBpZiAoIXNwaGVyZSkge1xuICAgICAgICBzcGhlcmUgPSBuZXcgU3BoZXJlR2VvKHtcbiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHN1YmRpdmlzaW9uICogMixcbiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzdWJkaXZpc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZ2VvQ2FjaGUucHV0KGdlb0tleSwgc3BoZXJlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzaChzcGhlcmUsIG1hdGVyaWFsLCBwYXJlbnROb2RlKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcGxhbmUgbWVzaCBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZSBvciB0aGUgZ2l2ZW4gcGFyZW50IG5vZGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58bnVtYmVyfSBbc3ViZGl2aXNpb249MV0gU3ViZGl2aXNpb24gb2YgcGxhbmUuXG4gKiAgICAgICAgICBDYW4gYmUgYSBudW1iZXIgdG8gcmVwcmVzZW50IGJvdGggd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zLiBPciBhbiBhcnJheSB0byByZXByZXNlbnQgdGhlbSByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0ge09iamVjdHxjbGF5Lk1hdGVyaWFsfSBbbWF0ZXJpYWxdXG4gKiBAcGFyYW0ge2NsYXkuTm9kZX0gW3BhcmVudE5vZGVdIFBhcmVudCBub2RlIHRvIGFwcGVuZC4gRGVmYXVsdCB0byBiZSBzY2VuZS5cbiAqIEByZXR1cm4ge2NsYXkuTWVzaH1cbiAqIEBleGFtcGxlXG4gKiAgLy8gQ3JlYXRlIGEgcmVkIGNvbG9yIHBsYW5lLlxuICogIGFwcC5jcmVhdGVQbGFuZSgxLCB7XG4gKiAgICAgIGNvbG9yOiBbMSwgMCwgMF1cbiAqICB9KVxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlUGxhbmUgPSBmdW5jdGlvbiAoc3ViZGl2LCBtYXRlcmlhbCwgcGFyZW50Tm9kZSkge1xuICAgIGlmIChzdWJkaXYgPT0gbnVsbCkge1xuICAgICAgICBzdWJkaXYgPSAxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN1YmRpdiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc3ViZGl2ID0gW3N1YmRpdiwgc3ViZGl2XTtcbiAgICB9XG4gICAgdmFyIGdlb0tleSA9ICdwbGFuZS0nICsgc3ViZGl2LmpvaW4oJy0nKTtcbiAgICB2YXIgcGxhbmVHZW8gPSB0aGlzLl9nZW9DYWNoZS5nZXQoZ2VvS2V5KTtcbiAgICBpZiAoIXBsYW5lR2VvKSB7XG4gICAgICAgIHBsYW5lR2VvID0gbmV3IFBsYW5lR2VvKHtcbiAgICAgICAgICAgIHdpZHRoU2VnbWVudHM6IHN1YmRpdlswXSxcbiAgICAgICAgICAgIGhlaWdodFNlZ21lbnRzOiBzdWJkaXZbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2dlb0NhY2hlLnB1dChnZW9LZXksIHBsYW5lR2VvKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzaChwbGFuZUdlbywgbWF0ZXJpYWwsIHBhcmVudE5vZGUpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBnZW5lcmFsIG1lc2ggd2l0aCBnaXZlbiBnZW9tZXRyeSBpbnN0YW5jZSBhbmQgbWF0ZXJpYWwgY29uZmlnLlxuICogQHBhcmFtIHsqfSBnZW9tZXRyeVxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlTWVzaCA9IGZ1bmN0aW9uIChnZW9tZXRyeSwgbWF0LCBwYXJlbnROb2RlKSB7XG4gICAgdmFyIG1lc2ggPSBuZXcgTWVzaCh7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgbWF0ZXJpYWw6IG1hdCBpbnN0YW5jZW9mIE1hdGVyaWFsID8gbWF0IDogdGhpcy5jcmVhdGVNYXRlcmlhbChtYXQpXG4gICAgfSk7XG4gICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUgfHwgdGhpcy5zY2VuZTtcbiAgICBwYXJlbnROb2RlLmFkZChtZXNoKTtcbiAgICByZXR1cm4gbWVzaDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcGVyc3BlY3RpdmUgb3Igb3J0aG9ncmFwaGljIGNhbWVyYSBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58Y2xheS5tYXRoLlZlY3RvcjN9IHBvc2l0aW9uXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fGNsYXkubWF0aC5WZWN0b3IzfSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT1cInBlcnNwZWN0aXZlXCJdIENhbiBiZSAncGVyc3BlY3RpdmUnIG9yICdvcnRob2dyYXBoaWMnKGluIHNob3J0ICdvcnRobycpXG4gKiBAcmV0dXJuIHtjbGF5LmNhbWVyYS5QZXJzcGVjdGl2ZX1cbiAqL1xuQXBwM0QucHJvdG90eXBlLmNyZWF0ZUNhbWVyYSA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGFyZ2V0LCB0eXBlKSB7XG4gICAgdmFyIENhbWVyYUN0b3I7XG4gICAgaWYgKHR5cGUgPT09ICdvcnRobycgfHwgdHlwZSA9PT0gJ29ydGhvZ3JhcGhpYycpIHtcbiAgICAgICAgQ2FtZXJhQ3RvciA9IE9ydGhvZ3JhcGhpY0NhbWVyYTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICh0eXBlICYmIHR5cGUgIT09ICdwZXJzcGVjdGl2ZScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua293biBjYW1lcmEgdHlwZSAnICsgdHlwZSArICcuIFVzZSBkZWZhdWx0IHBlcnNwZWN0aXZlIGNhbWVyYScpO1xuICAgICAgICB9XG4gICAgICAgIENhbWVyYUN0b3IgPSBQZXJzcGVjdGl2ZUNhbWVyYTtcbiAgICB9XG5cbiAgICB2YXIgY2FtZXJhID0gbmV3IENhbWVyYUN0b3IoKTtcbiAgICBpZiAocG9zaXRpb24gaW5zdGFuY2VvZiBWZWN0b3IzKSB7XG4gICAgICAgIGNhbWVyYS5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9zaXRpb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0QXJyYXkocG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICB0YXJnZXQgPSBuZXcgVmVjdG9yMyh0YXJnZXRbMF0sIHRhcmdldFsxXSwgdGFyZ2V0WzJdKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcbiAgICAgICAgY2FtZXJhLmxvb2tBdCh0YXJnZXQpO1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUuYWRkKGNhbWVyYSk7XG5cbiAgICByZXR1cm4gY2FtZXJhO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXJlY3Rpb25hbCBsaWdodCBhbmQgYWRkIGl0IHRvIHRoZSBzY2VuZS5cbiAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj58Y2xheS5tYXRoLlZlY3RvcjN9IGRpciBBIFZlY3RvcjMgb3IgYXJyYXkgdG8gcmVwcmVzZW50IHRoZSBkaXJlY3Rpb24uXG4gKiBAcGFyYW0ge0NvbG9yfSBbY29sb3I9JyNmZmYnXSBDb2xvciBvZiBkaXJlY3Rpb25hbCBsaWdodCwgZGVmYXVsdCB0byBiZSB3aGl0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5XSBJbnRlbnNpdHkgb2YgZGlyZWN0aW9uYWwgbGlnaHQsIGRlZmF1bHQgdG8gYmUgMS5cbiAqXG4gKiBAZXhhbXBsZVxuICogIGFwcC5jcmVhdGVEaXJlY3Rpb25hbExpZ2h0KFstMSwgLTEsIC0xXSwgJyNmZmYnLCAyKTtcbiAqL1xuQXBwM0QucHJvdG90eXBlLmNyZWF0ZURpcmVjdGlvbmFsTGlnaHQgPSBmdW5jdGlvbiAoZGlyLCBjb2xvciwgaW50ZW5zaXR5KSB7XG4gICAgdmFyIGxpZ2h0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoKTtcbiAgICBpZiAoZGlyIGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgICBkaXIgPSBkaXIuYXJyYXk7XG4gICAgfVxuICAgIGxpZ2h0LnBvc2l0aW9uLnNldEFycmF5KGRpcikubmVnYXRlKCk7XG4gICAgbGlnaHQubG9va0F0KFZlY3RvcjMuWkVSTyk7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sb3IgPSBwYXJzZUNvbG9yKGNvbG9yKTtcbiAgICB9XG4gICAgY29sb3IgIT0gbnVsbCAmJiAobGlnaHQuY29sb3IgPSBjb2xvcik7XG4gICAgaW50ZW5zaXR5ICE9IG51bGwgJiYgKGxpZ2h0LmludGVuc2l0eSA9IGludGVuc2l0eSk7XG5cbiAgICB0aGlzLnNjZW5lLmFkZChsaWdodCk7XG4gICAgcmV0dXJuIGxpZ2h0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBzcG90IGxpZ2h0IGFuZCBhZGQgaXQgdG8gdGhlIHNjZW5lLlxuICogQHBhcmFtIHtBcnJheS48bnVtYmVyPnxjbGF5Lm1hdGguVmVjdG9yM30gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIHNwb3QgbGlnaHQuXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fGNsYXkubWF0aC5WZWN0b3IzfSBbdGFyZ2V0XSBUYXJnZXQgcG9zaXRpb24gd2hlcmUgc3BvdCBsaWdodCBwb2ludHMgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhbmdlPTIwXSBGYWxsb2ZmIHJhbmdlIG9mIHNwb3QgbGlnaHQuIERlZmF1bHQgdG8gYmUgMjAuXG4gKiBAcGFyYW0ge0NvbG9yfSBbY29sb3I9JyNmZmYnXSBDb2xvciBvZiBzcG90IGxpZ2h0LCBkZWZhdWx0IHRvIGJlIHdoaXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gSW50ZW5zaXR5IG9mIHNwb3QgbGlnaHQsIGRlZmF1bHQgdG8gYmUgMS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdW1icmFBbmdsZT0zMF0gVW1icmEgYW5nbGUgb2Ygc3BvdCBsaWdodC4gRGVmYXVsdCB0byBiZSAzMCBkZWdyZWUgZnJvbSB0aGUgbWlkZGxlIGxpbmUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3BlbnVtYnJhQW5nbGU9NDVdIFBlbnVtYnJhIGFuZ2xlIG9mIHNwb3QgbGlnaHQuIERlZmF1bHQgdG8gYmUgNDUgZGVncmVlIGZyb20gdGhlIG1pZGRsZSBsaW5lLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgYXBwLmNyZWF0ZVNwb3RMaWdodChbNSwgNSwgNV0sIFswLCAwLCAwXSwgMjAsICM5MDApO1xuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlU3BvdExpZ2h0ID0gZnVuY3Rpb24gKHBvc2l0aW9uLCB0YXJnZXQsIHJhbmdlLCBjb2xvciwgaW50ZW5zaXR5LCB1bWJyYUFuZ2xlLCBwZW51bWJyYUFuZ2xlKSB7XG4gICAgdmFyIGxpZ2h0ID0gbmV3IFNwb3RMaWdodCgpO1xuICAgIGxpZ2h0LnBvc2l0aW9uLnNldEFycmF5KHBvc2l0aW9uIGluc3RhbmNlb2YgVmVjdG9yMyA/IHBvc2l0aW9uLmFycmF5IDogcG9zaXRpb24pO1xuXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHRhcmdldCA9IG5ldyBWZWN0b3IzKHRhcmdldFswXSwgdGFyZ2V0WzFdLCB0YXJnZXRbMl0pO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVmVjdG9yMykge1xuICAgICAgICBsaWdodC5sb29rQXQodGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb2xvciA9IHBhcnNlQ29sb3IoY29sb3IpO1xuICAgIH1cbiAgICByYW5nZSAhPSBudWxsICYmIChsaWdodC5yYW5nZSA9IHJhbmdlKTtcbiAgICBjb2xvciAhPSBudWxsICYmIChsaWdodC5jb2xvciA9IGNvbG9yKTtcbiAgICBpbnRlbnNpdHkgIT0gbnVsbCAmJiAobGlnaHQuaW50ZW5zaXR5ID0gaW50ZW5zaXR5KTtcbiAgICB1bWJyYUFuZ2xlICE9IG51bGwgJiYgKGxpZ2h0LnVtYnJhQW5nbGUgPSB1bWJyYUFuZ2xlKTtcbiAgICBwZW51bWJyYUFuZ2xlICE9IG51bGwgJiYgKGxpZ2h0LnBlbnVtYnJhQW5nbGUgPSBwZW51bWJyYUFuZ2xlKTtcblxuICAgIHRoaXMuc2NlbmUuYWRkKGxpZ2h0KTtcblxuICAgIHJldHVybiBsaWdodDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcG9pbnQgbGlnaHQuXG4gKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fGNsYXkubWF0aC5WZWN0b3IzfSBwb3NpdGlvbiBQb3NpdGlvbiBvZiBwb2ludCBsaWdodC4uXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhbmdlPTEwMF0gRmFsbG9mZiByYW5nZSBvZiBwb2ludCBsaWdodC5cbiAqIEBwYXJhbSB7Q29sb3J9IFtjb2xvcj0nI2ZmZiddIENvbG9yIG9mIHBvaW50IGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gSW50ZW5zaXR5IG9mIHBvaW50IGxpZ2h0LlxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlUG9pbnRMaWdodCA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgcmFuZ2UsIGNvbG9yLCBpbnRlbnNpdHkpIHtcbiAgICB2YXIgbGlnaHQgPSBuZXcgUG9pbnRMaWdodCgpO1xuICAgIGxpZ2h0LnBvc2l0aW9uLnNldEFycmF5KHBvc2l0aW9uIGluc3RhbmNlb2YgVmVjdG9yMyA/IHBvc2l0aW9uLmFycmF5IDogcG9zaXRpb24pO1xuXG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sb3IgPSBwYXJzZUNvbG9yKGNvbG9yKTtcbiAgICB9XG4gICAgcmFuZ2UgIT0gbnVsbCAmJiAobGlnaHQucmFuZ2UgPSByYW5nZSk7XG4gICAgY29sb3IgIT0gbnVsbCAmJiAobGlnaHQuY29sb3IgPSBjb2xvcik7XG4gICAgaW50ZW5zaXR5ICE9IG51bGwgJiYgKGxpZ2h0LmludGVuc2l0eSA9IGludGVuc2l0eSk7XG5cbiAgICB0aGlzLnNjZW5lLmFkZChsaWdodCk7XG5cbiAgICByZXR1cm4gbGlnaHQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGFtYmllbnQgbGlnaHQuXG4gKiBAcGFyYW0ge0NvbG9yfSBbY29sb3I9JyNmZmYnXSBDb2xvciBvZiBhbWJpZW50IGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gSW50ZW5zaXR5IG9mIGFtYmllbnQgbGlnaHQuXG4gKi9cbkFwcDNELnByb3RvdHlwZS5jcmVhdGVBbWJpZW50TGlnaHQgPSBmdW5jdGlvbiAoY29sb3IsIGludGVuc2l0eSkge1xuICAgIHZhciBsaWdodCA9IG5ldyBBbWJpZW50TGlnaHQoKTtcblxuICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbG9yID0gcGFyc2VDb2xvcihjb2xvcik7XG4gICAgfVxuICAgIGNvbG9yICE9IG51bGwgJiYgKGxpZ2h0LmNvbG9yID0gY29sb3IpO1xuICAgIGludGVuc2l0eSAhPSBudWxsICYmIChsaWdodC5pbnRlbnNpdHkgPSBpbnRlbnNpdHkpO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQobGlnaHQpO1xuXG4gICAgcmV0dXJuIGxpZ2h0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gY3ViZW1hcCBhbWJpZW50IGxpZ2h0IGFuZCBhbiBzcGhlcmljYWwgaGFybW9uaWMgYW1iaWVudCBsaWdodFxuICogZm9yIHNwZWN1bGFyIGFuZCBkaWZmdXNlIGxpZ2h0aW5nIGluIFBCUiByZW5kZXJpbmdcbiAqIEBwYXJhbSB7SW1hZ2VMaWtlfSBbZW52SW1hZ2VdIFBhbm9yYW1hIGVudmlyb25tZW50IGltYWdlLCBIRFIgZm9ybWF0IGlzIGJldHRlci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3BlY3VsYXJJbnRlbnN0aXR5PTAuN10gSW50ZW5zaXR5IG9mIHNwZWN1bGFyIGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtkaWZmdXNlSW50ZW5zdGl0eT0wLjddIEludGVuc2l0eSBvZiBkaWZmdXNlIGxpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtleHBvc3VyZT0xXSBFeHBvc3VyZSBvZiBIRFIgaW1hZ2UuIE9ubHkgaWYgaW1hZ2UgaW4gZmlyc3QgcGFyYW10ZXIgaXMgSERSLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwcmVmaWx0ZXJlZEN1YmVtYXBTaXplPTMyXSBUaGUgc2l6ZSBvZiBwcmVmaWxlcnRlZCBjdWJlbWFwLiBMYXJnZXIgdmFsdWUgd2lsbCB0YWtlIG1vcmUgdGltZSB0byBkbyBleHBlbnNpdmUgcHJlZmlsdGVyaW5nLlxuICovXG5BcHAzRC5wcm90b3R5cGUuY3JlYXRlQW1iaWVudEN1YmVtYXBMaWdodCA9IGZ1bmN0aW9uIChlbnZJbWFnZSwgc3BlY0ludGVuc2l0eSwgZGlmZkludGVuc2l0eSwgZXhwb3N1cmUsIHByZWZpbHRlcmVkQ3ViZW1hcFNpemUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGV4cG9zdXJlID09IG51bGwpIHtcbiAgICAgICAgZXhwb3N1cmUgPSAxO1xuICAgIH1cbiAgICBpZiAocHJlZmlsdGVyZWRDdWJlbWFwU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHByZWZpbHRlcmVkQ3ViZW1hcFNpemUgPSAzMjtcbiAgICB9XG5cbiAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuXG4gICAgcmV0dXJuIHRoaXMubG9hZFRleHR1cmUoZW52SW1hZ2UsIHtcbiAgICAgICAgZXhwb3N1cmU6IGV4cG9zdXJlXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZW52VGV4dHVyZSkge1xuICAgICAgICB2YXIgc3BlY0xpZ2h0ID0gbmV3IEFtYmllbnRDdWJlbWFwTGlnaHQoe1xuICAgICAgICAgICAgaW50ZW5zaXR5OiBzcGVjSW50ZW5zaXR5ICE9IG51bGwgPyBzcGVjSW50ZW5zaXR5IDogMC43XG4gICAgICAgIH0pO1xuICAgICAgICBzcGVjTGlnaHQuY3ViZW1hcCA9IGVudlRleHR1cmU7XG4gICAgICAgIGVudlRleHR1cmUuZmxpcFkgPSBmYWxzZTtcbiAgICAgICAgLy8gVE9ETyBDYWNoZSBwcmVmaWx0ZXIgP1xuICAgICAgICBzcGVjTGlnaHQucHJlZmlsdGVyKHNlbGYucmVuZGVyZXIsIDMyKTtcblxuICAgICAgICB2YXIgZGlmZkxpZ2h0ID0gbmV3IEFtYmllbnRTSExpZ2h0KHtcbiAgICAgICAgICAgIGludGVuc2l0eTogZGlmZkludGVuc2l0eSAhPSBudWxsID8gZGlmZkludGVuc2l0eSA6IDAuNyxcbiAgICAgICAgICAgIGNvZWZmaWNpZW50czogc2hVdGlsLnByb2plY3RFbnZpcm9ubWVudE1hcChcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlcmVyLCBzcGVjTGlnaHQuY3ViZW1hcCwge1xuICAgICAgICAgICAgICAgICAgICBsb2Q6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH0pO1xuICAgICAgICBzY2VuZS5hZGQoc3BlY0xpZ2h0KTtcbiAgICAgICAgc2NlbmUuYWRkKGRpZmZMaWdodCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwZWN1bGFyOiBzcGVjTGlnaHQsXG4gICAgICAgICAgICBkaWZmdXNlOiBkaWZmTGlnaHQsXG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBlbnZpcm9ubWVudCBtYXBcbiAgICAgICAgICAgIGVudmlyb25tZW50TWFwOiBlbnZUZXh0dXJlXG4gICAgICAgIH07XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIExvYWQgYSBbZ2xURl0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGKSBmb3JtYXQgbW9kZWwuXG4gKiBZb3UgY2FuIGNvbnZlcnQgRkJYL0RBRS9PQkogZm9ybWF0IG1vZGVscyB0byBbZ2xURl0oaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGKSB3aXRoIFtmYngyZ2x0Zl0oaHR0cHM6Ly9naXRodWIuY29tL3Bpc3NhbmcvY2xheWdsI2ZieC10by1nbHRmMjAtY29udmVydGVyKSBweXRob24gc2NyaXB0LFxuICogb3Igc2ltcGx5IHVzaW5nIHRoZSBbQ2xheSBWaWV3ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9waXNzYW5nL2NsYXktdmlld2VyKSBjbGllbnQgYXBwbGljYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICogQHBhcmFtIHtzdHJpbmd8Y2xheS5TaGFkZXJ9IFtvcHRzLnNoYWRlcj0nY2xheS5zdGFuZGFyZCddICdiYXNpYyd8J2xhbWJlcnQnfCdzdGFuZGFyZCcuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLndhaXRUZXh0dXJlTG9hZGVkPWZhbHNlXSBJZiBhZGQgdG8gc2NlbmUgdXRpbCB0ZXh0dXJlcyBhcmUgYWxsIGxvYWRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuYXV0b1BsYXlBbmltYXRpb249dHJ1ZV0gSWYgYXV0b3BsYXkgdGhlIGFuaW1hdGlvbiBvZiBtb2RlbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMudXBBeGlzPSd5J10gQ2hhbmdlIG1vZGVsIHRvIHkgdXAgaWYgdXBBeGlzIGlzICd6J1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy50ZXh0dXJlRmxpcFk9ZmFsc2VdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGV4dHVyZVJvb3RQYXRoXSBSb290IHBhdGggb2YgdGV4dHVyZS4gRGVmYXVsdCB0byBiZSByZWxhdGl2ZSB3aXRoIGdsVEYgZmlsZS5cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbkFwcDNELnByb3RvdHlwZS5sb2FkTW9kZWwgPSBmdW5jdGlvbiAodXJsLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVUkwuJyk7XG4gICAgfVxuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKG9wdHMuYXV0b1BsYXlBbmltYXRpb24gPT0gbnVsbCkge1xuICAgICAgICBvcHRzLmF1dG9QbGF5QW5pbWF0aW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHNoYWRlciA9IG9wdHMuc2hhZGVyIHx8ICdjbGF5LnN0YW5kYXJkJztcblxuICAgIHZhciBsb2FkZXJPcHRzID0ge1xuICAgICAgICByb290Tm9kZTogbmV3IE5vZGUoKSxcbiAgICAgICAgc2hhZGVyOiBzaGFkZXIsXG4gICAgICAgIHRleHR1cmVSb290UGF0aDogb3B0cy50ZXh0dXJlUm9vdFBhdGgsXG4gICAgICAgIGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcbiAgICAgICAgdGV4dHVyZUZsaXBZOiBvcHRzLnRleHR1cmVGbGlwWVxuICAgIH07XG4gICAgaWYgKG9wdHMudXBBeGlzICYmIG9wdHMudXBBeGlzLnRvTG93ZXJDYXNlKCkgPT09ICd6Jykge1xuICAgICAgICBsb2FkZXJPcHRzLnJvb3ROb2RlLnJvdGF0aW9uLmlkZW50aXR5KCkucm90YXRlWCgtTWF0aC5QSSAvIDIpO1xuICAgIH1cblxuICAgIHZhciBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcihsb2FkZXJPcHRzKTtcblxuICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgdmFyIHRpbWVsaW5lID0gdGhpcy50aW1lbGluZTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBhZnRlckxvYWQocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNjZW5lLmFkZChyZXN1bHQucm9vdE5vZGUpO1xuICAgICAgICAgICAgaWYgKG9wdHMuYXV0b1BsYXlBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2xpcHMuZm9yRWFjaChmdW5jdGlvbiAoY2xpcCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZS5hZGRDbGlwKGNsaXApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGxvYWRlci5zdWNjZXNzKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvcHRzLndhaXRUZXh0dXJlTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXJMb2FkKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChyZXN1bHQudGV4dHVyZXMubWFwKGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5zdWNjZXNzKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5lcnJvcihyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckxvYWQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyTG9hZChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9hZGVyLmVycm9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9hZGVyLmxvYWQodXJsKTtcbiAgICB9KTtcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIEFwcDNEOiBBcHAzRCxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSAzRCBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgbWFuYWdlIHRoZSBhcHAgaW5pdGlhbGl6YXRpb24gYW5kIGxvb3AuXG4gICAgICogQG5hbWUgY2xheS5hcHBsaWNhdGlvbi5jcmVhdGVcbiAgICAgKiBAcGFyYW0ge0hUTUxEb21FbGVtZW50fHN0cmluZ30gZG9tIENvbnRhaW5lciBkb20gZWxlbWVudCBvciBhIHNlbGVjdG9yIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGBxdWVyeVNlbGVjdG9yYFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcHBOU1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXQgSW5pdGlhbGl6YXRpb24gY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGluaXRpbmcgYXBwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxvb3AgTG9vcCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIGVhY2ggZnJhbWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gQ29udGFpbmVyIHdpZHRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSBDb250YWluZXIgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGV2aWNlUGl4ZWxSYXRpb11cbiAgICAgKiBAcmV0dXJuIHtjbGF5LmFwcGxpY2F0aW9uLkFwcDNEfVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgY2xheS5hcHBsaWNhdGlvbi5jcmVhdGUoJyNhcHAnLCB7XG4gICAgICogICAgICBpbml0OiBmdW5jdGlvbiAoYXBwKSB7XG4gICAgICogICAgICAgICAgYXBwLmNyZWF0ZUN1YmUoKTtcbiAgICAgKiAgICAgICAgICB2YXIgY2FtZXJhID0gYXBwLmNyZWF0ZUNhbWVyYSgpO1xuICAgICAqICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgMCwgMik7XG4gICAgICogICAgICB9LFxuICAgICAqICAgICAgbG9vcDogZnVuY3Rpb24gKCkgeyAvLyBub29wIH1cbiAgICAgKiAgfSlcbiAgICAgKi9cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChkb20sIGFwcE5TKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwM0QoZG9tLCBhcHBOUyk7XG4gICAgfVxufTsiLCJpbXBvcnQgbm90aWZpZXIgZnJvbSAnLi4vY29yZS9taXhpbi9ub3RpZmllcic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi9jb3JlL3JlcXVlc3QnO1xuaW1wb3J0IHV0aWwgIGZyb20gJy4uL2NvcmUvdXRpbCc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5hc3luYy5UYXNrXG4gKiBAbWl4ZXMgY2xheS5jb3JlLm1peGluLm5vdGlmaWVyXG4gKi9cbnZhciBUYXNrID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZnVsbGZpbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3JlamVjdGVkID0gZmFsc2U7XG59O1xuLyoqXG4gKiBUYXNrIHN1Y2Nlc3NlZFxuICogQHBhcmFtIHt9IGRhdGFcbiAqL1xuVGFzay5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB0aGlzLl9mdWxsZmlsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWplY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMudHJpZ2dlcignc3VjY2VzcycsIGRhdGEpO1xufTtcbi8qKlxuICogVGFzayBmYWlsZWRcbiAqIEBwYXJhbSB7fSBlcnJcbiAqL1xuVGFzay5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgdGhpcy5fcmVqZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuX2Z1bGxmaWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgZXJyKTtcbn07XG4vKipcbiAqIElmIHRhc2sgc3VjY2Vzc2VkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5UYXNrLnByb3RvdHlwZS5pc0Z1bGxmaWxsZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbGZpbGxlZDtcbn07XG4vKipcbiAqIElmIHRhc2sgZmFpbGVkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5UYXNrLnByb3RvdHlwZS5pc1JlamVjdGVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlamVjdGVkO1xufTtcbi8qKlxuICogSWYgdGFzayBmaW5pc2hlZCwgZWl0aGVyIHN1Y2Nlc3NlZCBvciBmYWlsZWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblRhc2sucHJvdG90eXBlLmlzU2V0dGxlZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsZmlsbGVkIHx8IHRoaXMuX3JlamVjdGVkO1xufTtcblxudXRpbC5leHRlbmQoVGFzay5wcm90b3R5cGUsIG5vdGlmaWVyKTtcblxuZnVuY3Rpb24gbWFrZVJlcXVlc3RUYXNrKHVybCwgcmVzcG9uc2VUeXBlKSB7XG4gICAgdmFyIHRhc2sgPSBuZXcgVGFzaygpO1xuICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogcmVzcG9uc2VUeXBlLFxuICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICB0YXNrLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGFzaztcbn1cbi8qKlxuICogTWFrZSBhIHJlcXVlc3QgdGFza1xuICogQHBhcmFtICB7c3RyaW5nfG9iamVjdHxvYmplY3RbXXxzdHJpbmdbXX0gdXJsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtyZXNwb25zZVR5cGVdXG4gKiBAZXhhbXBsZVxuICogICAgIHZhciB0YXNrID0gVGFzay5tYWtlUmVxdWVzdFRhc2soJy4vYS5qc29uJyk7XG4gKiAgICAgdmFyIHRhc2sgPSBUYXNrLm1ha2VSZXF1ZXN0VGFzayh7XG4gKiAgICAgICAgIHVybDogJ2IuYmluJyxcbiAqICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIHRhc2tzID0gVGFzay5tYWtlUmVxdWVzdFRhc2soWycuL2EuanNvbicsICcuL2IuanNvbiddKTtcbiAqICAgICB2YXIgdGFza3MgPSBUYXNrLm1ha2VSZXF1ZXN0VGFzayhbXG4gKiAgICAgICAgIHt1cmw6ICdhLmpzb24nfSxcbiAqICAgICAgICAge3VybDogJ2IuYmluJywgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfVxuICogICAgIF0pO1xuICogQHJldHVybiB7Y2xheS5hc3luYy5UYXNrfGNsYXkuYXN5bmMuVGFza1tdfVxuICovXG5UYXNrLm1ha2VSZXF1ZXN0VGFzayA9IGZ1bmN0aW9uKHVybCwgcmVzcG9uc2VUeXBlKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdFRhc2sodXJsLCByZXNwb25zZVR5cGUpO1xuICAgIH0gZWxzZSBpZiAodXJsLnVybCkgeyAgIC8vICBDb25maWd1cmUgb2JqZWN0XG4gICAgICAgIHZhciBvYmogPSB1cmw7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdFRhc2sob2JqLnVybCwgb2JqLnJlc3BvbnNlVHlwZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHsgIC8vIFVybCBsaXN0XG4gICAgICAgIHZhciB1cmxMaXN0ID0gdXJsO1xuICAgICAgICB2YXIgdGFza3MgPSBbXTtcbiAgICAgICAgdXJsTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgICAgICAgICAgdmFyIHVybCwgcmVzcG9uc2VUeXBlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gb2JqO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChPYmplY3Qob2JqKSA9PT0gb2JqKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gb2JqLnVybDtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGUgPSBvYmoucmVzcG9uc2VUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFza3MucHVzaChtYWtlUmVxdWVzdFRhc2sodXJsLCByZXNwb25zZVR5cGUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXNrcztcbiAgICB9XG59O1xuLyoqXG4gKiBAcmV0dXJuIHtjbGF5LmFzeW5jLlRhc2t9XG4gKi9cblRhc2subWFrZVRhc2sgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRhc2soKTtcbn07XG5cbnV0aWwuZXh0ZW5kKFRhc2sucHJvdG90eXBlLCBub3RpZmllcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRhc2s7XG4iLCJpbXBvcnQgdXRpbCBmcm9tICcuLi9jb3JlL3V0aWwnO1xuaW1wb3J0IFRhc2sgZnJvbSAnLi9UYXNrJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LmFzeW5jLlRhc2tHcm91cFxuICogQGV4dGVuZHMgY2xheS5hc3luYy5UYXNrXG4gKi9cbnZhciBUYXNrR3JvdXAgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBUYXNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLl90YXNrcyA9IFtdO1xuXG4gICAgdGhpcy5fZnVsZmlsbGVkTnVtYmVyID0gMDtcblxuICAgIHRoaXMuX3JlamVjdGVkTnVtYmVyID0gMDtcbn07XG5cbnZhciBDdG9yID0gZnVuY3Rpb24gKCl7fTtcbkN0b3IucHJvdG90eXBlID0gVGFzay5wcm90b3R5cGU7XG5UYXNrR3JvdXAucHJvdG90eXBlID0gbmV3IEN0b3IoKTtcblxuVGFza0dyb3VwLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRhc2tHcm91cDtcblxuLyoqXG4gKiBXYWl0IGZvciBhbGwgZ2l2ZW4gdGFza3Mgc3VjY2Vzc2VkLCB0YXNrIGNhbiBhbHNvIGJlIGFueSBub3RpZmllciBvYmplY3Qgd2hpY2ggd2lsbCB0cmlnZ2VyIHN1Y2Nlc3MgYW5kIGVycm9yIGV2ZW50cy4gTGlrZSB7QGxpbmsgY2xheS5UZXh0dXJlMkR9LCB7QGxpbmsgY2xheS5UZXh0dXJlQ3ViZX0sIHtAbGluayBjbGF5LmxvYWRlci5HTFRGfS5cbiAqIEBwYXJhbSAge0FycmF5LjxjbGF5LmFzeW5jLlRhc2s+fSB0YXNrc1xuICogQGNoYWluYWJsZVxuICogQGV4YW1wbGVcbiAqICAgICAvLyBMb2FkIHRleHR1cmUgbGlzdFxuICogICAgIHZhciBsaXN0ID0gWydhLmpwZycsICdiLmpwZycsICdjLmpwZyddXG4gKiAgICAgdmFyIHRleHR1cmVzID0gbGlzdC5tYXAoZnVuY3Rpb24gKHNyYykge1xuICogICAgICAgICB2YXIgdGV4dHVyZSA9IG5ldyBjbGF5LlRleHR1cmUyRCgpO1xuICogICAgICAgICB0ZXh0dXJlLmxvYWQoc3JjKTtcbiAqICAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gKiAgICAgfSk7XG4gKiAgICAgdmFyIHRhc2tHcm91cCA9IG5ldyBjbGF5LmFzeW5jLlRhc2tHcm91cCgpO1xuICogICAgIHRhc2tHcm91cC5hbGwodGV4dHVyZXMpLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICogICAgICAgICAvLyBEbyBzb21lIHRoaW5nIGFmdGVyIGFsbCB0ZXh0dXJlcyBsb2FkZWRcbiAqICAgICB9KTtcbiAqL1xuVGFza0dyb3VwLnByb3RvdHlwZS5hbGwgPSBmdW5jdGlvbiAodGFza3MpIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIHRoaXMuX3Rhc2tzID0gdGFza3M7XG4gICAgdGhpcy5fZnVsZmlsbGVkTnVtYmVyID0gMDtcbiAgICB0aGlzLl9yZWplY3RlZE51bWJlciA9IDA7XG5cbiAgICB1dGlsLmVhY2godGFza3MsIGZ1bmN0aW9uICh0YXNrLCBpZHgpIHtcbiAgICAgICAgaWYgKCF0YXNrIHx8ICF0YXNrLm9uY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb3VudCsrO1xuICAgICAgICB0YXNrLm9uY2UoJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICBjb3VudC0tO1xuXG4gICAgICAgICAgICBzZWxmLl9mdWxmaWxsZWROdW1iZXIrKztcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vIFNvbWUgdGFza3MgbGlrZSB0ZXh0dXJlLCBsb2FkZXIgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0YXNrXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgc3RhdGVzIGhlcmVcbiAgICAgICAgICAgIHRhc2suX2Z1bGZpbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBkYXRhW2lkeF0gPSByZXM7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0YXNrLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBzZWxmLl9yZWplY3RlZE51bWJlciArKztcblxuICAgICAgICAgICAgdGFzay5fZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHNlbGYucmVqZWN0KHRhc2spO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuLyoqXG4gKiBXYWl0IGZvciBhbGwgZ2l2ZW4gdGFza3MgZmluaXNoZWQsIGVpdGhlciBzdWNjZXNzZWQgb3IgZmFpbGVkXG4gKiBAcGFyYW0gIHtBcnJheS48Y2xheS5hc3luYy5UYXNrPn0gdGFza3NcbiAqIEByZXR1cm4ge2NsYXkuYXN5bmMuVGFza0dyb3VwfVxuICovXG5UYXNrR3JvdXAucHJvdG90eXBlLmFsbFNldHRsZWQgPSBmdW5jdGlvbiAodGFza3MpIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLnRyaWdnZXIoJ3N1Y2Nlc3MnLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl90YXNrcyA9IHRhc2tzO1xuXG4gICAgdXRpbC5lYWNoKHRhc2tzLCBmdW5jdGlvbiAodGFzaywgaWR4KSB7XG4gICAgICAgIGlmICghdGFzayB8fCAhdGFzay5vbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY291bnQrKztcbiAgICAgICAgdGFzay5vbmNlKCdzdWNjZXNzJywgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgY291bnQtLTtcblxuICAgICAgICAgICAgc2VsZi5fZnVsZmlsbGVkTnVtYmVyKys7XG5cbiAgICAgICAgICAgIHRhc2suX2Z1bGZpbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBkYXRhW2lkeF0gPSByZXM7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0YXNrLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY291bnQtLTtcblxuICAgICAgICAgICAgc2VsZi5fcmVqZWN0ZWROdW1iZXIrKztcblxuICAgICAgICAgICAgdGFzay5fZnVsZmlsbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0YXNrLl9yZWplY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIGRhdGFbaWR4XSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufTtcbi8qKlxuICogR2V0IHN1Y2Nlc3NlZCBzdWIgdGFza3MgbnVtYmVyLCByZWN1cnNpdmUgY2FuIGJlIHRydWUgaWYgc3ViIHRhc2sgaXMgYWxzbyBhIFRhc2tHcm91cC5cbiAqIEBwYXJhbSAge2Jvb2xlYW59IFtyZWN1cnNpdmVdXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblRhc2tHcm91cC5wcm90b3R5cGUuZ2V0RnVsZmlsbGVkTnVtYmVyID0gZnVuY3Rpb24gKHJlY3Vyc2l2ZSkge1xuICAgIGlmIChyZWN1cnNpdmUpIHtcbiAgICAgICAgdmFyIG5GdWxmaWxsZWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRoaXMuX3Rhc2tzW2ldO1xuICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUYXNrR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuRnVsZmlsbGVkICs9IHRhc2suZ2V0RnVsZmlsbGVkTnVtYmVyKHJlY3Vyc2l2ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYodGFzay5fZnVsZmlsbGVkKSB7XG4gICAgICAgICAgICAgICAgbkZ1bGZpbGxlZCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuRnVsZmlsbGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdWxmaWxsZWROdW1iZXI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBHZXQgZmFpbGVkIHN1YiB0YXNrcyBudW1iZXIsIHJlY3Vyc2l2ZSBjYW4gYmUgdHJ1ZSBpZiBzdWIgdGFzayBpcyBhbHNvIGEgVGFza0dyb3VwLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZV1cbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVGFza0dyb3VwLnByb3RvdHlwZS5nZXRSZWplY3RlZE51bWJlciA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHZhciBuUmVqZWN0ZWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRoaXMuX3Rhc2tzW2ldO1xuICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUYXNrR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuUmVqZWN0ZWQgKz0gdGFzay5nZXRSZWplY3RlZE51bWJlcihyZWN1cnNpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHRhc2suX3JlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgblJlamVjdGVkICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5SZWplY3RlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVqZWN0ZWROdW1iZXI7XG4gICAgfVxufTtcblxuLyoqXG4gKiBHZXQgZmluaXNoZWQgc3ViIHRhc2tzIG51bWJlciwgcmVjdXJzaXZlIGNhbiBiZSB0cnVlIGlmIHN1YiB0YXNrIGlzIGFsc28gYSBUYXNrR3JvdXAuXG4gKiBAcGFyYW0gIHtib29sZWFufSBbcmVjdXJzaXZlXVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5UYXNrR3JvdXAucHJvdG90eXBlLmdldFNldHRsZWROdW1iZXIgPSBmdW5jdGlvbiAocmVjdXJzaXZlKSB7XG5cbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHZhciBuU2V0dGxlZCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fdGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGhpcy5fdGFza3NbaV07XG4gICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIFRhc2tHcm91cCkge1xuICAgICAgICAgICAgICAgIG5TZXR0bGVkICs9IHRhc2suZ2V0U2V0dGxlZE51bWJlcihyZWN1cnNpdmUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHRhc2suX3JlamVjdGVkIHx8IHRhc2suX2Z1bGZpbGxlZCkge1xuICAgICAgICAgICAgICAgIG5TZXR0bGVkICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5TZXR0bGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdWxmaWxsZWROdW1iZXIgKyB0aGlzLl9yZWplY3RlZE51bWJlcjtcbiAgICB9XG59O1xuXG4vKipcbiAqIEdldCBhbGwgc3ViIHRhc2tzIG51bWJlciwgcmVjdXJzaXZlIGNhbiBiZSB0cnVlIGlmIHN1YiB0YXNrIGlzIGFsc28gYSBUYXNrR3JvdXAuXG4gKiBAcGFyYW0gIHtib29sZWFufSBbcmVjdXJzaXZlXVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5UYXNrR3JvdXAucHJvdG90eXBlLmdldFRhc2tOdW1iZXIgPSBmdW5jdGlvbiAocmVjdXJzaXZlKSB7XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgICB2YXIgblRhc2sgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRoaXMuX3Rhc2tzW2ldO1xuICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUYXNrR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuVGFzayArPSB0YXNrLmdldFRhc2tOdW1iZXIocmVjdXJzaXZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgblRhc2sgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gblRhc2s7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tzLmxlbmd0aDtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYXNrR3JvdXA7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuXG52YXIgQ2FudmFzTWF0ZXJpYWwgPSBCYXNlLmV4dGVuZCh7XG5cbiAgICBjb2xvcjogWzEsIDEsIDEsIDFdLFxuXG4gICAgb3BhY2l0eTogMSxcblxuICAgIHBvaW50U2l6ZTogMCxcblxuICAgIHBvaW50U2hhcGU6ICdyZWN0YW5nbGUnXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FudmFzTWF0ZXJpYWw7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4uL2NvcmUvZ2xlbnVtJztcbnZhciBtYXQ0ID0gZ2xNYXRyaXgubWF0NDtcbnZhciB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbnZhciB2ZWM0ID0gZ2xNYXRyaXgudmVjNDtcblxudmFyIHZlYzNTZXQgPSB2ZWMzLnNldDtcbnZhciB2ZWMzQ3JlYXRlID0gdmVjMy5jcmVhdGU7XG5cbnZhciB2ZWM0Q3JlYXRlID0gdmVjNC5jcmVhdGU7XG5cbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG5cbnZhciBQUklNSVRJVkVfVFJJQU5HTEUgPSAxO1xudmFyIFBSSU1JVElWRV9MSU5FID0gMjtcbnZhciBQUklNSVRJVkVfUE9JTlQgPSAzO1xuXG5mdW5jdGlvbiBQcmltaXRpdmVQb29sKGNvbnN0cnVjdG9yKSB7XG4gICAgdGhpcy5jdG9yID0gY29uc3RydWN0b3I7XG5cbiAgICB0aGlzLl9kYXRhID0gW107XG5cbiAgICB0aGlzLl9zaXplID0gMDtcbn1cblxuUHJpbWl0aXZlUG9vbC5wcm90b3R5cGUgPSB7XG4gICAgcGljazogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIHZhciBzaXplID0gdGhpcy5fc2l6ZTtcbiAgICAgICAgdmFyIG9iaiA9IGRhdGFbc2l6ZV07XG4gICAgICAgIGlmICghIG9iaikge1xuICAgICAgICAgICAgLy8gQ29uc3RydWN0b3IgbXVzdCBoYXZlIG5vIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIG9iaiA9IG5ldyB0aGlzLmN0b3IoKTtcbiAgICAgICAgICAgIGRhdGFbc2l6ZV0gPSBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9LFxuXG4gICAgc2hyaW5rOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEubGVuZ3RoID0gdGhpcy5fc2l6ZTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIFRyaWFuZ2xlKCkge1xuICAgIHRoaXMudmVydGljZXMgPSBbdmVjNENyZWF0ZSgpLCB2ZWM0Q3JlYXRlKCksIHZlYzRDcmVhdGUoKV07XG4gICAgdGhpcy5jb2xvciA9IHZlYzRDcmVhdGUoKTtcblxuICAgIHRoaXMuZGVwdGggPSAwO1xufVxuXG5UcmlhbmdsZS5wcm90b3R5cGUudHlwZSA9IFBSSU1JVElWRV9UUklBTkdMRTtcblxuZnVuY3Rpb24gUG9pbnQoKSB7XG4gICAgLy8gSGVyZSB1c2UgYW4gYXJyYXkgdG8gbWFrZSBpdCBtb3JlIGNvbnZpbmllbnQgdG8gcHJvY2Nlc3NpbmcgaW4gX3NldFByaW1pdGl2ZSBtZXRob2RcbiAgICB0aGlzLnZlcnRpY2VzID0gW3ZlYzRDcmVhdGUoKV07XG5cbiAgICB0aGlzLmNvbG9yID0gdmVjNENyZWF0ZSgpO1xuXG4gICAgdGhpcy5kZXB0aCA9IDA7XG59XG5cblBvaW50LnByb3RvdHlwZS50eXBlID0gUFJJTUlUSVZFX1BPSU5UO1xuXG5mdW5jdGlvbiBMaW5lKCkge1xuICAgIHRoaXMudmVydGljZXMgPSBbdmVjNENyZWF0ZSgpLCB2ZWM0Q3JlYXRlKCldO1xuICAgIHRoaXMuY29sb3IgPSB2ZWM0Q3JlYXRlKCk7XG5cbiAgICB0aGlzLmRlcHRoID0gMDtcblxuICAgIHRoaXMubGluZVdpZHRoID0gMTtcbn1cblxuTGluZS5wcm90b3R5cGUudHlwZSA9IFBSSU1JVElWRV9MSU5FO1xuXG5mdW5jdGlvbiBkZXB0aFNvcnRGdW5jKHgsIHkpIHtcbiAgICAvLyBTb3J0IGZyb20gZmFyIHRvIG5lYXIsIHdoaWNoIGluIGRlcHRoIG9mIHByb2plY3Rpb24gc3BhY2UgaXMgZnJvbSBsYXJnZXIgdG8gc21hbGxlclxuICAgIHJldHVybiB5LmRlcHRoIC0geC5kZXB0aDtcbn1cblxuZnVuY3Rpb24gdmVjM1RvQ29sb3JTdHIodjMpIHtcbiAgICByZXR1cm4gJ3JnYignICsgcm91bmQodjNbMF0gKiAyNTUpICsgJywnICsgcm91bmQodjNbMV0gKiAyNTUpICsgJywnICsgcm91bmQodjNbMl0gKiAyNTUpICsgJyknO1xufVxuXG5mdW5jdGlvbiB2ZWM0VG9Db2xvclN0cih2NCkge1xuICAgIHJldHVybiAncmdiYSgnICsgcm91bmQodjRbMF0gKiAyNTUpICsgJywnICsgcm91bmQodjRbMV0gKiAyNTUpICsgJywnICsgcm91bmQodjRbMl0gKiAyNTUpICsgJywnICsgdjRbM10gKyAnKSc7XG59XG5cbnZhciBDYW52YXNSZW5kZXJlciA9IEJhc2UuZXh0ZW5kKHtcblxuICAgIGNhbnZhczogbnVsbCxcblxuICAgIF93aWR0aDogMTAwLFxuXG4gICAgX2hlaWdodDogMTAwLFxuXG4gICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMS4wLFxuXG4gICAgY29sb3I6IFswLjAsIDAuMCwgMC4wLCAwLjBdLFxuXG4gICAgY2xlYXI6IHRydWUsXG5cbiAgICBjdHg6IG51bGwsXG5cbiAgICAvLyBDYWNoZWQgcHJpbWl0aXZlIGxpc3QsIGluY2x1ZGluZyB0cmlhbmdsZSwgbGluZSwgcG9pbnRcbiAgICBfcHJpbWl0aXZlczogW10sXG5cbiAgICAvLyBUcmlhbmdsZSBwb29sXG4gICAgX3RyaWFuZ2xlczogbmV3IFByaW1pdGl2ZVBvb2woVHJpYW5nbGUpLFxuXG4gICAgLy8gTGluZSBwb29sXG4gICAgX2xpbmVzOiBuZXcgUHJpbWl0aXZlUG9vbChMaW5lKSxcblxuICAgIC8vIFBvaW50IHBvb2xcbiAgICBfcG9pbnRzOiBuZXcgUHJpbWl0aXZlUG9vbChQb2ludClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoISB0aGlzLmNhbnZhcykge1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIH1cbiAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXM7XG5cbiAgICB0cnkge1xuICAgICAgICB0aGlzLmN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGlmICghY3R4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgQ29udGV4dCAnICsgZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xufSwge1xuXG4gICAgcmVzaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgZHByID0gdGhpcy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogZHByO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGRwcjtcblxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gY2FudmFzLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gY2FudmFzLmhlaWdodCAvIGRwcjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRXaWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfSxcblxuICAgIGdldEhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH0sXG5cbiAgICBnZXRWaWV3cG9ydEFzcGVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGggLyB0aGlzLl9oZWlnaHQ7XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKHNjZW5lLCBjYW1lcmEpIHtcblxuICAgICAgICBpZiAodGhpcy5jbGVhcikge1xuICAgICAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcjtcbiAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLmN0eDtcbiAgICAgICAgICAgIHZhciBkcHIgPSB0aGlzLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICB2YXIgdyA9IHRoaXMuX3dpZHRoICogZHByO1xuICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9oZWlnaHQgKiBkcHI7XG4gICAgICAgICAgICBpZiAoY29sb3IgJiYgY29sb3JbM10gPT09IDApIHtcbiAgICAgICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSGFzIHRyYW5zcGFyZW5jeVxuICAgICAgICAgICAgICAgIGlmIChjb2xvclszXSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yLmxlbmd0aCA9PT0gNCA/IHZlYzRUb0NvbG9yU3RyKGNvbG9yKSA6IHZlYzNUb0NvbG9yU3RyKGNvbG9yKTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY2VuZS51cGRhdGUoKTtcbiAgICAgICAgY2FtZXJhLnVwZGF0ZSgpO1xuXG4gICAgICAgIHZhciBvcGFxdWVMaXN0ID0gc2NlbmUub3BhcXVlTGlzdDtcbiAgICAgICAgdmFyIHRyYW5zcGFyZW50TGlzdCA9IHNjZW5lLnRyYW5zcGFyZW50TGlzdDtcbiAgICAgICAgdmFyIHNjZW5lTWF0ZXJpYWwgPSBzY2VuZS5tYXRlcmlhbDtcblxuICAgICAgICB2YXIgbGlzdCA9IG9wYXF1ZUxpc3QuY29uY2F0KHRyYW5zcGFyZW50TGlzdCk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzKGxpc3QsIGNhbWVyYSk7XG4gICAgfSxcblxuICAgIHJlbmRlclBhc3M6IGZ1bmN0aW9uIChsaXN0LCBjYW1lcmEpIHtcbiAgICAgICAgdmFyIHZpZXdQcm9qID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseSh2aWV3UHJvaiwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguYXJyYXksIGNhbWVyYS52aWV3TWF0cml4LmFycmF5KTtcbiAgICAgICAgdmFyIHdvcmxkVmlld1Byb2pNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICB2YXIgcG9zVmlld1NwYWNlID0gdmVjMy5jcmVhdGUoKTtcblxuICAgICAgICB2YXIgcHJpbWl0aXZlcyA9IHRoaXMuX3ByaW1pdGl2ZXM7XG4gICAgICAgIHZhciB0cmlhbmdsZXNQb29sID0gdGhpcy5fdHJpYW5nbGVzO1xuICAgICAgICB2YXIgbGluZXNQb29sID0gdGhpcy5fbGluZXM7XG4gICAgICAgIHZhciBwb2ludHNQb29sID0gdGhpcy5fcG9pbnRzO1xuXG4gICAgICAgIHRyaWFuZ2xlc1Bvb2wucmVzZXQoKTtcbiAgICAgICAgbGluZXNQb29sLnJlc2V0KCk7XG4gICAgICAgIHBvaW50c1Bvb2wucmVzZXQoKTtcblxuICAgICAgICB2YXIgblByaW1pdGl2ZSA9IDA7XG5cbiAgICAgICAgdmFyIGluZGljZXMgPSBbMCwgMCwgMF07XG4gICAgICAgIHZhciBtYXRDb2xvciA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJhYmxlID0gbGlzdFtpXTtcblxuICAgICAgICAgICAgbWF0NC5tdWx0aXBseSh3b3JsZFZpZXdQcm9qTWF0LCB2aWV3UHJvaiwgcmVuZGVyYWJsZS53b3JsZFRyYW5zZm9ybS5hcnJheSk7XG5cbiAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IHJlbmRlcmFibGUuZ2VvbWV0cnk7XG4gICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSByZW5kZXJhYmxlLm1hdGVyaWFsO1xuICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgICAgICAvLyBhbHBoYSBpcyBkZWZhdWx0IDFcbiAgICAgICAgICAgIGlmIChtYXRlcmlhbC5jb2xvci5sZW5ndGggPT0gMykge1xuICAgICAgICAgICAgICAgIHZlYzMuY29weShtYXRDb2xvciwgbWF0ZXJpYWwuY29sb3IpO1xuICAgICAgICAgICAgICAgIG1hdENvbG9yWzNdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzQuY29weShtYXRDb2xvciwgbWF0ZXJpYWwuY29sb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgblZlcnRleCA9IGdlb21ldHJ5LnZlcnRleENvdW50O1xuICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IFRSSUFOR0xFUywgTElORVMsIFBPSU5UUyBkcmF3IG1vZGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHJlbmRlcmFibGUubW9kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZ2xlbnVtLlRSSUFOR0xFUzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlb21ldHJ5LmlzVXNlSW5kaWNlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbkZhY2UgPSBnZW9tZXRyeS50cmlhbmdsZUNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuRmFjZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuZ2V0RmFjZShqLCBpbmRpY2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlhbmdsZSA9IHRyaWFuZ2xlc1Bvb2wucGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpcHBlZCA9IHRoaXMuX3NldFByaW1pdGl2ZSh0cmlhbmdsZSwgaW5kaWNlcywgMywgYXR0cmlidXRlcywgd29ybGRWaWV3UHJvak1hdCwgbWF0Q29sb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgY2xpcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVzW25QcmltaXRpdmUrK10gPSB0cmlhbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5WZXJ0ZXg7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1swXSA9IGorKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzFdID0gaisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbMl0gPSBqKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJpYW5nbGUgPSB0cmlhbmdsZXNQb29sLnBpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXBwZWQgPSB0aGlzLl9zZXRQcmltaXRpdmUodHJpYW5nbGUsIGluZGljZXMsIDMsIGF0dHJpYnV0ZXMsIHdvcmxkVmlld1Byb2pNYXQsIG1hdENvbG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGNsaXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlc1tuUHJpbWl0aXZlKytdID0gdHJpYW5nbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2xlbnVtLkxJTkVTOlxuICAgICAgICAgICAgICAgICAgICAvLyBMSU5FUyBtb2RlIGNhbid0IHVzZSBmYWNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgblZlcnRleDspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbMF0gPSBqKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzFdID0gaisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1Bvb2wucGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5saW5lV2lkdGggPSByZW5kZXJhYmxlLmxpbmVXaWR0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXBwZWQgPSB0aGlzLl9zZXRQcmltaXRpdmUobGluZSwgaW5kaWNlcywgMiwgYXR0cmlidXRlcywgd29ybGRWaWV3UHJvak1hdCwgbWF0Q29sb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBjbGlwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlc1tuUHJpbWl0aXZlKytdID0gbGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGdsZW51bS5QT0lOVFM6XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgblZlcnRleDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzWzBdID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IHBvaW50c1Bvb2wucGljaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaXBwZWQgPSB0aGlzLl9zZXRQcmltaXRpdmUocG9pbnQsIGluZGljZXMsIDEsIGF0dHJpYnV0ZXMsIHdvcmxkVmlld1Byb2pNYXQsIG1hdENvbG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgY2xpcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZXNbblByaW1pdGl2ZSsrXSA9IHBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFBPSU5UUyBtb2RlIGNhbid0IHVzZSBmYWNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJpYW5nbGVzUG9vbC5zaHJpbmsoKTtcbiAgICAgICAgbGluZXNQb29sLnNocmluaygpO1xuICAgICAgICBwb2ludHNQb29sLnNocmluaygpO1xuXG4gICAgICAgIHByaW1pdGl2ZXMubGVuZ3RoID0gblByaW1pdGl2ZTtcblxuICAgICAgICBwcmltaXRpdmVzLnNvcnQoZGVwdGhTb3J0RnVuYyk7XG4gICAgICAgIHRoaXMuX2RyYXdQcmltaXRpdmVzKHByaW1pdGl2ZXMpO1xuICAgIH0sXG5cbiAgICBfc2V0UHJpbWl0aXZlOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmVydGV4Q29sb3IgPSB2ZWM0Q3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJpbWl0aXZlLCBpbmRpY2VzLCBzaXplLCBhdHRyaWJ1dGVzLCB3b3JsZFZpZXdQcm9qTWF0LCBtYXRDb2xvcikge1xuICAgICAgICAgICAgdmFyIGNvbG9yQXR0cmliID0gYXR0cmlidXRlcy5jb2xvcjtcbiAgICAgICAgICAgIHZhciB1c2VWZXJ0ZXhDb2xvciA9IGNvbG9yQXR0cmliLnZhbHVlICYmIGNvbG9yQXR0cmliLnZhbHVlLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB2YXIgcHJpQ29sb3IgPSBwcmltaXRpdmUuY29sb3I7XG5cbiAgICAgICAgICAgIHByaW1pdGl2ZS5kZXB0aCA9IDA7XG4gICAgICAgICAgICBpZiAodXNlVmVydGV4Q29sb3IpIHtcbiAgICAgICAgICAgICAgICB2ZWM0LnNldChwcmlDb2xvciwgMCwgMCwgMCwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjbGlwcGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAxIC8gc2l6ZTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkID0gcHJpbWl0aXZlLnZlcnRpY2VzW2ldO1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucG9zaXRpb24uZ2V0KGluZGljZXNbaV0sIGNvb3JkKTtcbiAgICAgICAgICAgICAgICBjb29yZFszXSA9IDE7XG4gICAgICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkLCBjb29yZCwgd29ybGRWaWV3UHJvak1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZVZlcnRleENvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yQXR0cmliLmdldChpbmRpY2VzW2ldLCB2ZXJ0ZXhDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF2ZXJhZ2UgdmVydGV4IGNvbG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggcHJpbWl0aXZlIG9ubHkgY2FsbCBmaWxsIG9yIHN0cm9rZSBvbmNlXG4gICAgICAgICAgICAgICAgICAgIC8vIFNvIGNvbG9yIG11c3QgYmUgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgdmVjNC5zY2FsZUFuZEFkZChwcmlDb2xvciwgcHJpQ29sb3IsIHZlcnRleENvbG9yLCBwZXJjZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDbGlwcGluZ1xuICAgICAgICAgICAgICAgIHZhciB4ID0gY29vcmRbMF07XG4gICAgICAgICAgICAgICAgdmFyIHkgPSBjb29yZFsxXTtcbiAgICAgICAgICAgICAgICB2YXIgeiA9IGNvb3JkWzJdO1xuICAgICAgICAgICAgICAgIHZhciB3ID0gY29vcmRbM107XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIFBvaW50IGNsaXBwaW5nXG4gICAgICAgICAgICAgICAgaWYgKHggPiAtdyAmJiB4IDwgdyAmJiB5ID4gLXcgJiYgeSA8IHcgJiYgeiA+IC13ICYmIHogPCB3KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgaW52VyA9IDEgLyB3O1xuICAgICAgICAgICAgICAgIGNvb3JkWzBdID0geCAqIGludlc7XG4gICAgICAgICAgICAgICAgY29vcmRbMV0gPSB5ICogaW52VztcbiAgICAgICAgICAgICAgICBjb29yZFsyXSA9IHogKiBpbnZXO1xuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmltaXRpdmUgYXZlcmFnZSBkZXB0aDtcbiAgICAgICAgICAgICAgICBwcmltaXRpdmUuZGVwdGggKz0gY29vcmRbMl07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghIGNsaXBwZWQpIHtcbiAgICAgICAgICAgICAgICBwcmltaXRpdmUuZGVwdGggLz0gc2l6ZTtcblxuICAgICAgICAgICAgICAgIGlmICh1c2VWZXJ0ZXhDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICB2ZWM0Lm11bChwcmlDb2xvciwgcHJpQ29sb3IsIG1hdENvbG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzQuY29weShwcmlDb2xvciwgbWF0Q29sb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNsaXBwZWQ7XG4gICAgICAgIH1cbiAgICB9KSgpLFxuXG4gICAgX2RyYXdQcmltaXRpdmVzOiBmdW5jdGlvbiAocHJpbWl0aXZlcykge1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGN0eC5zYXZlKCk7XG5cbiAgICAgICAgdmFyIHByZXZNYXRlcmlhbDtcblxuICAgICAgICB2YXIgZHByID0gdGhpcy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLl93aWR0aCAqIGRwcjtcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuX2hlaWdodCAqIGRwcjtcbiAgICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgICAgIHZhciBwcmV2TGluZVdpZHRoO1xuICAgICAgICB2YXIgcHJldlN0cm9rZUNvbG9yO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpbWl0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHByaW1pdGl2ZSA9IHByaW1pdGl2ZXNbaV07XG4gICAgICAgICAgICB2YXIgdmVydGljZXMgPSBwcmltaXRpdmUudmVydGljZXM7XG5cbiAgICAgICAgICAgIHZhciBwcmltaXRpdmVUeXBlID0gcHJpbWl0aXZlLnR5cGU7XG4gICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSBwcmltaXRpdmUubWF0ZXJpYWw7XG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwgIT09IHByZXZNYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBtYXRlcmlhbFxuICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IG1hdGVyaWFsLm9wYWNpdHk7XG4gICAgICAgICAgICAgICAgcHJldk1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjb2xvclN0ciA9IHZlYzRUb0NvbG9yU3RyKHByaW1pdGl2ZS5jb2xvcik7XG4gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFBSSU1JVElWRV9UUklBTkdMRTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYwID0gdmVydGljZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2MSA9IHZlcnRpY2VzWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdjIgPSB2ZXJ0aWNlc1syXTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yU3RyO1xuICAgICAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oKHYwWzBdICsgMSkgKiBoYWxmV2lkdGgsICgtdjBbMV0gKyAxKSAqIGhhbGZIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKCh2MVswXSArIDEpICogaGFsZldpZHRoLCAoLXYxWzFdICsgMSkgKiBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbygodjJbMF0gKyAxKSAqIGhhbGZXaWR0aCwgKC12MlsxXSArIDEpICogaGFsZkhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBQUklNSVRJVkVfTElORTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYwID0gdmVydGljZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2MSA9IHZlcnRpY2VzWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gcHJpbWl0aXZlLmxpbmVXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZTdHJva2VDb2xvciAhPT0gY29sb3JTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yU3RyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lV2lkdGggIT09IHByZXZMaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSBwcmV2TGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbygodjBbMF0gKyAxKSAqIGhhbGZXaWR0aCwgKC12MFsxXSArIDEpICogaGFsZkhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oKHYxWzBdICsgMSkgKiBoYWxmV2lkdGgsICgtdjFbMV0gKyAxKSAqIGhhbGZIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUFJJTUlUSVZFX1BPSU5UOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRTaXplID0gbWF0ZXJpYWwucG9pbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRTaGFwZSA9IG1hdGVyaWFsLnBvaW50U2hhcGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYWxmU2l6ZSA9IHBvaW50U2l6ZSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2ludFNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdjAgPSB2ZXJ0aWNlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjeCA9ICh2MFswXSArIDEpICogaGFsZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN5ID0gKC12MFsxXSArIDEpICogaGFsZkhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yU3RyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50U2hhcGUgPT09ICdyZWN0YW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGN4IC0gaGFsZlNpemUsIGN5IC0gaGFsZlNpemUsIHBvaW50U2l6ZSwgcG9pbnRTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvaW50U2hhcGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5hcmMoY3gsIGN5LCBoYWxmU2l6ZSwgMCwgTWF0aC5QSSAqIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH0sXG5cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3RyaWFuZ2xlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLl9saW5lcy5jbGVhcigpO1xuICAgICAgICB0aGlzLl9wb2ludHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fcHJpbWl0aXZlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY3R4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDYW52YXNSZW5kZXJlcjtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5cbi8vIFBFTkRJTkdcbi8vIFVzZSB0b3BvbG9naWNhbCBzb3J0ID9cblxuLyoqXG4gKiBOb2RlIG9mIGdyYXBoIGJhc2VkIHBvc3QgcHJvY2Vzc2luZy5cbiAqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jb21wb3NpdG9yLk5vZGVcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKlxuICovXG52YXIgTm9kZSA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LmNvbXBvc2l0b3IuTm9kZSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnB1dCBsaW5rcywgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSBncmFwaFxuICAgICAgICAgKiBAZXhhbXBsZTpcbiAgICAgICAgICogICAgIGlucHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBpbnB1dExpbmtzOiB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3V0cHV0IGxpbmtzLCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIGdyYXBoXG4gICAgICAgICAqIEBleGFtcGxlOlxuICAgICAgICAgKiAgICAgb3V0cHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRMaW5rczoge30sXG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3V0cHV0IHRleHR1cmUgb2YgcHJldmlvdXMgZnJhbWVcbiAgICAgICAgLy8gV2lsbCBiZSB1c2VkIHdoZW4gdGhlcmUgZXhpc3QgYSBjaXJjdWxhciByZWZlcmVuY2VcbiAgICAgICAgX3ByZXZPdXRwdXRUZXh0dXJlczoge30sXG4gICAgICAgIF9vdXRwdXRUZXh0dXJlczoge30sXG5cbiAgICAgICAgLy8gRXhhbXBsZTogeyBuYW1lOiAyIH1cbiAgICAgICAgX291dHB1dFJlZmVyZW5jZXM6IHt9LFxuXG4gICAgICAgIF9yZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAvLyBJZiByZW5kZXJlZCBpbiB0aGlzIGZyYW1lXG4gICAgICAgIF9yZW5kZXJlZDogZmFsc2UsXG5cbiAgICAgICAgX2NvbXBvc2l0b3I6IG51bGxcbiAgICB9O1xufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLk5vZGUucHJvdG90eXBlICovXG57XG5cbiAgICAvLyBUT0RPIFJlbW92ZSBwYXJhbWV0ZXIgZnVuY3Rpb24gY2FsbGJhY2tcbiAgICB1cGRhdGVQYXJhbWV0ZXI6IGZ1bmN0aW9uIChvdXRwdXROYW1lLCByZW5kZXJlcikge1xuICAgICAgICB2YXIgb3V0cHV0SW5mbyA9IHRoaXMub3V0cHV0c1tvdXRwdXROYW1lXTtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvdXRwdXRJbmZvLnBhcmFtZXRlcnM7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5O1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnNDb3B5KSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ3dpZHRoJyAmJiBrZXkgIT09ICdoZWlnaHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNDb3B5W2tleV0gPSBwYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB3aWR0aCwgaGVpZ2h0O1xuICAgICAgICBpZiAocGFyYW1ldGVycy53aWR0aCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGguY2FsbCh0aGlzLCByZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuaGVpZ2h0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHBhcmFtZXRlcnMuaGVpZ2h0LmNhbGwodGhpcywgcmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyYW1ldGVycy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1ldGVyc0NvcHkud2lkdGggIT09IHdpZHRoXG4gICAgICAgICAgICB8fCBwYXJhbWV0ZXJzQ29weS5oZWlnaHQgIT09IGhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdXRwdXRUZXh0dXJlc1tvdXRwdXROYW1lXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dFRleHR1cmVzW291dHB1dE5hbWVdLmRpc3Bvc2UocmVuZGVyZXIuZ2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LndpZHRoID0gd2lkdGg7XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICByZXR1cm4gcGFyYW1ldGVyc0NvcHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBwYXJhbWV0ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7fSB2YWx1ZVxuICAgICAqL1xuICAgIHNldFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7fSxcbiAgICAvKipcbiAgICAgKiBHZXQgcGFyYW1ldGVyIHZhbHVlXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lXG4gICAgICogQHJldHVybiB7fVxuICAgICAqL1xuICAgIGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUpIHt9LFxuICAgIC8qKlxuICAgICAqIFNldCBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgICAqL1xuICAgIHNldFBhcmFtZXRlcnM6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBvYmopIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVyKG5hbWUsIG9ialtuYW1lXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgIGdldE91dHB1dDogZnVuY3Rpb24gKHJlbmRlcmVyIC8qb3B0aW9uYWwqLywgbmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG91dHB1dCB0ZXh0dXJlIHdpdGhvdXQgcmVuZGVyaW5nXG4gICAgICAgICAgICBuYW1lID0gcmVuZGVyZXI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dEluZm8gPSB0aGlzLm91dHB1dHNbbmFtZV07XG4gICAgICAgIGlmICghb3V0cHV0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFscmVhZHkgYmVlbiByZW5kZXJlZCBpbiB0aGlzIGZyYW1lXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCkge1xuICAgICAgICAgICAgLy8gRm9yY2UgcmV0dXJuIHRleHR1cmUgaW4gbGFzdCBmcmFtZVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ub3V0cHV0TGFzdEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZPdXRwdXRUZXh0dXJlc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdXRwdXRUZXh0dXJlc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmluZyAgIC8vIFNvbHZlIENpcmN1bGFyIFJlZmVyZW5jZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYmxhbmsgdGV4dHVyZSBhdCBmaXJzdCBwYXNzXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdID0gdGhpcy5fY29tcG9zaXRvci5hbGxvY2F0ZVRleHR1cmUob3V0cHV0SW5mby5wYXJhbWV0ZXJzIHx8IHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcihyZW5kZXJlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX291dHB1dFRleHR1cmVzW25hbWVdO1xuICAgIH0sXG5cbiAgICByZW1vdmVSZWZlcmVuY2U6IGZ1bmN0aW9uIChvdXRwdXROYW1lKSB7XG4gICAgICAgIHRoaXMuX291dHB1dFJlZmVyZW5jZXNbb3V0cHV0TmFtZV0tLTtcbiAgICAgICAgaWYgKHRoaXMuX291dHB1dFJlZmVyZW5jZXNbb3V0cHV0TmFtZV0gPT09IDApIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXRJbmZvID0gdGhpcy5vdXRwdXRzW291dHB1dE5hbWVdO1xuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ua2VlcExhc3RGcmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5yZWxlYXNlVGV4dHVyZSh0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2T3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0gPSB0aGlzLl9vdXRwdXRUZXh0dXJlc1tvdXRwdXROYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE91dHB1dCBvZiB0aGlzIG5vZGUgaGF2ZSBhbHJlYXkgYmVlbiB1c2VkIGJ5IGFsbCBvdGhlciBub2Rlc1xuICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgdGV4dHVyZSBiYWNrIHRvIHRoZSBwb29sLlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0b3IucmVsZWFzZVRleHR1cmUodGhpcy5fb3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGxpbms6IGZ1bmN0aW9uIChpbnB1dFBpbk5hbWUsIGZyb21Ob2RlLCBmcm9tUGluTmFtZSkge1xuXG4gICAgICAgIC8vIFRoZSByZWxhdGlvbnNoaXAgZnJvbSBvdXRwdXQgcGluIHRvIGlucHV0IHBpbiBpcyBvbmUtb24tbXVsdGlwbGVcbiAgICAgICAgdGhpcy5pbnB1dExpbmtzW2lucHV0UGluTmFtZV0gPSB7XG4gICAgICAgICAgICBub2RlOiBmcm9tTm9kZSxcbiAgICAgICAgICAgIHBpbjogZnJvbVBpbk5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFmcm9tTm9kZS5vdXRwdXRMaW5rc1tmcm9tUGluTmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21Ob2RlLm91dHB1dExpbmtzW2Zyb21QaW5OYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZyb21Ob2RlLm91dHB1dExpbmtzW2Zyb21QaW5OYW1lXS5wdXNoKHtcbiAgICAgICAgICAgIG5vZGU6IHRoaXMsXG4gICAgICAgICAgICBwaW46IGlucHV0UGluTmFtZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGVkIHRoZSBwaW4gdGV4dHVyZSBpbiBzaGFkZXJcbiAgICAgICAgdGhpcy5wYXNzLm1hdGVyaWFsLmVuYWJsZVRleHR1cmUoaW5wdXRQaW5OYW1lKTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pbnB1dExpbmtzID0ge307XG4gICAgICAgIHRoaXMub3V0cHV0TGlua3MgPSB7fTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUmVmZXJlbmNlOiBmdW5jdGlvbiAob3V0cHV0TmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuX3JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAodmFyIGlucHV0TmFtZSBpbiB0aGlzLmlucHV0TGlua3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IHRoaXMuaW5wdXRMaW5rc1tpbnB1dE5hbWVdO1xuICAgICAgICAgICAgICAgIGxpbmsubm9kZS51cGRhdGVSZWZlcmVuY2UobGluay5waW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dHB1dE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dFJlZmVyZW5jZXNbb3V0cHV0TmFtZV0gKys7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmVmb3JlRnJhbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMub3V0cHV0TGlua3MpIHtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dFJlZmVyZW5jZXNbbmFtZV0gPSAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFmdGVyRnJhbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHV0IGJhY2sgYWxsIHRoZSB0ZXh0dXJlcyB0byBwb29sXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5vdXRwdXRMaW5rcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX291dHB1dFJlZmVyZW5jZXNbbmFtZV0gPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG91dHB1dEluZm8gPSB0aGlzLm91dHB1dHNbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ua2VlcExhc3RGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdG9yLnJlbGVhc2VUZXh0dXJlKHRoaXMuX3ByZXZPdXRwdXRUZXh0dXJlc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW25hbWVdID0gdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdG9yLnJlbGVhc2VUZXh0dXJlKHRoaXMuX291dHB1dFRleHR1cmVzW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTm9kZTtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgR3JhcGhOb2RlIGZyb20gJy4vTm9kZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY29tcG9zaXRvci5HcmFwaFxuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIEdyYXBoID0gQmFzZS5leHRlbmQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkuY29tcG9zaXRvci5HcmFwaCMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0FycmF5LjxjbGF5LmNvbXBvc2l0b3IuTm9kZT59XG4gICAgICAgICAqL1xuICAgICAgICBub2RlczogW11cbiAgICB9O1xufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLkdyYXBoLnByb3RvdHlwZSAqL1xue1xuXG4gICAgLyoqXG4gICAgICogTWFyayB0byB1cGRhdGVcbiAgICAgKi9cbiAgICBkaXJ0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2NsYXkuY29tcG9zaXRvci5Ob2RlfSBub2RlXG4gICAgICovXG4gICAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcblxuICAgICAgICBpZiAodGhpcy5ub2Rlcy5pbmRleE9mKG5vZGUpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm9kZXMucHVzaChub2RlKTtcblxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LmNvbXBvc2l0b3IuTm9kZXxzdHJpbmd9IG5vZGVcbiAgICAgKi9cbiAgICByZW1vdmVOb2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBub2RlID0gdGhpcy5nZXROb2RlQnlOYW1lKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpZHggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub2Rlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHtjbGF5LmNvbXBvc2l0b3IuTm9kZX1cbiAgICAgKi9cbiAgICBnZXROb2RlQnlOYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGxpbmtzIG9mIGdyYXBoXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ub2Rlc1tpXS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYXZlcnNlIGFsbCB0aGUgbm9kZXMgYW5kIGJ1aWxkIHRoZSBncmFwaFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5ub2Rlc1tpXTtcblxuICAgICAgICAgICAgaWYgKCFub2RlLmlucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaW5wdXROYW1lIGluIG5vZGUuaW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmlucHV0c1tpbnB1dE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXNzICYmICFub2RlLnBhc3MubWF0ZXJpYWwuaXNVbmlmb3JtRW5hYmxlZChpbnB1dE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGluICcgICsgbm9kZS5uYW1lICsgJy4nICsgaW5wdXROYW1lICsgJyBub3QgdXNlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmcm9tUGluSW5mbyA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG5cbiAgICAgICAgICAgICAgICB2YXIgZnJvbVBpbiA9IHRoaXMuZmluZFBpbihmcm9tUGluSW5mbyk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21QaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5saW5rKGlucHV0TmFtZSwgZnJvbVBpbi5ub2RlLCBmcm9tUGluLnBpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZyb21QaW5JbmZvID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdOb2RlICcgKyBmcm9tUGluSW5mbyArICcgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BpbiBvZiAnICsgZnJvbVBpbkluZm8ubm9kZSArICcuJyArIGZyb21QaW5JbmZvLnBpbiArICcgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluZFBpbjogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHZhciBub2RlO1xuICAgICAgICAvLyBUcnkgdG8gdGFrZSBpbnB1dCBhcyBhIGRpcmVjdGx5IGEgbm9kZVxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIEdyYXBoTm9kZSkge1xuICAgICAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgbm9kZTogaW5wdXRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0Lm5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdG1wID0gdGhpcy5ub2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodG1wLm5hbWUgPT09IGlucHV0Lm5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlID0gaW5wdXQubm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgdmFyIGlucHV0UGluID0gaW5wdXQucGluO1xuICAgICAgICAgICAgaWYgKCFpbnB1dFBpbikge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBmaXJzdCBwaW4gZGVmYXVsdGx5XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUub3V0cHV0cykge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFBpbiA9IE9iamVjdC5rZXlzKG5vZGUub3V0cHV0cylbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUub3V0cHV0c1tpbnB1dFBpbl0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICBwaW46IGlucHV0UGluXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBHcmFwaDtcbiIsImltcG9ydCBHcmFwaCBmcm9tICcuL0dyYXBoJztcbmltcG9ydCBUZXh0dXJlUG9vbCBmcm9tICcuL1RleHR1cmVQb29sJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5cbi8qKlxuICogQ29tcG9zaXRvciBwcm92aWRlIGdyYXBoIGJhc2VkIHBvc3QgcHJvY2Vzc2luZ1xuICpcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LmNvbXBvc2l0b3IuQ29tcG9zaXRvclxuICogQGV4dGVuZHMgY2xheS5jb21wb3NpdG9yLkdyYXBoXG4gKlxuICovXG52YXIgQ29tcG9zaXRvciA9IEdyYXBoLmV4dGVuZChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBPdXRwdXQgbm9kZVxuICAgICAgICBfb3V0cHV0czogW10sXG5cbiAgICAgICAgX3RleHR1cmVQb29sOiBuZXcgVGV4dHVyZVBvb2woKSxcblxuICAgICAgICBfZnJhbWVCdWZmZXI6IG5ldyBGcmFtZUJ1ZmZlcih7XG4gICAgICAgICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICAgICAgfSlcbiAgICB9O1xufSxcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLkNvbXBvc2l0b3IucHJvdG90eXBlICovXG57XG4gICAgYWRkTm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBHcmFwaC5wcm90b3R5cGUuYWRkTm9kZS5jYWxsKHRoaXMsIG5vZGUpO1xuICAgICAgICBub2RlLl9jb21wb3NpdG9yID0gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgcmVuZGVyOiBmdW5jdGlvbihyZW5kZXJlciwgZnJhbWVCdWZmZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5fb3V0cHV0cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vZGVzW2ldLm91dHB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3V0cHV0cy5wdXNoKHRoaXMubm9kZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZWZlcmVuY2UgbnVtYmVyIG9mIGVhY2ggb3V0cHV0IHRleHR1cmVcbiAgICAgICAgICAgIHRoaXMubm9kZXNbaV0uYmVmb3JlRnJhbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3V0cHV0c1tpXS51cGRhdGVSZWZlcmVuY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fb3V0cHV0c1tpXS5yZW5kZXIocmVuZGVyZXIsIGZyYW1lQnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gQ2xlYXIgdXBcbiAgICAgICAgICAgIHRoaXMubm9kZXNbaV0uYWZ0ZXJGcmFtZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFsbG9jYXRlVGV4dHVyZTogZnVuY3Rpb24gKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHR1cmVQb29sLmdldChwYXJhbWV0ZXJzKTtcbiAgICB9LFxuXG4gICAgcmVsZWFzZVRleHR1cmU6IGZ1bmN0aW9uIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVQb29sLnB1dChwYXJhbWV0ZXJzKTtcbiAgICB9LFxuXG4gICAgZ2V0RnJhbWVCdWZmZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lQnVmZmVyO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIGNvbXBvc2l0b3JcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVQb29sLmNsZWFyKHJlbmRlcmVyKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9zaXRvcjtcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5pbXBvcnQgZ2xlbnVtIGZyb20gJy4uL2NvcmUvZ2xlbnVtJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY29tcG9zaXRvci5TY2VuZU5vZGVcbiAqIEBleHRlbmRzIGNsYXkuY29tcG9zaXRvci5Ob2RlXG4gKi9cbnZhciBTY2VuZU5vZGUgPSBOb2RlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLlNjZW5lTm9kZSMgKi9cbntcbiAgICBuYW1lOiAnc2NlbmUnLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LlNjZW5lfVxuICAgICAqL1xuICAgIHNjZW5lOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtjbGF5LkNhbWVyYX1cbiAgICAgKi9cbiAgICBjYW1lcmE6IG51bGwsXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgYXV0b1VwZGF0ZVNjZW5lOiB0cnVlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHByZVo6IGZhbHNlXG5cbn0sIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZnJhbWVCdWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoKTtcbn0sIHtcbiAgICByZW5kZXI6IGZ1bmN0aW9uKHJlbmRlcmVyKSB7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9nbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcignYmVmb3JlcmVuZGVyJyk7XG5cbiAgICAgICAgdmFyIHJlbmRlckluZm87XG5cbiAgICAgICAgaWYgKCF0aGlzLm91dHB1dHMpIHtcblxuICAgICAgICAgICAgcmVuZGVySW5mbyA9IHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgIXRoaXMuYXV0b1VwZGF0ZVNjZW5lLCB0aGlzLnByZVopO1xuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgIHZhciBmcmFtZUJ1ZmZlciA9IHRoaXMuZnJhbWVCdWZmZXI7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy51cGRhdGVQYXJhbWV0ZXIobmFtZSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIHZhciBvdXRwdXRJbmZvID0gdGhpcy5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fY29tcG9zaXRvci5hbGxvY2F0ZVRleHR1cmUocGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV0gPSB0ZXh0dXJlO1xuXG4gICAgICAgICAgICAgICAgdmFyIGF0dGFjaG1lbnQgPSBvdXRwdXRJbmZvLmF0dGFjaG1lbnQgfHwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoYXR0YWNobWVudCkgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudCA9IF9nbFthdHRhY2htZW50XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRleHR1cmUsIGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgIC8vIE1SVCBTdXBwb3J0IGluIGNocm9tZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc2RrL3Rlc3RzL2NvbmZvcm1hbmNlL2V4dGVuc2lvbnMvZXh0LWRyYXctYnVmZmVycy5odG1sXG4gICAgICAgICAgICB2YXIgZXh0ID0gcmVuZGVyZXIuZ2V0R0xFeHRlbnNpb24oJ0VYVF9kcmF3X2J1ZmZlcnMnKTtcbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnVmcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGF0dGFjaG1lbnQgaW4gdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPSBwYXJzZUludChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPj0gX2dsLkNPTE9SX0FUVEFDSE1FTlQwICYmIGF0dGFjaG1lbnQgPD0gX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy5wdXNoKGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4dC5kcmF3QnVmZmVyc0VYVChidWZzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWx3YXlzIGNsZWFyXG4gICAgICAgICAgICAvLyBQRU5ESU5HXG4gICAgICAgICAgICByZW5kZXJlci5zYXZlQ2xlYXIoKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLmNsZWFyQml0ID0gZ2xlbnVtLkRFUFRIX0JVRkZFUl9CSVQgfCBnbGVudW0uQ09MT1JfQlVGRkVSX0JJVDtcbiAgICAgICAgICAgIHJlbmRlckluZm8gPSByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsICF0aGlzLmF1dG9VcGRhdGVTY2VuZSwgdGhpcy5wcmVaKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlc3RvcmVDbGVhcigpO1xuXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdhZnRlcnJlbmRlcicsIHJlbmRlckluZm8pO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZCA9IHRydWU7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNjZW5lTm9kZTtcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuY29tcG9zaXRvci5UZXh0dXJlTm9kZVxuICogQGV4dGVuZHMgY2xheS5jb21wb3NpdG9yLk5vZGVcbiAqL1xudmFyIFRleHR1cmVOb2RlID0gTm9kZS5leHRlbmQoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5jb21wb3NpdG9yLlRleHR1cmVOb2RlIyAqLyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5UZXh0dXJlMkR9XG4gICAgICAgICAqL1xuICAgICAgICB0ZXh0dXJlOiBudWxsLFxuXG4gICAgICAgIC8vIFRleHR1cmUgbm9kZSBtdXN0IGhhdmUgb3V0cHV0IHdpdGhvdXQgcGFyYW1ldGVyc1xuICAgICAgICBvdXRwdXRzOiB7XG4gICAgICAgICAgICBjb2xvcjoge31cbiAgICAgICAgfVxuICAgIH07XG59LCBmdW5jdGlvbiAoKSB7XG59LCB7XG5cbiAgICBnZXRPdXRwdXQ6IGZ1bmN0aW9uIChyZW5kZXJlciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlO1xuICAgIH0sXG5cbiAgICAvLyBEbyBub3RoaW5nXG4gICAgYmVmb3JlRnJhbWU6IGZ1bmN0aW9uICgpIHt9LFxuICAgIGFmdGVyRnJhbWU6IGZ1bmN0aW9uICgpIHt9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZU5vZGU7XG4iLCIvLyBUT0RPIFNoYWRlciBsaWJyYXJ5XG5pbXBvcnQgUGFzcyBmcm9tICcuL1Bhc3MnO1xuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJztcblxuLy8gVE9ETyBjdXJsbm9pc2UgZGVtbyB3cm9uZ1xuXG4vLyBQRU5ESU5HXG4vLyBVc2UgdG9wb2xvZ2ljYWwgc29ydCA/XG5cbi8qKlxuICogRmlsdGVyIG5vZGVcbiAqXG4gKiBAY29uc3RydWN0b3IgY2xheS5jb21wb3NpdG9yLkZpbHRlck5vZGVcbiAqIEBleHRlbmRzIGNsYXkuY29tcG9zaXRvci5Ob2RlXG4gKlxuICogQGV4YW1wbGVcbiAgICB2YXIgbm9kZSA9IG5ldyBjbGF5LmNvbXBvc2l0b3IuTm9kZSh7XG4gICAgICAgIG5hbWU6ICdmeGFhJyxcbiAgICAgICAgc2hhZGVyOiBjbGF5LlNoYWRlci5zb3VyY2UoJ2NsYXkuY29tcG9zaXRvci5meGFhJyksXG4gICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiAnc2NlbmUnLFxuICAgICAgICAgICAgICAgICAgICBwaW46ICdjb2xvcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gTXVsdGlwbGUgb3V0cHV0cyBpcyBwcmVzZXJ2ZWQgZm9yIE1SVCBzdXBwb3J0IGluIFdlYkdMMi4wXG4gICAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgYXR0YWNobWVudDogY2xheS5GcmFtZUJ1ZmZlci5DT0xPUl9BVFRBQ0hNRU5UMFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBjbGF5LlRleHR1cmUuUkdCQSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUxMixcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA1MTJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2lsbCBrZWVwIHRoZSBSVFQgcmVuZGVyZWQgaW4gbGFzdCBmcmFtZVxuICAgICAgICAgICAgICAgIGtlZXBMYXN0RnJhbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIG5vZGUgb3V0cHV0IHRoZSBSVFQgcmVuZGVyZWQgaW4gbGFzdCBmcmFtZVxuICAgICAgICAgICAgICAgIG91dHB1dExhc3RGcmFtZTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgKlxuICAgICovXG52YXIgRmlsdGVyTm9kZSA9IE5vZGUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyoqIEBsZW5kcyBjbGF5LmNvbXBvc2l0b3IuTm9kZSMgKi8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgaW5wdXRzOiB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIG91dHB1dHM6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBzaGFkZXI6ICcnLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnB1dCBsaW5rcywgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSBncmFwaFxuICAgICAgICAgKiBAZXhhbXBsZTpcbiAgICAgICAgICogICAgIGlucHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBpbnB1dExpbmtzOiB7fSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogT3V0cHV0IGxpbmtzLCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIGdyYXBoXG4gICAgICAgICAqIEBleGFtcGxlOlxuICAgICAgICAgKiAgICAgb3V0cHV0TmFtZToge1xuICAgICAgICAgKiAgICAgICAgIG5vZGU6IHNvbWVOb2RlLFxuICAgICAgICAgKiAgICAgICAgIHBpbjogJ3h4eHgnXG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICBvdXRwdXRMaW5rczoge30sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LmNvbXBvc2l0b3IuUGFzc31cbiAgICAgICAgICovXG4gICAgICAgIHBhc3M6IG51bGwsXG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3V0cHV0IHRleHR1cmUgb2YgcHJldmlvdXMgZnJhbWVcbiAgICAgICAgLy8gV2lsbCBiZSB1c2VkIHdoZW4gdGhlcmUgZXhpc3QgYSBjaXJjdWxhciByZWZlcmVuY2VcbiAgICAgICAgX3ByZXZPdXRwdXRUZXh0dXJlczoge30sXG4gICAgICAgIF9vdXRwdXRUZXh0dXJlczoge30sXG5cbiAgICAgICAgLy8gRXhhbXBsZTogeyBuYW1lOiAyIH1cbiAgICAgICAgX291dHB1dFJlZmVyZW5jZXM6IHt9LFxuXG4gICAgICAgIF9yZW5kZXJpbmc6IGZhbHNlLFxuICAgICAgICAvLyBJZiByZW5kZXJlZCBpbiB0aGlzIGZyYW1lXG4gICAgICAgIF9yZW5kZXJlZDogZmFsc2UsXG5cbiAgICAgICAgX2NvbXBvc2l0b3I6IG51bGxcbiAgICB9O1xufSwgZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIHBhc3MgPSBuZXcgUGFzcyh7XG4gICAgICAgIGZyYWdtZW50OiB0aGlzLnNoYWRlclxuICAgIH0pO1xuICAgIHRoaXMucGFzcyA9IHBhc3M7XG59LFxuLyoqIEBsZW5kcyBjbGF5LmNvbXBvc2l0b3IuTm9kZS5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtjbGF5LlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqL1xuICAgIHJlbmRlcjogZnVuY3Rpb24gKHJlbmRlcmVyLCBmcmFtZUJ1ZmZlcikge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZXJlbmRlcicsIHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJpbmcgPSB0cnVlO1xuXG4gICAgICAgIHZhciBfZ2wgPSByZW5kZXJlci5nbDtcblxuICAgICAgICBmb3IgKHZhciBpbnB1dE5hbWUgaW4gdGhpcy5pbnB1dExpbmtzKSB7XG4gICAgICAgICAgICB2YXIgbGluayA9IHRoaXMuaW5wdXRMaW5rc1tpbnB1dE5hbWVdO1xuICAgICAgICAgICAgdmFyIGlucHV0VGV4dHVyZSA9IGxpbmsubm9kZS5nZXRPdXRwdXQocmVuZGVyZXIsIGxpbmsucGluKTtcbiAgICAgICAgICAgIHRoaXMucGFzcy5zZXRVbmlmb3JtKGlucHV0TmFtZSwgaW5wdXRUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdXRwdXRcbiAgICAgICAgaWYgKCF0aGlzLm91dHB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMucGFzcy5vdXRwdXRzID0gbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5nZXRGcmFtZUJ1ZmZlcigpLnVuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgIHRoaXMucGFzcy5yZW5kZXIocmVuZGVyZXIsIGZyYW1lQnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFzcy5vdXRwdXRzID0ge307XG5cbiAgICAgICAgICAgIHZhciBhdHRhY2hlZFRleHR1cmVzID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy51cGRhdGVQYXJhbWV0ZXIobmFtZSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihwYXJhbWV0ZXJzLndpZHRoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmFtZXRlcihuYW1lLCByZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvdXRwdXRJbmZvID0gdGhpcy5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fY29tcG9zaXRvci5hbGxvY2F0ZVRleHR1cmUocGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3V0cHV0VGV4dHVyZXNbbmFtZV0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgIHZhciBhdHRhY2htZW50ID0gb3V0cHV0SW5mby5hdHRhY2htZW50IHx8IF9nbC5DT0xPUl9BVFRBQ0hNRU5UMDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGF0dGFjaG1lbnQpID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPSBfZ2xbYXR0YWNobWVudF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF0dGFjaGVkVGV4dHVyZXNbYXR0YWNobWVudF0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5nZXRGcmFtZUJ1ZmZlcigpLmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBhdHRhY2htZW50IGluIGF0dGFjaGVkVGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBhdHRhY2htZW50IGNoYW5nZXMgaW4gZGlmZmVyZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRvci5nZXRGcmFtZUJ1ZmZlcigpLmF0dGFjaChcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWRUZXh0dXJlc1thdHRhY2htZW50XSwgYXR0YWNobWVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGFzcy5yZW5kZXIocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBkYXRhIG9mIHRleHR1cmUgaXMgY2hhbmdlZCBvdmVyIHRpbWUsXG4gICAgICAgICAgICAvLyBIZXJlIHVwZGF0ZSB0aGUgbWlwbWFwcyBvZiB0ZXh0dXJlIGVhY2ggdGltZSBhZnRlciByZW5kZXJlZDtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0b3IuZ2V0RnJhbWVCdWZmZXIoKS51cGRhdGVNaXBtYXAocmVuZGVyZXIuZ2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaW5wdXROYW1lIGluIHRoaXMuaW5wdXRMaW5rcykge1xuICAgICAgICAgICAgdmFyIGxpbmsgPSB0aGlzLmlucHV0TGlua3NbaW5wdXROYW1lXTtcbiAgICAgICAgICAgIGxpbmsubm9kZS5yZW1vdmVSZWZlcmVuY2UobGluay5waW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2FmdGVycmVuZGVyJywgcmVuZGVyZXIpO1xuICAgIH0sXG5cbiAgICAvLyBUT0RPIFJlbW92ZSBwYXJhbWV0ZXIgZnVuY3Rpb24gY2FsbGJhY2tcbiAgICB1cGRhdGVQYXJhbWV0ZXI6IGZ1bmN0aW9uIChvdXRwdXROYW1lLCByZW5kZXJlcikge1xuICAgICAgICB2YXIgb3V0cHV0SW5mbyA9IHRoaXMub3V0cHV0c1tvdXRwdXROYW1lXTtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBvdXRwdXRJbmZvLnBhcmFtZXRlcnM7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5O1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnNDb3B5KSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzQ29weSA9IG91dHB1dEluZm8uX3BhcmFtZXRlcnNDb3B5ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ3dpZHRoJyAmJiBrZXkgIT09ICdoZWlnaHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNDb3B5W2tleV0gPSBwYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB3aWR0aCwgaGVpZ2h0O1xuICAgICAgICBpZiAocGFyYW1ldGVycy53aWR0aCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGguY2FsbCh0aGlzLCByZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcmFtZXRlcnMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuaGVpZ2h0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHBhcmFtZXRlcnMuaGVpZ2h0LmNhbGwodGhpcywgcmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcGFyYW1ldGVycy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1ldGVyc0NvcHkud2lkdGggIT09IHdpZHRoXG4gICAgICAgICAgICB8fCBwYXJhbWV0ZXJzQ29weS5oZWlnaHQgIT09IGhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdXRwdXRUZXh0dXJlc1tvdXRwdXROYW1lXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dFRleHR1cmVzW291dHB1dE5hbWVdLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LndpZHRoID0gd2lkdGg7XG4gICAgICAgIHBhcmFtZXRlcnNDb3B5LmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICByZXR1cm4gcGFyYW1ldGVyc0NvcHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCBwYXJhbWV0ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7fSB2YWx1ZVxuICAgICAqL1xuICAgIHNldFBhcmFtZXRlcjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMucGFzcy5zZXRVbmlmb3JtKG5hbWUsIHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCBwYXJhbWV0ZXIgdmFsdWVcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJuIHt9XG4gICAgICovXG4gICAgZ2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXNzLmdldFVuaWZvcm0obmFtZSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXQgcGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICAgKi9cbiAgICBzZXRQYXJhbWV0ZXJzOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihuYW1lLCBvYmpbbmFtZV0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBTZXQgc2hhZGVyIGNvZGVcbiAgICAvLyAgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RyXG4gICAgLy8gICovXG4gICAgLy8gc2V0U2hhZGVyOiBmdW5jdGlvbiAoc2hhZGVyU3RyKSB7XG4gICAgLy8gICAgIHZhciBtYXRlcmlhbCA9IHRoaXMucGFzcy5tYXRlcmlhbDtcbiAgICAvLyAgICAgbWF0ZXJpYWwuc2hhZGVyLnNldEZyYWdtZW50KHNoYWRlclN0cik7XG4gICAgLy8gICAgIG1hdGVyaWFsLmF0dGFjaFNoYWRlcihtYXRlcmlhbC5zaGFkZXIsIHRydWUpO1xuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUHJveHkgb2YgcGFzcy5tYXRlcmlhbC5kZWZpbmUoJ2ZyYWdtZW50JywgeHh4KTtcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHN5bWJvbFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gW3ZhbF1cbiAgICAgKi9cbiAgICBkZWZpbmU6IGZ1bmN0aW9uIChzeW1ib2wsIHZhbCkge1xuICAgICAgICB0aGlzLnBhc3MubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsIHN5bWJvbCwgdmFsKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJveHkgb2YgcGFzcy5tYXRlcmlhbC51bmRlZmluZSgnZnJhZ21lbnQnLCB4eHgpXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzeW1ib2xcbiAgICAgKi9cbiAgICB1bmRlZmluZTogZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB0aGlzLnBhc3MubWF0ZXJpYWwudW5kZWZpbmUoJ2ZyYWdtZW50Jywgc3ltYm9sKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlUmVmZXJlbmNlOiBmdW5jdGlvbiAob3V0cHV0TmFtZSkge1xuICAgICAgICB0aGlzLl9vdXRwdXRSZWZlcmVuY2VzW291dHB1dE5hbWVdLS07XG4gICAgICAgIGlmICh0aGlzLl9vdXRwdXRSZWZlcmVuY2VzW291dHB1dE5hbWVdID09PSAwKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0SW5mbyA9IHRoaXMub3V0cHV0c1tvdXRwdXROYW1lXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmZvLmtlZXBMYXN0RnJhbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldk91dHB1dFRleHR1cmVzW291dHB1dE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvc2l0b3IucmVsZWFzZVRleHR1cmUodGhpcy5fcHJldk91dHB1dFRleHR1cmVzW291dHB1dE5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldk91dHB1dFRleHR1cmVzW291dHB1dE5hbWVdID0gdGhpcy5fb3V0cHV0VGV4dHVyZXNbb3V0cHV0TmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdXRwdXQgb2YgdGhpcyBub2RlIGhhdmUgYWxyZWF5IGJlZW4gdXNlZCBieSBhbGwgb3RoZXIgbm9kZXNcbiAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHRleHR1cmUgYmFjayB0byB0aGUgcG9vbC5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdG9yLnJlbGVhc2VUZXh0dXJlKHRoaXMuX291dHB1dFRleHR1cmVzW291dHB1dE5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBOb2RlLnByb3RvdHlwZS5jbGVhci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8vIERlZmF1bHQgZGlzYWJsZSBhbGwgdGV4dHVyZVxuICAgICAgICB0aGlzLnBhc3MubWF0ZXJpYWwuZGlzYWJsZVRleHR1cmVzQWxsKCk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlck5vZGU7XG4iLCJpbXBvcnQgdXRpbCBmcm9tICcuLi9jb3JlL3V0aWwnO1xuaW1wb3J0IENvbXBvc2l0b3IgZnJvbSAnLi9Db21wb3NpdG9yJztcbmltcG9ydCBDb21wb1NjZW5lTm9kZSBmcm9tICcuL1NjZW5lTm9kZSc7XG5pbXBvcnQgQ29tcG9UZXh0dXJlTm9kZSBmcm9tICcuL1RleHR1cmVOb2RlJztcbmltcG9ydCBDb21wb0ZpbHRlck5vZGUgZnJvbSAnLi9GaWx0ZXJOb2RlJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL1RleHR1cmUnO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFRleHR1cmVDdWJlIGZyb20gJy4uL1RleHR1cmVDdWJlJztcblxudmFyIHNoYWRlclNvdXJjZVJlZyA9IC9eI3NvdXJjZVxcKCguKj8pXFwpLztcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXVxuICogQHJldHVybiB7Y2xheS5jb21wb3NpdG9yLkNvbXBvc2l0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2l0b3IoanNvbiwgb3B0cykge1xuICAgIHZhciBjb21wb3NpdG9yID0gbmV3IENvbXBvc2l0b3IoKTtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIHZhciBsaWIgPSB7XG4gICAgICAgIHRleHR1cmVzOiB7fSxcbiAgICAgICAgcGFyYW1ldGVyczoge31cbiAgICB9O1xuICAgIHZhciBhZnRlckxvYWQgPSBmdW5jdGlvbihzaGFkZXJMaWIsIHRleHR1cmVMaWIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUluZm8gPSBqc29uLm5vZGVzW2ldO1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBjcmVhdGVOb2RlKG5vZGVJbmZvLCBsaWIsIG9wdHMpO1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdG9yLmFkZE5vZGUobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiBqc29uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgdmFyIHBhcmFtSW5mbyA9IGpzb24ucGFyYW1ldGVyc1tuYW1lXTtcbiAgICAgICAgbGliLnBhcmFtZXRlcnNbbmFtZV0gPSBjb252ZXJ0UGFyYW1ldGVyKHBhcmFtSW5mbyk7XG4gICAgfVxuICAgIC8vIFRPRE8gbG9hZCB0ZXh0dXJlIGFzeW5jaHJvbm91c1xuICAgIGxvYWRUZXh0dXJlcyhqc29uLCBsaWIsIG9wdHMsIGZ1bmN0aW9uKHRleHR1cmVMaWIpIHtcbiAgICAgICAgbGliLnRleHR1cmVzID0gdGV4dHVyZUxpYjtcbiAgICAgICAgYWZ0ZXJMb2FkKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9zaXRvcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9kZShub2RlSW5mbywgbGliLCBvcHRzKSB7XG4gICAgdmFyIHR5cGUgPSBub2RlSW5mby50eXBlIHx8ICdmaWx0ZXInO1xuICAgIHZhciBzaGFkZXJTb3VyY2U7XG4gICAgdmFyIGlucHV0cztcbiAgICB2YXIgb3V0cHV0cztcblxuICAgIGlmICh0eXBlID09PSAnZmlsdGVyJykge1xuICAgICAgICB2YXIgc2hhZGVyRXhwID0gbm9kZUluZm8uc2hhZGVyLnRyaW0oKTtcbiAgICAgICAgdmFyIHJlcyA9IHNoYWRlclNvdXJjZVJlZy5leGVjKHNoYWRlckV4cCk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHNoYWRlclNvdXJjZSA9IFNoYWRlci5zb3VyY2UocmVzWzFdLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2hhZGVyRXhwLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgICAgICBzaGFkZXJTb3VyY2UgPSBsaWIuc2hhZGVyc1tzaGFkZXJFeHAuc3Vic3RyKDEpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWRlclNvdXJjZSkge1xuICAgICAgICAgICAgc2hhZGVyU291cmNlID0gc2hhZGVyRXhwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hhZGVyU291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZUluZm8uaW5wdXRzKSB7XG4gICAgICAgIGlucHV0cyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIG5vZGVJbmZvLmlucHV0cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlSW5mby5pbnB1dHNbbmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRzW25hbWVdID0gbm9kZUluZm8uaW5wdXRzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXRzW25hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlSW5mby5pbnB1dHNbbmFtZV0ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgcGluOiBub2RlSW5mby5pbnB1dHNbbmFtZV0ucGluXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZUluZm8ub3V0cHV0cykge1xuICAgICAgICBvdXRwdXRzID0ge307XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZUluZm8ub3V0cHV0cykge1xuICAgICAgICAgICAgdmFyIG91dHB1dEluZm8gPSBub2RlSW5mby5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgb3V0cHV0c1tuYW1lXSA9IHt9O1xuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8uYXR0YWNobWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0c1tuYW1lXS5hdHRhY2htZW50ID0gb3V0cHV0SW5mby5hdHRhY2htZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ua2VlcExhc3RGcmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0c1tuYW1lXS5rZWVwTGFzdEZyYW1lID0gb3V0cHV0SW5mby5rZWVwTGFzdEZyYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ub3V0cHV0TGFzdEZyYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzW25hbWVdLm91dHB1dExhc3RGcmFtZSA9IG91dHB1dEluZm8ub3V0cHV0TGFzdEZyYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dHB1dEluZm8ucGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIG91dHB1dHNbbmFtZV0ucGFyYW1ldGVycyA9IGNvbnZlcnRQYXJhbWV0ZXIob3V0cHV0SW5mby5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbm9kZTtcbiAgICBpZiAodHlwZSA9PT0gJ3NjZW5lJykge1xuICAgICAgICBub2RlID0gbmV3IENvbXBvU2NlbmVOb2RlKHtcbiAgICAgICAgICAgIG5hbWU6IG5vZGVJbmZvLm5hbWUsXG4gICAgICAgICAgICBzY2VuZTogb3B0cy5zY2VuZSxcbiAgICAgICAgICAgIGNhbWVyYTogb3B0cy5jYW1lcmEsXG4gICAgICAgICAgICBvdXRwdXRzOiBvdXRwdXRzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAndGV4dHVyZScpIHtcbiAgICAgICAgbm9kZSA9IG5ldyBDb21wb1RleHR1cmVOb2RlKHtcbiAgICAgICAgICAgIG5hbWU6IG5vZGVJbmZvLm5hbWUsXG4gICAgICAgICAgICBvdXRwdXRzOiBvdXRwdXRzXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBEZWZhdWx0IGlzIGZpbHRlclxuICAgIGVsc2Uge1xuICAgICAgICBub2RlID0gbmV3IENvbXBvRmlsdGVyTm9kZSh7XG4gICAgICAgICAgICBuYW1lOiBub2RlSW5mby5uYW1lLFxuICAgICAgICAgICAgc2hhZGVyOiBzaGFkZXJTb3VyY2UsXG4gICAgICAgICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgICAgICAgIG91dHB1dHM6IG91dHB1dHNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlSW5mby5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIG5vZGVJbmZvLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gbm9kZUluZm8ucGFyYW1ldGVyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHZhbCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGxpYi50ZXh0dXJlc1t2YWwuc3Vic3RyKDEpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUub24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlZm9yZXJlbmRlcicsIGNyZWF0ZVNpemVTZXRIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cnlDb252ZXJ0RXhwcih2YWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLnNldFBhcmFtZXRlcihuYW1lLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlSW5mby5kZWZpbmVzICYmIG5vZGUucGFzcykge1xuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBub2RlSW5mby5kZWZpbmVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IG5vZGVJbmZvLmRlZmluZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbm9kZS5wYXNzLm1hdGVyaWFsLmRlZmluZSgnZnJhZ21lbnQnLCBuYW1lLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UGFyYW1ldGVyKHBhcmFtSW5mbykge1xuICAgIHZhciBwYXJhbSA9IHt9O1xuICAgIGlmICghcGFyYW1JbmZvKSB7XG4gICAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9XG4gICAgWyd0eXBlJywgJ21pbkZpbHRlcicsICdtYWdGaWx0ZXInLCAnd3JhcFMnLCAnd3JhcFQnLCAnZmxpcFknLCAndXNlTWlwbWFwJ11cbiAgICAgICAgLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHBhcmFtSW5mb1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGVudW1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gVGV4dHVyZVt2YWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJhbVtuYW1lXSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgWyd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1JbmZvW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gcGFyYW1JbmZvW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbVtuYW1lXSA9IGNyZWF0ZVNpemVQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cnlDb252ZXJ0RXhwcih2YWwpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbVtuYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIGlmIChwYXJhbUluZm8udXNlTWlwbWFwICE9IG51bGwpIHtcbiAgICAgICAgcGFyYW0udXNlTWlwbWFwID0gcGFyYW1JbmZvLnVzZU1pcG1hcDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtO1xufVxuXG5mdW5jdGlvbiBsb2FkVGV4dHVyZXMoanNvbiwgbGliLCBvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghanNvbi50ZXh0dXJlcykge1xuICAgICAgICBjYWxsYmFjayh7fSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRleHR1cmVzID0ge307XG4gICAgdmFyIGxvYWRpbmcgPSAwO1xuXG4gICAgdmFyIGNiZCA9IGZhbHNlO1xuICAgIHZhciB0ZXh0dXJlUm9vdFBhdGggPSBvcHRzLnRleHR1cmVSb290UGF0aDtcbiAgICB1dGlsLmVhY2goanNvbi50ZXh0dXJlcywgZnVuY3Rpb24odGV4dHVyZUluZm8sIG5hbWUpIHtcbiAgICAgICAgdmFyIHRleHR1cmU7XG4gICAgICAgIHZhciBwYXRoID0gdGV4dHVyZUluZm8ucGF0aDtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBjb252ZXJ0UGFyYW1ldGVyKHRleHR1cmVJbmZvLnBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSAmJiBwYXRoLmxlbmd0aCA9PT0gNikge1xuICAgICAgICAgICAgaWYgKHRleHR1cmVSb290UGF0aCkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLnJlbGF0aXZlMmFic29sdXRlKGl0ZW0sIHRleHR1cmVSb290UGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0dXJlID0gbmV3IFRleHR1cmVDdWJlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGV4dHVyZVJvb3RQYXRoKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IHV0aWwucmVsYXRpdmUyYWJzb2x1dGUocGF0aCwgdGV4dHVyZVJvb3RQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgVGV4dHVyZTJEKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dHVyZS5sb2FkKHBhdGgpO1xuICAgICAgICBsb2FkaW5nKys7XG4gICAgICAgIHRleHR1cmUub25jZSgnc3VjY2VzcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGV4dHVyZXNbbmFtZV0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgbG9hZGluZy0tO1xuICAgICAgICAgICAgaWYgKGxvYWRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0ZXh0dXJlcyk7XG4gICAgICAgICAgICAgICAgY2JkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobG9hZGluZyA9PT0gMCAmJiAhY2JkKSB7XG4gICAgICAgIGNhbGxiYWNrKHRleHR1cmVzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpemVTZXRIYW5kbGVyKG5hbWUsIGV4cHJGdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZW5kZXJlcikge1xuICAgICAgICAvLyBQRU5ESU5HIHZpZXdwb3J0IHNpemUgb3Igd2luZG93IHNpemVcbiAgICAgICAgdmFyIGRwciA9IHJlbmRlcmVyLmdldERldmljZVBpeGVsUmF0aW8oKTtcbiAgICAgICAgLy8gUEVORElORyBJZiBtdWx0aXBseSBkcHIgP1xuICAgICAgICB2YXIgd2lkdGggPSByZW5kZXJlci5nZXRXaWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gcmVuZGVyZXIuZ2V0SGVpZ2h0KCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBleHByRnVuYyh3aWR0aCwgaGVpZ2h0LCBkcHIpO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcihuYW1lLCByZXN1bHQpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpemVQYXJzZXIobmFtZSwgZXhwckZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHZhciBkcHIgPSByZW5kZXJlci5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIHZhciB3aWR0aCA9IHJlbmRlcmVyLmdldFdpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSByZW5kZXJlci5nZXRIZWlnaHQoKTtcbiAgICAgICAgcmV0dXJuIGV4cHJGdW5jKHdpZHRoLCBoZWlnaHQsIGRwcik7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdHJ5Q29udmVydEV4cHIoc3RyaW5nKSB7XG4gICAgLy8gUEVORElOR1xuICAgIHZhciBleHByUmVzID0gL15leHByXFwoKC4qKVxcKSQvLmV4ZWMoc3RyaW5nKTtcbiAgICBpZiAoZXhwclJlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ3dpZHRoJywgJ2hlaWdodCcsICdkcHInLCAncmV0dXJuICcgKyBleHByUmVzWzFdKTtcbiAgICAgICAgICAgIC8vIFRyeSBydW4gdFxuICAgICAgICAgICAgZnVuYygxLCAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHByZXNzaW9uLicpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb3NpdG9yO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQuZ2J1ZmZlci52ZXJ0ZXhcXG51bmlmb3JtIG1hdDQgd29ybGRWaWV3UHJvamVjdGlvbiA6IFdPUkxEVklFV1BST0pFQ1RJT047XFxudW5pZm9ybSBtYXQ0IHdvcmxkSW52ZXJzZVRyYW5zcG9zZSA6IFdPUkxESU5WRVJTRVRSQU5TUE9TRTtcXG51bmlmb3JtIG1hdDQgd29ybGQgOiBXT1JMRDtcXG51bmlmb3JtIHZlYzIgdXZSZXBlYXQ7XFxudW5pZm9ybSB2ZWMyIHV2T2Zmc2V0O1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uIDogUE9TSVRJT047XFxuYXR0cmlidXRlIHZlYzIgdGV4Y29vcmQgOiBURVhDT09SRF8wO1xcbiNpZmRlZiBGSVJTVF9QQVNTXFxuYXR0cmlidXRlIHZlYzMgbm9ybWFsIDogTk9STUFMO1xcbiNlbmRpZlxcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG4jaWZkZWYgRklSU1RfUEFTU1xcbnZhcnlpbmcgdmVjMyB2X05vcm1hbDtcXG5hdHRyaWJ1dGUgdmVjNCB0YW5nZW50IDogVEFOR0VOVDtcXG52YXJ5aW5nIHZlYzMgdl9UYW5nZW50O1xcbnZhcnlpbmcgdmVjMyB2X0JpdGFuZ2VudDtcXG52YXJ5aW5nIHZlYzMgdl9Xb3JsZFBvc2l0aW9uO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIHNraW5uZWRQb3NpdGlvbiA9IHBvc2l0aW9uO1xcbiNpZmRlZiBGSVJTVF9QQVNTXFxuICAgIHZlYzMgc2tpbm5lZE5vcm1hbCA9IG5vcm1hbDtcXG4gICAgdmVjMyBza2lubmVkVGFuZ2VudCA9IHRhbmdlbnQueHl6O1xcbiAgICBib29sIGhhc1RhbmdlbnQgPSBkb3QodGFuZ2VudCwgdGFuZ2VudCkgPiAwLjA7XFxuI2VuZGlmXFxuI2lmZGVmIFNLSU5OSU5HXFxuICAgIEBpbXBvcnQgY2xheS5jaHVuay5za2luX21hdHJpeFxcbiAgICBza2lubmVkUG9zaXRpb24gPSAoc2tpbk1hdHJpeFdTICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6O1xcbiAgICAjaWZkZWYgRklSU1RfUEFTU1xcbiAgICBza2lubmVkTm9ybWFsID0gKHNraW5NYXRyaXhXUyAqIHZlYzQobm9ybWFsLCAwLjApKS54eXo7XFxuICAgIGlmIChoYXNUYW5nZW50KSB7XFxuICAgICAgICBza2lubmVkVGFuZ2VudCA9IChza2luTWF0cml4V1MgKiB2ZWM0KHRhbmdlbnQueHl6LCAwLjApKS54eXo7XFxuICAgIH1cXG4gICAgI2VuZGlmXFxuI2VuZGlmXFxuICAgIGdsX1Bvc2l0aW9uID0gd29ybGRWaWV3UHJvamVjdGlvbiAqIHZlYzQoc2tpbm5lZFBvc2l0aW9uLCAxLjApO1xcbiAgICB2X1RleGNvb3JkID0gdGV4Y29vcmQgKiB1dlJlcGVhdCArIHV2T2Zmc2V0O1xcbiNpZmRlZiBGSVJTVF9QQVNTXFxuICAgIHZfTm9ybWFsID0gbm9ybWFsaXplKCh3b3JsZEludmVyc2VUcmFuc3Bvc2UgKiB2ZWM0KHNraW5uZWROb3JtYWwsIDAuMCkpLnh5eik7XFxuICAgIGlmIChoYXNUYW5nZW50KSB7XFxuICAgICAgICB2X1RhbmdlbnQgPSBub3JtYWxpemUoKHdvcmxkSW52ZXJzZVRyYW5zcG9zZSAqIHZlYzQoc2tpbm5lZFRhbmdlbnQsIDAuMCkpLnh5eik7XFxuICAgICAgICB2X0JpdGFuZ2VudCA9IG5vcm1hbGl6ZShjcm9zcyh2X05vcm1hbCwgdl9UYW5nZW50KSAqIHRhbmdlbnQudyk7XFxuICAgIH1cXG4gICAgdl9Xb3JsZFBvc2l0aW9uID0gKHdvcmxkICogdmVjNChza2lubmVkUG9zaXRpb24sIDEuMCkpLnh5ejtcXG4jZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5nYnVmZmVyMS5mcmFnbWVudFxcbnVuaWZvcm0gbWF0NCB2aWV3SW52ZXJzZSA6IFZJRVdJTlZFUlNFO1xcbnVuaWZvcm0gZmxvYXQgZ2xvc3NpbmVzcztcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxudmFyeWluZyB2ZWMzIHZfV29ybGRQb3NpdGlvbjtcXG51bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XFxudmFyeWluZyB2ZWMzIHZfVGFuZ2VudDtcXG52YXJ5aW5nIHZlYzMgdl9CaXRhbmdlbnQ7XFxudW5pZm9ybSBzYW1wbGVyMkQgcm91Z2hHbG9zc01hcDtcXG51bmlmb3JtIGJvb2wgdXNlUm91Z2hHbG9zc01hcDtcXG51bmlmb3JtIGJvb2wgdXNlUm91Z2huZXNzO1xcbnVuaWZvcm0gYm9vbCBkb3VibGVTaWRlZDtcXG51bmlmb3JtIGludCByb3VnaEdsb3NzQ2hhbm5lbDogMDtcXG5mbG9hdCBpbmRleGluZ1RleGVsKGluIHZlYzQgdGV4ZWwsIGluIGludCBpZHgpIHtcXG4gICAgaWYgKGlkeCA9PSAzKSByZXR1cm4gdGV4ZWwuYTtcXG4gICAgZWxzZSBpZiAoaWR4ID09IDEpIHJldHVybiB0ZXhlbC5nO1xcbiAgICBlbHNlIGlmIChpZHggPT0gMikgcmV0dXJuIHRleGVsLmI7XFxuICAgIGVsc2UgcmV0dXJuIHRleGVsLnI7XFxufVxcbnZvaWQgbWFpbigpXFxue1xcbiAgICB2ZWMzIE4gPSB2X05vcm1hbDtcXG4gICAgaWYgKGRvdWJsZVNpZGVkKSB7XFxuICAgICAgICB2ZWMzIGV5ZVBvcyA9IHZpZXdJbnZlcnNlWzNdLnh5ejtcXG4gICAgICAgIHZlYzMgViA9IGV5ZVBvcyAtIHZfV29ybGRQb3NpdGlvbjtcXG4gICAgICAgIGlmIChkb3QoTiwgVikgPCAwLjApIHtcXG4gICAgICAgICAgICBOID0gLU47XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGRvdCh2X1RhbmdlbnQsIHZfVGFuZ2VudCkgPiAwLjApIHtcXG4gICAgICAgIHZlYzMgbm9ybWFsVGV4ZWwgPSB0ZXh0dXJlMkQobm9ybWFsTWFwLCB2X1RleGNvb3JkKS54eXo7XFxuICAgICAgICBpZiAoZG90KG5vcm1hbFRleGVsLCBub3JtYWxUZXhlbCkgPiAwLjApIHsgICAgICAgICAgICBOID0gbm9ybWFsVGV4ZWwgKiAyLjAgLSAxLjA7XFxuICAgICAgICAgICAgbWF0MyB0Ym4gPSBtYXQzKHZfVGFuZ2VudCwgdl9CaXRhbmdlbnQsIHZfTm9ybWFsKTtcXG4gICAgICAgICAgICBOID0gbm9ybWFsaXplKHRibiAqIE4pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSAoTiArIDEuMCkgKiAwLjU7XFxuICAgIGZsb2F0IGcgPSBnbG9zc2luZXNzO1xcbiAgICBpZiAodXNlUm91Z2hHbG9zc01hcCkge1xcbiAgICAgICAgZmxvYXQgZzIgPSBpbmRleGluZ1RleGVsKHRleHR1cmUyRChyb3VnaEdsb3NzTWFwLCB2X1RleGNvb3JkKSwgcm91Z2hHbG9zc0NoYW5uZWwpO1xcbiAgICAgICAgaWYgKHVzZVJvdWdobmVzcykge1xcbiAgICAgICAgICAgIGcyID0gMS4wIC0gZzI7XFxuICAgICAgICB9XFxuICAgICAgICBnID0gY2xhbXAoZzIgKyAoZyAtIDAuNSkgKiAyLjAsIDAuMCwgMS4wKTtcXG4gICAgfVxcbiAgICBnbF9GcmFnQ29sb3IuYSA9IGcgKyAwLjAwNTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5nYnVmZmVyMi5mcmFnbWVudFxcbnVuaWZvcm0gc2FtcGxlcjJEIGRpZmZ1c2VNYXA7XFxudW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbnVuaWZvcm0gdmVjMyBjb2xvcjtcXG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcXG51bmlmb3JtIGJvb2wgdXNlTWV0YWxuZXNzTWFwO1xcbnVuaWZvcm0gYm9vbCBsaW5lYXI7XFxudmFyeWluZyB2ZWMyIHZfVGV4Y29vcmQ7XFxuQGltcG9ydCBjbGF5LnV0aWwuc3JnYlxcbnZvaWQgbWFpbiAoKVxcbntcXG4gICAgZmxvYXQgbSA9IG1ldGFsbmVzcztcXG4gICAgaWYgKHVzZU1ldGFsbmVzc01hcCkge1xcbiAgICAgICAgdmVjNCBtZXRhbG5lc3NUZXhlbCA9IHRleHR1cmUyRChtZXRhbG5lc3NNYXAsIHZfVGV4Y29vcmQpO1xcbiAgICAgICAgbSA9IGNsYW1wKG1ldGFsbmVzc1RleGVsLnIgKyAobSAqIDIuMCAtIDEuMCksIDAuMCwgMS4wKTtcXG4gICAgfVxcbiAgICB2ZWM0IHRleGVsID0gdGV4dHVyZTJEKGRpZmZ1c2VNYXAsIHZfVGV4Y29vcmQpO1xcbiAgICBpZiAobGluZWFyKSB7XFxuICAgICAgICB0ZXhlbCA9IHNSR0JUb0xpbmVhcih0ZXhlbCk7XFxuICAgIH1cXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHRleGVsLnJnYiAqIGNvbG9yO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IG0gKyAwLjAwNTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5nYnVmZmVyLmRlYnVnXFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG51bmlmb3JtIGludCBkZWJ1ZzogMDtcXG52b2lkIG1haW4gKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgaWYgKGRlYnVnID09IDApIHtcXG4gICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoTiwgMS4wKTtcXG4gICAgfVxcbiAgICBlbHNlIGlmIChkZWJ1ZyA9PSAxKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoeiksIDEuMCk7XFxuICAgIH1cXG4gICAgZWxzZSBpZiAoZGVidWcgPT0gMikge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChwb3NpdGlvbiwgMS4wKTtcXG4gICAgfVxcbiAgICBlbHNlIGlmIChkZWJ1ZyA9PSAzKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzMoZ2xvc3NpbmVzcyksIDEuMCk7XFxuICAgIH1cXG4gICAgZWxzZSBpZiAoZGVidWcgPT0gNCkge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh2ZWMzKG1ldGFsbmVzcyksIDEuMCk7XFxuICAgIH1cXG4gICAgZWxzZSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGFsYmVkbywgMS4wKTtcXG4gICAgfVxcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5saWdodF9oZWFkXFxudW5pZm9ybSBzYW1wbGVyMkQgZ0J1ZmZlclRleHR1cmUxO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGdCdWZmZXJUZXh0dXJlMjtcXG51bmlmb3JtIHNhbXBsZXIyRCBnQnVmZmVyVGV4dHVyZTM7XFxudW5pZm9ybSB2ZWMyIHdpbmRvd1NpemU6IFdJTkRPV19TSVpFO1xcbnVuaWZvcm0gdmVjNCB2aWV3cG9ydDogVklFV1BPUlQ7XFxudW5pZm9ybSBtYXQ0IHZpZXdQcm9qZWN0aW9uSW52O1xcbiNpZmRlZiBERVBUSF9FTkNPREVEXFxuQGltcG9ydCBjbGF5LnV0aWwuZGVjb2RlX2Zsb2F0XFxuI2VuZGlmXFxuQGVuZFxcbkBleHBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMiB1diA9IGdsX0ZyYWdDb29yZC54eSAvIHdpbmRvd1NpemU7XFxuICAgIHZlYzIgdXYyID0gKGdsX0ZyYWdDb29yZC54eSAtIHZpZXdwb3J0Lnh5KSAvIHZpZXdwb3J0Lnp3O1xcbiAgICB2ZWM0IHRleGVsMSA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTEsIHV2KTtcXG4gICAgdmVjNCB0ZXhlbDMgPSB0ZXh0dXJlMkQoZ0J1ZmZlclRleHR1cmUzLCB1dik7XFxuICAgIGlmIChkb3QodGV4ZWwxLnJnYiwgdmVjMygxLjApKSA9PSAwLjApIHtcXG4gICAgICAgIGRpc2NhcmQ7XFxuICAgIH1cXG4gICAgZmxvYXQgZ2xvc3NpbmVzcyA9IHRleGVsMS5hO1xcbiAgICBmbG9hdCBtZXRhbG5lc3MgPSB0ZXhlbDMuYTtcXG4gICAgdmVjMyBOID0gdGV4ZWwxLnJnYiAqIDIuMCAtIDEuMDtcXG4gICAgZmxvYXQgeiA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTIsIHV2KS5yICogMi4wIC0gMS4wO1xcbiAgICB2ZWMyIHh5ID0gdXYyICogMi4wIC0gMS4wO1xcbiAgICB2ZWM0IHByb2plY3RlZFBvcyA9IHZlYzQoeHksIHosIDEuMCk7XFxuICAgIHZlYzQgcDQgPSB2aWV3UHJvamVjdGlvbkludiAqIHByb2plY3RlZFBvcztcXG4gICAgdmVjMyBwb3NpdGlvbiA9IHA0Lnh5eiAvIHA0Lnc7XFxuICAgIHZlYzMgYWxiZWRvID0gdGV4ZWwzLnJnYjtcXG4gICAgdmVjMyBkaWZmdXNlQ29sb3IgPSBhbGJlZG8gKiAoMS4wIC0gbWV0YWxuZXNzKTtcXG4gICAgdmVjMyBzcGVjdWxhckNvbG9yID0gbWl4KHZlYzMoMC4wNCksIGFsYmVkbywgbWV0YWxuZXNzKTtcXG5AZW5kXFxuQGV4cG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2VxdWF0aW9uXFxuZmxvYXQgRF9QaG9uZyhpbiBmbG9hdCBnLCBpbiBmbG9hdCBuZGgpIHtcXG4gICAgZmxvYXQgYSA9IHBvdyg4MTkyLjAsIGcpO1xcbiAgICByZXR1cm4gKGEgKyAyLjApIC8gOC4wICogcG93KG5kaCwgYSk7XFxufVxcbmZsb2F0IERfR0dYKGluIGZsb2F0IGcsIGluIGZsb2F0IG5kaCkge1xcbiAgICBmbG9hdCByID0gMS4wIC0gZztcXG4gICAgZmxvYXQgYSA9IHIgKiByO1xcbiAgICBmbG9hdCB0bXAgPSBuZGggKiBuZGggKiAoYSAtIDEuMCkgKyAxLjA7XFxuICAgIHJldHVybiBhIC8gKDMuMTQxNTkyNiAqIHRtcCAqIHRtcCk7XFxufVxcbnZlYzMgRl9TY2hsaWNrKGluIGZsb2F0IG5kdiwgdmVjMyBzcGVjKSB7XFxuICAgIHJldHVybiBzcGVjICsgKDEuMCAtIHNwZWMpICogcG93KDEuMCAtIG5kdiwgNS4wKTtcXG59XFxudmVjMyBsaWdodEVxdWF0aW9uKFxcbiAgICBpbiB2ZWMzIGxpZ2h0Q29sb3IsIGluIHZlYzMgZGlmZnVzZUNvbG9yLCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsXFxuICAgIGluIGZsb2F0IG5kbCwgaW4gZmxvYXQgbmRoLCBpbiBmbG9hdCBuZHYsIGluIGZsb2F0IGdcXG4pXFxue1xcbiAgICByZXR1cm4gbmRsICogbGlnaHRDb2xvclxcbiAgICAgICAgKiAoZGlmZnVzZUNvbG9yICsgRF9QaG9uZyhnLCBuZGgpICogRl9TY2hsaWNrKG5kdiwgc3BlY3VsYXJDb2xvcikpO1xcbn1cXG5AZW5kXCI7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vVGV4dHVyZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IEZyYW1lQnVmZmVyIGZyb20gJy4uL0ZyYW1lQnVmZmVyJztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBGb3J3YXJkUmVuZGVyZXIgZnJvbSAnLi4vUmVuZGVyZXInO1xuaW1wb3J0IFBhc3MgZnJvbSAnLi4vY29tcG9zaXRvci9QYXNzJztcbmltcG9ydCBNYXRyaXg0IGZyb20gJy4uL21hdGgvTWF0cml4NCc7XG5cbmltcG9ydCBnYnVmZmVyRXNzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2didWZmZXIuZ2xzbC5qcyc7XG5pbXBvcnQgY2h1bmtFc3NsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvY2h1bmsuZ2xzbC5qcyc7XG5cblNoYWRlci5pbXBvcnQoZ2J1ZmZlckVzc2wpO1xuU2hhZGVyLmltcG9ydChjaHVua0Vzc2wpO1xuXG5mdW5jdGlvbiBjcmVhdGVGaWxsQ2FudmFzKGNvbG9yKSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHguZmlsbFN0eWxlID0gY29sb3IgfHwgJyMwMDAnO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcblxuICAgIHJldHVybiBjYW52YXM7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFRleHR1cmVUb1Nsb3QocmVuZGVyZXIsIHByb2dyYW0sIHN5bWJvbCwgdGV4dHVyZSwgc2xvdCkge1xuICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFpJywgc3ltYm9sLCBzbG90KTtcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBzbG90KTtcbiAgICAvLyBNYXliZSB0ZXh0dXJlIGlzIG5vdCBsb2FkZWQgeWV0O1xuICAgIGlmICh0ZXh0dXJlLmlzUmVuZGVyYWJsZSgpKSB7XG4gICAgICAgIHRleHR1cmUuYmluZChyZW5kZXJlcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBCaW5kIHRleHR1cmUgdG8gbnVsbFxuICAgICAgICB0ZXh0dXJlLnVuYmluZChyZW5kZXJlcik7XG4gICAgfVxufVxuXG4vLyBUT0RPIFVzZSBnbG9iYWxTaGFkZXIgaW5zdGVhZG9mIGdsb2JhbE1hdGVyaWFsP1xuZnVuY3Rpb24gZ2V0QmVmb3JlUmVuZGVySG9vazEgKGdsLCBkZWZhdWx0Tm9ybWFsTWFwLCBkZWZhdWx0Um91Z2huZXNzTWFwKSB7XG5cbiAgICB2YXIgcHJldmlvdXNOb3JtYWxNYXA7XG4gICAgdmFyIHByZXZpb3VzUm91Z0dsb3NzTWFwO1xuICAgIHZhciBwcmV2aW91c1JlbmRlcmFibGU7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmFibGUsIGdCdWZmZXJNYXQsIHByZXZNYXRlcmlhbCkge1xuICAgICAgICAvLyBNYXRlcmlhbCBub3QgY2hhbmdlXG4gICAgICAgIGlmIChwcmV2aW91c1JlbmRlcmFibGUgJiYgcHJldmlvdXNSZW5kZXJhYmxlLm1hdGVyaWFsID09PSByZW5kZXJhYmxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhbmRhcmRNYXRlcmlhbCA9IHJlbmRlcmFibGUubWF0ZXJpYWw7XG4gICAgICAgIHZhciBwcm9ncmFtID0gcmVuZGVyYWJsZS5fX3Byb2dyYW07XG5cbiAgICAgICAgdmFyIGdsb3NzaW5lc3M7XG4gICAgICAgIHZhciByb3VnaEdsb3NzTWFwO1xuICAgICAgICB2YXIgdXNlUm91Z2huZXNzV29ya2Zsb3cgPSBzdGFuZGFyZE1hdGVyaWFsLmlzRGVmaW5lZCgnZnJhZ21lbnQnLCAnVVNFX1JPVUdITkVTUycpO1xuICAgICAgICB2YXIgZG91YmxlU2lkZWQgPSBzdGFuZGFyZE1hdGVyaWFsLmlzRGVmaW5lZCgnZnJhZ21lbnQnLCAnRE9VQkxFX1NJREVEJyk7XG4gICAgICAgIHZhciByb3VnaEdsb3NzQ2hhbm5lbDtcbiAgICAgICAgaWYgKHVzZVJvdWdobmVzc1dvcmtmbG93KSB7XG4gICAgICAgICAgICBnbG9zc2luZXNzID0gMS4wIC0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ3JvdWdobmVzcycpO1xuICAgICAgICAgICAgcm91Z2hHbG9zc01hcCA9IHN0YW5kYXJkTWF0ZXJpYWwuZ2V0KCdyb3VnaG5lc3NNYXAnKTtcbiAgICAgICAgICAgIHJvdWdoR2xvc3NDaGFubmVsID0gc3RhbmRhcmRNYXRlcmlhbC5nZXREZWZpbmUoJ2ZyYWdtZW50JywgJ1JPVUdITkVTU19DSEFOTkVMJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9zc2luZXNzID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ2dsb3NzaW5lc3MnKTtcbiAgICAgICAgICAgIHJvdWdoR2xvc3NNYXAgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgnZ2xvc3NpbmVzc01hcCcpO1xuICAgICAgICAgICAgcm91Z2hHbG9zc0NoYW5uZWwgPSBzdGFuZGFyZE1hdGVyaWFsLmdldERlZmluZSgnZnJhZ21lbnQnLCAnR0xPU1NJTkVTU19DSEFOTkVMJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVzZVJvdWdoR2xvc3NNYXAgPSAhIXJvdWdoR2xvc3NNYXA7XG5cbiAgICAgICAgdmFyIG5vcm1hbE1hcCA9IHN0YW5kYXJkTWF0ZXJpYWwuZ2V0KCdub3JtYWxNYXAnKSB8fCBkZWZhdWx0Tm9ybWFsTWFwO1xuICAgICAgICB2YXIgdXZSZXBlYXQgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgndXZSZXBlYXQnKTtcbiAgICAgICAgdmFyIHV2T2Zmc2V0ID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ3V2T2Zmc2V0Jyk7XG5cbiAgICAgICAgcm91Z2hHbG9zc01hcCA9IHJvdWdoR2xvc3NNYXAgfHwgZGVmYXVsdFJvdWdobmVzc01hcDtcblxuICAgICAgICBpZiAocHJldk1hdGVyaWFsICE9PSBnQnVmZmVyTWF0KSB7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgnZ2xvc3NpbmVzcycsIGdsb3NzaW5lc3MpO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ25vcm1hbE1hcCcsIG5vcm1hbE1hcCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgncm91Z2hHbG9zc01hcCcsIHJvdWdoR2xvc3NNYXApO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3VzZVJvdWdoR2xvc3NNYXAnLCArdXNlUm91Z2hHbG9zc01hcCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgndXNlUm91Z2huZXNzJywgK3VzZVJvdWdobmVzc1dvcmtmbG93KTtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdkb3VibGVTaWRlZCcsICtkb3VibGVTaWRlZCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgncm91Z2hHbG9zc0NoYW5uZWwnLCArcm91Z2hHbG9zc0NoYW5uZWwgfHwgMCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgndXZSZXBlYXQnLCB1dlJlcGVhdCk7XG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgndXZPZmZzZXQnLCB1dk9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oXG4gICAgICAgICAgICAgICAgZ2wsICcxZicsICdnbG9zc2luZXNzJywgZ2xvc3NpbmVzc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzTm9ybWFsTWFwICE9PSBub3JtYWxNYXApIHtcbiAgICAgICAgICAgICAgICBhdHRhY2hUZXh0dXJlVG9TbG90KHRoaXMsIHByb2dyYW0sICdub3JtYWxNYXAnLCBub3JtYWxNYXAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzUm91Z0dsb3NzTWFwICE9PSByb3VnaEdsb3NzTWFwKSB7XG4gICAgICAgICAgICAgICAgYXR0YWNoVGV4dHVyZVRvU2xvdCh0aGlzLCBwcm9ncmFtLCAncm91Z2hHbG9zc01hcCcsIHJvdWdoR2xvc3NNYXAsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMWknLCAndXNlUm91Z2hHbG9zc01hcCcsICt1c2VSb3VnaEdsb3NzTWFwKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFpJywgJ3VzZVJvdWdobmVzcycsICt1c2VSb3VnaG5lc3NXb3JrZmxvdyk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsICcxaScsICdkb3VibGVTaWRlZCcsICtkb3VibGVTaWRlZCk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsICcxaScsICdyb3VnaEdsb3NzQ2hhbm5lbCcsICtyb3VnaEdsb3NzQ2hhbm5lbCB8fCAwKTtcbiAgICAgICAgICAgIGlmICh1dlJlcGVhdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMmYnLCAndXZSZXBlYXQnLCB1dlJlcGVhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXZPZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzJmJywgJ3V2T2Zmc2V0JywgdXZPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOb3JtYWxNYXAgPSBub3JtYWxNYXA7XG4gICAgICAgIHByZXZpb3VzUm91Z0dsb3NzTWFwID0gcm91Z2hHbG9zc01hcDtcblxuICAgICAgICBwcmV2aW91c1JlbmRlcmFibGUgPSByZW5kZXJhYmxlO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldEJlZm9yZVJlbmRlckhvb2syKGdsLCBkZWZhdWx0RGlmZnVzZU1hcCwgZGVmYXVsdE1ldGFsbmVzc01hcCkge1xuICAgIHZhciBwcmV2aW91c0RpZmZ1c2VNYXA7XG4gICAgdmFyIHByZXZpb3VzUmVuZGVyYWJsZTtcbiAgICB2YXIgcHJldmlvdXNNZXRhbG5lc3NNYXA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmFibGUsIGdCdWZmZXJNYXQsIHByZXZNYXRlcmlhbCkge1xuICAgICAgICAvLyBNYXRlcmlhbCBub3QgY2hhbmdlXG4gICAgICAgIGlmIChwcmV2aW91c1JlbmRlcmFibGUgJiYgcHJldmlvdXNSZW5kZXJhYmxlLm1hdGVyaWFsID09PSByZW5kZXJhYmxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJvZ3JhbSA9IHJlbmRlcmFibGUuX19wcm9ncmFtO1xuICAgICAgICB2YXIgc3RhbmRhcmRNYXRlcmlhbCA9IHJlbmRlcmFibGUubWF0ZXJpYWw7XG5cbiAgICAgICAgdmFyIGNvbG9yID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ2NvbG9yJyk7XG4gICAgICAgIHZhciBtZXRhbG5lc3MgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgnbWV0YWxuZXNzJyk7XG5cbiAgICAgICAgdmFyIGRpZmZ1c2VNYXAgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgnZGlmZnVzZU1hcCcpO1xuICAgICAgICB2YXIgbWV0YWxuZXNzTWFwID0gc3RhbmRhcmRNYXRlcmlhbC5nZXQoJ21ldGFsbmVzc01hcCcpO1xuXG4gICAgICAgIHZhciB1dlJlcGVhdCA9IHN0YW5kYXJkTWF0ZXJpYWwuZ2V0KCd1dlJlcGVhdCcpO1xuICAgICAgICB2YXIgdXZPZmZzZXQgPSBzdGFuZGFyZE1hdGVyaWFsLmdldCgndXZPZmZzZXQnKTtcblxuICAgICAgICB2YXIgdXNlTWV0YWxuZXNzTWFwID0gISFtZXRhbG5lc3NNYXA7XG5cbiAgICAgICAgZGlmZnVzZU1hcCA9IGRpZmZ1c2VNYXAgfHwgZGVmYXVsdERpZmZ1c2VNYXA7XG4gICAgICAgIG1ldGFsbmVzc01hcCA9IG1ldGFsbmVzc01hcCB8fCBkZWZhdWx0TWV0YWxuZXNzTWFwO1xuXG4gICAgICAgIGlmIChwcmV2TWF0ZXJpYWwgIT09IGdCdWZmZXJNYXQpIHtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdjb2xvcicsIGNvbG9yKTtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdtZXRhbG5lc3MnLCBtZXRhbG5lc3MpO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlTWFwKTtcbiAgICAgICAgICAgIGdCdWZmZXJNYXQuc2V0KCdtZXRhbG5lc3NNYXAnLCBtZXRhbG5lc3NNYXApO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3VzZU1ldGFsbmVzc01hcCcsICt1c2VNZXRhbG5lc3NNYXApO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3V2UmVwZWF0JywgdXZSZXBlYXQpO1xuICAgICAgICAgICAgZ0J1ZmZlck1hdC5zZXQoJ3V2T2Zmc2V0JywgdXZPZmZzZXQpO1xuXG4gICAgICAgICAgICBnQnVmZmVyTWF0LnNldCgnbGluZWFyJywgK3N0YW5kYXJkTWF0ZXJpYWwubGluZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFmJywgJ21ldGFsbmVzcycsIG1ldGFsbmVzcyk7XG5cbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzNmJywgJ2NvbG9yJywgY29sb3IpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRGlmZnVzZU1hcCAhPT0gZGlmZnVzZU1hcCkge1xuICAgICAgICAgICAgICAgIGF0dGFjaFRleHR1cmVUb1Nsb3QodGhpcywgcHJvZ3JhbSwgJ2RpZmZ1c2VNYXAnLCBkaWZmdXNlTWFwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91c01ldGFsbmVzc01hcCAhPT0gbWV0YWxuZXNzTWFwKSB7XG4gICAgICAgICAgICAgICAgYXR0YWNoVGV4dHVyZVRvU2xvdCh0aGlzLCBwcm9ncmFtLCAnbWV0YWxuZXNzTWFwJywgbWV0YWxuZXNzTWFwLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybShnbCwgJzFpJywgJ3VzZU1ldGFsbmVzc01hcCcsICt1c2VNZXRhbG5lc3NNYXApO1xuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMmYnLCAndXZSZXBlYXQnLCB1dlJlcGVhdCk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsICcyZicsICd1dk9mZnNldCcsIHV2T2Zmc2V0KTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCAnMWknLCAnbGluZWFyJywgK3N0YW5kYXJkTWF0ZXJpYWwubGluZWFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzRGlmZnVzZU1hcCA9IGRpZmZ1c2VNYXA7XG4gICAgICAgIHByZXZpb3VzTWV0YWxuZXNzTWFwID0gbWV0YWxuZXNzTWFwO1xuXG4gICAgICAgIHByZXZpb3VzUmVuZGVyYWJsZSA9IHJlbmRlcmFibGU7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBHQnVmZmVyIGlzIHByb3ZpZGVkIGZvciBkZWZlcnJlZCByZW5kZXJpbmcgYW5kIFNTQU8sIFNTUiBwYXNzLlxuICogSXQgd2lsbCBkbyB0d28gcGFzc2VzIHJlbmRlcmluZyB0byB0aHJlZSB0YXJnZXQgdGV4dHVyZXMuIFNlZVxuICogKyB7QGxpbmsgY2xheS5kZWZlcnJlZC5HQnVmZmVyI2dldFRhcmdldFRleHR1cmUxfVxuICogKyB7QGxpbmsgY2xheS5kZWZlcnJlZC5HQnVmZmVyI2dldFRhcmdldFRleHR1cmUyfVxuICogKyB7QGxpbmsgY2xheS5kZWZlcnJlZC5HQnVmZmVyI2dldFRhcmdldFRleHR1cmUzfVxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5kZWZlcnJlZC5HQnVmZmVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgR0J1ZmZlciA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHJldHVybiB7XG5cbiAgICAgICAgZW5hYmxlVGFyZ2V0VGV4dHVyZTE6IHRydWUsXG5cbiAgICAgICAgZW5hYmxlVGFyZ2V0VGV4dHVyZTI6IHRydWUsXG5cbiAgICAgICAgZW5hYmxlVGFyZ2V0VGV4dHVyZTM6IHRydWUsXG5cbiAgICAgICAgcmVuZGVyVHJhbnNwYXJlbnQ6IGZhbHNlLFxuXG4gICAgICAgIF9yZW5kZXJMaXN0OiBbXSxcbiAgICAgICAgLy8gLSBSOiBub3JtYWwueFxuICAgICAgICAvLyAtIEc6IG5vcm1hbC55XG4gICAgICAgIC8vIC0gQjogbm9ybWFsLnpcbiAgICAgICAgLy8gLSBBOiBnbG9zc2luZXNzXG4gICAgICAgIF9nQnVmZmVyVGV4MTogbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBtaW5GaWx0ZXI6IFRleHR1cmUuTkVBUkVTVCxcbiAgICAgICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICAgICAgLy8gUEVORElOR1xuICAgICAgICAgICAgdHlwZTogVGV4dHVyZS5IQUxGX0ZMT0FUXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIC0gUjogZGVwdGhcbiAgICAgICAgX2dCdWZmZXJUZXgyOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIG1pbkZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1QsXG4gICAgICAgICAgICAvLyBmb3JtYXQ6IFRleHR1cmUuREVQVEhfQ09NUE9ORU5ULFxuICAgICAgICAgICAgLy8gdHlwZTogVGV4dHVyZS5VTlNJR05FRF9JTlRcblxuICAgICAgICAgICAgZm9ybWF0OiBUZXh0dXJlLkRFUFRIX1NURU5DSUwsXG4gICAgICAgICAgICB0eXBlOiBUZXh0dXJlLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIC0gUjogYWxiZWRvLnJcbiAgICAgICAgLy8gLSBHOiBhbGJlZG8uZ1xuICAgICAgICAvLyAtIEI6IGFsYmVkby5iXG4gICAgICAgIC8vIC0gQTogbWV0YWxuZXNzXG4gICAgICAgIF9nQnVmZmVyVGV4MzogbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBtaW5GaWx0ZXI6IFRleHR1cmUuTkVBUkVTVCxcbiAgICAgICAgICAgIG1hZ0ZpbHRlcjogVGV4dHVyZS5ORUFSRVNUXG4gICAgICAgIH0pLFxuXG4gICAgICAgIF9kZWZhdWx0Tm9ybWFsTWFwOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIGltYWdlOiBjcmVhdGVGaWxsQ2FudmFzKCcjMDAwJylcbiAgICAgICAgfSksXG4gICAgICAgIF9kZWZhdWx0Um91Z2huZXNzTWFwOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIGltYWdlOiBjcmVhdGVGaWxsQ2FudmFzKCcjZmZmJylcbiAgICAgICAgfSksXG4gICAgICAgIF9kZWZhdWx0TWV0YWxuZXNzTWFwOiBuZXcgVGV4dHVyZTJEKHtcbiAgICAgICAgICAgIGltYWdlOiBjcmVhdGVGaWxsQ2FudmFzKCcjZmZmJylcbiAgICAgICAgfSksXG4gICAgICAgIF9kZWZhdWx0RGlmZnVzZU1hcDogbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICBpbWFnZTogY3JlYXRlRmlsbENhbnZhcygnI2ZmZicpXG4gICAgICAgIH0pLFxuXG4gICAgICAgIF9mcmFtZUJ1ZmZlcjogbmV3IEZyYW1lQnVmZmVyKCksXG5cbiAgICAgICAgX2dCdWZmZXJNYXRlcmlhbDE6IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoXG4gICAgICAgICAgICAgICAgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5nYnVmZmVyLnZlcnRleCcpLFxuICAgICAgICAgICAgICAgIFNoYWRlci5zb3VyY2UoJ2NsYXkuZGVmZXJyZWQuZ2J1ZmZlcjEuZnJhZ21lbnQnKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHZlcnRleERlZmluZXM6IHtcbiAgICAgICAgICAgICAgICBGSVJTVF9QQVNTOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJhZ21lbnREZWZpbmVzOiB7XG4gICAgICAgICAgICAgICAgRklSU1RfUEFTUzogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgX2dCdWZmZXJNYXRlcmlhbDI6IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoXG4gICAgICAgICAgICAgICAgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5nYnVmZmVyLnZlcnRleCcpLFxuICAgICAgICAgICAgICAgIFNoYWRlci5zb3VyY2UoJ2NsYXkuZGVmZXJyZWQuZ2J1ZmZlcjIuZnJhZ21lbnQnKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KSxcblxuICAgICAgICBfZGVidWdQYXNzOiBuZXcgUGFzcyh7XG4gICAgICAgICAgICBmcmFnbWVudDogU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5nYnVmZmVyLmRlYnVnJylcbiAgICAgICAgfSlcbiAgICB9O1xufSwgLyoqIEBsZW5kcyBjbGF5LmRlZmVycmVkLkdCdWZmZXIjICove1xuXG4gICAgLyoqXG4gICAgICogU2V0IEcgQnVmZmVyIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICAgICAqL1xuICAgIHJlc2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2dCdWZmZXJUZXgxLndpZHRoID09PSB3aWR0aFxuICAgICAgICAgICAgJiYgdGhpcy5fZ0J1ZmZlclRleDEuaGVpZ2h0ID09PSBoZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ0J1ZmZlclRleDEud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5fZ0J1ZmZlclRleDEuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuX2dCdWZmZXJUZXgyLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuX2dCdWZmZXJUZXgyLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICB0aGlzLl9nQnVmZmVyVGV4My53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLl9nQnVmZmVyVGV4My5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfSxcblxuICAgIC8vIFRPRE8gaXMgZHByIG5lZWRlZD9cbiAgICBzZXRWaWV3cG9ydDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGRwcikge1xuICAgICAgICB2YXIgdmlld3BvcnQ7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0geDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0ge1xuICAgICAgICAgICAgICAgIHg6IHgsIHk6IHksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiBkcHIgfHwgMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIH0sXG5cbiAgICBnZXRWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZnJhbWVCdWZmZXIudmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZUJ1ZmZlci52aWV3cG9ydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogMCwgeTogMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fZ0J1ZmZlclRleDEud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9nQnVmZmVyVGV4MS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgRyBCdWZmZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqIEBwYXJhbSB7Y2xheS5jYW1lcmEuUGVyc3BlY3RpdmV9IGNhbWVyYVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XG5cbiAgICAgICAgdmFyIGdsID0gcmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgdmFyIGZyYW1lQnVmZmVyID0gdGhpcy5fZnJhbWVCdWZmZXI7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IGZyYW1lQnVmZmVyLnZpZXdwb3J0O1xuICAgICAgICB2YXIgb3BhcXVlTGlzdCA9IHNjZW5lLm9wYXF1ZUxpc3Q7XG4gICAgICAgIHZhciB0cmFuc3BhcmVudExpc3QgPSBzY2VuZS50cmFuc3BhcmVudExpc3Q7XG5cbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciByZW5kZXJMaXN0ID0gdGhpcy5fcmVuZGVyTGlzdDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcGFxdWVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIW9wYXF1ZUxpc3RbaV0uaWdub3JlR0J1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJlbmRlckxpc3Rbb2Zmc2V0KytdID0gb3BhcXVlTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZW5kZXJUcmFuc3BhcmVudCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc3BhcmVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcGFyZW50TGlzdFtpXS5pZ25vcmVHQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckxpc3Rbb2Zmc2V0KytdID0gdHJhbnNwYXJlbnRMaXN0W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXJMaXN0Lmxlbmd0aCA9IG9mZnNldDtcblxuICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xuICAgICAgICBnbC5kZXB0aE1hc2sodHJ1ZSk7XG4gICAgICAgIGdsLmNvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgZ2wuZGlzYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgdmFyIGVuYWJsZVRhcmdldFRleHR1cmUxID0gdGhpcy5lbmFibGVUYXJnZXRUZXh0dXJlMTtcbiAgICAgICAgdmFyIGVuYWJsZVRhcmdldFRleHR1cmUyID0gdGhpcy5lbmFibGVUYXJnZXRUZXh0dXJlMjtcbiAgICAgICAgdmFyIGVuYWJsZVRhcmdldFRleHR1cmUzID0gdGhpcy5lbmFibGVUYXJnZXRUZXh0dXJlMztcbiAgICAgICAgaWYgKCFlbmFibGVUYXJnZXRUZXh0dXJlMSAmJiAhZW5hYmxlVGFyZ2V0VGV4dHVyZTMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2FuXFwndCBkaXNhYmxlIHRhcmdldFRleHR1cmUxIHRhcmdldFRleHR1cmUzIGJvdGgnKTtcbiAgICAgICAgICAgIGVuYWJsZVRhcmdldFRleHR1cmUxID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmFibGVUYXJnZXRUZXh0dXJlMikge1xuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRoaXMuX2dCdWZmZXJUZXgyLCByZW5kZXJlci5nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUEVORElORywgc2NlbmUuYm91bmRpbmdCb3hMYXN0RnJhbWUgbmVlZHMgYmUgdXBkYXRlZCBpZiBoYXZlIHNoYWRvd1xuICAgICAgICByZW5kZXJlci5iaW5kU2NlbmVSZW5kZXJpbmcoc2NlbmUpO1xuICAgICAgICBpZiAoZW5hYmxlVGFyZ2V0VGV4dHVyZTEpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgMVxuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYXR0YWNoKHRoaXMuX2dCdWZmZXJUZXgxKTtcbiAgICAgICAgICAgIGZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuXG4gICAgICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZHByID0gdmlld3BvcnQuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICAvLyB1c2Ugc2Npc3NvciB0byBtYWtlIHN1cmUgb25seSBjbGVhciB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgICAgICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgICAgICAgICAgICAgICBnbC5zY2lzc29yKHZpZXdwb3J0LnggKiBkcHIsIHZpZXdwb3J0LnkgKiBkcHIsIHZpZXdwb3J0LndpZHRoICogZHByLCB2aWV3cG9ydC5oZWlnaHQgKiBkcHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICAgICAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGdCdWZmZXJNYXRlcmlhbDEgPSB0aGlzLl9nQnVmZmVyTWF0ZXJpYWwxO1xuICAgICAgICAgICAgdmFyIHBhc3NDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgZ2V0TWF0ZXJpYWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdCdWZmZXJNYXRlcmlhbDE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBiZWZvcmVSZW5kZXI6IGdldEJlZm9yZVJlbmRlckhvb2sxKGdsLCB0aGlzLl9kZWZhdWx0Tm9ybWFsTWFwLCB0aGlzLl9kZWZhdWx0Um91Z2huZXNzTWFwKSxcbiAgICAgICAgICAgICAgICBzb3J0Q29tcGFyZTogcmVuZGVyZXIub3BhcXVlU29ydENvbXBhcmVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBGSVhNRSBVc2UgTVJUIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJQYXNzKHJlbmRlckxpc3QsIGNhbWVyYSwgcGFzc0NvbmZpZyk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5hYmxlVGFyZ2V0VGV4dHVyZTMpIHtcblxuICAgICAgICAgICAgLy8gUGFzcyAyXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlci5hdHRhY2godGhpcy5fZ0J1ZmZlclRleDMpO1xuICAgICAgICAgICAgZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgIHZhciBkcHIgPSB2aWV3cG9ydC5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIC8vIHVzZSBzY2lzc29yIHRvIG1ha2Ugc3VyZSBvbmx5IGNsZWFyIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnNjaXNzb3Iodmlld3BvcnQueCAqIGRwciwgdmlld3BvcnQueSAqIGRwciwgdmlld3BvcnQud2lkdGggKiBkcHIsIHZpZXdwb3J0LmhlaWdodCAqIGRwcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBnQnVmZmVyTWF0ZXJpYWwyID0gdGhpcy5fZ0J1ZmZlck1hdGVyaWFsMjtcbiAgICAgICAgICAgIHZhciBwYXNzQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGdldE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnQnVmZmVyTWF0ZXJpYWwyO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYmVmb3JlUmVuZGVyOiBnZXRCZWZvcmVSZW5kZXJIb29rMihnbCwgdGhpcy5fZGVmYXVsdERpZmZ1c2VNYXAsIHRoaXMuX2RlZmF1bHRNZXRhbG5lc3NNYXApLFxuICAgICAgICAgICAgICAgIHNvcnRDb21wYXJlOiByZW5kZXJlci5vcGFxdWVTb3J0Q29tcGFyZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlclBhc3MocmVuZGVyTGlzdCwgY2FtZXJhLCBwYXNzQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbmRlcmVyLmJpbmRTY2VuZVJlbmRlcmluZyhudWxsKTtcbiAgICAgICAgZnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyRGVidWc6IGZ1bmN0aW9uIChyZW5kZXJlciwgY2FtZXJhLCB0eXBlLCB2aWV3cG9ydCkge1xuICAgICAgICB2YXIgZGVidWdUeXBlcyA9IHtcbiAgICAgICAgICAgIG5vcm1hbDogMCxcbiAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgcG9zaXRpb246IDIsXG4gICAgICAgICAgICBnbG9zc2luZXNzOiAzLFxuICAgICAgICAgICAgbWV0YWxuZXNzOiA0LFxuICAgICAgICAgICAgYWxiZWRvOiA1XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWJ1Z1R5cGVzW3R5cGVdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5rb3duIHR5cGUgXCInICsgdHlwZSArICdcIicpO1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB1c2Ugbm9ybWFsXG4gICAgICAgICAgICB0eXBlID0gJ25vcm1hbCc7XG4gICAgICAgIH1cblxuICAgICAgICByZW5kZXJlci5zYXZlQ2xlYXIoKTtcbiAgICAgICAgcmVuZGVyZXIuc2F2ZVZpZXdwb3J0KCk7XG4gICAgICAgIHJlbmRlcmVyLmNsZWFyQml0ID0gcmVuZGVyZXIuZ2wuREVQVEhfQlVGRkVSX0JJVDtcblxuICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KHZpZXdwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmlld1Byb2plY3Rpb25JbnYgPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICBNYXRyaXg0Lm11bHRpcGx5KHZpZXdQcm9qZWN0aW9uSW52LCBjYW1lcmEud29ybGRUcmFuc2Zvcm0sIGNhbWVyYS5pbnZQcm9qZWN0aW9uTWF0cml4KTtcblxuICAgICAgICB2YXIgZGVidWdQYXNzID0gdGhpcy5fZGVidWdQYXNzO1xuICAgICAgICBkZWJ1Z1Bhc3Muc2V0VW5pZm9ybSgndmlld3BvcnRTaXplJywgW3JlbmRlcmVyLmdldFdpZHRoKCksIHJlbmRlcmVyLmdldEhlaWdodCgpXSk7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTEnLCB0aGlzLl9nQnVmZmVyVGV4MSk7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTInLCB0aGlzLl9nQnVmZmVyVGV4Mik7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTMnLCB0aGlzLl9nQnVmZmVyVGV4Myk7XG4gICAgICAgIGRlYnVnUGFzcy5zZXRVbmlmb3JtKCdkZWJ1ZycsIGRlYnVnVHlwZXNbdHlwZV0pO1xuICAgICAgICBkZWJ1Z1Bhc3Muc2V0VW5pZm9ybSgndmlld1Byb2plY3Rpb25JbnYnLCB2aWV3UHJvamVjdGlvbkludi5hcnJheSk7XG4gICAgICAgIGRlYnVnUGFzcy5yZW5kZXIocmVuZGVyZXIpO1xuXG4gICAgICAgIHJlbmRlcmVyLnJlc3RvcmVWaWV3cG9ydCgpO1xuICAgICAgICByZW5kZXJlci5yZXN0b3JlQ2xlYXIoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGZpcnN0IHRhcmdldCB0ZXh0dXJlLlxuICAgICAqIENoYW5uZWwgc3RvcmFnZTpcbiAgICAgKiArIFI6IG5vcm1hbC54ICogMC41ICsgMC41XG4gICAgICogKyBHOiBub3JtYWwueSAqIDAuNSArIDAuNVxuICAgICAqICsgQjogbm9ybWFsLnogKiAwLjUgKyAwLjVcbiAgICAgKiArIEE6IGdsb3NzaW5lc3NcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlMTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ0J1ZmZlclRleDE7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBzZWNvbmQgdGFyZ2V0IHRleHR1cmUuXG4gICAgICogQ2hhbm5lbCBzdG9yYWdlOlxuICAgICAqICsgUjogZGVwdGhcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlMjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ0J1ZmZlclRleDI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGlyZCB0YXJnZXQgdGV4dHVyZS5cbiAgICAgKiBDaGFubmVsIHN0b3JhZ2U6XG4gICAgICogKyBSOiBhbGJlZG8uclxuICAgICAqICsgRzogYWxiZWRvLmdcbiAgICAgKiArIEI6IGFsYmVkby5iXG4gICAgICogKyBBOiBtZXRhbG5lc3NcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlMzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ0J1ZmZlclRleDM7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbiAocmVuZGVyZXIpIHtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgR0J1ZmZlcjsiLCJpbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG52YXIgdmVjMiA9IGdsTWF0cml4LnZlYzI7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuZ2VvbWV0cnkuQ29uZVxuICogQGV4dGVuZHMgY2xheS5HZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC50b3BSYWRpdXNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5ib3R0b21SYWRpdXNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5oZWlnaHRdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5jYXBTZWdtZW50c11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0LmhlaWdodFNlZ21lbnRzXVxuICovXG52YXIgQ29uZSA9IEdlb21ldHJ5LmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5Db25lIyAqL1xue1xuICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdG9wUmFkaXVzOiAwLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBib3R0b21SYWRpdXM6IDEsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGhlaWdodDogMixcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgY2FwU2VnbWVudHM6IDIwLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBoZWlnaHRTZWdtZW50czogMVxufSwgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5idWlsZCgpO1xufSxcbi8qKiBAbGVuZHMgY2xheS5nZW9tZXRyeS5Db25lLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmUgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtdO1xuICAgICAgICB2YXIgZmFjZXMgPSBbXTtcbiAgICAgICAgcG9zaXRpb25zLmxlbmd0aCA9IDA7XG4gICAgICAgIHRleGNvb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgICBmYWNlcy5sZW5ndGggPSAwO1xuICAgICAgICAvLyBUb3AgY2FwXG4gICAgICAgIHZhciBjYXBTZWdSYWRpYWwgPSBNYXRoLlBJICogMiAvIHRoaXMuY2FwU2VnbWVudHM7XG5cbiAgICAgICAgdmFyIHRvcENhcCA9IFtdO1xuICAgICAgICB2YXIgYm90dG9tQ2FwID0gW107XG5cbiAgICAgICAgdmFyIHIxID0gdGhpcy50b3BSYWRpdXM7XG4gICAgICAgIHZhciByMiA9IHRoaXMuYm90dG9tUmFkaXVzO1xuICAgICAgICB2YXIgeSA9IHRoaXMuaGVpZ2h0IC8gMjtcblxuICAgICAgICB2YXIgYzEgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgeSwgMCk7XG4gICAgICAgIHZhciBjMiA9IHZlYzMuZnJvbVZhbHVlcygwLCAteSwgMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYXBTZWdtZW50czsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhldGEgPSBpICogY2FwU2VnUmFkaWFsO1xuICAgICAgICAgICAgdmFyIHggPSByMSAqIE1hdGguc2luKHRoZXRhKTtcbiAgICAgICAgICAgIHZhciB6ID0gcjEgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICAgICAgICB0b3BDYXAucHVzaCh2ZWMzLmZyb21WYWx1ZXMoeCwgeSwgeikpO1xuXG4gICAgICAgICAgICB4ID0gcjIgKiBNYXRoLnNpbih0aGV0YSk7XG4gICAgICAgICAgICB6ID0gcjIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICAgICAgICBib3R0b21DYXAucHVzaCh2ZWMzLmZyb21WYWx1ZXMoeCwgLXksIHopKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRvcCBjYXBcbiAgICAgICAgcG9zaXRpb25zLnB1c2goYzEpO1xuICAgICAgICAvLyBGSVhNRVxuICAgICAgICB0ZXhjb29yZHMucHVzaCh2ZWMyLmZyb21WYWx1ZXMoMCwgMSkpO1xuICAgICAgICB2YXIgbiA9IHRoaXMuY2FwU2VnbWVudHM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCh0b3BDYXBbaV0pO1xuICAgICAgICAgICAgLy8gRklYTUVcbiAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcyhpIC8gbiwgMCkpO1xuICAgICAgICAgICAgZmFjZXMucHVzaChbMCwgaSsxLCAoaSsxKSAlIG4gKyAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCBib3R0b20gY2FwXG4gICAgICAgIHZhciBvZmZzZXQgPSBwb3NpdGlvbnMubGVuZ3RoO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChjMik7XG4gICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcygwLCAxKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChib3R0b21DYXBbaV0pO1xuICAgICAgICAgICAgLy8gRklYTUVcbiAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcyhpIC8gbiwgMCkpO1xuICAgICAgICAgICAgZmFjZXMucHVzaChbb2Zmc2V0LCBvZmZzZXQrKChpKzEpICUgbiArIDEpLCBvZmZzZXQraSsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCBzaWRlXG4gICAgICAgIG9mZnNldCA9IHBvc2l0aW9ucy5sZW5ndGg7XG4gICAgICAgIHZhciBuMiA9IHRoaXMuaGVpZ2h0U2VnbWVudHM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4yKzE7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gaiAvIG4yO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHZlYzMubGVycCh2ZWMzLmNyZWF0ZSgpLCB0b3BDYXBbaV0sIGJvdHRvbUNhcFtpXSwgdikpO1xuICAgICAgICAgICAgICAgIHRleGNvb3Jkcy5wdXNoKHZlYzIuZnJvbVZhbHVlcyhpIC8gbiwgdikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4yOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaTEgPSBpICogKG4yICsgMSkgKyBqO1xuICAgICAgICAgICAgICAgIHZhciBpMiA9ICgoaSArIDEpICUgbikgKiAobjIgKyAxKSArIGo7XG4gICAgICAgICAgICAgICAgdmFyIGkzID0gKChpICsgMSkgJSBuKSAqIChuMiArIDEpICsgaiArIDE7XG4gICAgICAgICAgICAgICAgdmFyIGk0ID0gaSAqIChuMiArIDEpICsgaiArIDE7XG4gICAgICAgICAgICAgICAgZmFjZXMucHVzaChbb2Zmc2V0K2kyLCBvZmZzZXQraTEsIG9mZnNldCtpNF0pO1xuICAgICAgICAgICAgICAgIGZhY2VzLnB1c2goW29mZnNldCtpNCwgb2Zmc2V0K2kzLCBvZmZzZXQraTJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi5mcm9tQXJyYXkocG9zaXRpb25zKTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnRleGNvb3JkMC5mcm9tQXJyYXkodGV4Y29vcmRzKTtcblxuICAgICAgICB0aGlzLmluaXRJbmRpY2VzRnJvbUFycmF5KGZhY2VzKTtcblxuICAgICAgICB0aGlzLmdlbmVyYXRlVmVydGV4Tm9ybWFscygpO1xuXG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcbiAgICAgICAgdmFyIHIgPSBNYXRoLm1heCh0aGlzLnRvcFJhZGl1cywgdGhpcy5ib3R0b21SYWRpdXMpO1xuICAgICAgICB0aGlzLmJvdW5kaW5nQm94Lm1pbi5zZXQoLXIsIC10aGlzLmhlaWdodC8yLCAtcik7XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWF4LnNldChyLCB0aGlzLmhlaWdodC8yLCByKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ29uZTtcbiIsImltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgQ29uZUdlb21ldHJ5IGZyb20gJy4vQ29uZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkuZ2VvbWV0cnkuQ3lsaW5kZXJcbiAqIEBleHRlbmRzIGNsYXkuR2VvbWV0cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQucmFkaXVzXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQuaGVpZ2h0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHQuY2FwU2VnbWVudHNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdC5oZWlnaHRTZWdtZW50c11cbiAqL1xudmFyIEN5bGluZGVyID0gR2VvbWV0cnkuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5Lmdlb21ldHJ5LkN5bGluZGVyIyAqL1xue1xuICAgIGR5bmFtaWM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFkaXVzOiAxLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBoZWlnaHQ6IDIsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGNhcFNlZ21lbnRzOiA1MCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgaGVpZ2h0U2VnbWVudHM6IDFcbn0sIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuYnVpbGQoKTtcbn0sXG4vKiogQGxlbmRzIGNsYXkuZ2VvbWV0cnkuQ3lsaW5kZXIucHJvdG90eXBlICovXG57XG4gICAgLyoqXG4gICAgICogQnVpbGQgY3lsaW5kZXIgZ2VvbWV0cnlcbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjb25lID0gbmV3IENvbmVHZW9tZXRyeSh7XG4gICAgICAgICAgICB0b3BSYWRpdXM6IHRoaXMucmFkaXVzLFxuICAgICAgICAgICAgYm90dG9tUmFkaXVzOiB0aGlzLnJhZGl1cyxcbiAgICAgICAgICAgIGNhcFNlZ21lbnRzOiB0aGlzLmNhcFNlZ21lbnRzLFxuICAgICAgICAgICAgaGVpZ2h0U2VnbWVudHM6IHRoaXMuaGVpZ2h0U2VnbWVudHMsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZSA9IGNvbmUuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC52YWx1ZSA9IGNvbmUuYXR0cmlidXRlcy5ub3JtYWwudmFsdWU7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy50ZXhjb29yZDAudmFsdWUgPSBjb25lLmF0dHJpYnV0ZXMudGV4Y29vcmQwLnZhbHVlO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBjb25lLmluZGljZXM7XG5cbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IGNvbmUuYm91bmRpbmdCb3g7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEN5bGluZGVyO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQubGlnaHRfdm9sdW1lLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbnZhcnlpbmcgdmVjMyB2X1Bvc2l0aW9uO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbiAgICB2X1Bvc2l0aW9uID0gcG9zaXRpb247XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLnNwb3RfbGlnaHRcXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfaGVhZFxcbkBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5saWdodF9lcXVhdGlvblxcbkBpbXBvcnQgY2xheS51dGlsLmNhbGN1bGF0ZV9hdHRlbnVhdGlvblxcbnVuaWZvcm0gdmVjMyBsaWdodFBvc2l0aW9uO1xcbnVuaWZvcm0gdmVjMyBsaWdodERpcmVjdGlvbjtcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIGZsb2F0IHVtYnJhQW5nbGVDb3NpbmU7XFxudW5pZm9ybSBmbG9hdCBwZW51bWJyYUFuZ2xlQ29zaW5lO1xcbnVuaWZvcm0gZmxvYXQgbGlnaHRSYW5nZTtcXG51bmlmb3JtIGZsb2F0IGZhbGxvZmZGYWN0b3I7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0U2hhZG93TWFwO1xcbnVuaWZvcm0gbWF0NCBsaWdodE1hdHJpeDtcXG51bmlmb3JtIGZsb2F0IGxpZ2h0U2hhZG93TWFwU2l6ZTtcXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkucGx1Z2luLnNoYWRvd19tYXBfY29tbW9uXFxudm9pZCBtYWluKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMyBMID0gbGlnaHRQb3NpdGlvbiAtIHBvc2l0aW9uO1xcbiAgICB2ZWMzIFYgPSBub3JtYWxpemUoZXllUG9zaXRpb24gLSBwb3NpdGlvbik7XFxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoTCk7XFxuICAgIEwgLz0gZGlzdDtcXG4gICAgZmxvYXQgYXR0ZW51YXRpb24gPSBsaWdodEF0dGVudWF0aW9uKGRpc3QsIGxpZ2h0UmFuZ2UpO1xcbiAgICBmbG9hdCBjID0gZG90KC1ub3JtYWxpemUobGlnaHREaXJlY3Rpb24pLCBMKTtcXG4gICAgZmxvYXQgZmFsbG9mZiA9IGNsYW1wKChjIC0gdW1icmFBbmdsZUNvc2luZSkgLyAocGVudW1icmFBbmdsZUNvc2luZSAtIHVtYnJhQW5nbGVDb3NpbmUpLCAwLjAsIDEuMCk7XFxuICAgIGZhbGxvZmYgPSBwb3coZmFsbG9mZiwgZmFsbG9mZkZhY3Rvcik7XFxuICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgIGZsb2F0IG5kbCA9IGNsYW1wKGRvdChOLCBMKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZGggPSBjbGFtcChkb3QoTiwgSCksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSAoMS4wIC0gZmFsbG9mZikgKiBhdHRlbnVhdGlvbiAqIGxpZ2h0RXF1YXRpb24oXFxuICAgICAgICBsaWdodENvbG9yLCBkaWZmdXNlQ29sb3IsIHNwZWN1bGFyQ29sb3IsIG5kbCwgbmRoLCBuZHYsIGdsb3NzaW5lc3NcXG4gICAgKTtcXG4jaWZkZWYgU0hBRE9XTUFQX0VOQUJMRURcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IGNvbXB1dGVTaGFkb3dDb250cmliKFxcbiAgICAgICAgbGlnaHRTaGFkb3dNYXAsIGxpZ2h0TWF0cml4LCBwb3NpdGlvbiwgbGlnaHRTaGFkb3dNYXBTaXplXFxuICAgICk7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgKj0gc2hhZG93Q29udHJpYjtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7XFxufVxcbkBlbmRcXG5cIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLmRpcmVjdGlvbmFsX2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfZXF1YXRpb25cXG51bmlmb3JtIHZlYzMgbGlnaHREaXJlY3Rpb247XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29sb3I7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0U2hhZG93TWFwO1xcbnVuaWZvcm0gZmxvYXQgbGlnaHRTaGFkb3dNYXBTaXplO1xcbnVuaWZvcm0gbWF0NCBsaWdodE1hdHJpY2VzW1NIQURPV19DQVNDQURFXTtcXG51bmlmb3JtIGZsb2F0IHNoYWRvd0Nhc2NhZGVDbGlwc05lYXJbU0hBRE9XX0NBU0NBREVdO1xcbnVuaWZvcm0gZmxvYXQgc2hhZG93Q2FzY2FkZUNsaXBzRmFyW1NIQURPV19DQVNDQURFXTtcXG4jZW5kaWZcXG5AaW1wb3J0IGNsYXkucGx1Z2luLnNoYWRvd19tYXBfY29tbW9uXFxudm9pZCBtYWluKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMyBMID0gLW5vcm1hbGl6ZShsaWdodERpcmVjdGlvbik7XFxuICAgIHZlYzMgViA9IG5vcm1hbGl6ZShleWVQb3NpdGlvbiAtIHBvc2l0aW9uKTtcXG4gICAgdmVjMyBIID0gbm9ybWFsaXplKEwgKyBWKTtcXG4gICAgZmxvYXQgbmRsID0gY2xhbXAoZG90KE4sIEwpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZHYgPSBjbGFtcChkb3QoTiwgViksIDAuMCwgMS4wKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGxpZ2h0RXF1YXRpb24oXFxuICAgICAgICBsaWdodENvbG9yLCBkaWZmdXNlQ29sb3IsIHNwZWN1bGFyQ29sb3IsIG5kbCwgbmRoLCBuZHYsIGdsb3NzaW5lc3NcXG4gICAgKTtcXG4jaWZkZWYgU0hBRE9XTUFQX0VOQUJMRURcXG4gICAgZmxvYXQgc2hhZG93Q29udHJpYiA9IDEuMDtcXG4gICAgZm9yIChpbnQgX2lkeF8gPSAwOyBfaWR4XyA8IFNIQURPV19DQVNDQURFOyBfaWR4XysrKSB7e1xcbiAgICAgICAgaWYgKFxcbiAgICAgICAgICAgIHogPj0gc2hhZG93Q2FzY2FkZUNsaXBzTmVhcltfaWR4X10gJiZcXG4gICAgICAgICAgICB6IDw9IHNoYWRvd0Nhc2NhZGVDbGlwc0ZhcltfaWR4X11cXG4gICAgICAgICkge1xcbiAgICAgICAgICAgIHNoYWRvd0NvbnRyaWIgPSBjb21wdXRlU2hhZG93Q29udHJpYihcXG4gICAgICAgICAgICAgICAgbGlnaHRTaGFkb3dNYXAsIGxpZ2h0TWF0cmljZXNbX2lkeF9dLCBwb3NpdGlvbiwgbGlnaHRTaGFkb3dNYXBTaXplLFxcbiAgICAgICAgICAgICAgICB2ZWMyKDEuMCAvIGZsb2F0KFNIQURPV19DQVNDQURFKSwgMS4wKSxcXG4gICAgICAgICAgICAgICAgdmVjMihmbG9hdChfaWR4XykgLyBmbG9hdChTSEFET1dfQ0FTQ0FERSksIDAuMClcXG4gICAgICAgICAgICApO1xcbiAgICAgICAgfVxcbiAgICB9fVxcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IHNoYWRvd0NvbnRyaWI7XFxuI2VuZGlmXFxuICAgIGdsX0ZyYWdDb2xvci5hID0gMS4wO1xcbn1cXG5AZW5kXFxuXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5kZWZlcnJlZC5hbWJpZW50X2xpZ2h0XFxudW5pZm9ybSBzYW1wbGVyMkQgZ0J1ZmZlclRleHR1cmUxO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGdCdWZmZXJUZXh0dXJlMztcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIHZlYzIgd2luZG93U2l6ZTogV0lORE9XX1NJWkU7XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzIgdXYgPSBnbF9GcmFnQ29vcmQueHkgLyB3aW5kb3dTaXplO1xcbiAgICB2ZWM0IHRleGVsMSA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTEsIHV2KTtcXG4gICAgaWYgKGRvdCh0ZXhlbDEucmdiLCB2ZWMzKDEuMCkpID09IDAuMCkge1xcbiAgICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgICB2ZWMzIGFsYmVkbyA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTMsIHV2KS5yZ2I7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBsaWdodENvbG9yICogYWxiZWRvO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQuYW1iaWVudF9zaF9saWdodFxcbnVuaWZvcm0gc2FtcGxlcjJEIGdCdWZmZXJUZXh0dXJlMTtcXG51bmlmb3JtIHNhbXBsZXIyRCBnQnVmZmVyVGV4dHVyZTM7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29sb3I7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29lZmZpY2llbnRzWzldO1xcbnVuaWZvcm0gdmVjMiB3aW5kb3dTaXplOiBXSU5ET1dfU0laRTtcXG52ZWMzIGNhbGNBbWJpZW50U0hMaWdodCh2ZWMzIE4pIHtcXG4gICAgcmV0dXJuIGxpZ2h0Q29lZmZpY2llbnRzWzBdXFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzFdICogTi54XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzJdICogTi55XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzNdICogTi56XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzRdICogTi54ICogTi56XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzVdICogTi56ICogTi55XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzZdICogTi55ICogTi54XFxuICAgICAgICArIGxpZ2h0Q29lZmZpY2llbnRzWzddICogKDMuMCAqIE4ueiAqIE4ueiAtIDEuMClcXG4gICAgICAgICsgbGlnaHRDb2VmZmljaWVudHNbOF0gKiAoTi54ICogTi54IC0gTi55ICogTi55KTtcXG59XFxudm9pZCBtYWluKClcXG57XFxuICAgIHZlYzIgdXYgPSBnbF9GcmFnQ29vcmQueHkgLyB3aW5kb3dTaXplO1xcbiAgICB2ZWM0IHRleGVsMSA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTEsIHV2KTtcXG4gICAgaWYgKGRvdCh0ZXhlbDEucmdiLCB2ZWMzKDEuMCkpID09IDAuMCkge1xcbiAgICAgICAgZGlzY2FyZDtcXG4gICAgfVxcbiAgICB2ZWMzIE4gPSB0ZXhlbDEucmdiICogMi4wIC0gMS4wO1xcbiAgICB2ZWMzIGFsYmVkbyA9IHRleHR1cmUyRChnQnVmZmVyVGV4dHVyZTMsIHV2KS5yZ2I7XFxuICAgIGdsX0ZyYWdDb2xvci5yZ2IgPSBsaWdodENvbG9yICogYWxiZWRvICogY2FsY0FtYmllbnRTSExpZ2h0KE4pO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG59XFxuQGVuZFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkuZGVmZXJyZWQuYW1iaWVudF9jdWJlbWFwX2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIHNhbXBsZXJDdWJlIGxpZ2h0Q3ViZW1hcDtcXG51bmlmb3JtIHNhbXBsZXIyRCBicmRmTG9va3VwO1xcbnVuaWZvcm0gdmVjMyBleWVQb3NpdGlvbjtcXG5AaW1wb3J0IGNsYXkudXRpbC5yZ2JtXFxudm9pZCBtYWluKClcXG57XFxuICAgIEBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5nYnVmZmVyX3JlYWRcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvc2l0aW9uIC0gcG9zaXRpb24pO1xcbiAgICB2ZWMzIEwgPSByZWZsZWN0KC1WLCBOKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IHJvdWdoID0gY2xhbXAoMS4wIC0gZ2xvc3NpbmVzcywgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBiaWFzID0gcm91Z2ggKiA1LjA7XFxuICAgIHZlYzIgYnJkZlBhcmFtID0gdGV4dHVyZTJEKGJyZGZMb29rdXAsIHZlYzIocm91Z2gsIG5kdikpLnh5O1xcbiAgICB2ZWMzIGVudldlaWdodCA9IHNwZWN1bGFyQ29sb3IgKiBicmRmUGFyYW0ueCArIGJyZGZQYXJhbS55O1xcbiAgICB2ZWMzIGVudlRleGVsID0gUkdCTURlY29kZSh0ZXh0dXJlQ3ViZUxvZEVYVChsaWdodEN1YmVtYXAsIEwsIGJpYXMpLCA1MS41KTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGxpZ2h0Q29sb3IgKiBlbnZUZXhlbCAqIGVudldlaWdodDtcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLnBvaW50X2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG5AaW1wb3J0IGNsYXkudXRpbC5jYWxjdWxhdGVfYXR0ZW51YXRpb25cXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfZXF1YXRpb25cXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIGZsb2F0IGxpZ2h0UmFuZ2U7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbnVuaWZvcm0gc2FtcGxlckN1YmUgbGlnaHRTaGFkb3dNYXA7XFxudW5pZm9ybSBmbG9hdCBsaWdodFNoYWRvd01hcFNpemU7XFxuI2VuZGlmXFxudmFyeWluZyB2ZWMzIHZfUG9zaXRpb247XFxuQGltcG9ydCBjbGF5LnBsdWdpbi5zaGFkb3dfbWFwX2NvbW1vblxcbnZvaWQgbWFpbigpXFxue1xcbiAgICBAaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsuZ2J1ZmZlcl9yZWFkXFxuICAgIHZlYzMgTCA9IGxpZ2h0UG9zaXRpb24gLSBwb3NpdGlvbjtcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvc2l0aW9uIC0gcG9zaXRpb24pO1xcbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKEwpO1xcbiAgICBMIC89IGRpc3Q7XFxuICAgIHZlYzMgSCA9IG5vcm1hbGl6ZShMICsgVik7XFxuICAgIGZsb2F0IG5kbCA9IGNsYW1wKGRvdChOLCBMKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZGggPSBjbGFtcChkb3QoTiwgSCksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgbmR2ID0gY2xhbXAoZG90KE4sIFYpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IGF0dGVudWF0aW9uID0gbGlnaHRBdHRlbnVhdGlvbihkaXN0LCBsaWdodFJhbmdlKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGF0dGVudWF0aW9uICogbGlnaHRFcXVhdGlvbihcXG4gICAgICAgIGxpZ2h0Q29sb3IsIGRpZmZ1c2VDb2xvciwgc3BlY3VsYXJDb2xvciwgbmRsLCBuZGgsIG5kdiwgZ2xvc3NpbmVzc1xcbiAgICApO1xcbiNpZmRlZiBTSEFET1dNQVBfRU5BQkxFRFxcbiAgICBmbG9hdCBzaGFkb3dDb250cmliID0gY29tcHV0ZVNoYWRvd0NvbnRyaWJPbW5pKFxcbiAgICAgICAgbGlnaHRTaGFkb3dNYXAsIC1MICogZGlzdCwgbGlnaHRSYW5nZVxcbiAgICApO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiICo9IGNsYW1wKHNoYWRvd0NvbnRyaWIsIDAuMCwgMS4wKTtcXG4jZW5kaWZcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7XFxufVxcbkBlbmRcIjtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LmRlZmVycmVkLnNwaGVyZV9saWdodFxcbkBpbXBvcnQgY2xheS5kZWZlcnJlZC5jaHVuay5saWdodF9oZWFkXFxuQGltcG9ydCBjbGF5LnV0aWwuY2FsY3VsYXRlX2F0dGVudWF0aW9uXFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2VxdWF0aW9uXFxudW5pZm9ybSB2ZWMzIGxpZ2h0UG9zaXRpb247XFxudW5pZm9ybSB2ZWMzIGxpZ2h0Q29sb3I7XFxudW5pZm9ybSBmbG9hdCBsaWdodFJhbmdlO1xcbnVuaWZvcm0gZmxvYXQgbGlnaHRSYWRpdXM7XFxudW5pZm9ybSB2ZWMzIGV5ZVBvc2l0aW9uO1xcbnZhcnlpbmcgdmVjMyB2X1Bvc2l0aW9uO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICBAaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsuZ2J1ZmZlcl9yZWFkXFxuICAgIHZlYzMgTCA9IGxpZ2h0UG9zaXRpb24gLSBwb3NpdGlvbjtcXG4gICAgdmVjMyBWID0gbm9ybWFsaXplKGV5ZVBvc2l0aW9uIC0gcG9zaXRpb24pO1xcbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKEwpO1xcbiAgICB2ZWMzIFIgPSByZWZsZWN0KFYsIE4pO1xcbiAgICBmbG9hdCB0bXAgPSBkb3QoTCwgUik7XFxuICAgIHZlYzMgY1RvUiA9IHRtcCAqIFIgLSBMO1xcbiAgICBmbG9hdCBkID0gbGVuZ3RoKGNUb1IpO1xcbiAgICBMID0gTCArIGNUb1IgKiBjbGFtcChsaWdodFJhZGl1cyAvIGQsIDAuMCwgMS4wKTtcXG4gICAgTCA9IG5vcm1hbGl6ZShMKTtcXG4gICAgdmVjMyBIID0gbm9ybWFsaXplKEwgKyBWKTtcXG4gICAgZmxvYXQgbmRsID0gY2xhbXAoZG90KE4sIEwpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IG5kaCA9IGNsYW1wKGRvdChOLCBIKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBuZHYgPSBjbGFtcChkb3QoTiwgViksIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgYXR0ZW51YXRpb24gPSBsaWdodEF0dGVudWF0aW9uKGRpc3QsIGxpZ2h0UmFuZ2UpO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiID0gbGlnaHRDb2xvciAqIG5kbCAqIGF0dGVudWF0aW9uO1xcbiAgICBnbG9zc2luZXNzID0gY2xhbXAoZ2xvc3NpbmVzcyAtIGxpZ2h0UmFkaXVzIC8gMi4wIC8gZGlzdCwgMC4wLCAxLjApO1xcbiAgICBnbF9GcmFnQ29sb3IucmdiID0gYXR0ZW51YXRpb24gKiBsaWdodEVxdWF0aW9uKFxcbiAgICAgICAgbGlnaHRDb2xvciwgZGlmZnVzZUNvbG9yLCBzcGVjdWxhckNvbG9yLCBuZGwsIG5kaCwgbmR2LCBnbG9zc2luZXNzXFxuICAgICk7XFxuICAgIGdsX0ZyYWdDb2xvci5hID0gMS4wO1xcbn1cXG5AZW5kXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5kZWZlcnJlZC50dWJlX2xpZ2h0XFxuQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmxpZ2h0X2hlYWRcXG5AaW1wb3J0IGNsYXkudXRpbC5jYWxjdWxhdGVfYXR0ZW51YXRpb25cXG5AaW1wb3J0IGNsYXkuZGVmZXJyZWQuY2h1bmsubGlnaHRfZXF1YXRpb25cXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXG51bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcXG51bmlmb3JtIGZsb2F0IGxpZ2h0UmFuZ2U7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0RXh0ZW5kO1xcbnVuaWZvcm0gdmVjMyBleWVQb3NpdGlvbjtcXG52YXJ5aW5nIHZlYzMgdl9Qb3NpdGlvbjtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgQGltcG9ydCBjbGF5LmRlZmVycmVkLmNodW5rLmdidWZmZXJfcmVhZFxcbiAgICB2ZWMzIEwgPSBsaWdodFBvc2l0aW9uIC0gcG9zaXRpb247XFxuICAgIHZlYzMgViA9IG5vcm1hbGl6ZShleWVQb3NpdGlvbiAtIHBvc2l0aW9uKTtcXG4gICAgdmVjMyBSID0gcmVmbGVjdChWLCBOKTtcXG4gICAgdmVjMyBMMCA9IGxpZ2h0UG9zaXRpb24gLSBsaWdodEV4dGVuZCAtIHBvc2l0aW9uO1xcbiAgICB2ZWMzIEwxID0gbGlnaHRQb3NpdGlvbiArIGxpZ2h0RXh0ZW5kIC0gcG9zaXRpb247XFxuICAgIHZlYzMgTEQgPSBMMSAtIEwwO1xcbiAgICBmbG9hdCBsZW4wID0gbGVuZ3RoKEwwKTtcXG4gICAgZmxvYXQgbGVuMSA9IGxlbmd0aChMMSk7XFxuICAgIGZsb2F0IGlycmEgPSAyLjAgKiBjbGFtcChkb3QoTiwgTDApIC8gKDIuMCAqIGxlbjApICsgZG90KE4sIEwxKSAvICgyLjAgKiBsZW4xKSwgMC4wLCAxLjApO1xcbiAgICBmbG9hdCBMRERvdFIgPSBkb3QoUiwgTEQpO1xcbiAgICBmbG9hdCB0ID0gKExERG90UiAqIGRvdChSLCBMMCkgLSBkb3QoTDAsIExEKSkgLyAoZG90KExELCBMRCkgLSBMRERvdFIgKiBMRERvdFIpO1xcbiAgICB0ID0gY2xhbXAodCwgMC4wLCAxLjApO1xcbiAgICBMID0gTDAgKyB0ICogTEQ7XFxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgoTCk7XFxuICAgIEwgLz0gZGlzdDtcXG4gICAgdmVjMyBIID0gbm9ybWFsaXplKEwgKyBWKTtcXG4gICAgZmxvYXQgbmRoID0gY2xhbXAoZG90KE4sIEgpLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IG5kdiA9IGNsYW1wKGRvdChOLCBWKSwgMC4wLCAxLjApO1xcbiAgICBnbG9zc2luZXNzID0gY2xhbXAoZ2xvc3NpbmVzcyAtIDAuMCAvIDIuMCAvIGRpc3QsIDAuMCwgMS4wKTtcXG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGxpZ2h0Q29sb3IgKiBpcnJhICogbGlnaHRBdHRlbnVhdGlvbihkaXN0LCBsaWdodFJhbmdlKVxcbiAgICAgICAgKiAoZGlmZnVzZUNvbG9yICsgRF9QaG9uZyhnbG9zc2luZXNzLCBuZGgpICogRl9TY2hsaWNrKG5kdiwgc3BlY3VsYXJDb2xvcikpO1xcbiAgICBnbF9GcmFnQ29sb3IuYSA9IDEuMDtcXG59XFxuQGVuZFwiO1xuIiwiLy8gTGlnaHQtcHJlIHBhc3MgZGVmZXJyZWQgcmVuZGVyaW5nXG4vLyBodHRwOi8vd3d3LnJlYWx0aW1lcmVuZGVyaW5nLmNvbS9ibG9nL2RlZmVycmVkLWxpZ2h0aW5nLWFwcHJvYWNoZXMvXG5pbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL01hdGVyaWFsJztcbmltcG9ydCBGcmFtZUJ1ZmZlciBmcm9tICcuLi9GcmFtZUJ1ZmZlcic7XG5pbXBvcnQgRnVsbFF1YWRQYXNzIGZyb20gJy4uL2NvbXBvc2l0b3IvUGFzcyc7XG5pbXBvcnQgVGV4dHVyZTJEIGZyb20gJy4uL1RleHR1cmUyRCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9UZXh0dXJlJztcbmltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IFNwaGVyZUdlbyBmcm9tICcuLi9nZW9tZXRyeS9TcGhlcmUnO1xuaW1wb3J0IENvbmVHZW8gZnJvbSAnLi4vZ2VvbWV0cnkvQ29uZSc7XG5pbXBvcnQgQ3lsaW5kZXJHZW8gZnJvbSAnLi4vZ2VvbWV0cnkvQ3lsaW5kZXInO1xuaW1wb3J0IE1hdHJpeDQgZnJvbSAnLi4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgR0J1ZmZlciBmcm9tICcuL0dCdWZmZXInO1xuXG5pbXBvcnQgcHJlekdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9wcmV6Lmdsc2wuanMnO1xuaW1wb3J0IHV0aWxHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvdXRpbC5nbHNsLmpzJztcblxuaW1wb3J0IGxpZ2h0dm9sdW1lR2xzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2xpZ2h0dm9sdW1lLmdsc2wuanMnO1xuLy8gTGlnaHQgc2hhZGVyc1xuaW1wb3J0IHNwb3RHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvc3BvdC5nbHNsLmpzJztcbmltcG9ydCBkaXJlY3Rpb25hbEdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9kaXJlY3Rpb25hbC5nbHNsLmpzJztcbmltcG9ydCBhbWJpZW50R2xzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnQuZ2xzbC5qcyc7XG5pbXBvcnQgYW1iaWVudHNoR2xzbCBmcm9tICcuLi9zaGFkZXIvc291cmNlL2RlZmVycmVkL2FtYmllbnRzaC5nbHNsLmpzJztcbmltcG9ydCBhbWJpZW50Y3ViZW1hcEdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9hbWJpZW50Y3ViZW1hcC5nbHNsLmpzJztcbmltcG9ydCBwb2ludEdsc2wgZnJvbSAnLi4vc2hhZGVyL3NvdXJjZS9kZWZlcnJlZC9wb2ludC5nbHNsLmpzJztcbmltcG9ydCBzcGhlcmVHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvc3BoZXJlLmdsc2wuanMnO1xuaW1wb3J0IHR1YmVHbHNsIGZyb20gJy4uL3NoYWRlci9zb3VyY2UvZGVmZXJyZWQvdHViZS5nbHNsLmpzJztcblxuU2hhZGVyLmltcG9ydChwcmV6R2xzbCk7XG5TaGFkZXIuaW1wb3J0KHV0aWxHbHNsKTtcblNoYWRlci5pbXBvcnQobGlnaHR2b2x1bWVHbHNsKTtcblxuLy8gTGlnaHQgc2hhZGVyc1xuU2hhZGVyLmltcG9ydChzcG90R2xzbCk7XG5TaGFkZXIuaW1wb3J0KGRpcmVjdGlvbmFsR2xzbCk7XG5TaGFkZXIuaW1wb3J0KGFtYmllbnRHbHNsKTtcblNoYWRlci5pbXBvcnQoYW1iaWVudHNoR2xzbCk7XG5TaGFkZXIuaW1wb3J0KGFtYmllbnRjdWJlbWFwR2xzbCk7XG5TaGFkZXIuaW1wb3J0KHBvaW50R2xzbCk7XG5TaGFkZXIuaW1wb3J0KHNwaGVyZUdsc2wpO1xuU2hhZGVyLmltcG9ydCh0dWJlR2xzbCk7XG5cblNoYWRlci5pbXBvcnQocHJlekdsc2wpO1xuXG4vKipcbiAqIERlZmVycmVkIHJlbmRlcmVyXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LmRlZmVycmVkLlJlbmRlcmVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRGVmZXJyZWRSZW5kZXJlciA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBmdWxsUXVhZFZlcnRleCA9IFNoYWRlci5zb3VyY2UoJ2NsYXkuY29tcG9zaXRvci52ZXJ0ZXgnKTtcbiAgICB2YXIgbGlnaHRWb2x1bWVWZXJ0ZXggPSBTaGFkZXIuc291cmNlKCdjbGF5LmRlZmVycmVkLmxpZ2h0X3ZvbHVtZS52ZXJ0ZXgnKTtcblxuICAgIHZhciBkaXJlY3Rpb25hbExpZ2h0U2hhZGVyID0gbmV3IFNoYWRlcihmdWxsUXVhZFZlcnRleCwgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5kaXJlY3Rpb25hbF9saWdodCcpKTtcblxuICAgIHZhciBsaWdodEFjY3VtdWxhdGVCbGVuZEZ1bmMgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICAgICAgZ2wuYmxlbmRFcXVhdGlvbihnbC5GVU5DX0FERCk7XG4gICAgICAgIGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORSk7XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVMaWdodFBhc3NNYXQgPSBmdW5jdGlvbiAoc2hhZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWF0ZXJpYWwoe1xuICAgICAgICAgICAgc2hhZGVyOiBzaGFkZXIsXG4gICAgICAgICAgICBibGVuZDogbGlnaHRBY2N1bXVsYXRlQmxlbmRGdW5jLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICBkZXB0aE1hc2s6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlVm9sdW1lU2hhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaGFkZXIobGlnaHRWb2x1bWVWZXJ0ZXgsIFNoYWRlci5zb3VyY2UoJ2NsYXkuZGVmZXJyZWQuJyArIG5hbWUpKTtcbiAgICB9O1xuXG4gICAgLy8gUm90YXRlIGFuZCBwb3NpdGlvbmluZyB0byBmaXQgdGhlIHNwb3QgbGlnaHRcbiAgICAvLyBXaGljaCB0aGUgY3VzcCBvZiBjb25lIHBvaW50aW5nIHRvIHRoZSBwb3NpdGl2ZSB6XG4gICAgLy8gYW5kIHBvc2l0aW9uZWQgb24gdGhlIG9yaWdpblxuICAgIHZhciBjb25lR2VvID0gbmV3IENvbmVHZW8oe1xuICAgICAgICBjYXBTZWdtZW50czogMTBcbiAgICB9KTtcbiAgICB2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcbiAgICBtYXQucm90YXRlWChNYXRoLlBJIC8gMilcbiAgICAgICAgLnRyYW5zbGF0ZShuZXcgVmVjdG9yMygwLCAtMSwgMCkpO1xuXG4gICAgY29uZUdlby5hcHBseVRyYW5zZm9ybShtYXQpO1xuXG4gICAgdmFyIGN5bGluZGVyR2VvID0gbmV3IEN5bGluZGVyR2VvKHtcbiAgICAgICAgY2FwU2VnbWVudHM6IDEwXG4gICAgfSk7XG4gICAgLy8gQWxpZ24gd2l0aCB4IGF4aXNcbiAgICBtYXQuaWRlbnRpdHkoKS5yb3RhdGVaKE1hdGguUEkgLyAyKTtcbiAgICBjeWxpbmRlckdlby5hcHBseVRyYW5zZm9ybShtYXQpO1xuXG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5kZWZlcnJlZC5SZW5kZXJlciMgKi8ge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm92aWRlIFNoYWRvd01hcFBhc3MgZm9yIHNoYWRvdyByZW5kZXJpbmcuXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LnByZVBhc3MuU2hhZG93TWFwfVxuICAgICAgICAgKi9cbiAgICAgICAgc2hhZG93TWFwUGFzczogbnVsbCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZSBhdXRvIHJlc2l6aW5nIGZyb20gZ2l2ZW4gZGVmdWFsdCByZW5kZXJlciBzaXplLlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9SZXNpemU6IHRydWUsXG5cbiAgICAgICAgX2NyZWF0ZUxpZ2h0UGFzc01hdDogY3JlYXRlTGlnaHRQYXNzTWF0LFxuXG4gICAgICAgIF9nQnVmZmVyOiBuZXcgR0J1ZmZlcigpLFxuXG4gICAgICAgIF9saWdodEFjY3VtRnJhbWVCdWZmZXI6IG5ldyBGcmFtZUJ1ZmZlcih7XG4gICAgICAgICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICAgICAgfSksXG5cbiAgICAgICAgX2xpZ2h0QWNjdW1UZXg6IG5ldyBUZXh0dXJlMkQoe1xuICAgICAgICAgICAgLy8gRklYTUUgRGV2aWNlIG5vdCBzdXBwb3J0IGZsb2F0IHRleHR1cmVcbiAgICAgICAgICAgIHR5cGU6IFRleHR1cmUuSEFMRl9GTE9BVCxcbiAgICAgICAgICAgIG1pbkZpbHRlcjogVGV4dHVyZS5ORUFSRVNULFxuICAgICAgICAgICAgbWFnRmlsdGVyOiBUZXh0dXJlLk5FQVJFU1RcbiAgICAgICAgfSksXG5cbiAgICAgICAgX2Z1bGxRdWFkUGFzczogbmV3IEZ1bGxRdWFkUGFzcyh7XG4gICAgICAgICAgICBibGVuZFdpdGhQcmV2aW91czogdHJ1ZVxuICAgICAgICB9KSxcblxuICAgICAgICBfZGlyZWN0aW9uYWxMaWdodE1hdDogY3JlYXRlTGlnaHRQYXNzTWF0KGRpcmVjdGlvbmFsTGlnaHRTaGFkZXIpLFxuXG4gICAgICAgIF9hbWJpZW50TWF0OiBjcmVhdGVMaWdodFBhc3NNYXQobmV3IFNoYWRlcihcbiAgICAgICAgICAgIGZ1bGxRdWFkVmVydGV4LCBTaGFkZXIuc291cmNlKCdjbGF5LmRlZmVycmVkLmFtYmllbnRfbGlnaHQnKVxuICAgICAgICApKSxcbiAgICAgICAgX2FtYmllbnRTSE1hdDogY3JlYXRlTGlnaHRQYXNzTWF0KG5ldyBTaGFkZXIoXG4gICAgICAgICAgICBmdWxsUXVhZFZlcnRleCwgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5hbWJpZW50X3NoX2xpZ2h0JylcbiAgICAgICAgKSksXG4gICAgICAgIF9hbWJpZW50Q3ViZW1hcE1hdDogY3JlYXRlTGlnaHRQYXNzTWF0KG5ldyBTaGFkZXIoXG4gICAgICAgICAgICBmdWxsUXVhZFZlcnRleCwgU2hhZGVyLnNvdXJjZSgnY2xheS5kZWZlcnJlZC5hbWJpZW50X2N1YmVtYXBfbGlnaHQnKVxuICAgICAgICApKSxcblxuICAgICAgICBfc3BvdExpZ2h0U2hhZGVyOiBjcmVhdGVWb2x1bWVTaGFkZXIoJ3Nwb3RfbGlnaHQnKSxcbiAgICAgICAgX3BvaW50TGlnaHRTaGFkZXI6IGNyZWF0ZVZvbHVtZVNoYWRlcigncG9pbnRfbGlnaHQnKSxcblxuICAgICAgICBfc3BoZXJlTGlnaHRTaGFkZXI6IGNyZWF0ZVZvbHVtZVNoYWRlcignc3BoZXJlX2xpZ2h0JyksXG4gICAgICAgIF90dWJlTGlnaHRTaGFkZXI6IGNyZWF0ZVZvbHVtZVNoYWRlcigndHViZV9saWdodCcpLFxuXG4gICAgICAgIF9saWdodFNwaGVyZUdlbzogbmV3IFNwaGVyZUdlbyh7XG4gICAgICAgICAgICB3aWR0aFNlZ21lbnRzOiAxMCxcbiAgICAgICAgICAgIGhlaWdodFNlZ2VtZW50czogMTBcbiAgICAgICAgfSksXG5cbiAgICAgICAgX2xpZ2h0Q29uZUdlbzogY29uZUdlbyxcblxuICAgICAgICBfbGlnaHRDeWxpbmRlckdlbzogY3lsaW5kZXJHZW8sXG5cbiAgICAgICAgX291dHB1dFBhc3M6IG5ldyBGdWxsUXVhZFBhc3Moe1xuICAgICAgICAgICAgZnJhZ21lbnQ6IFNoYWRlci5zb3VyY2UoJ2NsYXkuY29tcG9zaXRvci5vdXRwdXQnKVxuICAgICAgICB9KVxuICAgIH07XG59LCAvKiogQGxlbmRzIGNsYXkuZGVmZXJyZWQuUmVuZGVyZXIjICovIHtcbiAgICAvKipcbiAgICAgKiBEbyByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtIHtjbGF5LlNjZW5lfSBzY2VuZVxuICAgICAqIEBwYXJhbSB7Y2xheS5DYW1lcmF9IGNhbWVyYVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnJlbmRlclRvVGFyZ2V0ID0gZmFsc2VdIElmIG5vdCBvdXB1dCBhbmQgcmVuZGVyIHRvIHRoZSB0YXJnZXQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMubm90VXBkYXRlU2hhZG93ID0gdHJ1ZV0gSWYgbm90IHVwZGF0ZSB0aGUgc2hhZG93LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMubm90VXBkYXRlU2NlbmUgPSB0cnVlXSBJZiBub3QgdXBkYXRlIHRoZSBzY2VuZS5cbiAgICAgKi9cbiAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgb3B0cykge1xuXG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgICBvcHRzLnJlbmRlclRvVGFyZ2V0ID0gb3B0cy5yZW5kZXJUb1RhcmdldCB8fCBmYWxzZTtcbiAgICAgICAgb3B0cy5ub3RVcGRhdGVTaGFkb3cgPSBvcHRzLm5vdFVwZGF0ZVNoYWRvdyB8fCBmYWxzZTtcbiAgICAgICAgb3B0cy5ub3RVcGRhdGVTY2VuZSA9IG9wdHMubm90VXBkYXRlU2NlbmUgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKCFvcHRzLm5vdFVwZGF0ZVNjZW5lKSB7XG4gICAgICAgICAgICBzY2VuZS51cGRhdGUoZmFsc2UsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FtZXJhLnVwZGF0ZSh0cnVlKTtcblxuICAgICAgICAvLyBQRU5ESU5HIEZvciBzdGVyZW8gcmVuZGVyaW5nXG4gICAgICAgIHZhciBkcHIgPSByZW5kZXJlci5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9SZXNpemVcbiAgICAgICAgICAgICYmIChyZW5kZXJlci5nZXRXaWR0aCgpICogZHByICE9PSB0aGlzLl9saWdodEFjY3VtVGV4LndpZHRoXG4gICAgICAgICAgICB8fCByZW5kZXJlci5nZXRIZWlnaHQoKSAqIGRwciAhPT0gdGhpcy5fbGlnaHRBY2N1bVRleC5oZWlnaHQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemUocmVuZGVyZXIuZ2V0V2lkdGgoKSAqIGRwciwgcmVuZGVyZXIuZ2V0SGVpZ2h0KCkgKiBkcHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ0J1ZmZlci51cGRhdGUocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgICAgIC8vIEFjY3VtdWxhdGUgbGlnaHQgYnVmZmVyXG4gICAgICAgIHRoaXMuX2FjY3VtdWxhdGVMaWdodEJ1ZmZlcihyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgIW9wdHMubm90VXBkYXRlU2hhZG93KTtcblxuICAgICAgICBpZiAoIW9wdHMucmVuZGVyVG9UYXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX291dHB1dFBhc3Muc2V0VW5pZm9ybSgndGV4dHVyZScsIHRoaXMuX2xpZ2h0QWNjdW1UZXgpO1xuXG4gICAgICAgICAgICB0aGlzLl9vdXRwdXRQYXNzLnJlbmRlcihyZW5kZXJlcik7XG4gICAgICAgICAgICAvLyB0aGlzLl9nQnVmZmVyLnJlbmRlckRlYnVnKHJlbmRlcmVyLCBjYW1lcmEsICdub3JtYWwnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LlRleHR1cmUyRH1cbiAgICAgKi9cbiAgICBnZXRUYXJnZXRUZXh0dXJlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodEFjY3VtVGV4O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtjbGF5LkZyYW1lQnVmZmVyfVxuICAgICAqL1xuICAgIGdldFRhcmdldEZyYW1lQnVmZmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodEFjY3VtRnJhbWVCdWZmZXI7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkuZGVmZXJyZWQuR0J1ZmZlcn1cbiAgICAgKi9cbiAgICBnZXRHQnVmZmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nQnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyBUT0RPIGlzIGRwciBuZWVkZWQ/XG4gICAgc2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBkcHIpIHtcbiAgICAgICAgdGhpcy5fZ0J1ZmZlci5zZXRWaWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBkcHIpO1xuICAgICAgICB0aGlzLl9saWdodEFjY3VtRnJhbWVCdWZmZXIudmlld3BvcnQgPSB0aGlzLl9nQnVmZmVyLmdldFZpZXdwb3J0KCk7XG4gICAgfSxcblxuICAgIC8vIGdldEZ1bGxRdWFkTGlnaHRQYXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9mdWxsUXVhZFBhc3M7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIFNldCByZW5kZXJlciBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAgICAgKi9cbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX2xpZ2h0QWNjdW1UZXgud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5fbGlnaHRBY2N1bVRleC5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgLy8gUEVORElORyB2aWV3cG9ydCA/XG4gICAgICAgIHRoaXMuX2dCdWZmZXIucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG5cbiAgICBfYWNjdW11bGF0ZUxpZ2h0QnVmZmVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIHVwZGF0ZVNoYWRvdykge1xuICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcbiAgICAgICAgdmFyIGxpZ2h0QWNjdW1UZXggPSB0aGlzLl9saWdodEFjY3VtVGV4O1xuICAgICAgICB2YXIgbGlnaHRBY2N1bUZyYW1lQnVmZmVyID0gdGhpcy5fbGlnaHRBY2N1bUZyYW1lQnVmZmVyO1xuXG4gICAgICAgIHZhciBleWVQb3NpdGlvbiA9IGNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZvbHVtZSBtZXNoZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZS5saWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxpZ2h0UHJveHkoc2NlbmUubGlnaHRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaGFkb3dNYXBQYXNzID0gdGhpcy5zaGFkb3dNYXBQYXNzO1xuICAgICAgICBpZiAoc2hhZG93TWFwUGFzcyAmJiB1cGRhdGVTaGFkb3cpIHtcbiAgICAgICAgICAgIGdsLmNsZWFyQ29sb3IoMSwgMSwgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlTGlnaHRTaGFkb3cocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVsaWdodGFjY3VtdWxhdGUnLCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgdXBkYXRlU2hhZG93KTtcblxuICAgICAgICBsaWdodEFjY3VtRnJhbWVCdWZmZXIuYXR0YWNoKGxpZ2h0QWNjdW1UZXgpO1xuICAgICAgICBsaWdodEFjY3VtRnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIHZhciBjbGVhckNvbG9yID0gcmVuZGVyZXIuY2xlYXJDb2xvcjtcblxuICAgICAgICB2YXIgdmlld3BvcnQgPSBsaWdodEFjY3VtRnJhbWVCdWZmZXIudmlld3BvcnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgdmFyIGRwciA9IHZpZXdwb3J0LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICAvLyB1c2Ugc2Npc3NvciB0byBtYWtlIHN1cmUgb25seSBjbGVhciB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgZ2wuc2Npc3Nvcih2aWV3cG9ydC54ICogZHByLCB2aWV3cG9ydC55ICogZHByLCB2aWV3cG9ydC53aWR0aCAqIGRwciwgdmlld3BvcnQuaGVpZ2h0ICogZHByKTtcbiAgICAgICAgfVxuICAgICAgICBnbC5jbGVhckNvbG9yKGNsZWFyQ29sb3JbMF0sIGNsZWFyQ29sb3JbMV0sIGNsZWFyQ29sb3JbMl0sIGNsZWFyQ29sb3JbM10pO1xuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcbiAgICAgICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ3N0YXJ0bGlnaHRhY2N1bXVsYXRlJywgcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgICAgIHZhciB2aWV3UHJvamVjdGlvbkludiA9IG5ldyBNYXRyaXg0KCk7XG4gICAgICAgIE1hdHJpeDQubXVsdGlwbHkodmlld1Byb2plY3Rpb25JbnYsIGNhbWVyYS53b3JsZFRyYW5zZm9ybSwgY2FtZXJhLmludlByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgIHZhciB2b2x1bWVNZXNoTGlzdCA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmUubGlnaHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbGlnaHQgPSBzY2VuZS5saWdodHNbaV07XG4gICAgICAgICAgICB2YXIgdVRwbCA9IGxpZ2h0LnVuaWZvcm1UZW1wbGF0ZXM7XG5cbiAgICAgICAgICAgIHZhciB2b2x1bWVNZXNoID0gbGlnaHQudm9sdW1lTWVzaCB8fCBsaWdodC5fX3ZvbHVtZU1lc2g7XG5cbiAgICAgICAgICAgIGlmICh2b2x1bWVNZXNoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gdm9sdW1lTWVzaC5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICAvLyBWb2x1bWUgbWVzaCB3aWxsIGFmZmVjdCB0aGUgc2NlbmUgYm91bmRpbmcgYm94IHdoZW4gcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgLy8gaWYgY2FzdFNoYWRvdyBpcyB0cnVlXG4gICAgICAgICAgICAgICAgdm9sdW1lTWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICB2YXIgdW5rbm93bkxpZ2h0VHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlnaHQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdQT0lOVF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodENvbG9yJywgdVRwbC5wb2ludExpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnBvaW50TGlnaHRSYW5nZS52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRQb3NpdGlvbicsIHVUcGwucG9pbnRMaWdodFBvc2l0aW9uLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1BPVF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodFBvc2l0aW9uJywgdVRwbC5zcG90TGlnaHRQb3NpdGlvbi52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRDb2xvcicsIHVUcGwuc3BvdExpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnNwb3RMaWdodFJhbmdlLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodERpcmVjdGlvbicsIHVUcGwuc3BvdExpZ2h0RGlyZWN0aW9uLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCd1bWJyYUFuZ2xlQ29zaW5lJywgdVRwbC5zcG90TGlnaHRVbWJyYUFuZ2xlQ29zaW5lLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdwZW51bWJyYUFuZ2xlQ29zaW5lJywgdVRwbC5zcG90TGlnaHRQZW51bWJyYUFuZ2xlQ29zaW5lLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdmYWxsb2ZmRmFjdG9yJywgdVRwbC5zcG90TGlnaHRGYWxsb2ZmRmFjdG9yLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1BIRVJFX0xJR0hUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29sb3InLCB1VHBsLnNwaGVyZUxpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnNwaGVyZUxpZ2h0UmFuZ2UudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFkaXVzJywgdVRwbC5zcGhlcmVMaWdodFJhZGl1cy52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRQb3NpdGlvbicsIHVUcGwuc3BoZXJlTGlnaHRQb3NpdGlvbi52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RVQkVfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRDb2xvcicsIHVUcGwudHViZUxpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0UmFuZ2UnLCB1VHBsLnR1YmVMaWdodFJhbmdlLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodEV4dGVuZCcsIHVUcGwudHViZUxpZ2h0RXh0ZW5kLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodFBvc2l0aW9uJywgdVRwbC50dWJlTGlnaHRQb3NpdGlvbi52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duTGlnaHRUeXBlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodW5rbm93bkxpZ2h0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdleWVQb3NpdGlvbicsIGV5ZVBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCd2aWV3UHJvamVjdGlvbkludicsIHZpZXdQcm9qZWN0aW9uSW52LmFycmF5KTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTEnLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUxKCkpO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2dCdWZmZXJUZXh0dXJlMicsIHRoaXMuX2dCdWZmZXIuZ2V0VGFyZ2V0VGV4dHVyZTIoKSk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnZ0J1ZmZlclRleHR1cmUzJywgdGhpcy5fZ0J1ZmZlci5nZXRUYXJnZXRUZXh0dXJlMygpKTtcblxuICAgICAgICAgICAgICAgIHZvbHVtZU1lc2hMaXN0LnB1c2godm9sdW1lTWVzaCk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXNzID0gdGhpcy5fZnVsbFF1YWRQYXNzO1xuICAgICAgICAgICAgICAgIHZhciB1bmtub3duTGlnaHRUeXBlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gRnVsbCBxdWFkIGxpZ2h0XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsaWdodC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FNQklFTlRfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbCA9IHRoaXMuX2FtYmllbnRNYXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29sb3InLCB1VHBsLmFtYmllbnRMaWdodENvbG9yLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQU1CSUVOVF9TSF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsID0gdGhpcy5fYW1iaWVudFNITWF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodENvbG9yJywgdVRwbC5hbWJpZW50U0hMaWdodENvbG9yLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29lZmZpY2llbnRzJywgdVRwbC5hbWJpZW50U0hMaWdodENvZWZmaWNpZW50cy52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FNQklFTlRfQ1VCRU1BUF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsID0gdGhpcy5fYW1iaWVudEN1YmVtYXBNYXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0Q29sb3InLCB1VHBsLmFtYmllbnRDdWJlbWFwTGlnaHRDb2xvci52YWx1ZShsaWdodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodEN1YmVtYXAnLCB1VHBsLmFtYmllbnRDdWJlbWFwTGlnaHRDdWJlbWFwLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzLm1hdGVyaWFsLnNldFVuaWZvcm0oJ2JyZGZMb29rdXAnLCB1VHBsLmFtYmllbnRDdWJlbWFwTGlnaHRCUkRGTG9va3VwLnZhbHVlKGxpZ2h0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRElSRUNUSU9OQUxfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhc1NoYWRvdyA9IHNoYWRvd01hcFBhc3MgJiYgbGlnaHQuY2FzdFNoYWRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MubWF0ZXJpYWwgPSB0aGlzLl9kaXJlY3Rpb25hbExpZ2h0TWF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbFtoYXNTaGFkb3cgPyAnZGVmaW5lJyA6ICd1bmRlZmluZSddKCdmcmFnbWVudCcsICdTSEFET1dNQVBfRU5BQkxFRCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1NoYWRvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MubWF0ZXJpYWwuZGVmaW5lKCdmcmFnbWVudCcsICdTSEFET1dfQ0FTQ0FERScsIGxpZ2h0LnNoYWRvd0Nhc2NhZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzcy5tYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodENvbG9yJywgdVRwbC5kaXJlY3Rpb25hbExpZ2h0Q29sb3IudmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MubWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHREaXJlY3Rpb24nLCB1VHBsLmRpcmVjdGlvbmFsTGlnaHREaXJlY3Rpb24udmFsdWUobGlnaHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5rb253IGxpZ2h0IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25MaWdodFR5cGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodW5rbm93bkxpZ2h0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcGFzc01hdGVyaWFsID0gcGFzcy5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICBwYXNzTWF0ZXJpYWwuc2V0VW5pZm9ybSgnZXllUG9zaXRpb24nLCBleWVQb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcGFzc01hdGVyaWFsLnNldFVuaWZvcm0oJ3ZpZXdQcm9qZWN0aW9uSW52Jywgdmlld1Byb2plY3Rpb25JbnYuYXJyYXkpO1xuICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTEnLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUxKCkpO1xuICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTInLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUyKCkpO1xuICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdnQnVmZmVyVGV4dHVyZTMnLCB0aGlzLl9nQnVmZmVyLmdldFRhcmdldFRleHR1cmUzKCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgICAgIGlmIChzaGFkb3dNYXBQYXNzICYmIGxpZ2h0LmNhc3RTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc01hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0U2hhZG93TWFwJywgbGlnaHQuX19zaGFkb3dNYXApO1xuICAgICAgICAgICAgICAgICAgICBwYXNzTWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRNYXRyaWNlcycsIGxpZ2h0Ll9fbGlnaHRNYXRyaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NNYXRlcmlhbC5zZXRVbmlmb3JtKCdzaGFkb3dDYXNjYWRlQ2xpcHNOZWFyJywgbGlnaHQuX19jYXNjYWRlQ2xpcHNOZWFyKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc01hdGVyaWFsLnNldFVuaWZvcm0oJ3NoYWRvd0Nhc2NhZGVDbGlwc0ZhcicsIGxpZ2h0Ll9fY2FzY2FkZUNsaXBzRmFyKTtcblxuICAgICAgICAgICAgICAgICAgICBwYXNzTWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRTaGFkb3dNYXBTaXplJywgbGlnaHQuc2hhZG93UmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFzcy5yZW5kZXJRdWFkKHJlbmRlcmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlclZvbHVtZU1lc2hMaXN0KHJlbmRlcmVyLCBjYW1lcmEsIHZvbHVtZU1lc2hMaXN0KTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2xpZ2h0YWNjdW11bGF0ZScsIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKTtcblxuICAgICAgICBsaWdodEFjY3VtRnJhbWVCdWZmZXIudW5iaW5kKHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2FmdGVybGlnaHRhY2N1bXVsYXRlJywgcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEpO1xuXG4gICAgfSxcblxuICAgIF9wcmVwYXJlTGlnaHRTaGFkb3c6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JsZFZpZXcgPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhKSB7XG4gICAgICAgICAgICB2YXIgc2hhZG93Q2FzdGVycztcblxuICAgICAgICAgICAgc2hhZG93Q2FzdGVycyA9IHRoaXMuX3NoYWRvd0Nhc3RlcnMgfHwgKHRoaXMuX3NoYWRvd0Nhc3RlcnMgPSBbXSk7XG4gICAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgICAgdmFyIGxpc3QgPSBzY2VuZS5vcGFxdWVMaXN0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbaV0uY2FzdFNoYWRvdykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dDYXN0ZXJzW2NvdW50KytdID0gbGlzdFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGFkb3dDYXN0ZXJzLmxlbmd0aCA9IGNvdW50O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjZW5lLmxpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBsaWdodCA9IHNjZW5lLmxpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgdm9sdW1lTWVzaCA9IGxpZ2h0LnZvbHVtZU1lc2ggfHwgbGlnaHQuX192b2x1bWVNZXNoO1xuICAgICAgICAgICAgICAgIGlmICghbGlnaHQuY2FzdFNoYWRvdykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpZ2h0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUE9JTlRfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdTUE9UX0xJR0hUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZydXN0dW0gY3VsbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4NC5tdWx0aXBseSh3b3JsZFZpZXcsIGNhbWVyYS52aWV3TWF0cml4LCB2b2x1bWVNZXNoLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5pc0ZydXN0dW1DdWxsZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lTWVzaCwgbnVsbCwgY2FtZXJhLCB3b3JsZFZpZXcuYXJyYXksIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVTaW5nbGVMaWdodFNoYWRvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgbGlnaHQsIHNoYWRvd0Nhc3RlcnMsIHZvbHVtZU1lc2gubWF0ZXJpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRElSRUNUSU9OQUxfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVNpbmdsZUxpZ2h0U2hhZG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBsaWdodCwgc2hhZG93Q2FzdGVycywgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIF9wcmVwYXJlU2luZ2xlTGlnaHRTaGFkb3c6IGZ1bmN0aW9uIChyZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgbGlnaHQsIGNhc3RlcnMsIG1hdGVyaWFsKSB7XG4gICAgICAgIHN3aXRjaCAobGlnaHQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnUE9JTlRfTElHSFQnOlxuICAgICAgICAgICAgICAgIHZhciBzaGFkb3dNYXBzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLnJlbmRlclBvaW50TGlnaHRTaGFkb3coXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLCBzY2VuZSwgbGlnaHQsIGNhc3RlcnMsIHNoYWRvd01hcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0U2hhZG93TWFwJywgc2hhZG93TWFwc1swXSk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRTaGFkb3dNYXBTaXplJywgbGlnaHQuc2hhZG93UmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdTUE9UX0xJR0hUJzpcbiAgICAgICAgICAgICAgICB2YXIgc2hhZG93TWFwcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBsaWdodE1hdHJpY2VzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLnJlbmRlclNwb3RMaWdodFNoYWRvdyhcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIsIHNjZW5lLCBsaWdodCwgY2FzdGVycywgbGlnaHRNYXRyaWNlcywgc2hhZG93TWFwc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgnbGlnaHRTaGFkb3dNYXAnLCBzaGFkb3dNYXBzWzBdKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCdsaWdodE1hdHJpeCcsIGxpZ2h0TWF0cmljZXNbMF0pO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ2xpZ2h0U2hhZG93TWFwU2l6ZScsIGxpZ2h0LnNoYWRvd1Jlc29sdXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRElSRUNUSU9OQUxfTElHSFQnOlxuICAgICAgICAgICAgICAgIHZhciBzaGFkb3dNYXBzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGxpZ2h0TWF0cmljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgY2FzY2FkZUNsaXBzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLnJlbmRlckRpcmVjdGlvbmFsTGlnaHRTaGFkb3coXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBsaWdodCwgY2FzdGVycywgY2FzY2FkZUNsaXBzLCBsaWdodE1hdHJpY2VzLCBzaGFkb3dNYXBzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FzY2FkZUNsaXBzTmVhciA9IGNhc2NhZGVDbGlwcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHZhciBjYXNjYWRlQ2xpcHNGYXIgPSBjYXNjYWRlQ2xpcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBjYXNjYWRlQ2xpcHNOZWFyLnBvcCgpO1xuICAgICAgICAgICAgICAgIGNhc2NhZGVDbGlwc0Zhci5zaGlmdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBmcm9tIGZhciB0byBuZWFyXG4gICAgICAgICAgICAgICAgY2FzY2FkZUNsaXBzTmVhci5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgY2FzY2FkZUNsaXBzRmFyLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBsaWdodE1hdHJpY2VzLnJldmVyc2UoKTtcblxuICAgICAgICAgICAgICAgIGxpZ2h0Ll9fY2FzY2FkZUNsaXBzTmVhciA9IGNhc2NhZGVDbGlwc05lYXI7XG4gICAgICAgICAgICAgICAgbGlnaHQuX19jYXNjYWRlQ2xpcHNGYXIgPSBjYXNjYWRlQ2xpcHNGYXI7XG4gICAgICAgICAgICAgICAgbGlnaHQuX19zaGFkb3dNYXAgPSBzaGFkb3dNYXBzWzBdO1xuICAgICAgICAgICAgICAgIGxpZ2h0Ll9fbGlnaHRNYXRyaWNlcyA9IGxpZ2h0TWF0cmljZXM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVXBkYXRlIGxpZ2h0IHZvbHVtZSBtZXNoXG4gICAgLy8gTGlnaHQgdm9sdW1lIG1lc2ggaXMgcmVuZGVyZWQgaW4gbGlnaHQgYWNjdW11bGF0ZSBwYXNzIGluc3RlYWQgb2YgZnVsbCBxdWFkLlxuICAgIC8vIEl0IHdpbGwgcmVkdWNlIHBpeGVscyBzaWduaWZpY2FudGx5IHdoZW4gbG9jYWwgbGlnaHQgaXMgcmVsYXRpdmVseSBzbWFsbC5cbiAgICAvLyBBbmQgd2UgY2FuIHVzZSBjdXN0b20gdm9sdW1lIG1lc2ggdG8gc2hhcGUgdGhlIGxpZ2h0LlxuICAgIC8vXG4gICAgLy8gU2VlIFwiRGVmZXJyZWQgU2hhZGluZyBPcHRpbWl6YXRpb25zXCIgaW4gR0RDMjAxMVxuICAgIF91cGRhdGVMaWdodFByb3h5OiBmdW5jdGlvbiAobGlnaHQpIHtcbiAgICAgICAgdmFyIHZvbHVtZU1lc2g7XG4gICAgICAgIGlmIChsaWdodC52b2x1bWVNZXNoKSB7XG4gICAgICAgICAgICB2b2x1bWVNZXNoID0gbGlnaHQudm9sdW1lTWVzaDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAobGlnaHQudHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9jYWwgbGlnaHQgKHBvaW50IGFuZCBzcG90KSBuZWVkcyB2b2x1bWUgbWVzaC5cbiAgICAgICAgICAgICAgICAvLyBEaXJlY3Rpb25hbCBhbmQgYW1iaWVudCBsaWdodCByZW5kZXJzIGluIGZ1bGwgcXVhZFxuICAgICAgICAgICAgICAgIGNhc2UgJ1BPSU5UX0xJR0hUJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTUEhFUkVfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICB2YXIgc2hhZGVyID0gbGlnaHQudHlwZSA9PT0gJ1NQSEVSRV9MSUdIVCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fc3BoZXJlTGlnaHRTaGFkZXIgOiB0aGlzLl9wb2ludExpZ2h0U2hhZGVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBWb2x1bWUgbWVzaCBjcmVhdGVkIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaWdodC5fX3ZvbHVtZU1lc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0Ll9fdm9sdW1lTWVzaCA9IG5ldyBNZXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbDogdGhpcy5fY3JlYXRlTGlnaHRQYXNzTWF0KHNoYWRlciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHRoaXMuX2xpZ2h0U3BoZXJlR2VvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY3VsbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGxpZ2h0IHZvbHVtZSBtZXNoIGludGVyc2VjdCBjYW1lcmEgbmVhciBwbGFuZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgbWVzaCBpbnNpZGUgY2FuIHN0aWxsIGJlIHJlbmRlcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsbGluZzogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZU1lc2ggPSBsaWdodC5fX3ZvbHVtZU1lc2g7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gbGlnaHQucmFuZ2UgKyAobGlnaHQucmFkaXVzIHx8IDApO1xuICAgICAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLnNjYWxlLnNldChyLCByLCByKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnU1BPVF9MSUdIVCc6XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0Ll9fdm9sdW1lTWVzaCA9IGxpZ2h0Ll9fdm9sdW1lTWVzaCB8fCBuZXcgTWVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbDogdGhpcy5fY3JlYXRlTGlnaHRQYXNzTWF0KHRoaXMuX3Nwb3RMaWdodFNoYWRlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogdGhpcy5fbGlnaHRDb25lR2VvLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VsbGluZzogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZU1lc2ggPSBsaWdodC5fX3ZvbHVtZU1lc2g7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3BlY3QgPSBNYXRoLnRhbihsaWdodC5wZW51bWJyYUFuZ2xlICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IGxpZ2h0LnJhbmdlO1xuICAgICAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLnNjYWxlLnNldChhc3BlY3QgKiByYW5nZSwgYXNwZWN0ICogcmFuZ2UsIHJhbmdlIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RVQkVfTElHSFQnOlxuICAgICAgICAgICAgICAgICAgICBsaWdodC5fX3ZvbHVtZU1lc2ggPSBsaWdodC5fX3ZvbHVtZU1lc2ggfHwgbmV3IE1lc2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWw6IHRoaXMuX2NyZWF0ZUxpZ2h0UGFzc01hdCh0aGlzLl90dWJlTGlnaHRTaGFkZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHRoaXMuX2xpZ2h0Q3lsaW5kZXJHZW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBjdWxsaW5nOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lTWVzaCA9IGxpZ2h0Ll9fdm9sdW1lTWVzaDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gbGlnaHQucmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZU1lc2guc2NhbGUuc2V0KGxpZ2h0Lmxlbmd0aCAvIDIgKyByYW5nZSwgcmFuZ2UsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZvbHVtZU1lc2gpIHtcbiAgICAgICAgICAgIHZvbHVtZU1lc2gudXBkYXRlKCk7XG4gICAgICAgICAgICAvLyBBcHBseSBsaWdodCB0cmFuc2Zvcm1cbiAgICAgICAgICAgIE1hdHJpeDQubXVsdGlwbHkodm9sdW1lTWVzaC53b3JsZFRyYW5zZm9ybSwgbGlnaHQud29ybGRUcmFuc2Zvcm0sIHZvbHVtZU1lc2gud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgdmFyIGhhc1NoYWRvdyA9IHRoaXMuc2hhZG93TWFwUGFzcyAmJiBsaWdodC5jYXN0U2hhZG93O1xuICAgICAgICAgICAgdm9sdW1lTWVzaC5tYXRlcmlhbFtoYXNTaGFkb3cgPyAnZGVmaW5lJyA6ICd1bmRlZmluZSddKCdmcmFnbWVudCcsICdTSEFET1dNQVBfRU5BQkxFRCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZW5kZXJWb2x1bWVNZXNoTGlzdDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdvcmxkVmlld1Byb2plY3Rpb24gPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICB2YXIgd29ybGRWaWV3ID0gbmV3IE1hdHJpeDQoKTtcbiAgICAgICAgdmFyIHByZVpNYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCh7XG4gICAgICAgICAgICBzaGFkZXI6IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5wcmV6LnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnByZXouZnJhZ21lbnQnKSlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVuZGVyZXIsIGNhbWVyYSwgdm9sdW1lTWVzaExpc3QpIHtcbiAgICAgICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBnbC5ibGVuZEVxdWF0aW9uKGdsLkZVTkNfQUREKTtcbiAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSk7XG4gICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVRVUFMKTtcblxuICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG5cbiAgICAgICAgICAgIHZhciB2aWV3cG9ydCA9IHJlbmRlcmVyLnZpZXdwb3J0O1xuICAgICAgICAgICAgdmFyIGRwciA9IHZpZXdwb3J0LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICB2YXIgdmlld3BvcnRVbmlmb3JtID0gW1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0LnggKiBkcHIsIHZpZXdwb3J0LnkgKiBkcHIsXG4gICAgICAgICAgICAgICAgdmlld3BvcnQud2lkdGggKiBkcHIsIHZpZXdwb3J0LmhlaWdodCAqIGRwclxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgdmFyIHdpbmRvd1NpemVVbmlmb3JtID0gW1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0QWNjdW1UZXgud2lkdGgsXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlnaHRBY2N1bVRleC5oZWlnaHRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm9sdW1lTWVzaExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdm9sdW1lTWVzaCA9IHZvbHVtZU1lc2hMaXN0W2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gRnJ1c3R1bSBjdWxsaW5nXG4gICAgICAgICAgICAgICAgTWF0cml4NC5tdWx0aXBseSh3b3JsZFZpZXcsIGNhbWVyYS52aWV3TWF0cml4LCB2b2x1bWVNZXNoLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuaXNGcnVzdHVtQ3VsbGVkKFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLCBudWxsLCBjYW1lcmEsIHdvcmxkVmlldy5hcnJheSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguYXJyYXlcbiAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV6IHRvIGF2b2lkIG9uZSBwaXhlbCByZW5kZXJlZCB0d2ljZVxuICAgICAgICAgICAgICAgIGdsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZ2wuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICAgICAgICAgIC8vIGRlcHRoTWFzayBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIGNsZWFyIERFUFRIX0JVRkZFUlxuICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuXG4gICAgICAgICAgICAgICAgTWF0cml4NC5tdWx0aXBseSh3b3JsZFZpZXdQcm9qZWN0aW9uLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgd29ybGRWaWV3KTtcblxuICAgICAgICAgICAgICAgIHZhciBwcmVaUHJvZ3JhbSA9IHJlbmRlcmVyLmdldFByb2dyYW0odm9sdW1lTWVzaCwgcHJlWk1hdGVyaWFsKTtcbiAgICAgICAgICAgICAgICB2b2x1bWVNZXNoLl9fcHJvZ3JhbSA9IHByZVpQcm9ncmFtO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnZhbGlkYXRlUHJvZ3JhbShwcmVaUHJvZ3JhbSk7XG4gICAgICAgICAgICAgICAgcHJlWlByb2dyYW0uYmluZChyZW5kZXJlcik7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2VtYW50aWNJbmZvID0gcHJlWk1hdGVyaWFsLnNoYWRlci5tYXRyaXhTZW1hbnRpY3MuV09STERWSUVXUFJPSkVDVElPTjtcbiAgICAgICAgICAgICAgICBwcmVaUHJvZ3JhbS5zZXRVbmlmb3JtKGdsLCBzZW1hbnRpY0luZm8udHlwZSwgc2VtYW50aWNJbmZvLnN5bWJvbCwgd29ybGRWaWV3UHJvamVjdGlvbi5hcnJheSk7XG4gICAgICAgICAgICAgICAgdm9sdW1lTWVzaC5yZW5kZXIocmVuZGVyZXIsIHByZVpNYXRlcmlhbCwgcHJlWlByb2dyYW0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIGxpZ2h0XG4gICAgICAgICAgICAgICAgZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGdsLmRlcHRoTWFzayhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIHByb2dyYW0gPSByZW5kZXJlci5nZXRQcm9ncmFtKHZvbHVtZU1lc2gsIHZvbHVtZU1lc2gubWF0ZXJpYWwpO1xuICAgICAgICAgICAgICAgIHZvbHVtZU1lc2guX19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgICAgICAgICByZW5kZXJlci52YWxpZGF0ZVByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5iaW5kKHJlbmRlcmVyKTtcblxuICAgICAgICAgICAgICAgIHZhciBzZW1hbnRpY0luZm8gPSB2b2x1bWVNZXNoLm1hdGVyaWFsLnNoYWRlci5tYXRyaXhTZW1hbnRpY3MuV09STERWSUVXUFJPSkVDVElPTjtcbiAgICAgICAgICAgICAgICAvLyBTZXQgc29tZSBjb21tb24gdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm0oZ2wsIHNlbWFudGljSW5mby50eXBlLCBzZW1hbnRpY0luZm8uc3ltYm9sLCB3b3JsZFZpZXdQcm9qZWN0aW9uLmFycmF5KTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1PZlNlbWFudGljKGdsLCAnV0lORE9XX1NJWkUnLCB3aW5kb3dTaXplVW5pZm9ybSk7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3JtT2ZTZW1hbnRpYyhnbCwgJ1ZJRVdQT1JUJywgdmlld3BvcnRVbmlmb3JtKTtcblxuICAgICAgICAgICAgICAgIHZvbHVtZU1lc2gubWF0ZXJpYWwuYmluZChyZW5kZXJlciwgcHJvZ3JhbSk7XG4gICAgICAgICAgICAgICAgdm9sdW1lTWVzaC5yZW5kZXIocmVuZGVyZXIsIHZvbHVtZU1lc2gubWF0ZXJpYWwsIHByb2dyYW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVTUyk7XG4gICAgICAgIH07XG4gICAgfSkoKSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2NsYXkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuX2dCdWZmZXIuZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fbGlnaHRBY2N1bUZyYW1lQnVmZmVyLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICB0aGlzLl9saWdodEFjY3VtVGV4LmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgICAgIHRoaXMuX2xpZ2h0Q29uZUdlby5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICAgICAgdGhpcy5fbGlnaHRDeWxpbmRlckdlby5kaXNwb3NlKHJlbmRlcmVyKTtcbiAgICAgICAgdGhpcy5fbGlnaHRTcGhlcmVHZW8uZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fZnVsbFF1YWRQYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICB0aGlzLl9vdXRwdXRQYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuXG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbmFsTGlnaHRNYXQuZGlzcG9zZShyZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5zaGFkb3dNYXBQYXNzLmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBEZWZlcnJlZFJlbmRlcmVyO1xuIiwiaW1wb3J0IExpZ2h0IGZyb20gJy4uL0xpZ2h0JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5saWdodC5TcGhlcmVcbiAqIEBleHRlbmRzIHtjbGF5LkxpZ2h0fVxuICovXG52YXIgU3BoZXJlTGlnaHQgPSBMaWdodC5leHRlbmQoXG4vKiogQGxlbmRzIGNsYXkubGlnaHQuU3BoZXJlIyAqL1xue1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFuZ2U6IDEwMCxcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcmFkaXVzOiA1XG59LCB7XG5cbiAgICB0eXBlOiAnU1BIRVJFX0xJR0hUJyxcblxuICAgIHVuaWZvcm1UZW1wbGF0ZXM6IHtcbiAgICAgICAgc3BoZXJlTGlnaHRQb3NpdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5nZXRXb3JsZFBvc2l0aW9uKCkuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwaGVyZUxpZ2h0UmFuZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICcxZicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UucmFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwaGVyZUxpZ2h0UmFkaXVzOiB7XG4gICAgICAgICAgICB0eXBlOiAnMWYnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJhZGl1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3BoZXJlTGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBTcGhlcmVMaWdodDtcbiIsImltcG9ydCBMaWdodCBmcm9tICcuLi9MaWdodCc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LmxpZ2h0LlR1YmVcbiAqIEBleHRlbmRzIHtjbGF5LkxpZ2h0fVxuICovXG52YXIgVHViZUxpZ2h0ID0gTGlnaHQuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LmxpZ2h0LlR1YmUjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICByYW5nZTogMTAwLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW5ndGg6IDEwXG59LCB7XG5cbiAgICB0eXBlOiAnVFVCRV9MSUdIVCcsXG5cbiAgICB1bmlmb3JtVGVtcGxhdGVzOiB7XG4gICAgICAgIHR1YmVMaWdodFBvc2l0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnM2YnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLmdldFdvcmxkUG9zaXRpb24oKS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0dWJlTGlnaHRFeHRlbmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICczZicsXG4gICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIGluIHggYXhpc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5jb3B5KGluc3RhbmNlLndvcmxkVHJhbnNmb3JtLngpXG4gICAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCkuc2NhbGUoaW5zdGFuY2UubGVuZ3RoIC8gMikuYXJyYXk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKClcbiAgICAgICAgfSxcblxuICAgICAgICB0dWJlTGlnaHRSYW5nZToge1xuICAgICAgICAgICAgdHlwZTogJzFmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0dWJlTGlnaHRDb2xvcjoge1xuICAgICAgICAgICAgdHlwZTogJzNmJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IGluc3RhbmNlLmNvbG9yO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlbnNpdHkgPSBpbnN0YW5jZS5pbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtjb2xvclswXSppbnRlbnNpdHksIGNvbG9yWzFdKmludGVuc2l0eSwgY29sb3JbMl0qaW50ZW5zaXR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBUdWJlTGlnaHQ7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vY29yZS9yZXF1ZXN0JztcbmltcG9ydCBjcmVhdGVDb21wb3NpdG9yIGZyb20gJy4uL2NvbXBvc2l0b3IvY3JlYXRlQ29tcG9zaXRvcic7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkubG9hZGVyLkZYXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRlhMb2FkZXIgPSBCYXNlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5sb2FkZXIuRlgjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICByb290UGF0aDogJycsXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0ZXh0dXJlUm9vdFBhdGg6ICcnLFxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2hhZGVyUm9vdFBhdGg6ICcnLFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkuU2NlbmV9XG4gICAgICovXG4gICAgc2NlbmU6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5DYW1lcmF9XG4gICAgICovXG4gICAgY2FtZXJhOiBudWxsXG59LFxuLyoqIEBsZW5kcyBjbGF5LmxvYWRlci5GWC5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICAgICAqL1xuICAgIGxvYWQ6IGZ1bmN0aW9uKHVybCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLnJvb3RQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RQYXRoID0gdXJsLnNsaWNlKDAsIHVybC5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QuZ2V0KHtcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgb25wcm9ncmVzczogZnVuY3Rpb24ocGVyY2VudCwgbG9hZGVkLCB0b3RhbCkge1xuICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcigncHJvZ3Jlc3MnLCBwZXJjZW50LCBsb2FkZWQsIHRvdGFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyKCdlcnJvcicsIGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBvc2l0b3IoSlNPTi5wYXJzZShkYXRhKSwge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlUm9vdFBhdGg6IHRoaXMudGV4dHVyZVJvb3RQYXRoIHx8IHRoaXMucm9vdFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogdGhpcy5jYW1lcmEsXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lOiB0aGlzLnNjZW5lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBGWExvYWRlcjtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDIgPSBnbE1hdHJpeC5tYXQyO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5NYXRyaXgyXG4gKi9cbnZhciBNYXRyaXgyID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yYWdlIG9mIE1hdHJpeDJcbiAgICAgKiBAbmFtZSBhcnJheVxuICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXgyI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBtYXQyLmNyZWF0ZSgpO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5NYXRyaXgyI1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cbk1hdHJpeDIucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IE1hdHJpeDIsXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29tcG9uZW50cyBmcm9tIGFycmF5XG4gICAgICogQHBhcmFtICB7RmxvYXQzMkFycmF5fG51bWJlcltdfSBhcnJcbiAgICAgKi9cbiAgICBzZXRBcnJheTogZnVuY3Rpb24gKGFycikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbaV0gPSBhcnJbaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IE1hdHJpeDJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAobmV3IE1hdHJpeDIoKSkuY29weSh0aGlzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29weSBmcm9tIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0Mi5jb3B5KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGFkanVnYXRlIG9mIHNlbGYsIGluLXBsYWNlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gICAgICovXG4gICAgYWRqb2ludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDIuYWRqb2ludCh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG1hdHJpeCBkZXRlcm1pbmFudFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkZXRlcm1pbmFudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtYXQyLmRldGVybWluYW50KHRoaXMuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYSBpZGVudGl0eSBtYXRyaXhcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBpZGVudGl0eTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDIuaWRlbnRpdHkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludmVydCBzZWxmXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gICAgICovXG4gICAgaW52ZXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWF0Mi5pbnZlcnQodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdXRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJ9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0Mi5tdWwodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdWx0aXBseUxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIG11bExlZnQ6IGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgbWF0Mi5tdWwodGhpcy5hcnJheSwgYS5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIG11bHRpcGx5OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDIubXVsdGlwbHkodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IGEgYW5kIHNlbGYsIGEgaXMgb24gdGhlIGxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIG11bHRpcGx5TGVmdDogZnVuY3Rpb24oYSkge1xuICAgICAgICBtYXQyLm11bHRpcGx5KHRoaXMuYXJyYXksIGEuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgc2VsZiBieSBhIGdpdmVuIHJhZGlhblxuICAgICAqIEBwYXJhbSAge251bWJlcn0gICByYWRcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICByb3RhdGU6IGZ1bmN0aW9uKHJhZCkge1xuICAgICAgICBtYXQyLnJvdGF0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCByYWQpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTY2FsZSBzZWxmIGJ5IHNcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gIHNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICBzY2FsZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQyLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHYuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVHJhbnNwb3NlIHNlbGYsIGluLXBsYWNlLlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICAgICAqL1xuICAgIHRyYW5zcG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDIudHJhbnNwb3NlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAnWycgKyBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHRoaXMuYXJyYXksICcsJykgKyAnXSc7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQHBhcmFtICB7TWF0cml4Mn0gb3V0XG4gKiBAcGFyYW0gIHtNYXRyaXgyfSBhXG4gKiBAcmV0dXJuIHtNYXRyaXgyfVxuICovXG5NYXRyaXgyLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyLmFkam9pbnQob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG1hdDIuY29weShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbk1hdHJpeDIuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbihhKSB7XG4gICAgcmV0dXJuIG1hdDIuZGV0ZXJtaW5hbnQoYS5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyfVxuICovXG5NYXRyaXgyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgbWF0Mi5pZGVudGl0eShvdXQuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAqL1xuTWF0cml4Mi5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyLmludmVydChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIubXVsID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgbWF0Mi5tdWwob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIubXVsdGlwbHkgPSBNYXRyaXgyLm11bDtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4Mn0gYVxuICogQHBhcmFtICB7bnVtYmVyfSAgIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIucm90YXRlID0gZnVuY3Rpb24ob3V0LCBhLCByYWQpIHtcbiAgICBtYXQyLnJvdGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHJhZCk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJ9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJ9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJ9XG4gKi9cbk1hdHJpeDIuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICBtYXQyLnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBwYXJhbSAge01hdHJpeDJ9IG91dFxuICogQHBhcmFtICB7TWF0cml4Mn0gYVxuICogQHJldHVybiB7TWF0cml4Mn1cbiAqL1xuTWF0cml4Mi50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyLnRyYW5zcG9zZShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXgyO1xuIiwiaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgbWF0MmQgPSBnbE1hdHJpeC5tYXQyZDtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5Lm1hdGguTWF0cml4MmRcbiAqL1xudmFyIE1hdHJpeDJkID0gZnVuY3Rpb24oKSB7XG4gICAgLyoqXG4gICAgICogU3RvcmFnZSBvZiBNYXRyaXgyZFxuICAgICAqIEBuYW1lIGFycmF5XG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLk1hdHJpeDJkI1xuICAgICAqL1xuICAgIHRoaXMuYXJyYXkgPSBtYXQyZC5jcmVhdGUoKTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4MmQjXG4gICAgICovXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xufTtcblxuTWF0cml4MmQucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IE1hdHJpeDJkLFxuXG4gICAgLyoqXG4gICAgICogU2V0IGNvbXBvbmVudHMgZnJvbSBhcnJheVxuICAgICAqIEBwYXJhbSAge0Zsb2F0MzJBcnJheXxudW1iZXJbXX0gYXJyXG4gICAgICovXG4gICAgc2V0QXJyYXk6IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5W2ldID0gYXJyW2ldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBNYXRyaXgyZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAobmV3IE1hdHJpeDJkKCkpLmNvcHkodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0MmQuY29weSh0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG1hdHJpeCBkZXRlcm1pbmFudFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkZXRlcm1pbmFudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBtYXQyZC5kZXRlcm1pbmFudCh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgaWRlbnRpdHkgbWF0cml4XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIGlkZW50aXR5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWF0MmQuaWRlbnRpdHkodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludmVydCBzZWxmXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIGludmVydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hdDJkLmludmVydCh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11dGlwbHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gICAgICovXG4gICAgbXVsOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDJkLm11bCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11bHRpcGx5TGVmdFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBtdWxMZWZ0OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIG1hdDJkLm11bCh0aGlzLmFycmF5LCBiLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBtdWx0aXBseTogZnVuY3Rpb24oYikge1xuICAgICAgICBtYXQyZC5tdWx0aXBseSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgYSBhbmQgc2VsZiwgYSBpcyBvbiB0aGUgbGVmdFxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICBtdWx0aXBseUxlZnQ6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgbWF0MmQubXVsdGlwbHkodGhpcy5hcnJheSwgYi5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSBzZWxmIGJ5IGEgZ2l2ZW4gcmFkaWFuXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgIHJhZFxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAgICAgKi9cbiAgICByb3RhdGU6IGZ1bmN0aW9uKHJhZCkge1xuICAgICAgICBtYXQyZC5yb3RhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcmFkKTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2NhbGUgc2VsZiBieSBzXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICBzXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbihzKSB7XG4gICAgICAgIG1hdDJkLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHMuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgc2VsZiBieSB2XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICB2XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24odikge1xuICAgICAgICBtYXQyZC50cmFuc2xhdGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgdi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwodGhpcy5hcnJheSwgJywnKSArICddJztcbiAgICB9LFxuXG4gICAgdG9BcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBtYXQyZC5jb3B5KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbk1hdHJpeDJkLmRldGVybWluYW50ID0gZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiBtYXQyZC5kZXRlcm1pbmFudChhLmFycmF5KTtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAqL1xuTWF0cml4MmQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBtYXQyZC5pZGVudGl0eShvdXQuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAqL1xuTWF0cml4MmQuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgbWF0MmQuaW52ZXJ0KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLm11bCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG1hdDJkLm11bChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLm11bHRpcGx5ID0gTWF0cml4MmQubXVsO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gICByYWRcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgyZH1cbiAqL1xuTWF0cml4MmQucm90YXRlID0gZnVuY3Rpb24ob3V0LCBhLCByYWQpIHtcbiAgICBtYXQyZC5yb3RhdGUob3V0LmFycmF5LCBhLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDJkfVxuICovXG5NYXRyaXgyZC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIG1hdDJkLnNjYWxlKG91dC5hcnJheSwgYS5hcnJheSwgdi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDJkfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICB2XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4MmR9XG4gKi9cbk1hdHJpeDJkLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIG1hdDJkLnRyYW5zbGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXgyZDtcbiIsImltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDMgPSBnbE1hdHJpeC5tYXQzO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkubWF0aC5NYXRyaXgzXG4gKi9cbnZhciBNYXRyaXgzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgLyoqXG4gICAgICogU3RvcmFnZSBvZiBNYXRyaXgzXG4gICAgICogQG5hbWUgYXJyYXlcbiAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4MyNcbiAgICAgKi9cbiAgICB0aGlzLmFycmF5ID0gbWF0My5jcmVhdGUoKTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIF9kaXJ0eVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguTWF0cml4MyNcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG59O1xuXG5NYXRyaXgzLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBNYXRyaXgzLFxuXG4gICAgLyoqXG4gICAgICogU2V0IGNvbXBvbmVudHMgZnJvbSBhcnJheVxuICAgICAqIEBwYXJhbSAge0Zsb2F0MzJBcnJheXxudW1iZXJbXX0gYXJyXG4gICAgICovXG4gICAgc2V0QXJyYXk6IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5W2ldID0gYXJyW2ldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGFkanVnYXRlIG9mIHNlbGYsIGluLXBsYWNlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgYWRqb2ludDogZnVuY3Rpb24gKCkge1xuICAgICAgICBtYXQzLmFkam9pbnQodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsb25lIGEgbmV3IE1hdHJpeDNcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKG5ldyBNYXRyaXgzKCkpLmNvcHkodGhpcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgZnJvbSBiXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBjb3B5OiBmdW5jdGlvbiAoYikge1xuICAgICAgICBtYXQzLmNvcHkodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBtYXRyaXggZGV0ZXJtaW5hbnRcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1hdDMuZGV0ZXJtaW5hbnQodGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIE1hdHJpeDJkIGFcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4MmR9IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBmcm9tTWF0MmQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIG1hdDMuZnJvbU1hdDJkKHRoaXMuYXJyYXksIGEuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHVwcGVyLWxlZnQgM3gzIHZhbHVlcyBvZiBNYXRyaXg0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBmcm9tTWF0NDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgbWF0My5mcm9tTWF0NCh0aGlzLmFycmF5LCBhLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBhIHJvdGF0aW9uIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlF1YXRlcm5pb259IHFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBmcm9tUXVhdDogZnVuY3Rpb24gKHEpIHtcbiAgICAgICAgbWF0My5mcm9tUXVhdCh0aGlzLmFycmF5LCBxLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgaWRlbnRpdHkgbWF0cml4XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgaWRlbnRpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWF0My5pZGVudGl0eSh0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW52ZXJ0IHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBpbnZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWF0My5pbnZlcnQodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBtdXRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIG1hdDMubXVsKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgbXVsdGlwbHlMZWZ0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGFcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAgICAgKi9cbiAgICBtdWxMZWZ0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBtYXQzLm11bCh0aGlzLmFycmF5LCBhLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgbXVsdGlwbHk6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIG1hdDMubXVsdGlwbHkodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IGEgYW5kIHNlbGYsIGEgaXMgb24gdGhlIGxlZnRcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICAgICAqL1xuICAgIG11bHRpcGx5TGVmdDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgbWF0My5tdWx0aXBseSh0aGlzLmFycmF5LCBhLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHNlbGYgYnkgYSBnaXZlbiByYWRpYW5cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICAgcmFkXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgcm90YXRlOiBmdW5jdGlvbiAocmFkKSB7XG4gICAgICAgIG1hdDMucm90YXRlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHJhZCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHNlbGYgYnkgc1xuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSAgc1xuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbiAodikge1xuICAgICAgICBtYXQzLnNjYWxlKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIHYuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgc2VsZiBieSB2XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9ICB2XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gICAgICovXG4gICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAodikge1xuICAgICAgICBtYXQzLnRyYW5zbGF0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCB2LmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gICAgICovXG4gICAgbm9ybWFsRnJvbU1hdDQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIG1hdDMubm9ybWFsRnJvbU1hdDQodGhpcy5hcnJheSwgYS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRyYW5zcG9zZSBzZWxmLCBpbi1wbGFjZS5cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4Mn1cbiAgICAgKi9cbiAgICB0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWF0My50cmFuc3Bvc2UodGhpcy5hcnJheSwgdGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnWycgKyBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKHRoaXMuYXJyYXksICcsJykgKyAnXSc7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpO1xuICAgIH1cbn07XG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5hZGpvaW50ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuYWRqb2ludChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5jb3B5ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuY29weShvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbk1hdHJpeDMuZGV0ZXJtaW5hbnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiBtYXQzLmRldGVybWluYW50KGEuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gb3V0XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5pZGVudGl0eSA9IGZ1bmN0aW9uIChvdXQpIHtcbiAgICBtYXQzLmlkZW50aXR5KG91dC5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLmludmVydCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBtYXQzLmludmVydChvdXQuYXJyYXksIGEuYXJyYXkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMubXVsID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIG1hdDMubXVsKG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLm11bHRpcGx5ID0gTWF0cml4My5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9ICBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgyZH0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMuZnJvbU1hdDJkID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuZnJvbU1hdDJkKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLmZyb21NYXQ0ID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG1hdDMuZnJvbU1hdDQob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gICAgb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gYVxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMuZnJvbVF1YXQgPSBmdW5jdGlvbiAob3V0LCBxKSB7XG4gICAgbWF0My5mcm9tUXVhdChvdXQuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXg0fSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My5ub3JtYWxGcm9tTWF0NCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBtYXQzLm5vcm1hbEZyb21NYXQ0KG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDN9IGFcbiAqIEBwYXJhbSAge251bWJlcn0gIHJhZFxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMucm90YXRlID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgbWF0My5yb3RhdGUob3V0LmFycmF5LCBhLmFycmF5LCByYWQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yMn0gdlxuICogQHJldHVybiB7Y2xheS5tYXRoLk1hdHJpeDN9XG4gKi9cbk1hdHJpeDMuc2NhbGUgPSBmdW5jdGlvbiAob3V0LCBhLCB2KSB7XG4gICAgbWF0My5zY2FsZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5NYXRyaXgzfSBhXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguTWF0cml4M31cbiAqL1xuTWF0cml4My50cmFuc3Bvc2UgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgbWF0My50cmFuc3Bvc2Uob3V0LmFycmF5LCBhLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4M30gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ9IHZcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5NYXRyaXgzfVxuICovXG5NYXRyaXgzLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHYpIHtcbiAgICBtYXQzLnRyYW5zbGF0ZShvdXQuYXJyYXksIGEuYXJyYXksIHYuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRyaXgzO1xuIiwiaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi9WZWN0b3IzJztcbmltcG9ydCBWZWN0b3IyIGZyb20gJy4vVmVjdG9yMic7XG5cbi8qKlxuICogUmFuZG9tIG9yIGNvbnN0YW50IDFkLCAyZCwgM2QgdmVjdG9yIGdlbmVyYXRvclxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlZhbHVlXG4gKi9cbnZhciBWYWx1ZSA9IGZ1bmN0aW9uKCkge307XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnxjbGF5Lm1hdGguVmVjdG9yMnxjbGF5Lm1hdGguVmVjdG9yM30gW291dF1cbiAqIEByZXR1cm4ge251bWJlcnxjbGF5Lm1hdGguVmVjdG9yMnxjbGF5Lm1hdGguVmVjdG9yM31cbiAqL1xuVmFsdWUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG91dCkge307XG5cbi8vIENvbnN0YW50XG52YXIgQ29uc3RhbnRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcbn07XG5Db25zdGFudFZhbHVlLnByb3RvdHlwZSA9IG5ldyBWYWx1ZSgpO1xuQ29uc3RhbnRWYWx1ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdGFudFZhbHVlO1xuXG4vLyBWZWN0b3JcbnZhciBWZWN0b3JWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHZhbC5jb25zdHJ1Y3RvcjtcbiAgICB0aGlzLmdldCA9IGZ1bmN0aW9uKG91dCkge1xuICAgICAgICBpZiAoIW91dCkge1xuICAgICAgICAgICAgb3V0ID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LmNvcHkodmFsKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9O1xufTtcblZlY3RvclZhbHVlLnByb3RvdHlwZSA9IG5ldyBWYWx1ZSgpO1xuVmVjdG9yVmFsdWUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVjdG9yVmFsdWU7XG4vL1JhbmRvbSAxRFxudmFyIFJhbmRvbTFEID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG4gICAgdGhpcy5nZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiByYW5nZSArIG1pbjtcbiAgICB9O1xufTtcblJhbmRvbTFELnByb3RvdHlwZSA9IG5ldyBWYWx1ZSgpO1xuUmFuZG9tMUQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmFuZG9tMUQ7XG5cbi8vIFJhbmRvbTJEXG52YXIgUmFuZG9tMkQgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHZhciByYW5nZVggPSBtYXgueCAtIG1pbi54O1xuICAgIHZhciByYW5nZVkgPSBtYXgueSAtIG1pbi55O1xuXG4gICAgdGhpcy5nZXQgPSBmdW5jdGlvbihvdXQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgICAgIH1cbiAgICAgICAgVmVjdG9yMi5zZXQoXG4gICAgICAgICAgICBvdXQsXG4gICAgICAgICAgICByYW5nZVggKiBNYXRoLnJhbmRvbSgpICsgbWluLmFycmF5WzBdLFxuICAgICAgICAgICAgcmFuZ2VZICogTWF0aC5yYW5kb20oKSArIG1pbi5hcnJheVsxXVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcbn07XG5SYW5kb20yRC5wcm90b3R5cGUgPSBuZXcgVmFsdWUoKTtcblJhbmRvbTJELnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhbmRvbTJEO1xuXG52YXIgUmFuZG9tM0QgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHZhciByYW5nZVggPSBtYXgueCAtIG1pbi54O1xuICAgIHZhciByYW5nZVkgPSBtYXgueSAtIG1pbi55O1xuICAgIHZhciByYW5nZVogPSBtYXgueiAtIG1pbi56O1xuXG4gICAgdGhpcy5nZXQgPSBmdW5jdGlvbihvdXQpIHtcbiAgICAgICAgaWYgKCFvdXQpIHtcbiAgICAgICAgICAgIG91dCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIH1cbiAgICAgICAgVmVjdG9yMy5zZXQoXG4gICAgICAgICAgICBvdXQsXG4gICAgICAgICAgICByYW5nZVggKiBNYXRoLnJhbmRvbSgpICsgbWluLmFycmF5WzBdLFxuICAgICAgICAgICAgcmFuZ2VZICogTWF0aC5yYW5kb20oKSArIG1pbi5hcnJheVsxXSxcbiAgICAgICAgICAgIHJhbmdlWiAqIE1hdGgucmFuZG9tKCkgKyBtaW4uYXJyYXlbMl1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH07XG59O1xuUmFuZG9tM0QucHJvdG90eXBlID0gbmV3IFZhbHVlKCk7XG5SYW5kb20zRC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYW5kb20zRDtcblxuLy8gRmFjdG9yeSBtZXRob2RzXG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RhbnQgMWQgdmFsdWUgZ2VuZXJhdG9yXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGNvbnN0YW50XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmFsdWV9XG4gKi9cblZhbHVlLmNvbnN0YW50ID0gZnVuY3Rpb24oY29uc3RhbnQpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0YW50VmFsdWUoY29uc3RhbnQpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb25zdGFudCB2ZWN0b3IgdmFsdWUoMmQgb3IgM2QpIGdlbmVyYXRvclxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjJ8Y2xheS5tYXRoLlZlY3RvcjN9IHZlY3RvclxuICogQHJldHVybiB7Y2xheS5tYXRoLlZhbHVlfVxuICovXG5WYWx1ZS52ZWN0b3IgPSBmdW5jdGlvbih2ZWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IFZlY3RvclZhbHVlKHZlY3Rvcik7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhbmRvbSAxZCB2YWx1ZSBnZW5lcmF0b3JcbiAqIEBwYXJhbSAge251bWJlcn0gbWluXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG1heFxuICogQHJldHVybiB7Y2xheS5tYXRoLlZhbHVlfVxuICovXG5WYWx1ZS5yYW5kb20xRCA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIG5ldyBSYW5kb20xRChtaW4sIG1heCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhbmRvbSAyZCB2YWx1ZSBnZW5lcmF0b3JcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBtaW5cbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3IyfSBtYXhcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WYWx1ZX1cbiAqL1xuVmFsdWUucmFuZG9tMkQgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBuZXcgUmFuZG9tMkQobWluLCBtYXgpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByYW5kb20gM2QgdmFsdWUgZ2VuZXJhdG9yXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gbWluXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gbWF4XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmFsdWV9XG4gKi9cblZhbHVlLnJhbmRvbTNEID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gbmV3IFJhbmRvbTNEKG1pbiwgbWF4KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZhbHVlO1xuIiwiaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgdmVjNCA9IGdsTWF0cml4LnZlYzQ7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYWxpYXMgY2xheS5tYXRoLlZlY3RvcjRcbiAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gKiBAcGFyYW0ge251bWJlcn0geVxuICogQHBhcmFtIHtudW1iZXJ9IHpcbiAqIEBwYXJhbSB7bnVtYmVyfSB3XG4gKi9cbnZhciBWZWN0b3I0ID0gZnVuY3Rpb24oeCwgeSwgeiwgdykge1xuXG4gICAgeCA9IHggfHwgMDtcbiAgICB5ID0geSB8fCAwO1xuICAgIHogPSB6IHx8IDA7XG4gICAgdyA9IHcgfHwgMDtcblxuICAgIC8qKlxuICAgICAqIFN0b3JhZ2Ugb2YgVmVjdG9yNCwgcmVhZCBhbmQgd3JpdGUgb2YgeCwgeSwgeiwgdyB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIGluIGFycmF5XG4gICAgICogQWxsIG1ldGhvZHMgYWxzbyBvcGVyYXRlIG9uIHRoZSBhcnJheSBpbnN0ZWFkIG9mIHgsIHksIHosIHcgY29tcG9uZW50c1xuICAgICAqIEBuYW1lIGFycmF5XG4gICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjQjXG4gICAgICovXG4gICAgdGhpcy5hcnJheSA9IHZlYzQuZnJvbVZhbHVlcyh4LCB5LCB6LCB3KTtcblxuICAgIC8qKlxuICAgICAqIERpcnR5IGZsYWcgaXMgdXNlZCBieSB0aGUgTm9kZSB0byBkZXRlcm1pbmVcbiAgICAgKiBpZiB0aGUgbWF0cml4IGlzIHVwZGF0ZWQgdG8gbGF0ZXN0XG4gICAgICogQG5hbWUgX2RpcnR5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3I0I1xuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbn07XG5cblZlY3RvcjQucHJvdG90eXBlID0ge1xuXG4gICAgY29uc3RydWN0b3I6IFZlY3RvcjQsXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYiB0byBzZWxmXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBhZGQ6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5hZGQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB4LCB5IGFuZCB6IGNvbXBvbmVudHNcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgeVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHpcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB3XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgc2V0OiBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgICAgIHRoaXMuYXJyYXlbMF0gPSB4O1xuICAgICAgICB0aGlzLmFycmF5WzFdID0geTtcbiAgICAgICAgdGhpcy5hcnJheVsyXSA9IHo7XG4gICAgICAgIHRoaXMuYXJyYXlbM10gPSB3O1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgeCwgeSwgeiBhbmQgdyBjb21wb25lbnRzIGZyb20gYXJyYXlcbiAgICAgKiBAcGFyYW0gIHtGbG9hdDMyQXJyYXl8bnVtYmVyW119IGFyclxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIHNldEFycmF5OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdGhpcy5hcnJheVswXSA9IGFyclswXTtcbiAgICAgICAgdGhpcy5hcnJheVsxXSA9IGFyclsxXTtcbiAgICAgICAgdGhpcy5hcnJheVsyXSA9IGFyclsyXTtcbiAgICAgICAgdGhpcy5hcnJheVszXSA9IGFyclszXTtcblxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBhIG5ldyBWZWN0b3I0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjQodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29weSBmcm9tIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIGNvcHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5jb3B5KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGlzdGFuY2VcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWM0LmRpc3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3RhbmNlIGJldHdlZW4gc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRpc3RhbmNlOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB2ZWM0LmRpc3RhbmNlKHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgZGl2aWRlXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBkaXY6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5kaXYodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSBzZWxmIGJ5IGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIGRpdmlkZTogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWM0LmRpdmlkZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRG90IHByb2R1Y3Qgb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGRvdDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjNC5kb3QodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIG9mIGxlbmd0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBsZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmVjNC5sZW4odGhpcy5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGxlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWM0Lmxlbmd0aCh0aGlzLmFycmF5KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gYSBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICB0XG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgbGVycDogZnVuY3Rpb24oYSwgYiwgdCkge1xuICAgICAgICB2ZWM0LmxlcnAodGhpcy5hcnJheSwgYS5hcnJheSwgYi5hcnJheSwgdCk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2Ygc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgbWluOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHZlYzQubWluKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIHNlbGYgYW5kIGJcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIG1heDogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWM0Lm1heCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIG11bHRpcGx5XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBtdWw6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5tdWwodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE11dGlwbHkgc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgbXVsdGlwbHk6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5tdWx0aXBseSh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBiLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTmVnYXRlIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBuZWdhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2ZWM0Lm5lZ2F0ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHNlbGZcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2ZWM0Lm5vcm1hbGl6ZSh0aGlzLmFycmF5LCB0aGlzLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgcmFuZG9tIHgsIHksIHosIHcgY29tcG9uZW50cyB3aXRoIGEgZ2l2ZW4gc2NhbGVcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHNjYWxlXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgcmFuZG9tOiBmdW5jdGlvbihzY2FsZSkge1xuICAgICAgICB2ZWM0LnJhbmRvbSh0aGlzLmFycmF5LCBzY2FsZSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNjYWxlIHNlbGZcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICAgICAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICAgICAqL1xuICAgIHNjYWxlOiBmdW5jdGlvbihzKSB7XG4gICAgICAgIHZlYzQuc2NhbGUodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcyk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTY2FsZSBiIGFuZCBhZGQgdG8gc2VsZlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBzY2FsZUFuZEFkZDogZnVuY3Rpb24oYiwgcykge1xuICAgICAgICB2ZWM0LnNjYWxlQW5kQWRkKHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXksIHMpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3Igc3F1YXJlZERpc3RhbmNlXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3FyRGlzdDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjNC5zcXJEaXN0KHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gc2VsZiBhbmQgYlxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxdWFyZWREaXN0YW5jZTogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdmVjNC5zcXVhcmVkRGlzdGFuY2UodGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBzcXVhcmVkTGVuZ3RoXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNxckxlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2ZWM0LnNxckxlbih0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlZCBsZW5ndGggb2Ygc2VsZlxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBzcXVhcmVkTGVuZ3RoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQuc3F1YXJlZExlbmd0aCh0aGlzLmFycmF5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHN1YnRyYWN0XG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBzdWI6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgdmVjNC5zdWIodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgYi5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IGIgZnJvbSBzZWxmXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24oYikge1xuICAgICAgICB2ZWM0LnN1YnRyYWN0KHRoaXMuYXJyYXksIHRoaXMuYXJyYXksIGIuYXJyYXkpO1xuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gc2VsZiB3aXRoIGEgTWF0cml4NCBtXG4gICAgICogQHBhcmFtICB7Y2xheS5tYXRoLk1hdHJpeDR9IG1cbiAgICAgKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1NYXQ0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NCh0aGlzLmFycmF5LCB0aGlzLmFycmF5LCBtLmFycmF5KTtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHNlbGYgd2l0aCBhIFF1YXRlcm5pb24gcVxuICAgICAqIEBwYXJhbSAge2NsYXkubWF0aC5RdWF0ZXJuaW9ufSBxXG4gICAgICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gICAgICovXG4gICAgdHJhbnNmb3JtUXVhdDogZnVuY3Rpb24ocSkge1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybVF1YXQodGhpcy5hcnJheSwgdGhpcy5hcnJheSwgcS5hcnJheSk7XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwodGhpcy5hcnJheSwgJywnKSArICddJztcbiAgICB9LFxuXG4gICAgdG9BcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSk7XG4gICAgfVxufTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gR2V0dGVyIGFuZCBTZXR0ZXJcbmlmIChkZWZpbmVQcm9wZXJ0eSkge1xuXG4gICAgdmFyIHByb3RvID0gVmVjdG9yNC5wcm90b3R5cGU7XG4gICAgLyoqXG4gICAgICogQG5hbWUgeFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3I0XG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd4Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzBdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVswXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSB5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyT2YgY2xheS5tYXRoLlZlY3RvcjRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBkZWZpbmVQcm9wZXJ0eShwcm90bywgJ3knLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbMV07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5WzFdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHpcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJPZiBjbGF5Lm1hdGguVmVjdG9yNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGRlZmluZVByb3BlcnR5KHByb3RvLCAneicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcnJheVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlbMl0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgd1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlck9mIGNsYXkubWF0aC5WZWN0b3I0XG4gICAgICogQGluc3RhbmNlXG4gICAgICovXG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG8sICd3Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5WzNdO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcnJheVszXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIFN1cHBseSBtZXRob2RzIHRoYXQgYXJlIG5vdCBpbiBwbGFjZVxuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjNC5hZGQob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB4XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB5XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB6XG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICB2ZWM0LnNldChvdXQuYXJyYXksIHgsIHksIHosIHcpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQuY29weSA9IGZ1bmN0aW9uKG91dCwgYikge1xuICAgIHZlYzQuY29weShvdXQuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3I0LmRpc3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIHZlYzQuZGlzdGFuY2UoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjQuZGlzdGFuY2UgPSBWZWN0b3I0LmRpc3Q7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5kaXYgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWM0LmRpdmlkZShvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5kaXZpZGUgPSBWZWN0b3I0LmRpdjtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yNC5kb3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIHZlYzQuZG90KGEuYXJyYXksIGIuYXJyYXkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5WZWN0b3I0LmxlbiA9IGZ1bmN0aW9uKGIpIHtcbiAgICByZXR1cm4gdmVjNC5sZW5ndGgoYi5hcnJheSk7XG59O1xuXG4vLyBWZWN0b3I0Lmxlbmd0aCA9IFZlY3RvcjQubGVuO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHBhcmFtICB7bnVtYmVyfSAgdFxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQubGVycCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgdCkge1xuICAgIHZlYzQubGVycChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHQpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYlxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgdmVjNC5taW4ob3V0LmFycmF5LCBhLmFycmF5LCBiLmFycmF5KTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZlYzQubWF4KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5tdWwgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWM0Lm11bHRpcGx5KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm11bHRpcGx5ID0gVmVjdG9yNC5tdWw7XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZlYzQubmVnYXRlKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZlYzQubm9ybWFsaXplKG91dC5hcnJheSwgYS5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0LnJhbmRvbSA9IGZ1bmN0aW9uKG91dCwgc2NhbGUpIHtcbiAgICB2ZWM0LnJhbmRvbShvdXQuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gb3V0XG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7bnVtYmVyfSAgc2NhbGVcbiAqIEByZXR1cm4ge2NsYXkubWF0aC5WZWN0b3I0fVxuICovXG5WZWN0b3I0LnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCBzY2FsZSkge1xuICAgIHZlYzQuc2NhbGUob3V0LmFycmF5LCBhLmFycmF5LCBzY2FsZSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBzY2FsZVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQuc2NhbGVBbmRBZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIHNjYWxlKSB7XG4gICAgdmVjNC5zY2FsZUFuZEFkZChvdXQuYXJyYXksIGEuYXJyYXksIGIuYXJyYXksIHNjYWxlKTtcbiAgICBvdXQuX2RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yNH0gYVxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yNC5zcXJEaXN0ID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiB2ZWM0LnNxckRpc3QoYS5hcnJheSwgYi5hcnJheSk7XG59O1xuXG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjQuc3F1YXJlZERpc3RhbmNlID0gVmVjdG9yNC5zcXJEaXN0O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblZlY3RvcjQuc3FyTGVuID0gZnVuY3Rpb24oYSkge1xuICAgIHJldHVybiB2ZWM0LnNxckxlbihhLmFycmF5KTtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuVmVjdG9yNC5zcXVhcmVkTGVuZ3RoID0gVmVjdG9yNC5zcXJMZW47XG5cbi8qKlxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5zdWIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2ZWM0LnN1YnRyYWN0KG91dC5hcnJheSwgYS5hcnJheSwgYi5hcnJheSk7XG4gICAgb3V0Ll9kaXJ0eSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbn07XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IG91dFxuICogQHBhcmFtICB7Y2xheS5tYXRoLlZlY3RvcjR9IGFcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBiXG4gKiBAcmV0dXJuIHtjbGF5Lm1hdGguVmVjdG9yNH1cbiAqL1xuVmVjdG9yNC5zdWJ0cmFjdCA9IFZlY3RvcjQuc3ViO1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguTWF0cml4NH0gbVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZlYzQudHJhbnNmb3JtTWF0NChvdXQuYXJyYXksIGEuYXJyYXksIG0uYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBvdXRcbiAqIEBwYXJhbSAge2NsYXkubWF0aC5WZWN0b3I0fSBhXG4gKiBAcGFyYW0gIHtjbGF5Lm1hdGguUXVhdGVybmlvbn0gcVxuICogQHJldHVybiB7Y2xheS5tYXRoLlZlY3RvcjR9XG4gKi9cblZlY3RvcjQudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZlYzQudHJhbnNmb3JtUXVhdChvdXQuYXJyYXksIGEuYXJyYXksIHEuYXJyYXkpO1xuICAgIG91dC5fZGlydHkgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWZWN0b3I0O1xuIiwiaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGFsaWFzIGNsYXkucGFydGljbGUuUGFydGljbGVcbiAqL1xudmFyIFBhcnRpY2xlID0gZnVuY3Rpb24oKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgLyoqXG4gICAgICogVXNlIGV1bGVyIGFuZ2xlIHRvIHJlcHJlc2VudCBwYXJ0aWNsZSByb3RhdGlvblxuICAgICAqIEB0eXBlIHtjbGF5Lm1hdGguVmVjdG9yM31cbiAgICAgKi9cbiAgICB0aGlzLnJvdGF0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZlY3RvcjN9XG4gICAgICovXG4gICAgdGhpcy52ZWxvY2l0eSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAqL1xuICAgIHRoaXMuYW5ndWxhclZlbG9jaXR5ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5saWZlID0gMTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5hZ2UgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnNwcml0ZVNpemUgPSAxO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLndlaWdodCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Y2xheS5wYXJ0aWNsZS5FbWl0dGVyfVxuICAgICAqL1xuICAgIHRoaXMuZW1pdHRlciA9IG51bGw7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBwYXJ0aWNsZSBwb3NpdGlvblxuICogQHBhcmFtICB7bnVtYmVyfSBkZWx0YVRpbWVcbiAqL1xuUGFydGljbGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGRlbHRhVGltZSkge1xuICAgIGlmICh0aGlzLnZlbG9jaXR5KSB7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQodGhpcy5wb3NpdGlvbi5hcnJheSwgdGhpcy5wb3NpdGlvbi5hcnJheSwgdGhpcy52ZWxvY2l0eS5hcnJheSwgZGVsdGFUaW1lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYW5ndWxhclZlbG9jaXR5KSB7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQodGhpcy5yb3RhdGlvbi5hcnJheSwgdGhpcy5yb3RhdGlvbi5hcnJheSwgdGhpcy5hbmd1bGFyVmVsb2NpdHkuYXJyYXksIGRlbHRhVGltZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFydGljbGU7XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcuLi9jb3JlL0Jhc2UnO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBQYXJ0aWNsZSBmcm9tICcuL1BhcnRpY2xlJztcbmltcG9ydCBWYWx1ZSBmcm9tICcuLi9tYXRoL1ZhbHVlJztcbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIHZlYzMgPSAgZ2xNYXRyaXgudmVjMztcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5wYXJ0aWNsZS5FbWl0dGVyXG4gKiBAZXh0ZW5kcyBjbGF5LmNvcmUuQmFzZVxuICovXG52YXIgRW1pdHRlciA9IEJhc2UuZXh0ZW5kKFxuLyoqIEBsZW5kcyBjbGF5LnBhcnRpY2xlLkVtaXR0ZXIjICovXG57XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgcGFydGljbGVzIGNyZWF0ZWQgYnkgdGhpcyBlbWl0dGVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBtYXg6IDEwMDAsXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHBhcnRpY2xlcyBjcmVhdGVkIGJ5IHRoaXMgZW1pdHRlciBlYWNoIHNob3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGFtb3VudDogMjAsXG5cbiAgICAvLyBJbml0IHN0YXR1cyBmb3IgZWFjaCBwYXJ0aWNsZVxuICAgIC8qKlxuICAgICAqIFBhcnRpY2xlIGxpZmUgZ2VuZXJhdG9yXG4gICAgICogQHR5cGUgez9jbGF5Lm1hdGguVmFsdWUuPG51bWJlcj59XG4gICAgICovXG4gICAgbGlmZTogbnVsbCxcbiAgICAvKipcbiAgICAgKiBQYXJ0aWNsZSBwb3NpdGlvbiBnZW5lcmF0b3JcbiAgICAgKiBAdHlwZSB7P2NsYXkubWF0aC5WYWx1ZS48Y2xheS5tYXRoLlZlY3RvcjM+fVxuICAgICAqL1xuICAgIHBvc2l0aW9uOiBudWxsLFxuICAgIC8qKlxuICAgICAqIFBhcnRpY2xlIHJvdGF0aW9uIGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxjbGF5Lm1hdGguVmVjdG9yMz59XG4gICAgICovXG4gICAgcm90YXRpb246IG51bGwsXG4gICAgLyoqXG4gICAgICogUGFydGljbGUgdmVsb2NpdHkgZ2VuZXJhdG9yXG4gICAgICogQHR5cGUgez9jbGF5Lm1hdGguVmFsdWUuPGNsYXkubWF0aC5WZWN0b3IzPn1cbiAgICAgKi9cbiAgICB2ZWxvY2l0eTogbnVsbCxcbiAgICAvKipcbiAgICAgKiBQYXJ0aWNsZSBhbmd1bGFyIHZlbG9jaXR5IGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxjbGF5Lm1hdGguVmVjdG9yMz59XG4gICAgICovXG4gICAgYW5ndWxhclZlbG9jaXR5OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFBhcnRpY2xlIHNwcml0ZSBzaXplIGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxudW1iZXI+fVxuICAgICAqL1xuICAgIHNwcml0ZVNpemU6IG51bGwsXG4gICAgLyoqXG4gICAgICogUGFydGljbGUgd2VpZ2h0IGdlbmVyYXRvclxuICAgICAqIEB0eXBlIHs/Y2xheS5tYXRoLlZhbHVlLjxudW1iZXI+fVxuICAgICAqL1xuICAgIHdlaWdodDogbnVsbCxcblxuICAgIF9wYXJ0aWNsZVBvb2w6IG51bGxcblxufSwgZnVuY3Rpb24oKSB7XG5cbiAgICB0aGlzLl9wYXJ0aWNsZVBvb2wgPSBbXTtcblxuICAgIC8vIFRPRE8gUmVkdWNlIGhlYXAgbWVtb3J5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1heDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0aWNsZSA9IG5ldyBQYXJ0aWNsZSgpO1xuICAgICAgICBwYXJ0aWNsZS5lbWl0dGVyID0gdGhpcztcbiAgICAgICAgdGhpcy5fcGFydGljbGVQb29sLnB1c2gocGFydGljbGUpO1xuXG4gICAgICAgIGlmICh0aGlzLnZlbG9jaXR5KSB7XG4gICAgICAgICAgICBwYXJ0aWNsZS52ZWxvY2l0eSA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYW5ndWxhclZlbG9jaXR5KSB7XG4gICAgICAgICAgICBwYXJ0aWNsZS5hbmd1bGFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB9XG4gICAgfVxufSxcbi8qKiBAbGVuZHMgY2xheS5wYXJ0aWNsZS5FbWl0dGVyLnByb3RvdHlwZSAqL1xue1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZXIgbnVtYmVyIG9mIHBhcnRpY2xlcyBhbmQgcHVzaCB0aGVtIHRvIGEgZ2l2ZW4gcGFydGljbGUgbGlzdC4gRW1taXQgbnVtYmVyIGlzIGRlZmluZWQgYnkgYW1vdW50IHByb3BlcnR5XG4gICAgICogQHBhcmFtICB7QXJyYXkuPGNsYXkucGFydGljbGUuUGFydGljbGU+fSBvdXRcbiAgICAgKi9cbiAgICBlbWl0OiBmdW5jdGlvbihvdXQpIHtcbiAgICAgICAgdmFyIGFtb3VudCA9IE1hdGgubWluKHRoaXMuX3BhcnRpY2xlUG9vbC5sZW5ndGgsIHRoaXMuYW1vdW50KTtcblxuICAgICAgICB2YXIgcGFydGljbGU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW1vdW50OyBpKyspIHtcbiAgICAgICAgICAgIHBhcnRpY2xlID0gdGhpcy5fcGFydGljbGVQb29sLnBvcCgpO1xuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYXJ0aWNsZSBzdGF0dXNcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi5nZXQocGFydGljbGUucG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdGF0aW9uLmdldChwYXJ0aWNsZS5yb3RhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52ZWxvY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVsb2NpdHkuZ2V0KHBhcnRpY2xlLnZlbG9jaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmFuZ3VsYXJWZWxvY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ndWxhclZlbG9jaXR5LmdldChwYXJ0aWNsZS5hbmd1bGFyVmVsb2NpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubGlmZSkge1xuICAgICAgICAgICAgICAgIHBhcnRpY2xlLmxpZmUgPSB0aGlzLmxpZmUuZ2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zcHJpdGVTaXplKSB7XG4gICAgICAgICAgICAgICAgcGFydGljbGUuc3ByaXRlU2l6ZSA9IHRoaXMuc3ByaXRlU2l6ZS5nZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLndlaWdodCkge1xuICAgICAgICAgICAgICAgIHBhcnRpY2xlLndlaWdodCA9IHRoaXMud2VpZ2h0LmdldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydGljbGUuYWdlID0gMDtcblxuICAgICAgICAgICAgb3V0LnB1c2gocGFydGljbGUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBLaWxsIGEgZGVhZCBwYXJ0aWNsZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIHBvb2xcbiAgICAgKiBAcGFyYW0gIHtjbGF5LnBhcnRpY2xlLlBhcnRpY2xlfSBwYXJ0aWNsZVxuICAgICAqL1xuICAgIGtpbGw6IGZ1bmN0aW9uKHBhcnRpY2xlKSB7XG4gICAgICAgIHRoaXMuX3BhcnRpY2xlUG9vbC5wdXNoKHBhcnRpY2xlKTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb25zdGFudCAxZCB2YWx1ZSBnZW5lcmF0b3IuIEFsaWFzIGZvciB7QGxpbmsgY2xheS5tYXRoLlZhbHVlLmNvbnN0YW50fVxuICogQGZ1bmN0aW9uIGNsYXkucGFydGljbGUuRW1pdHRlci5jb25zdGFudFxuICovXG5FbWl0dGVyLmNvbnN0YW50ID0gVmFsdWUuY29uc3RhbnQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RhbnQgdmVjdG9yIHZhbHVlKDJkIG9yIDNkKSBnZW5lcmF0b3IuIEFsaWFzIGZvciB7QGxpbmsgY2xheS5tYXRoLlZhbHVlLnZlY3Rvcn1cbiAqIEBmdW5jdGlvbiBjbGF5LnBhcnRpY2xlLkVtaXR0ZXIudmVjdG9yXG4gKi9cbkVtaXR0ZXIudmVjdG9yID0gVmFsdWUudmVjdG9yO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhbmRvbSAxZCB2YWx1ZSBnZW5lcmF0b3IuIEFsaWFzIGZvciB7QGxpbmsgY2xheS5tYXRoLlZhbHVlLnJhbmRvbTFEfVxuICogQGZ1bmN0aW9uIGNsYXkucGFydGljbGUuRW1pdHRlci5yYW5kb20xRFxuICovXG5FbWl0dGVyLnJhbmRvbTFEID0gVmFsdWUucmFuZG9tMUQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgcmFuZG9tIDJkIHZhbHVlIGdlbmVyYXRvci4gQWxpYXMgZm9yIHtAbGluayBjbGF5Lm1hdGguVmFsdWUucmFuZG9tMkR9XG4gKiBAZnVuY3Rpb24gY2xheS5wYXJ0aWNsZS5FbWl0dGVyLnJhbmRvbTJEXG4gKi9cbkVtaXR0ZXIucmFuZG9tMkQgPSBWYWx1ZS5yYW5kb20yRDtcblxuLyoqXG4gKiBDcmVhdGUgYSByYW5kb20gM2QgdmFsdWUgZ2VuZXJhdG9yLiBBbGlhcyBmb3Ige0BsaW5rIGNsYXkubWF0aC5WYWx1ZS5yYW5kb20zRH1cbiAqIEBmdW5jdGlvbiBjbGF5LnBhcnRpY2xlLkVtaXR0ZXIucmFuZG9tM0RcbiAqL1xuRW1pdHRlci5yYW5kb20zRCA9IFZhbHVlLnJhbmRvbTNEO1xuXG5leHBvcnQgZGVmYXVsdCBFbWl0dGVyO1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi4vY29yZS9CYXNlJztcbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGFydGljbGUuRmllbGRcbiAqIEBleHRlbmRzIGNsYXkuY29yZS5CYXNlXG4gKi9cbnZhciBGaWVsZCA9IEJhc2UuZXh0ZW5kKHt9LCB7XG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBmaWVsZCB0byB0aGUgcGFydGljbGUgYW5kIHVwZGF0ZSB0aGUgcGFydGljbGUgdmVsb2NpdHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gdmVsb2NpdHlcbiAgICAgKiBAcGFyYW0gIHtjbGF5Lm1hdGguVmVjdG9yM30gcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHdlaWdodFxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGVsdGFUaW1lXG4gICAgICogQG1lbWJlck9mIGNsYXkucGFydGljbGUuRmllbGQucHJvdG90eXBlXG4gICAgICovXG4gICAgYXBwbHlUbzogZnVuY3Rpb24odmVsb2NpdHksIHBvc2l0aW9uLCB3ZWlnaHQsIGRlbHRhVGltZSkge31cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBGaWVsZDtcbiIsImltcG9ydCBGaWVsZCBmcm9tICcuL0ZpZWxkJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgZ2xNYXRyaXggZnJvbSAnLi4vZGVwL2dsbWF0cml4JztcbnZhciB2ZWMzID0gIGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIGNsYXkucGFydGljbGUuRm9yY2VGaWVsZFxuICogQGV4dGVuZHMgY2xheS5wYXJ0aWNsZS5GaWVsZFxuICovXG52YXIgRm9yY2VGaWVsZCA9IEZpZWxkLmV4dGVuZChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb3JjZTogbmV3IFZlY3RvcjMoKVxuICAgIH07XG59LCB7XG4gICAgYXBwbHlUbzogZnVuY3Rpb24odmVsb2NpdHksIHBvc2l0aW9uLCB3ZWlnaHQsIGRlbHRhVGltZSkge1xuICAgICAgICBpZiAod2VpZ2h0ID4gMCkge1xuICAgICAgICAgICAgdmVjMy5zY2FsZUFuZEFkZCh2ZWxvY2l0eS5hcnJheSwgdmVsb2NpdHkuYXJyYXksIHRoaXMuZm9yY2UuYXJyYXksIGRlbHRhVGltZSAvIHdlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRm9yY2VGaWVsZDtcbiIsImV4cG9ydCBkZWZhdWx0IFwiQGV4cG9ydCBjbGF5LnBhcnRpY2xlLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXcgOiBXT1JMRFZJRVc7XFxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb24gOiBQUk9KRUNUSU9OO1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uIDogUE9TSVRJT047XFxuYXR0cmlidXRlIHZlYzMgbm9ybWFsIDogTk9STUFMO1xcbiNpZmRlZiBVVl9BTklNQVRJT05cXG5hdHRyaWJ1dGUgdmVjMiB0ZXhjb29yZDAgOiBURVhDT09SRF8wO1xcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkMSA6IFRFWENPT1JEXzE7XFxudmFyeWluZyB2ZWMyIHZfVXYwO1xcbnZhcnlpbmcgdmVjMiB2X1V2MTtcXG4jZW5kaWZcXG52YXJ5aW5nIGZsb2F0IHZfQWdlO1xcbnZvaWQgbWFpbigpIHtcXG4gICAgdl9BZ2UgPSBub3JtYWwueDtcXG4gICAgZmxvYXQgcm90YXRpb24gPSBub3JtYWwueTtcXG4gICAgdmVjNCB3b3JsZFZpZXdQb3NpdGlvbiA9IHdvcmxkVmlldyAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxuICAgIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbiAqIHdvcmxkVmlld1Bvc2l0aW9uO1xcbiAgICBmbG9hdCB3ID0gZ2xfUG9zaXRpb24udztcXG4gICAgZ2xfUG9pbnRTaXplID0gbm9ybWFsLnogKiBwcm9qZWN0aW9uWzBdLnggLyB3O1xcbiAgICAjaWZkZWYgVVZfQU5JTUFUSU9OXFxuICAgICAgICB2X1V2MCA9IHRleGNvb3JkMDtcXG4gICAgICAgIHZfVXYxID0gdGV4Y29vcmQxO1xcbiAgICAjZW5kaWZcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS5wYXJ0aWNsZS5mcmFnbWVudFxcbnVuaWZvcm0gc2FtcGxlcjJEIHNwcml0ZTtcXG51bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudDtcXG51bmlmb3JtIHZlYzMgY29sb3IgOiBbMS4wLCAxLjAsIDEuMF07XFxudW5pZm9ybSBmbG9hdCBhbHBoYSA6IDEuMDtcXG52YXJ5aW5nIGZsb2F0IHZfQWdlO1xcbiNpZmRlZiBVVl9BTklNQVRJT05cXG52YXJ5aW5nIHZlYzIgdl9VdjA7XFxudmFyeWluZyB2ZWMyIHZfVXYxO1xcbiNlbmRpZlxcbnZvaWQgbWFpbigpIHtcXG4gICAgdmVjNCBjb2xvciA9IHZlYzQoY29sb3IsIGFscGhhKTtcXG4gICAgI2lmZGVmIFNQUklURV9FTkFCTEVEXFxuICAgICAgICAjaWZkZWYgVVZfQU5JTUFUSU9OXFxuICAgICAgICAgICAgY29sb3IgKj0gdGV4dHVyZTJEKHNwcml0ZSwgbWl4KHZfVXYwLCB2X1V2MSwgZ2xfUG9pbnRDb29yZCkpO1xcbiAgICAgICAgI2Vsc2VcXG4gICAgICAgICAgICBjb2xvciAqPSB0ZXh0dXJlMkQoc3ByaXRlLCBnbF9Qb2ludENvb3JkKTtcXG4gICAgICAgICNlbmRpZlxcbiAgICAjZW5kaWZcXG4gICAgI2lmZGVmIEdSQURJRU5UX0VOQUJMRURcXG4gICAgICAgIGNvbG9yICo9IHRleHR1cmUyRChncmFkaWVudCwgdmVjMih2X0FnZSwgMC41KSk7XFxuICAgICNlbmRpZlxcbiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXG59XFxuQGVuZFwiO1xuIiwiaW1wb3J0IFJlbmRlcmFibGUgZnJvbSAnLi4vUmVuZGVyYWJsZSc7XG5cbmltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuXG5pbXBvcnQgcGFydGljbGVFc3NsIGZyb20gJy4vcGFydGljbGUuZ2xzbC5qcyc7XG5TaGFkZXJbJ2ltcG9ydCddKHBhcnRpY2xlRXNzbCk7XG5cbnZhciBwYXJ0aWNsZVNoYWRlciA9IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5wYXJ0aWNsZS52ZXJ0ZXgnKSwgU2hhZGVyLnNvdXJjZSgnY2xheS5wYXJ0aWNsZS5mcmFnbWVudCcpKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5wYXJ0aWNsZS5QYXJ0aWNsZVJlbmRlcmFibGVcbiAqIEBleHRlbmRzIGNsYXkuUmVuZGVyYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgdmFyIHBhcnRpY2xlUmVuZGVyYWJsZSA9IG5ldyBjbGF5LnBhcnRpY2xlLlBhcnRpY2xlUmVuZGVyYWJsZSh7XG4gKiAgICAgICAgIHNwcml0ZUFuaW1hdGlvblRpbGVYOiA0LFxuICogICAgICAgICBzcHJpdGVBbmltYXRpb25UaWxlWTogNCxcbiAqICAgICAgICAgc3ByaXRlQW5pbWF0aW9uUmVwZWF0OiAxXG4gKiAgICAgfSk7XG4gKiAgICAgc2NlbmUuYWRkKHBhcnRpY2xlUmVuZGVyYWJsZSk7XG4gKiAgICAgLy8gRW5hYmxlIHV2IGFuaW1hdGlvbiBpbiB0aGUgc2hhZGVyXG4gKiAgICAgcGFydGljbGVSZW5kZXJhYmxlLm1hdGVyaWFsLmRlZmluZSgnYm90aCcsICdVVl9BTklNQVRJT04nKTtcbiAqICAgICB2YXIgRW1pdHRlciA9IGNsYXkucGFydGljbGUuRW1pdHRlcjtcbiAqICAgICB2YXIgVmVjdG9yMyA9IGNsYXkubWF0aC5WZWN0b3IzO1xuICogICAgIHZhciBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoe1xuICogICAgICAgICBtYXg6IDIwMDAsXG4gKiAgICAgICAgIGFtb3VudDogMTAwLFxuICogICAgICAgICBsaWZlOiBFbWl0dGVyLnJhbmRvbTFEKDEwLCAyMCksXG4gKiAgICAgICAgIHBvc2l0aW9uOiBFbWl0dGVyLnZlY3RvcihuZXcgVmVjdG9yMygpKSxcbiAqICAgICAgICAgdmVsb2NpdHk6IEVtaXR0ZXIucmFuZG9tM0QobmV3IFZlY3RvcjMoLTEwLCAwLCAtMTApLCBuZXcgVmVjdG9yMygxMCwgMCwgMTApKTtcbiAqICAgICB9KTtcbiAqICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuYWRkRW1pdHRlcihlbWl0dGVyKTtcbiAqICAgICB2YXIgZ3Jhdml0eUZpZWxkID0gbmV3IGNsYXkucGFydGljbGUuRm9yY2VGaWVsZCgpO1xuICogICAgIGdyYXZpdHlGaWVsZC5mb3JjZS55ID0gLTEwO1xuICogICAgIHBhcnRpY2xlUmVuZGVyYWJsZS5hZGRGaWVsZChncmF2aXR5RmllbGQpO1xuICogICAgIC4uLlxuICogICAgIGFuaW1hdGlvbi5vbignZnJhbWUnLCBmdW5jdGlvbihmcmFtZVRpbWUpIHtcbiAqICAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLnVwZGF0ZVBhcnRpY2xlcyhmcmFtZVRpbWUpO1xuICogICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XG4gKiAgICAgfSk7XG4gKi9cbnZhciBQYXJ0aWNsZVJlbmRlcmFibGUgPSBSZW5kZXJhYmxlLmV4dGVuZChcbi8qKiBAbGVuZHMgY2xheS5wYXJ0aWNsZS5QYXJ0aWNsZVJlbmRlcmFibGUjICovXG57XG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgbG9vcDogdHJ1ZSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBvbmVzaG90OiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBEdXJhdGlvbiBvZiBwYXJ0aWNsZSBzeXN0ZW0gaW4gbWlsbGlzZWNvbmRzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogMSxcblxuICAgIC8vIFVWIEFuaW1hdGlvblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3ByaXRlQW5pbWF0aW9uVGlsZVg6IDEsXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBzcHJpdGVBbmltYXRpb25UaWxlWTogMSxcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHNwcml0ZUFuaW1hdGlvblJlcGVhdDogMCxcblxuICAgIG1vZGU6IFJlbmRlcmFibGUuUE9JTlRTLFxuXG4gICAgaWdub3JlUGlja2luZzogdHJ1ZSxcblxuICAgIF9lbGFwc2VkVGltZTogMCxcblxuICAgIF9lbWl0dGluZzogdHJ1ZVxuXG59LCBmdW5jdGlvbigpe1xuXG4gICAgdGhpcy5nZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSh7XG4gICAgICAgIGR5bmFtaWM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5tYXRlcmlhbCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgIHNoYWRlcjogcGFydGljbGVTaGFkZXIsXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHRoTWFzazogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXRlcmlhbC5lbmFibGVUZXh0dXJlKCdzcHJpdGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLl9maWVsZHMgPSBbXTtcbiAgICB0aGlzLl9lbWl0dGVycyA9IFtdO1xufSxcbi8qKiBAbGVuZHMgY2xheS5wYXJ0aWNsZS5QYXJ0aWNsZVJlbmRlcmFibGUucHJvdG90eXBlICovXG57XG5cbiAgICBjdWxsaW5nOiBmYWxzZSxcblxuICAgIGZydXN0dW1DdWxsaW5nOiBmYWxzZSxcblxuICAgIGNhc3RTaGFkb3c6IGZhbHNlLFxuICAgIHJlY2VpdmVTaGFkb3c6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogQWRkIGVtaXR0ZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkucGFydGljbGUuRW1pdHRlcn0gZW1pdHRlclxuICAgICAqL1xuICAgIGFkZEVtaXR0ZXI6IGZ1bmN0aW9uKGVtaXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlcnMucHVzaChlbWl0dGVyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGVtaXR0ZXJcbiAgICAgKiBAcGFyYW0ge2NsYXkucGFydGljbGUuRW1pdHRlcn0gZW1pdHRlclxuICAgICAqL1xuICAgIHJlbW92ZUVtaXR0ZXI6IGZ1bmN0aW9uKGVtaXR0ZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlcnMuc3BsaWNlKHRoaXMuX2VtaXR0ZXJzLmluZGV4T2YoZW1pdHRlciksIDEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgZmllbGRcbiAgICAgKiBAcGFyYW0ge2NsYXkucGFydGljbGUuRmllbGR9IGZpZWxkXG4gICAgICovXG4gICAgYWRkRmllbGQ6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGZpZWxkXG4gICAgICogQHBhcmFtIHtjbGF5LnBhcnRpY2xlLkZpZWxkfSBmaWVsZFxuICAgICAqL1xuICAgIHJlbW92ZUZpZWxkOiBmdW5jdGlvbihmaWVsZCkge1xuICAgICAgICB0aGlzLl9maWVsZHMuc3BsaWNlKHRoaXMuX2ZpZWxkcy5pbmRleE9mKGZpZWxkKSwgMSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBwYXJ0aWNsZSBzeXN0ZW0uXG4gICAgICovXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBQdXQgYWxsIHRoZSBwYXJ0aWNsZXMgYmFja1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3BhcnRpY2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLl9wYXJ0aWNsZXNbaV07XG4gICAgICAgICAgICBwLmVtaXR0ZXIua2lsbChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYXJ0aWNsZXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUgPSAwO1xuICAgICAgICB0aGlzLl9lbWl0dGluZyA9IHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGVsdGFUaW1lXG4gICAgICovXG4gICAgdXBkYXRlUGFydGljbGVzOiBmdW5jdGlvbihkZWx0YVRpbWUpIHtcblxuICAgICAgICAvLyBNUyA9PiBTZWNvbmRzXG4gICAgICAgIGRlbHRhVGltZSAvPSAxMDAwO1xuICAgICAgICB0aGlzLl9lbGFwc2VkVGltZSArPSBkZWx0YVRpbWU7XG5cbiAgICAgICAgdmFyIHBhcnRpY2xlcyA9IHRoaXMuX3BhcnRpY2xlcztcblxuICAgICAgICBpZiAodGhpcy5fZW1pdHRpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZW1pdHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyc1tpXS5lbWl0KHBhcnRpY2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5vbmVzaG90KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFnaW5nXG4gICAgICAgIHZhciBsZW4gPSBwYXJ0aWNsZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjspIHtcbiAgICAgICAgICAgIHZhciBwID0gcGFydGljbGVzW2ldO1xuICAgICAgICAgICAgcC5hZ2UgKz0gZGVsdGFUaW1lO1xuICAgICAgICAgICAgaWYgKHAuYWdlID49IHAubGlmZSkge1xuICAgICAgICAgICAgICAgIHAuZW1pdHRlci5raWxsKHApO1xuICAgICAgICAgICAgICAgIHBhcnRpY2xlc1tpXSA9IHBhcnRpY2xlc1tsZW4tMV07XG4gICAgICAgICAgICAgICAgcGFydGljbGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGxlbi0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGVcbiAgICAgICAgICAgIHZhciBwID0gcGFydGljbGVzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLl9maWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmllbGRzW2pdLmFwcGx5VG8ocC52ZWxvY2l0eSwgcC5wb3NpdGlvbiwgcC53ZWlnaHQsIGRlbHRhVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC51cGRhdGUoZGVsdGFUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVZlcnRpY2VzKCk7XG4gICAgfSxcblxuICAgIF91cGRhdGVWZXJ0aWNlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG4gICAgICAgIC8vIElmIGhhcyB1diBhbmltYXRpb25cbiAgICAgICAgdmFyIGFuaW1UaWxlWCA9IHRoaXMuc3ByaXRlQW5pbWF0aW9uVGlsZVg7XG4gICAgICAgIHZhciBhbmltVGlsZVkgPSB0aGlzLnNwcml0ZUFuaW1hdGlvblRpbGVZO1xuICAgICAgICB2YXIgYW5pbVJlcGVhdCA9IHRoaXMuc3ByaXRlQW5pbWF0aW9uUmVwZWF0O1xuICAgICAgICB2YXIgblV2QW5pbUZyYW1lID0gYW5pbVRpbGVZICogYW5pbVRpbGVYICogYW5pbVJlcGVhdDtcbiAgICAgICAgdmFyIGhhc1V2QW5pbWF0aW9uID0gblV2QW5pbUZyYW1lID4gMTtcbiAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWU7XG4gICAgICAgIC8vIFB1dCBwYXJ0aWNsZSBzdGF0dXMgaW4gbm9ybWFsXG4gICAgICAgIHZhciBub3JtYWxzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwudmFsdWU7XG4gICAgICAgIHZhciB1dnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRleGNvb3JkMC52YWx1ZTtcbiAgICAgICAgdmFyIHV2czIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRleGNvb3JkMS52YWx1ZTtcblxuICAgICAgICB2YXIgbGVuID0gdGhpcy5fcGFydGljbGVzLmxlbmd0aDtcbiAgICAgICAgaWYgKCFwb3NpdGlvbnMgfHwgcG9zaXRpb25zLmxlbmd0aCAhPT0gbGVuICogMykge1xuICAgICAgICAgICAgLy8gVE9ETyBPcHRpbWl6ZVxuICAgICAgICAgICAgcG9zaXRpb25zID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi52YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkobGVuICogMyk7XG4gICAgICAgICAgICBub3JtYWxzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KGxlbiAqIDMpO1xuICAgICAgICAgICAgaWYgKGhhc1V2QW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdXZzID0gZ2VvbWV0cnkuYXR0cmlidXRlcy50ZXhjb29yZDAudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KGxlbiAqIDIpO1xuICAgICAgICAgICAgICAgIHV2czIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRleGNvb3JkMS52YWx1ZSA9IG5ldyBGbG9hdDMyQXJyYXkobGVuICogMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW52QW5pbVRpbGVYID0gMSAvIGFuaW1UaWxlWDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHBhcnRpY2xlID0gdGhpcy5fcGFydGljbGVzW2ldO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IGkgKiAzO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbb2Zmc2V0ICsgal0gPSBwYXJ0aWNsZS5wb3NpdGlvbi5hcnJheVtqXTtcbiAgICAgICAgICAgICAgICBub3JtYWxzW29mZnNldF0gPSBwYXJ0aWNsZS5hZ2UgLyBwYXJ0aWNsZS5saWZlO1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbHNbb2Zmc2V0ICsgMV0gPSBwYXJ0aWNsZS5yb3RhdGlvbjtcbiAgICAgICAgICAgICAgICBub3JtYWxzW29mZnNldCArIDFdID0gMDtcbiAgICAgICAgICAgICAgICBub3JtYWxzW29mZnNldCArIDJdID0gcGFydGljbGUuc3ByaXRlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvZmZzZXQyID0gaSAqIDI7XG4gICAgICAgICAgICBpZiAoaGFzVXZBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBwYXJ0aWNsZS5hZ2UgLyBwYXJ0aWNsZS5saWZlO1xuICAgICAgICAgICAgICAgIHZhciBzdGFnZSA9IE1hdGgucm91bmQocCAqIChuVXZBbmltRnJhbWUgLSAxKSkgKiBhbmltUmVwZWF0O1xuICAgICAgICAgICAgICAgIHZhciB2ID0gTWF0aC5mbG9vcihzdGFnZSAqIGludkFuaW1UaWxlWCk7XG4gICAgICAgICAgICAgICAgdmFyIHUgPSBzdGFnZSAtIHYgKiBhbmltVGlsZVg7XG4gICAgICAgICAgICAgICAgdXZzW29mZnNldDJdID0gdSAvIGFuaW1UaWxlWDtcbiAgICAgICAgICAgICAgICB1dnNbb2Zmc2V0MiArIDFdID0gMSAtIHYgLyBhbmltVGlsZVk7XG4gICAgICAgICAgICAgICAgdXZzMltvZmZzZXQyXSA9ICh1ICsgMSkgLyBhbmltVGlsZVg7XG4gICAgICAgICAgICAgICAgdXZzMltvZmZzZXQyICsgMV0gPSAxIC0gKHYgKyAxKSAvIGFuaW1UaWxlWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlb21ldHJ5LmRpcnR5KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGaW5pc2hlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbGFwc2VkVGltZSA+IHRoaXMuZHVyYXRpb24gJiYgIXRoaXMubG9vcDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Y2xheS5SZW5kZXJlcn0gcmVuZGVyZXJcbiAgICAgKi9cbiAgICBkaXNwb3NlOiBmdW5jdGlvbihyZW5kZXJlcikge1xuICAgICAgICAvLyBQdXQgYWxsIHRoZSBwYXJ0aWNsZXMgYmFja1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3BhcnRpY2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLl9wYXJ0aWNsZXNbaV07XG4gICAgICAgICAgICBwLmVtaXR0ZXIua2lsbChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UocmVuZGVyZXIpO1xuICAgICAgICAvLyBUT0RPIERpc3Bvc2UgdGV4dHVyZSA/XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2NsYXkucGFydGljbGUuUGFydGljbGVSZW5kZXJhYmxlfVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHBhcnRpY2xlUmVuZGVyYWJsZSA9IG5ldyBQYXJ0aWNsZVJlbmRlcmFibGUoe1xuICAgICAgICAgICAgbWF0ZXJpYWw6IHRoaXMubWF0ZXJpYWxcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnRpY2xlUmVuZGVyYWJsZS5sb29wID0gdGhpcy5sb29wO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUub25lc2hvdCA9IHRoaXMub25lc2hvdDtcbiAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLnNwcml0ZUFuaW1hdGlvblJlcGVhdCA9IHRoaXMuc3ByaXRlQW5pbWF0aW9uUmVwZWF0O1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuc3ByaXRlQW5pbWF0aW9uVGlsZVkgPSB0aGlzLnNwcml0ZUFuaW1hdGlvblRpbGVZO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUuc3ByaXRlQW5pbWF0aW9uVGlsZVggPSB0aGlzLnNwcml0ZUFuaW1hdGlvblRpbGVYO1xuXG4gICAgICAgIHBhcnRpY2xlUmVuZGVyYWJsZS5wb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24pO1xuICAgICAgICBwYXJ0aWNsZVJlbmRlcmFibGUucm90YXRpb24uY29weSh0aGlzLnJvdGF0aW9uKTtcbiAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLnNjYWxlLmNvcHkodGhpcy5zY2FsZSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFydGljbGVSZW5kZXJhYmxlLmFkZCh0aGlzLl9jaGlsZHJlbltpXS5jbG9uZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydGljbGVSZW5kZXJhYmxlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBQYXJ0aWNsZVJlbmRlcmFibGU7XG4iLCJleHBvcnQgZGVmYXVsdCBcIkBleHBvcnQgY2xheS5waWNraW5nLmNvbG9yLnZlcnRleFxcbnVuaWZvcm0gbWF0NCB3b3JsZFZpZXdQcm9qZWN0aW9uIDogV09STERWSUVXUFJPSkVDVElPTjtcXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiA6IFBPU0lUSU9OO1xcbkBpbXBvcnQgY2xheS5jaHVuay5za2lubmluZ19oZWFkZXJcXG52b2lkIG1haW4oKXtcXG4gICAgdmVjMyBza2lubmVkUG9zaXRpb24gPSBwb3NpdGlvbjtcXG4gICAgI2lmZGVmIFNLSU5OSU5HXFxuICAgICAgICBAaW1wb3J0IGNsYXkuY2h1bmsuc2tpbl9tYXRyaXhcXG4gICAgICAgIHNraW5uZWRQb3NpdGlvbiA9IChza2luTWF0cml4V1MgKiB2ZWM0KHBvc2l0aW9uLCAxLjApKS54eXo7XFxuICAgICNlbmRpZlxcbiAgICBnbF9Qb3NpdGlvbiA9IHdvcmxkVmlld1Byb2plY3Rpb24gKiB2ZWM0KHNraW5uZWRQb3NpdGlvbiwgMS4wKTtcXG59XFxuQGVuZFxcbkBlbmRcXG5AZXhwb3J0IGNsYXkucGlja2luZy5jb2xvci5mcmFnbWVudFxcbnVuaWZvcm0gdmVjNCBjb2xvciA6IFsxLjAsIDEuMCwgMS4wLCAxLjBdO1xcbnZvaWQgbWFpbigpIHtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XFxufVxcbkBlbmRcIjtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgRnJhbWVCdWZmZXIgZnJvbSAnLi4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IFRleHR1cmUyRCBmcm9tICcuLi9UZXh0dXJlMkQnO1xuaW1wb3J0IFNoYWRlciBmcm9tICcuLi9TaGFkZXInO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL01hdGVyaWFsJztcblxuaW1wb3J0IGNvbG9yRXNzbCBmcm9tICcuL2NvbG9yLmdsc2wuanMnO1xuU2hhZGVyLmltcG9ydChjb2xvckVzc2wpO1xuXG4vKipcbiAqIFBpeGVsIHBpY2tpbmcgaXMgZ3B1IGJhc2VkIHBpY2tpbmcsIHdoaWNoIGlzIGZhc3QgYW5kIGFjY3VyYXRlLlxuICogQnV0IG5vdCBsaWtlIHJheSBwaWNraW5nLCBpdCBjYW4ndCBnZXQgdGhlIGludGVyc2VjdGlvbiBwb2ludCBhbmQgdHJpYW5nbGUuXG4gKiBAY29uc3RydWN0b3IgY2xheS5waWNraW5nLlBpeGVsUGlja2luZ1xuICogQGV4dGVuZHMgY2xheS5jb3JlLkJhc2VcbiAqL1xudmFyIFBpeGVsUGlja2luZyA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkucGlja2luZy5QaXhlbFBpY2tpbmcjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcmdldCByZW5kZXJlclxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5SZW5kZXJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHJlbmRlcmVyOiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogRG93bnNhbXBsZSByYXRpbyBvZiBoaWRkZW4gZnJhbWUgYnVmZmVyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBkb3duU2FtcGxlUmF0aW86IDEsXG5cbiAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgaGVpZ2h0OiAxMDAsXG5cbiAgICAgICAgbG9va3VwT2Zmc2V0OiAxLFxuXG4gICAgICAgIF9mcmFtZUJ1ZmZlcjogbnVsbCxcbiAgICAgICAgX3RleHR1cmU6IG51bGwsXG4gICAgICAgIF9zaGFkZXI6IG51bGwsXG5cbiAgICAgICAgX2lkTWF0ZXJpYWxzOiBbXSxcbiAgICAgICAgX2xvb2t1cFRhYmxlOiBbXSxcblxuICAgICAgICBfbWVzaE1hdGVyaWFsczogW10sXG5cbiAgICAgICAgX2lkT2Zmc2V0OiAwXG4gICAgfTtcbn0sIGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnJlbmRlcmVyLmdldFdpZHRoKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5yZW5kZXJlci5nZXRIZWlnaHQoKTtcbiAgICB9XG4gICAgdGhpcy5faW5pdCgpO1xufSwgLyoqIEBsZW5kcyBjbGF5LnBpY2tpbmcuUGl4ZWxQaWNraW5nLnByb3RvdHlwZSAqLyB7XG4gICAgX2luaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl90ZXh0dXJlID0gbmV3IFRleHR1cmUyRCh7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCAqIHRoaXMuZG93blNhbXBsZVJhdGlvLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCAqIHRoaXMuZG93blNhbXBsZVJhdGlvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlciA9IG5ldyBGcmFtZUJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuX3NoYWRlciA9IG5ldyBTaGFkZXIoU2hhZGVyLnNvdXJjZSgnY2xheS5waWNraW5nLmNvbG9yLnZlcnRleCcpLCBTaGFkZXIuc291cmNlKCdjbGF5LnBpY2tpbmcuY29sb3IuZnJhZ21lbnQnKSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTZXQgcGlja2luZyBwcmVzaXNpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmF0aW9cbiAgICAgKi9cbiAgICBzZXRQcmVjaXNpb246IGZ1bmN0aW9uKHJhdGlvKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmUud2lkdGggPSB0aGlzLndpZHRoICogcmF0aW87XG4gICAgICAgIHRoaXMuX3RleHR1cmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiByYXRpbztcbiAgICAgICAgdGhpcy5kb3duU2FtcGxlUmF0aW8gPSByYXRpbztcbiAgICB9LFxuICAgIHJlc2l6ZTogZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLl90ZXh0dXJlLndpZHRoID0gd2lkdGggKiB0aGlzLmRvd25TYW1wbGVSYXRpbztcbiAgICAgICAgdGhpcy5fdGV4dHVyZS5oZWlnaHQgPSBoZWlnaHQgKiB0aGlzLmRvd25TYW1wbGVSYXRpbztcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5fdGV4dHVyZS5kaXJ0eSgpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBwaWNraW5nIGZyYW1lYnVmZmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGlvXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbihzY2VuZSwgY2FtZXJhKSB7XG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIGlmIChyZW5kZXJlci5nZXRXaWR0aCgpICE9PSB0aGlzLndpZHRoIHx8IHJlbmRlcmVyLmdldEhlaWdodCgpICE9PSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemUocmVuZGVyZXIud2lkdGgsIHJlbmRlcmVyLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci5hdHRhY2godGhpcy5fdGV4dHVyZSk7XG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLmJpbmQocmVuZGVyZXIpO1xuICAgICAgICB0aGlzLl9pZE9mZnNldCA9IHRoaXMubG9va3VwT2Zmc2V0O1xuICAgICAgICB0aGlzLl9zZXRNYXRlcmlhbChzY2VuZSk7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgdGhpcy5fcmVzdG9yZU1hdGVyaWFsKCk7XG4gICAgICAgIHRoaXMuX2ZyYW1lQnVmZmVyLnVuYmluZChyZW5kZXJlcik7XG4gICAgfSxcblxuICAgIF9zZXRNYXRlcmlhbDogZnVuY3Rpb24ocm9vdCkge1xuICAgICAgICBmb3IgKHZhciBpID0wOyBpIDwgcm9vdC5fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJvb3QuX2NoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmdlb21ldHJ5ICYmIGNoaWxkLm1hdGVyaWFsICYmIGNoaWxkLm1hdGVyaWFsLnNoYWRlcikge1xuICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuX2lkT2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9IGlkIC0gdGhpcy5sb29rdXBPZmZzZXQ7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gdGhpcy5faWRNYXRlcmlhbHNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcjogdGhpcy5fc2hhZGVyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBwYWNrSUQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xvclswXSAvPSAyNTU7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yWzFdIC89IDI1NTtcbiAgICAgICAgICAgICAgICAgICAgY29sb3JbMl0gLz0gMjU1O1xuICAgICAgICAgICAgICAgICAgICBjb2xvclszXSA9IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0KCdjb2xvcicsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRNYXRlcmlhbHNbaWR4XSA9IG1hdGVyaWFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9tZXNoTWF0ZXJpYWxzW2lkeF0gPSBjaGlsZC5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb29rdXBUYWJsZVtpZHhdID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2hpbGQubWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5fY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0TWF0ZXJpYWwoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBpY2sgdGhlIG9iamVjdFxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCBNb3VzZSBwb3NpdGlvbiB4XG4gICAgICogQHBhcmFtICB7bnVtYmVyfSB5IE1vdXNlIHBvc2l0aW9uIHlcbiAgICAgKiBAcmV0dXJuIHtjbGF5Lk5vZGV9XG4gICAgICovXG4gICAgcGljazogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgICAgIHZhciByYXRpbyA9IHRoaXMuZG93blNhbXBsZVJhdGlvO1xuICAgICAgICB4ID0gTWF0aC5jZWlsKHJhdGlvICogeCk7XG4gICAgICAgIHkgPSBNYXRoLmNlaWwocmF0aW8gKiAodGhpcy5oZWlnaHQgLSB5KSk7XG5cbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIHZhciBwaXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB2YXIgX2dsID0gcmVuZGVyZXIuZ2w7XG4gICAgICAgIC8vIFRPRE8gb3V0IG9mIGJvdW5kcyA/XG4gICAgICAgIC8vIHByZXNlcnZlRHJhd2luZ0J1ZmZlciA/XG4gICAgICAgIF9nbC5yZWFkUGl4ZWxzKHgsIHksIDEsIDEsIF9nbC5SR0JBLCBfZ2wuVU5TSUdORURfQllURSwgcGl4ZWwpO1xuICAgICAgICB0aGlzLl9mcmFtZUJ1ZmZlci51bmJpbmQocmVuZGVyZXIpO1xuICAgICAgICAvLyBTa2lwIGludGVycG9sYXRlZCBwaXhlbCBiZWNhdXNlIG9mIGFudGkgYWxpYXNcbiAgICAgICAgaWYgKHBpeGVsWzNdID09PSAyNTUpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IHVucGFja0lEKHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pO1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5fbG9va3VwVGFibGVbaWQgLSB0aGlzLmxvb2t1cE9mZnNldF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZXN0b3JlTWF0ZXJpYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xvb2t1cFRhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9sb29rdXBUYWJsZVtpXS5tYXRlcmlhbCA9IHRoaXMuX21lc2hNYXRlcmlhbHNbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzcG9zZTogZnVuY3Rpb24ocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5fZnJhbWVCdWZmZXIuZGlzcG9zZShyZW5kZXJlcik7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIHBhY2tJRChpZCl7XG4gICAgdmFyIHIgPSBpZCA+PiAxNjtcbiAgICB2YXIgZyA9IChpZCAtIChyIDw8IDgpKSA+PiA4O1xuICAgIHZhciBiID0gaWQgLSAociA8PCAxNikgLSAoZzw8OCk7XG4gICAgcmV0dXJuIFtyLCBnLCBiXTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrSUQociwgZywgYil7XG4gICAgcmV0dXJuIChyIDw8IDE2KSArIChnPDw4KSArIGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBpeGVsUGlja2luZztcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvciBjbGF5LnBsdWdpbi5GcmVlQ29udHJvbFxuICogQGV4YW1wbGVcbiAqICAgICB2YXIgY29udHJvbCA9IG5ldyBjbGF5LnBsdWdpbi5GcmVlQ29udHJvbCh7XG4gKiAgICAgICAgIHRhcmdldDogY2FtZXJhLFxuICogICAgICAgICBkb21FbGVtZW50OiByZW5kZXJlci5jYW52YXNcbiAqICAgICB9KTtcbiAqICAgICAuLi5cbiAqICAgICBhbmltYXRpb24ub24oJ2ZyYW1lJywgZnVuY3Rpb24oZnJhbWVUaW1lKSB7XG4gKiAgICAgICAgIGNvbnRyb2wudXBkYXRlKGZyYW1lVGltZSk7XG4gKiAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAqICAgICB9KTtcbiAqL1xudmFyIEZyZWVDb250cm9sID0gQmFzZS5leHRlbmQoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIC8qKiBAbGVuZHMgY2xheS5wbHVnaW4uRnJlZUNvbnRyb2wjICovIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNjZW5lIG5vZGUgdG8gY29udHJvbCwgbW9zdGx5IGl0IGlzIGEgY2FtZXJhXG4gICAgICAgICAqIEB0eXBlIHtjbGF5Lk5vZGV9XG4gICAgICAgICAqL1xuICAgICAgICB0YXJnZXQ6IG51bGwsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcmdldCBkb20gdG8gYmluZCB3aXRoIG1vdXNlIGV2ZW50c1xuICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBkb21FbGVtZW50OiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNb3VzZSBtb3ZlIHNlbnNpdGl2aXR5XG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBzZW5zaXRpdml0eTogMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGFyZ2V0IG1vdmUgc3BlZWRcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHNwZWVkOiAwLjQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwIGF4aXNcbiAgICAgICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAgICAgKi9cbiAgICAgICAgdXA6IG5ldyBWZWN0b3IzKDAsIDEsIDApLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBsb2NrIHZlcnRpY2FsIG1vdmVtZW50XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdmVydGljYWxNb3ZlTG9jazogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtjbGF5LmFuaW1hdGlvbi5BbmltYXRpb259XG4gICAgICAgICAqL1xuICAgICAgICBhbmltYXRpb246IG51bGwsXG5cbiAgICAgICAgX21vdmVGb3J3YXJkOiBmYWxzZSxcbiAgICAgICAgX21vdmVCYWNrd2FyZDogZmFsc2UsXG4gICAgICAgIF9tb3ZlTGVmdDogZmFsc2UsXG4gICAgICAgIF9tb3ZlUmlnaHQ6IGZhbHNlLFxuXG4gICAgICAgIF9vZmZzZXRQaXRjaDogMCxcbiAgICAgICAgX29mZnNldFJvbGw6IDBcbiAgICB9O1xufSwgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbG9ja0NoYW5nZSA9IHRoaXMuX2xvY2tDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9rZXlEb3duID0gdGhpcy5fa2V5RG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2tleVVwID0gdGhpcy5fa2V5VXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9tb3VzZU1vdmUgPSB0aGlzLl9tb3VzZU1vdmUuYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLmRvbUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICB9XG59LFxuLyoqIEBsZW5kcyBjbGF5LnBsdWdpbi5GcmVlQ29udHJvbC5wcm90b3R5cGUgKi9cbntcbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29udHJvbFxuICAgICAqL1xuICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBwb2ludGVyIGxvY2tcbiAgICAgICAgLy8gaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvcG9pbnRlcmxvY2svaW50cm8vXG4gICAgICAgIHZhciBlbCA9IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICAvL011c3QgcmVxdWVzdCBwb2ludGVyIGxvY2sgYWZ0ZXIgY2xpY2sgZXZlbnQsIGNhbid0IG5vdCBkbyBpdCBkaXJlY3RseVxuICAgICAgICAvL1doeSA/ID9cbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9yZXF1ZXN0UG9pbnRlckxvY2spO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2tleURvd24pO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2tleVVwKTtcblxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uLm9uKCdmcmFtZScsIHRoaXMuX2RldGVjdE1vdmVtZW50Q2hhbmdlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGNvbnRyb2xcbiAgICAgKi9cbiAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICB0aGlzLnRhcmdldC5vZmYoJ2JlZm9yZXVwZGF0ZScsIHRoaXMuX2JlZm9yZVVwZGF0ZUNhbWVyYSk7XG5cbiAgICAgICAgdmFyIGVsID0gdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAgIGVsLmV4aXRQb2ludGVyTG9jayA9IGVsLmV4aXRQb2ludGVyTG9ja1xuICAgICAgICAgICAgfHwgZWwubW96RXhpdFBvaW50ZXJMb2NrXG4gICAgICAgICAgICB8fCBlbC53ZWJraXRFeGl0UG9pbnRlckxvY2s7XG5cbiAgICAgICAgaWYgKGVsLmV4aXRQb2ludGVyTG9jaykge1xuICAgICAgICAgICAgZWwuZXhpdFBvaW50ZXJMb2NrKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9yZXF1ZXN0UG9pbnRlckxvY2spO1xuXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5fbG9ja0NoYW5nZSk7XG5cbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2tleURvd24pO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2tleVVwKTtcblxuICAgICAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uLm9mZignZnJhbWUnLCB0aGlzLl9kZXRlY3RNb3ZlbWVudENoYW5nZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3JlcXVlc3RQb2ludGVyTG9jazogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXM7XG4gICAgICAgIGVsLnJlcXVlc3RQb2ludGVyTG9jayA9IGVsLnJlcXVlc3RQb2ludGVyTG9ja1xuICAgICAgICAgICAgfHwgZWwubW96UmVxdWVzdFBvaW50ZXJMb2NrXG4gICAgICAgICAgICB8fCBlbC53ZWJraXRSZXF1ZXN0UG9pbnRlckxvY2s7XG5cbiAgICAgICAgZWwucmVxdWVzdFBvaW50ZXJMb2NrKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2wgdXBkYXRlLiBTaG91bGQgYmUgaW52b2tlZCBldmVyeSBmcmFtZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcmFtZVRpbWUgRnJhbWUgdGltZVxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24oZnJhbWVUaW1lKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDtcblxuICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLnRhcmdldC5wb3NpdGlvbjtcbiAgICAgICAgdmFyIHhBeGlzID0gdGFyZ2V0LmxvY2FsVHJhbnNmb3JtLngubm9ybWFsaXplKCk7XG4gICAgICAgIHZhciB6QXhpcyA9IHRhcmdldC5sb2NhbFRyYW5zZm9ybS56Lm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZlcnRpY2FsTW92ZUxvY2spIHtcbiAgICAgICAgICAgIHpBeGlzLnkgPSAwO1xuICAgICAgICAgICAgekF4aXMubm9ybWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3BlZWQgPSB0aGlzLnNwZWVkICogZnJhbWVUaW1lIC8gMjA7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vdmVGb3J3YXJkKSB7XG4gICAgICAgICAgICAvLyBPcHBvc2l0ZSBkaXJlY3Rpb24gb2YgelxuICAgICAgICAgICAgcG9zaXRpb24uc2NhbGVBbmRBZGQoekF4aXMsIC1zcGVlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21vdmVCYWNrd2FyZCkge1xuICAgICAgICAgICAgcG9zaXRpb24uc2NhbGVBbmRBZGQoekF4aXMsIHNwZWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW92ZUxlZnQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uLnNjYWxlQW5kQWRkKHhBeGlzLCAtc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW92ZVJpZ2h0KSB7XG4gICAgICAgICAgICBwb3NpdGlvbi5zY2FsZUFuZEFkZCh4QXhpcywgc3BlZWQgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldC5yb3RhdGVBcm91bmQodGFyZ2V0LnBvc2l0aW9uLCB0aGlzLnVwLCAtdGhpcy5fb2Zmc2V0UGl0Y2ggKiBmcmFtZVRpbWUgKiBNYXRoLlBJIC8gMzYwKTtcbiAgICAgICAgdmFyIHhBeGlzID0gdGFyZ2V0LmxvY2FsVHJhbnNmb3JtLng7XG4gICAgICAgIHRhcmdldC5yb3RhdGVBcm91bmQodGFyZ2V0LnBvc2l0aW9uLCB4QXhpcywgLXRoaXMuX29mZnNldFJvbGwgKiBmcmFtZVRpbWUgKiBNYXRoLlBJIC8gMzYwKTtcblxuICAgICAgICB0aGlzLl9vZmZzZXRSb2xsID0gdGhpcy5fb2Zmc2V0UGl0Y2ggPSAwO1xuICAgIH0sXG5cbiAgICBfbG9ja0NoYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCA9PT0gdGhpcy5kb21FbGVtZW50XG4gICAgICAgICAgICB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQgPT09IHRoaXMuZG9tRWxlbWVudFxuICAgICAgICAgICAgfHwgZG9jdW1lbnQud2Via2l0UG9pbnRlckxvY2tFbGVtZW50ID09PSB0aGlzLmRvbUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX21vdXNlTW92ZTogZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgZHggPSBlLm1vdmVtZW50WCB8fCBlLm1vek1vdmVtZW50WCB8fCBlLndlYmtpdE1vdmVtZW50WCB8fCAwO1xuICAgICAgICB2YXIgZHkgPSBlLm1vdmVtZW50WSB8fCBlLm1vek1vdmVtZW50WSB8fCBlLndlYmtpdE1vdmVtZW50WSB8fCAwO1xuXG4gICAgICAgIHRoaXMuX29mZnNldFBpdGNoICs9IGR4ICogdGhpcy5zZW5zaXRpdml0eSAvIDIwMDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0Um9sbCArPSBkeSAqIHRoaXMuc2Vuc2l0aXZpdHkgLyAyMDA7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgdG8gcmVtaW5kIHJlbmRlcmVyIGRvIHJlbmRlclxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH0sXG5cbiAgICBfZGV0ZWN0TW92ZW1lbnRDaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vdmVGb3J3YXJkIHx8IHRoaXMuX21vdmVCYWNrd2FyZCB8fCB0aGlzLl9tb3ZlTGVmdCB8fCB0aGlzLl9tb3ZlUmlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2tleURvd246IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgc3dpdGNoKGUua2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSA4NzogLy93XG4gICAgICAgICAgICBjYXNlIDM3OiAvL3VwIGFycm93XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZUZvcndhcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4MzogLy9zXG4gICAgICAgICAgICBjYXNlIDQwOiAvL2Rvd24gYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlQmFja3dhcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NTogLy9hXG4gICAgICAgICAgICBjYXNlIDM3OiAvL2xlZnQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlTGVmdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDY4OiAvL2RcbiAgICAgICAgICAgIGNhc2UgMzk6IC8vcmlnaHQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlUmlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGV2ZW50IHRvIHJlbWluZCByZW5kZXJlciBkbyByZW5kZXJcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9LFxuXG4gICAgX2tleVVwOiBmdW5jdGlvbihlKSB7XG4gICAgICAgIHN3aXRjaChlLmtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgODc6IC8vd1xuICAgICAgICAgICAgY2FzZSAzNzogLy91cCBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVGb3J3YXJkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDgzOiAvL3NcbiAgICAgICAgICAgIGNhc2UgNDA6IC8vZG93biBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVCYWNrd2FyZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NTogLy9hXG4gICAgICAgICAgICBjYXNlIDM3OiAvL2xlZnQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlTGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2ODogLy9kXG4gICAgICAgICAgICBjYXNlIDM5OiAvL3JpZ2h0IGFycm93XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVJpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgRnJlZUNvbnRyb2w7XG4iLCJ2YXIgR2VzdHVyZU1nciA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHRoaXMuX3RyYWNrID0gW107XG59O1xuXG5HZXN0dXJlTWdyLnByb3RvdHlwZSA9IHtcblxuICAgIGNvbnN0cnVjdG9yOiBHZXN0dXJlTWdyLFxuXG4gICAgcmVjb2duaXplOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCwgcm9vdCkge1xuICAgICAgICB0aGlzLl9kb1RyYWNrKGV2ZW50LCB0YXJnZXQsIHJvb3QpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVjb2duaXplKGV2ZW50KTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdHJhY2subGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kb1RyYWNrOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCwgcm9vdCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRhcmdldFRvdWNoZXM7XG5cbiAgICAgICAgaWYgKCF0b3VjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHJhY2tJdGVtID0ge1xuICAgICAgICAgICAgcG9pbnRzOiBbXSxcbiAgICAgICAgICAgIHRvdWNoZXM6IFtdLFxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdG91Y2hlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTtcbiAgICAgICAgICAgIHRyYWNrSXRlbS5wb2ludHMucHVzaChbdG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WV0pO1xuICAgICAgICAgICAgdHJhY2tJdGVtLnRvdWNoZXMucHVzaCh0b3VjaCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFjay5wdXNoKHRyYWNrSXRlbSk7XG4gICAgfSxcblxuICAgIF9yZWNvZ25pemU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gcmVjb2duaXplcnMpIHtcbiAgICAgICAgICAgIGlmIChyZWNvZ25pemVycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdlc3R1cmVJbmZvID0gcmVjb2duaXplcnNbZXZlbnROYW1lXSh0aGlzLl90cmFjaywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChnZXN0dXJlSW5mbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VzdHVyZUluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gZGlzdChwb2ludFBhaXIpIHtcbiAgICB2YXIgZHggPSBwb2ludFBhaXJbMV1bMF0gLSBwb2ludFBhaXJbMF1bMF07XG4gICAgdmFyIGR5ID0gcG9pbnRQYWlyWzFdWzFdIC0gcG9pbnRQYWlyWzBdWzFdO1xuXG4gICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG59XG5cbmZ1bmN0aW9uIGNlbnRlcihwb2ludFBhaXIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAocG9pbnRQYWlyWzBdWzBdICsgcG9pbnRQYWlyWzFdWzBdKSAvIDIsXG4gICAgICAgIChwb2ludFBhaXJbMF1bMV0gKyBwb2ludFBhaXJbMV1bMV0pIC8gMlxuICAgIF07XG59XG5cbnZhciByZWNvZ25pemVycyA9IHtcblxuICAgIHBpbmNoOiBmdW5jdGlvbiAodHJhY2ssIGV2ZW50KSB7XG4gICAgICAgIHZhciB0cmFja0xlbiA9IHRyYWNrLmxlbmd0aDtcblxuICAgICAgICBpZiAoIXRyYWNrTGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGluY2hFbmQgPSAodHJhY2tbdHJhY2tMZW4gLSAxXSB8fCB7fSkucG9pbnRzO1xuICAgICAgICB2YXIgcGluY2hQcmUgPSAodHJhY2tbdHJhY2tMZW4gLSAyXSB8fCB7fSkucG9pbnRzIHx8IHBpbmNoRW5kO1xuXG4gICAgICAgIGlmIChwaW5jaFByZVxuICAgICAgICAgICAgJiYgcGluY2hQcmUubGVuZ3RoID4gMVxuICAgICAgICAgICAgJiYgcGluY2hFbmRcbiAgICAgICAgICAgICYmIHBpbmNoRW5kLmxlbmd0aCA+IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2YXIgcGluY2hTY2FsZSA9IGRpc3QocGluY2hFbmQpIC8gZGlzdChwaW5jaFByZSk7XG4gICAgICAgICAgICAhaXNGaW5pdGUocGluY2hTY2FsZSkgJiYgKHBpbmNoU2NhbGUgPSAxKTtcblxuICAgICAgICAgICAgZXZlbnQucGluY2hTY2FsZSA9IHBpbmNoU2NhbGU7XG5cbiAgICAgICAgICAgIHZhciBwaW5jaENlbnRlciA9IGNlbnRlcihwaW5jaEVuZCk7XG4gICAgICAgICAgICBldmVudC5waW5jaFggPSBwaW5jaENlbnRlclswXTtcbiAgICAgICAgICAgIGV2ZW50LnBpbmNoWSA9IHBpbmNoQ2VudGVyWzFdO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwaW5jaCcsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0cmFja1swXS50YXJnZXQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgR2VzdHVyZU1ncjtcbiIsImltcG9ydCBNZXNoIGZyb20gJy4uL01lc2gnO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4uL0dlb21ldHJ5JztcbmltcG9ydCBQbGFuZSBmcm9tICcuLi9tYXRoL1BsYW5lJztcbmltcG9ydCBWZWN0b3IzIGZyb20gJy4uL21hdGgvVmVjdG9yMyc7XG5pbXBvcnQgTWF0cml4NCBmcm9tICcuLi9tYXRoL01hdHJpeDQnO1xuaW1wb3J0IFJheSBmcm9tICcuLi9tYXRoL1JheSc7XG5cbmltcG9ydCBnbE1hdHJpeCBmcm9tICcuLi9kZXAvZ2xtYXRyaXgnO1xudmFyIG1hdDQgPSBnbE1hdHJpeC5tYXQ0O1xudmFyIHZlYzMgPSBnbE1hdHJpeC52ZWMzO1xudmFyIHZlYzQgPSBnbE1hdHJpeC52ZWM0O1xuXG52YXIgdXZzID0gW1swLCAwXSwgWzAsIDFdLCBbMSwgMV0sIFsxLCAwXV07XG52YXIgdHJpcyA9IFswLCAxLCAyLCAyLCAzLCAwXTtcblxudmFyIEluZmluaXRlUGxhbmUgPSBNZXNoLmV4dGVuZCh7XG5cbiAgICBjYW1lcmE6IG51bGwsXG5cbiAgICBwbGFuZTogbnVsbCxcblxuICAgIG1heEdyaWQ6IDAsXG5cbiAgICAvLyBUT0RPXG4gICAgZnJ1c3R1bUN1bGxpbmc6IGZhbHNlXG5cbn0sIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KHtcbiAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgIH0pO1xuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uaW5pdCg2KTtcbiAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5pbml0KDYpO1xuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGV4Y29vcmQwLmluaXQoNik7XG4gICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSg2KTtcblxuICAgIHRoaXMucGxhbmUgPSBuZXcgUGxhbmUoKTtcbn0sIHtcblxuICAgIHVwZGF0ZUdlb21ldHJ5OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGNvb3JkcyA9IHRoaXMuX3VuUHJvamVjdEdyaWQoKTtcbiAgICAgICAgaWYgKCFjb29yZHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zaXRpb25BdHRyID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuICAgICAgICB2YXIgbm9ybWFsQXR0ciA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMudGV4Y29vcmQwO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuZ2VvbWV0cnkuaW5kaWNlcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRyaXNbaV07XG4gICAgICAgICAgICBwb3NpdGlvbkF0dHIuc2V0KGksIGNvb3Jkc1tpZHhdLmFycmF5KTtcbiAgICAgICAgICAgIG5vcm1hbEF0dHIuc2V0KGksIHRoaXMucGxhbmUubm9ybWFsLmFycmF5KTtcbiAgICAgICAgICAgIHRleGNvb3Jkcy5zZXQoaSwgdXZzW2lkeF0pO1xuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW9tZXRyeS5kaXJ0eSgpO1xuICAgIH0sXG5cbiAgICAvLyBodHRwOi8vZmlsZWFkbWluLmNzLmx0aC5zZS9ncmFwaGljcy90aGVzZXMvcHJvamVjdHMvcHJvamdyaWQvXG4gICAgX3VuUHJvamVjdEdyaWQ6IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIHBsYW5lVmlld1NwYWNlID0gbmV3IFBsYW5lKCk7XG4gICAgICAgIHZhciBsaW5lcyA9IFtcbiAgICAgICAgICAgIDAsIDEsIDAsIDIsIDEsIDMsIDIsIDMsXG4gICAgICAgICAgICA0LCA1LCA0LCA2LCA1LCA3LCA2LCA3LFxuICAgICAgICAgICAgMCwgNCwgMSwgNSwgMiwgNiwgMywgN1xuICAgICAgICBdO1xuXG4gICAgICAgIHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcblxuICAgICAgICAvLyAxLS0tLTJcbiAgICAgICAgLy8gfCAgICB8XG4gICAgICAgIC8vIDAtLS0tM1xuICAgICAgICB2YXIgY29vcmRzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBjb29yZHNbaV0gPSBuZXcgVmVjdG9yMygwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByYXkgPSBuZXcgUmF5KCk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBsYW5lVmlld1NwYWNlLmNvcHkodGhpcy5wbGFuZSk7XG4gICAgICAgICAgICBwbGFuZVZpZXdTcGFjZS5hcHBseVRyYW5zZm9ybSh0aGlzLmNhbWVyYS52aWV3TWF0cml4KTtcblxuICAgICAgICAgICAgdmFyIGZydXN0dW1WZXJ0aWNlcyA9IHRoaXMuY2FtZXJhLmZydXN0dW0udmVydGljZXM7XG5cbiAgICAgICAgICAgIHZhciBuUG9pbnRzID0gMDtcbiAgICAgICAgICAgIC8vIEludGVyc2VjdCB3aXRoIGxpbmVzIG9mIGZydXN0dW1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgICAgIHN0YXJ0LmFycmF5ID0gZnJ1c3R1bVZlcnRpY2VzW2xpbmVzW2kgKiAyXV07XG4gICAgICAgICAgICAgICAgZW5kLmFycmF5ID0gZnJ1c3R1bVZlcnRpY2VzW2xpbmVzW2kgKiAyICsgMV1dO1xuXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gcGxhbmVWaWV3U3BhY2UuaW50ZXJzZWN0TGluZShzdGFydCwgZW5kLCBwb2ludHNbblBvaW50c10pO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50c1tuUG9pbnRzXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW25Qb2ludHNdID0gcG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgblBvaW50cysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuUG9pbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwb2ludHNbaV0uYXBwbHlQcm9qZWN0aW9uKHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1pblggPSBwb2ludHNbMF0uYXJyYXlbMF07XG4gICAgICAgICAgICB2YXIgbWluWSA9IHBvaW50c1swXS5hcnJheVsxXTtcbiAgICAgICAgICAgIHZhciBtYXhYID0gcG9pbnRzWzBdLmFycmF5WzBdO1xuICAgICAgICAgICAgdmFyIG1heFkgPSBwb2ludHNbMF0uYXJyYXlbMV07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IG5Qb2ludHM7IGkrKykge1xuICAgICAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwb2ludHNbaV0uYXJyYXlbMF0pO1xuICAgICAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwb2ludHNbaV0uYXJyYXlbMV0pO1xuICAgICAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwb2ludHNbaV0uYXJyYXlbMF0pO1xuICAgICAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwb2ludHNbaV0uYXJyYXlbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1pblggPT0gbWF4WCB8fCBtaW5ZID09IG1heFkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb29yZHNbMF0uYXJyYXlbMF0gPSBtaW5YO1xuICAgICAgICAgICAgY29vcmRzWzBdLmFycmF5WzFdID0gbWluWTtcbiAgICAgICAgICAgIGNvb3Jkc1sxXS5hcnJheVswXSA9IG1pblg7XG4gICAgICAgICAgICBjb29yZHNbMV0uYXJyYXlbMV0gPSBtYXhZO1xuICAgICAgICAgICAgY29vcmRzWzJdLmFycmF5WzBdID0gbWF4WDtcbiAgICAgICAgICAgIGNvb3Jkc1syXS5hcnJheVsxXSA9IG1heFk7XG4gICAgICAgICAgICBjb29yZHNbM10uYXJyYXlbMF0gPSBtYXhYO1xuICAgICAgICAgICAgY29vcmRzWzNdLmFycmF5WzFdID0gbWluWTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbWVyYS5jYXN0UmF5KGNvb3Jkc1tpXSwgcmF5KTtcbiAgICAgICAgICAgICAgICByYXkuaW50ZXJzZWN0UGxhbmUodGhpcy5wbGFuZSwgY29vcmRzW2ldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICAgICAgfTtcbiAgICB9KSgpXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSW5maW5pdGVQbGFuZTtcbiIsImltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgVmVjdG9yMiBmcm9tICcuLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IFZlY3RvcjMgZnJvbSAnLi4vbWF0aC9WZWN0b3IzJztcbmltcG9ydCBHZXN0dXJlTWdyIGZyb20gJy4vR2VzdHVyZU1ncic7XG5cbmZ1bmN0aW9uIGZpcnN0Tm90TnVsbCgpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHNbaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFRvQXJyYXkodmFsKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbCwgdmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBhbGlhcyBjbGF5LnBsdWdpbi5PcmJpdENvbnRyb2xcbiAqL1xudmFyIE9yYml0Q29udHJvbCA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblxuICAgIHJldHVybiAvKiogQGxlbmRzIGNsYXkucGx1Z2luLk9yYml0Q29udHJvbCMgKi8ge1xuXG4gICAgICAgIHRpbWVsaW5lOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7SFRNTERvbUVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICBkb21FbGVtZW50OiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7Y2xheS5Ob2RlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2NsYXkubWF0aC5WZWN0b3IzfVxuICAgICAgICAgKi9cbiAgICAgICAgX2NlbnRlcjogbmV3IFZlY3RvcjMoKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWluaW11bSBkaXN0YW5jZSB0byB0aGUgY2VudGVyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDAuNVxuICAgICAgICAgKi9cbiAgICAgICAgbWluRGlzdGFuY2U6IDAuMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWF4aW11bSBkaXN0YW5jZSB0byB0aGUgY2VudGVyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDJcbiAgICAgICAgICovXG4gICAgICAgIG1heERpc3RhbmNlOiAxMDAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNaW5pbXVtIGFscGhhIHJvdGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBtaW5BbHBoYTogLTkwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXhpbXVtIGFscGhhIHJvdGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBtYXhBbHBoYTogOTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gYmV0YSByb3RhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgbWluQmV0YTogLUluZmluaXR5LFxuICAgICAgICAvKipcbiAgICAgICAgICogTWF4aW11bSBiZXRhIHJvdGF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBtYXhCZXRhOiBJbmZpbml0eSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhcnQgYXV0byByb3RhdGluZyBhZnRlciBzdGlsbCBmb3IgdGhlIGdpdmVuIHRpbWVcbiAgICAgICAgICovXG4gICAgICAgIGF1dG9Sb3RhdGVBZnRlclN0aWxsOiAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXJlY3Rpb24gb2YgYXV0b1JvdGF0ZS4gY3cgb3IgY2N3IHdoZW4gbG9va2luZyB0b3AgZG93bi5cbiAgICAgICAgICovXG4gICAgICAgIGF1dG9Sb3RhdGVEaXJlY3Rpb246ICdjdycsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZ3JlZSBwZXIgc2Vjb25kXG4gICAgICAgICAqL1xuICAgICAgICBhdXRvUm90YXRlU3BlZWQ6IDYwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYW4gb3Igcm90YXRlXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBfbW9kZTogJ3JvdGF0ZScsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFtcGluZzogMC44LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHJvdGF0ZVNlbnNpdGl2aXR5OiAxLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHpvb21TZW5zaXRpdml0eTogMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBwYW5TZW5zaXRpdml0eTogMSxcblxuICAgICAgICBfbmVlZHNVcGRhdGU6IGZhbHNlLFxuXG4gICAgICAgIF9yb3RhdGluZzogZmFsc2UsXG5cbiAgICAgICAgLy8gUm90YXRpb24gYXJvdW5kIHlBeGlzXG4gICAgICAgIF9waGk6IDAsXG4gICAgICAgIC8vIFJvdGF0aW9uIGFyb3VuZCB4QXhpc1xuICAgICAgICBfdGhldGE6IDAsXG5cbiAgICAgICAgX21vdXNlWDogMCxcbiAgICAgICAgX21vdXNlWTogMCxcblxuICAgICAgICBfcm90YXRlVmVsb2NpdHk6IG5ldyBWZWN0b3IyKCksXG5cbiAgICAgICAgX3BhblZlbG9jaXR5OiBuZXcgVmVjdG9yMigpLFxuXG4gICAgICAgIF9kaXN0YW5jZTogMjAsXG5cbiAgICAgICAgX3pvb21TcGVlZDogMCxcblxuICAgICAgICBfc3RpbGxUaW1lb3V0OiAwLFxuXG4gICAgICAgIF9hbmltYXRvcnM6IFtdLFxuXG4gICAgICAgIF9nZXN0dXJlTWdyOiBuZXcgR2VzdHVyZU1ncigpXG4gICAgfTtcbn0sIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBFYWNoIE9yYml0Q29udHJvbCBoYXMgaXQncyBvd24gaGFuZGxlclxuICAgIHRoaXMuX21vdXNlRG93bkhhbmRsZXIgPSB0aGlzLl9tb3VzZURvd25IYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VXaGVlbEhhbmRsZXIgPSB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIgPSB0aGlzLl9tb3VzZU1vdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VVcEhhbmRsZXIgPSB0aGlzLl9tb3VzZVVwSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3BpbmNoSGFuZGxlciA9IHRoaXMuX3BpbmNoSGFuZGxlci5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pbml0KCk7XG59LCAvKiogQGxlbmRzIGNsYXkucGx1Z2luLk9yYml0Q29udHJvbCMgKi8ge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUuXG4gICAgICogTW91c2UgZXZlbnQgYmluZGluZ1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRvbSA9IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX21vdXNlRG93bkhhbmRsZXIpO1xuXG4gICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9tb3VzZURvd25IYW5kbGVyKTtcbiAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZWxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUub24oJ2ZyYW1lJywgdGhpcy51cGRhdGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2UuXG4gICAgICogTW91c2UgZXZlbnQgdW5iaW5kaW5nXG4gICAgICovXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZG9tID0gdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fbW91c2VEb3duSGFuZGxlcik7XG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9tb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fbW91c2VVcEhhbmRsZXIpO1xuXG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9tb3VzZURvd25IYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBIYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9tb3VzZVdoZWVsSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHRoaXMudGltZWxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZWxpbmUub2ZmKCdmcmFtZScsIHRoaXMudXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0b3BBbGxBbmltYXRpb24oKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGRpc3RhbmNlXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXN0YW5jZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGRpc3RhbmNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgc2V0RGlzdGFuY2U6IGZ1bmN0aW9uIChkaXN0YW5jZSkge1xuICAgICAgICB0aGlzLl9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBhbHBoYSByb3RhdGlvblxuICAgICAqIEFscGhhIGFuZ2xlIGZvciB0b3AtZG93biByb3RhdGlvbi4gUG9zaXRpdmUgdG8gcm90YXRlIHRvIHRvcC5cbiAgICAgKlxuICAgICAqIFdoaWNoIG1lYW5zIGNhbWVyYSByb3RhdGlvbiBhcm91bmQgeCBheGlzLlxuICAgICAqL1xuICAgIGdldEFscGhhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aGV0YSAvIE1hdGguUEkgKiAxODA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBiZXRhIHJvdGF0aW9uXG4gICAgICogQmV0YSBhbmdsZSBmb3IgbGVmdC1yaWdodCByb3RhdGlvbi4gUG9zaXRpdmUgdG8gcm90YXRlIHRvIHJpZ2h0LlxuICAgICAqXG4gICAgICogV2hpY2ggbWVhbnMgY2FtZXJhIHJvdGF0aW9uIGFyb3VuZCB5IGF4aXMuXG4gICAgICovXG4gICAgZ2V0QmV0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gLXRoaXMuX3BoaSAvIE1hdGguUEkgKiAxODA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCBjb250cm9sIGNlbnRlclxuICAgICAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fVxuICAgICAqL1xuICAgIGdldENlbnRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VudGVyLnRvQXJyYXkoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGFscGhhIHJvdGF0aW9uIGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhXG4gICAgICovXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uIChhbHBoYSkge1xuICAgICAgICBhbHBoYSA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4QWxwaGEsIGFscGhhKSwgdGhpcy5taW5BbHBoYSk7XG5cbiAgICAgICAgdGhpcy5fdGhldGEgPSBhbHBoYSAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0IGJldGEgcm90YXRpb24gYW5nbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmV0YVxuICAgICAqL1xuICAgIHNldEJldGE6IGZ1bmN0aW9uIChiZXRhKSB7XG4gICAgICAgIGJldGEgPSBNYXRoLm1heChNYXRoLm1pbih0aGlzLm1heEJldGEsIGJldGEpLCB0aGlzLm1pbkJldGEpO1xuXG4gICAgICAgIHRoaXMuX3BoaSA9IC1iZXRhIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29udHJvbCBjZW50ZXJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBjZW50ZXJcbiAgICAgKi9cbiAgICBzZXRDZW50ZXI6IGZ1bmN0aW9uIChjZW50ZXJBcnIpIHtcbiAgICAgICAgdGhpcy5fY2VudGVyLnNldEFycmF5KGNlbnRlckFycik7XG4gICAgfSxcblxuICAgIHNldE9wdGlvbjogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG5cbiAgICAgICAgWydhdXRvUm90YXRlJywgJ2F1dG9Sb3RhdGVBZnRlclN0aWxsJyxcbiAgICAgICAgICAgICdhdXRvUm90YXRlRGlyZWN0aW9uJywgJ2F1dG9Sb3RhdGVTcGVlZCcsXG4gICAgICAgICAgICAnZGFtcGluZycsXG4gICAgICAgICAgICAnbWluRGlzdGFuY2UnLCAnbWF4RGlzdGFuY2UnLFxuICAgICAgICAgICAgJ21pbkFscGhhJywgJ21heEFscGhhJywgJ21pbkJldGEnLCAnbWF4QmV0YScsXG4gICAgICAgICAgICAncm90YXRlU2Vuc2l0aXZpdHknLCAnem9vbVNlbnNpdGl2aXR5JywgJ3BhblNlbnNpdGl2aXR5J1xuICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKG9wdHNba2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3B0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICBpZiAob3B0cy5kaXN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3RhbmNlKG9wdHMuZGlzdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMuYWxwaGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBbHBoYShvcHRzLmFscGhhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5iZXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmV0YShvcHRzLmJldGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdHMuY2VudGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNldENlbnRlcihvcHRzLmNlbnRlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0cy5kaXN0YW5jZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRzLmFscGhhXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdHMuYmV0YVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5kdXJhdGlvbj0xMDAwXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5lYXNpbmc9J2xpbmVhciddXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmRvbmVdXG4gICAgICovXG4gICAgYW5pbWF0ZVRvOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICB2YXIgdGFyZ2V0ID0ge307XG4gICAgICAgIHZhciB0aW1lbGluZSA9IHRoaXMudGltZWxpbmU7XG4gICAgICAgIGlmICghdGltZWxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5kaXN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouZGlzdGFuY2UgPSB0aGlzLmdldERpc3RhbmNlKCk7XG4gICAgICAgICAgICB0YXJnZXQuZGlzdGFuY2UgPSBvcHRzLmRpc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmFscGhhICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5hbHBoYSA9IHRoaXMuZ2V0QWxwaGEoKTtcbiAgICAgICAgICAgIHRhcmdldC5hbHBoYSA9IG9wdHMuYWxwaGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuYmV0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICBvYmouYmV0YSA9IHRoaXMuZ2V0QmV0YSgpO1xuICAgICAgICAgICAgdGFyZ2V0LmJldGEgPSBvcHRzLmJldGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuY2VudGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIG9iai5jZW50ZXIgPSB0aGlzLmdldENlbnRlcigpO1xuICAgICAgICAgICAgdGFyZ2V0LmNlbnRlciA9IG9wdHMuY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEFuaW1hdG9yKFxuICAgICAgICAgICAgdGltZWxpbmUuYW5pbWF0ZShvYmopXG4gICAgICAgICAgICAgICAgLndoZW4ob3B0cy5kdXJhdGlvbiB8fCAxMDAwLCB0YXJnZXQpXG4gICAgICAgICAgICAgICAgLmR1cmluZyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouYWxwaGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRBbHBoYShvYmouYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouYmV0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEJldGEob2JqLmJldGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouZGlzdGFuY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXREaXN0YW5jZShvYmouZGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmouY2VudGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0Q2VudGVyKG9iai5jZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX25lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5kb25lKG9wdHMuZG9uZSlcbiAgICAgICAgKS5zdGFydChvcHRzLmVhc2luZyB8fCAnbGluZWFyJyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgYWxsIGFuaW1hdGlvbnNcbiAgICAgKi9cbiAgICBzdG9wQWxsQW5pbWF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fYW5pbWF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvcnNbaV0uc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FuaW1hdG9ycy5sZW5ndGggPSAwO1xuICAgIH0sXG5cbiAgICBfaXNBbmltYXRpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FuaW1hdG9ycy5sZW5ndGggPiAwO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2FsbCB1cGRhdGUgZWFjaCBmcmFtZVxuICAgICAqIEBwYXJhbSAge251bWJlcn0gZGVsdGFUaW1lIEZyYW1lIHRpbWVcbiAgICAgKi9cbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChkZWx0YVRpbWUpIHtcblxuICAgICAgICBkZWx0YVRpbWUgPSBkZWx0YVRpbWUgfHwgMTY7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nKSB7XG4gICAgICAgICAgICB2YXIgcmFkaWFuID0gKHRoaXMuYXV0b1JvdGF0ZURpcmVjdGlvbiA9PT0gJ2N3JyA/IDEgOiAtMSlcbiAgICAgICAgICAgICAgICAqIHRoaXMuYXV0b1JvdGF0ZVNwZWVkIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgICAgIHRoaXMuX3BoaSAtPSByYWRpYW4gKiBkZWx0YVRpbWUgLyAxMDAwO1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3JvdGF0ZVZlbG9jaXR5LmxlbigpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuX3pvb21TcGVlZCkgPiAwLjAxIHx8IHRoaXMuX3BhblZlbG9jaXR5LmxlbigpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9uZWVkc1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRml4ZWQgZGVsdGFUaW1lXG4gICAgICAgIHRoaXMuX3VwZGF0ZURpc3RhbmNlKE1hdGgubWluKGRlbHRhVGltZSwgNTApKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGFuKE1hdGgubWluKGRlbHRhVGltZSwgNTApKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVSb3RhdGUoTWF0aC5taW4oZGVsdGFUaW1lLCA1MCkpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVRyYW5zZm9ybSgpO1xuXG4gICAgICAgIHRoaXMudGFyZ2V0LnVwZGF0ZSgpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcigndXBkYXRlJyk7XG5cbiAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVJvdGF0ZTogZnVuY3Rpb24gKGRlbHRhVGltZSkge1xuICAgICAgICB2YXIgdmVsb2NpdHkgPSB0aGlzLl9yb3RhdGVWZWxvY2l0eTtcbiAgICAgICAgdGhpcy5fcGhpID0gdmVsb2NpdHkueSAqIGRlbHRhVGltZSAvIDIwICsgdGhpcy5fcGhpO1xuICAgICAgICB0aGlzLl90aGV0YSA9IHZlbG9jaXR5LnggKiBkZWx0YVRpbWUgLyAyMCArIHRoaXMuX3RoZXRhO1xuXG4gICAgICAgIHRoaXMuc2V0QWxwaGEodGhpcy5nZXRBbHBoYSgpKTtcbiAgICAgICAgdGhpcy5zZXRCZXRhKHRoaXMuZ2V0QmV0YSgpKTtcblxuICAgICAgICB0aGlzLl92ZWN0b3JEYW1waW5nKHZlbG9jaXR5LCB0aGlzLmRhbXBpbmcpO1xuICAgIH0sXG5cbiAgICBfdXBkYXRlRGlzdGFuY2U6IGZ1bmN0aW9uIChkZWx0YVRpbWUpIHtcbiAgICAgICAgdGhpcy5fc2V0RGlzdGFuY2UodGhpcy5fZGlzdGFuY2UgKyB0aGlzLl96b29tU3BlZWQgKiBkZWx0YVRpbWUgLyAyMCk7XG4gICAgICAgIHRoaXMuX3pvb21TcGVlZCAqPSB0aGlzLmRhbXBpbmc7XG4gICAgfSxcblxuICAgIF9zZXREaXN0YW5jZTogZnVuY3Rpb24gKGRpc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlID0gTWF0aC5tYXgoTWF0aC5taW4oZGlzdGFuY2UsIHRoaXMubWF4RGlzdGFuY2UpLCB0aGlzLm1pbkRpc3RhbmNlKTtcbiAgICB9LFxuXG4gICAgX3VwZGF0ZVBhbjogZnVuY3Rpb24gKGRlbHRhVGltZSkge1xuICAgICAgICB2YXIgdmVsb2NpdHkgPSB0aGlzLl9wYW5WZWxvY2l0eTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMuX2Rpc3RhbmNlO1xuXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDtcbiAgICAgICAgdmFyIHlBeGlzID0gdGFyZ2V0LndvcmxkVHJhbnNmb3JtLnk7XG4gICAgICAgIHZhciB4QXhpcyA9IHRhcmdldC53b3JsZFRyYW5zZm9ybS54O1xuXG4gICAgICAgIC8vIFBFTkRJTkdcbiAgICAgICAgdGhpcy5fY2VudGVyXG4gICAgICAgICAgICAuc2NhbGVBbmRBZGQoeEF4aXMsIC12ZWxvY2l0eS54ICogbGVuIC8gMjAwKVxuICAgICAgICAgICAgLnNjYWxlQW5kQWRkKHlBeGlzLCAtdmVsb2NpdHkueSAqIGxlbiAvIDIwMCk7XG5cbiAgICAgICAgdGhpcy5fdmVjdG9yRGFtcGluZyh2ZWxvY2l0eSwgMCk7XG4gICAgfSxcblxuICAgIF91cGRhdGVUcmFuc2Zvcm06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMudGFyZ2V0O1xuXG4gICAgICAgIHZhciBkaXIgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB2YXIgdGhldGEgPSB0aGlzLl90aGV0YSArIE1hdGguUEkgLyAyO1xuICAgICAgICB2YXIgcGhpID0gdGhpcy5fcGhpICsgTWF0aC5QSSAvIDI7XG4gICAgICAgIHZhciByID0gTWF0aC5zaW4odGhldGEpO1xuXG4gICAgICAgIGRpci54ID0gciAqIE1hdGguY29zKHBoaSk7XG4gICAgICAgIGRpci55ID0gLU1hdGguY29zKHRoZXRhKTtcbiAgICAgICAgZGlyLnogPSByICogTWF0aC5zaW4ocGhpKTtcblxuICAgICAgICBjYW1lcmEucG9zaXRpb24uY29weSh0aGlzLl9jZW50ZXIpLnNjYWxlQW5kQWRkKGRpciwgdGhpcy5fZGlzdGFuY2UpO1xuICAgICAgICBjYW1lcmEucm90YXRpb24uaWRlbnRpdHkoKVxuICAgICAgICAgICAgLy8gRmlyc3QgYXJvdW5kIHksIHRoZW4gYXJvdW5kIHhcbiAgICAgICAgICAgIC5yb3RhdGVZKC10aGlzLl9waGkpXG4gICAgICAgICAgICAucm90YXRlWCgtdGhpcy5fdGhldGEpO1xuICAgIH0sXG5cbiAgICBfc3RhcnRDb3VudGluZ1N0aWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zdGlsbFRpbWVvdXQpO1xuXG4gICAgICAgIHZhciB0aW1lID0gdGhpcy5hdXRvUm90YXRlQWZ0ZXJTdGlsbDtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoIWlzTmFOKHRpbWUpICYmIHRpbWUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGlsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9yb3RhdGluZyA9IHRydWU7XG4gICAgICAgICAgICB9LCB0aW1lICogMTAwMCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3ZlY3RvckRhbXBpbmc6IGZ1bmN0aW9uICh2LCBkYW1waW5nKSB7XG4gICAgICAgIHZhciBzcGVlZCA9IHYubGVuKCk7XG4gICAgICAgIHNwZWVkID0gc3BlZWQgKiBkYW1waW5nO1xuICAgICAgICBpZiAoc3BlZWQgPCAxZS00KSB7XG4gICAgICAgICAgICBzcGVlZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdi5ub3JtYWxpemUoKS5zY2FsZShzcGVlZCk7XG4gICAgfSxcblxuICAgIGRlY29tcG9zZVRyYW5zZm9ybTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRSBldWxlciBvcmRlci4uLi4uLlxuICAgICAgICAvLyBGSVhNRSBhbHBoYSBpcyBub3QgY2VydGFpbiB3aGVuIGJldGEgaXMgOTAgb3IgLTkwXG4gICAgICAgIC8vIHZhciBldWxlciA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIC8vIGV1bGVyLmV1bGVyRnJvbU1hdDMoXG4gICAgICAgIC8vICAgIG5ldyBNYXRyaXgzKCkuZnJvbVF1YXQodGhpcy50YXJnZXQucm90YXRpb24pLCAnWllYJ1xuICAgICAgICAvLyApO1xuICAgICAgICAvLyBldWxlci5ldWxlckZyb21RdWF0KFxuICAgICAgICAvLyAgICAgdGhpcy50YXJnZXQucm90YXRpb24ubm9ybWFsaXplKCksICdaWVgnXG4gICAgICAgIC8vICk7XG4gICAgICAgIHRoaXMudGFyZ2V0LnVwZGF0ZVdvcmxkVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgdmFyIGZvcndhcmQgPSB0aGlzLnRhcmdldC53b3JsZFRyYW5zZm9ybS56O1xuICAgICAgICB2YXIgYWxwaGEgPSBNYXRoLmFzaW4oZm9yd2FyZC55KTtcbiAgICAgICAgdmFyIGJldGEgPSBNYXRoLmF0YW4yKGZvcndhcmQueCwgZm9yd2FyZC56KTtcblxuICAgICAgICB0aGlzLl90aGV0YSA9IGFscGhhO1xuICAgICAgICB0aGlzLl9waGkgPSAtYmV0YTtcblxuICAgICAgICB0aGlzLnNldEJldGEodGhpcy5nZXRCZXRhKCkpO1xuICAgICAgICB0aGlzLnNldEFscGhhKHRoaXMuZ2V0QWxwaGEoKSk7XG5cbiAgICAgICAgdGhpcy5fc2V0RGlzdGFuY2UodGhpcy50YXJnZXQucG9zaXRpb24uZGlzdCh0aGlzLl9jZW50ZXIpKTtcbiAgICB9LFxuXG4gICAgX21vdXNlRG93bkhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0FuaW1hdGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHggPSBlLmNsaWVudFg7XG4gICAgICAgIHZhciB5ID0gZS5jbGllbnRZO1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzKSB7XG4gICAgICAgICAgICB2YXIgdG91Y2ggPSBlLnRhcmdldFRvdWNoZXNbMF07XG4gICAgICAgICAgICB4ID0gdG91Y2guY2xpZW50WDtcbiAgICAgICAgICAgIHkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAgICAgICB0aGlzLl9tb2RlID0gJ3JvdGF0ZSc7XG5cbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NHZXN0dXJlKGUsICdzdGFydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbSA9IHRoaXMuZG9tRWxlbWVudDtcbiAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9tb3VzZVVwSGFuZGxlcik7XG5cbiAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBIYW5kbGVyKTtcblxuICAgICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX21vZGUgPSAncm90YXRlJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlLmJ1dHRvbiA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZSA9ICdwYW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgcm90YXRlIHZlbG9jaXR5XG4gICAgICAgIHRoaXMuX3JvdGF0ZVZlbG9jaXR5LnNldCgwLCAwKTtcbiAgICAgICAgdGhpcy5fcm90YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuYXV0b1JvdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRDb3VudGluZ1N0aWxsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3VzZVggPSB4O1xuICAgICAgICB0aGlzLl9tb3VzZVkgPSB5O1xuICAgIH0sXG5cbiAgICBfbW91c2VNb3ZlSGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeCA9IGUuY2xpZW50WDtcbiAgICAgICAgdmFyIHkgPSBlLmNsaWVudFk7XG5cbiAgICAgICAgdmFyIGhhdmVHZXN0dXJlO1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzKSB7XG4gICAgICAgICAgICB2YXIgdG91Y2ggPSBlLnRhcmdldFRvdWNoZXNbMF07XG4gICAgICAgICAgICB4ID0gdG91Y2guY2xpZW50WDtcbiAgICAgICAgICAgIHkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAgICAgICBoYXZlR2VzdHVyZSA9IHRoaXMuX3Byb2Nlc3NHZXN0dXJlKGUsICdjaGFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYW5TZW5zaXRpdml0eSA9IGNvbnZlcnRUb0FycmF5KHRoaXMucGFuU2Vuc2l0aXZpdHkpO1xuICAgICAgICB2YXIgcm90YXRlU2Vuc2l0aXZpdHkgPSBjb252ZXJ0VG9BcnJheSh0aGlzLnJvdGF0ZVNlbnNpdGl2aXR5KTtcblxuICAgICAgICBpZiAoIWhhdmVHZXN0dXJlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gJ3JvdGF0ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGVWZWxvY2l0eS55ID0gKHggLSB0aGlzLl9tb3VzZVgpIC8gdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCAqIDIgKiByb3RhdGVTZW5zaXRpdml0eVswXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGVWZWxvY2l0eS54ID0gKHkgLSB0aGlzLl9tb3VzZVkpIC8gdGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoICogMiAqIHJvdGF0ZVNlbnNpdGl2aXR5WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fbW9kZSA9PT0gJ3BhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYW5WZWxvY2l0eS54ID0gKHggLSB0aGlzLl9tb3VzZVgpIC8gdGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoICogcGFuU2Vuc2l0aXZpdHlbMF0gKiA0MDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFuVmVsb2NpdHkueSA9ICgteSArIHRoaXMuX21vdXNlWSkgLyB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0ICogcGFuU2Vuc2l0aXZpdHlbMV0gKiA0MDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3VzZVggPSB4O1xuICAgICAgICB0aGlzLl9tb3VzZVkgPSB5O1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuXG4gICAgX21vdXNlV2hlZWxIYW5kbGVyOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5faXNBbmltYXRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9IGUud2hlZWxEZWx0YSAvLyBXZWJraXRcbiAgICAgICAgICAgICAgICB8fCAtZS5kZXRhaWw7IC8vIEZpcmVmb3hcbiAgICAgICAgaWYgKGRlbHRhID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fem9vbUhhbmRsZXIoZSwgZGVsdGEgPiAwID8gLTEgOiAxKTtcbiAgICB9LFxuXG4gICAgX3BpbmNoSGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl96b29tSGFuZGxlcihlLCBlLnBpbmNoU2NhbGUgPiAxID8gLTAuNCA6IDAuNCk7XG4gICAgfSxcblxuICAgIF96b29tSGFuZGxlcjogZnVuY3Rpb24gKGUsIGRlbHRhKSB7XG5cbiAgICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5tYXgoTWF0aC5taW4oXG4gICAgICAgICAgICB0aGlzLl9kaXN0YW5jZSAtIHRoaXMubWluRGlzdGFuY2UsXG4gICAgICAgICAgICB0aGlzLm1heERpc3RhbmNlIC0gdGhpcy5fZGlzdGFuY2VcbiAgICAgICAgKSk7XG4gICAgICAgIHRoaXMuX3pvb21TcGVlZCA9IGRlbHRhICogTWF0aC5tYXgoZGlzdGFuY2UgLyA0MCAqIHRoaXMuem9vbVNlbnNpdGl2aXR5LCAwLjIpO1xuXG4gICAgICAgIHRoaXMuX3JvdGF0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b1JvdGF0ZSAmJiB0aGlzLl9tb2RlID09PSAncm90YXRlJykge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRDb3VudGluZ1N0aWxsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcblxuICAgIF9tb3VzZVVwSGFuZGxlcjogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBkb20gPSB0aGlzLmRvbUVsZW1lbnQ7XG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9tb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fbW91c2VVcEhhbmRsZXIpO1xuICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fbW91c2VNb3ZlSGFuZGxlcik7XG4gICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fbW91c2VVcEhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NHZXN0dXJlKGV2ZW50LCAnZW5kJyk7XG4gICAgfSxcblxuICAgIF9hZGRBbmltYXRvcjogZnVuY3Rpb24gKGFuaW1hdG9yKSB7XG4gICAgICAgIHZhciBhbmltYXRvcnMgPSB0aGlzLl9hbmltYXRvcnM7XG4gICAgICAgIGFuaW1hdG9ycy5wdXNoKGFuaW1hdG9yKTtcbiAgICAgICAgYW5pbWF0b3IuZG9uZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gYW5pbWF0b3JzLmluZGV4T2YoYW5pbWF0b3IpO1xuICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0b3JzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFuaW1hdG9yO1xuICAgIH0sXG5cblxuICAgIF9wcm9jZXNzR2VzdHVyZTogZnVuY3Rpb24gKGV2ZW50LCBzdGFnZSkge1xuICAgICAgICB2YXIgZ2VzdHVyZU1nciA9IHRoaXMuX2dlc3R1cmVNZ3I7XG5cbiAgICAgICAgc3RhZ2UgPT09ICdzdGFydCcgJiYgZ2VzdHVyZU1nci5jbGVhcigpO1xuXG4gICAgICAgIHZhciBnZXN0dXJlSW5mbyA9IGdlc3R1cmVNZ3IucmVjb2duaXplKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGhpcy5kb21FbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgc3RhZ2UgPT09ICdlbmQnICYmIGdlc3R1cmVNZ3IuY2xlYXIoKTtcblxuICAgICAgICAvLyBEbyBub3QgZG8gYW55IHByZXZlbnREZWZhdWx0IGhlcmUuIFVwcGVyIGFwcGxpY2F0aW9uIGRvIHRoYXQgaWYgbmVjZXNzYXJ5LlxuICAgICAgICBpZiAoZ2VzdHVyZUluZm8pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZ2VzdHVyZUluZm8udHlwZTtcbiAgICAgICAgICAgIGV2ZW50Lmdlc3R1cmVFdmVudCA9IHR5cGU7XG5cbiAgICAgICAgICAgIHRoaXMuX3BpbmNoSGFuZGxlcihnZXN0dXJlSW5mby5ldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2VzdHVyZUluZm87XG4gICAgfVxufSk7XG5cbi8qKlxuICogSWYgYXV0byByb3RhdGUgdGhlIHRhcmdldFxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT3JiaXRDb250cm9sLnByb3RvdHlwZSwgJ2F1dG9Sb3RhdGUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvUm90YXRlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuX2F1dG9Sb3RhdGUgPSB2YWw7XG4gICAgICAgIHRoaXMuX3JvdGF0aW5nID0gdmFsO1xuICAgIH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT3JiaXRDb250cm9sLnByb3RvdHlwZSwgJ3RhcmdldCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBpZiAodmFsICYmIHZhbC50YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2VudGVyKHZhbC50YXJnZXQudG9BcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90YXJnZXQgPSB2YWw7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlVHJhbnNmb3JtKCk7XG4gICAgfVxufSk7XG5cblxuZXhwb3J0IGRlZmF1bHQgT3JiaXRDb250cm9sO1xuIiwiLyoqXG4gKiBTdGF0aWNHZW9tZXRyeSBjYW4gbm90IGJlIGNoYW5nZWQgb25jZSB0aGV5J3ZlIGJlZW4gc2V0dXBcbiAqL1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4vR2VvbWV0cnknO1xuLyoqXG4gKiBAY29uc3RydWN0b3IgY2xheS5TdGF0aWNHZW9tZXRyeVxuICogQGV4dGVuZHMgY2xheS5HZW9tZXRyeVxuICovXG52YXIgU3RhdGljR2VvbWV0cnkgPSBHZW9tZXRyeS5leHRlbmQoe1xuICAgIGR5bmFtaWM6IGZhbHNlXG59KTtcbmV4cG9ydCBkZWZhdWx0IFN0YXRpY0dlb21ldHJ5O1xuIiwiLy8gVE9ETyB0ZXN0XG5pbXBvcnQgR2VvbWV0cnkgZnJvbSAnLi4vR2VvbWV0cnknO1xuaW1wb3J0IE1lc2ggZnJvbSAnLi4vTWVzaCc7XG5pbXBvcnQgTm9kZSBmcm9tICcuLi9Ob2RlJztcbmltcG9ydCBTdGFuZGFyZE1hdGVyaWFsIGZyb20gJy4uL1N0YW5kYXJkTWF0ZXJpYWwnO1xuaW1wb3J0IEJvdW5kaW5nQm94IGZyb20gJy4uL21hdGgvQm91bmRpbmdCb3gnO1xuaW1wb3J0IGdsTWF0cml4IGZyb20gJy4uL2RlcC9nbG1hdHJpeCc7XG52YXIgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG52YXIgdmVjMyA9IGdsTWF0cml4LnZlYzM7XG5cbi8qKlxuICogQG5hbWVzcGFjZSBjbGF5LnV0aWwubWVzaFxuICovXG52YXIgbWVzaFV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogTWVyZ2UgbXVsdGlwbGUgbWVzaGVzIHRvIG9uZS5cbiAgICAgKiBOb3RlIHRoYXQgdGhlc2UgbWVzaGVzIG11c3QgaGF2ZSB0aGUgc2FtZSBtYXRlcmlhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48Y2xheS5NZXNoPn0gbWVzaGVzXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcHBseVdvcmxkVHJhbnNmb3JtXG4gICAgICogQHJldHVybiBjbGF5Lk1lc2hcbiAgICAgKiBAbWVtYmVyT2YgY2xheS51dGlsLm1lc2hcbiAgICAgKi9cbiAgICBtZXJnZTogZnVuY3Rpb24gKG1lc2hlcywgYXBwbHlXb3JsZFRyYW5zZm9ybSkge1xuXG4gICAgICAgIGlmICghIG1lc2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZW1wbGF0ZU1lc2ggPSBtZXNoZXNbMF07XG4gICAgICAgIHZhciB0ZW1wbGF0ZUdlbyA9IHRlbXBsYXRlTWVzaC5nZW9tZXRyeTtcbiAgICAgICAgdmFyIG1hdGVyaWFsID0gdGVtcGxhdGVNZXNoLm1hdGVyaWFsO1xuXG4gICAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSh7XG4gICAgICAgICAgICBkeW5hbWljOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgQm91bmRpbmdCb3goKTtcblxuICAgICAgICB2YXIgYXR0cmlidXRlTmFtZXMgPSB0ZW1wbGF0ZUdlby5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZXNbaV07XG4gICAgICAgICAgICB2YXIgYXR0ciA9IHRlbXBsYXRlR2VvLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICAvLyBFeHRlbmQgY3VzdG9tIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICghZ2VvbWV0cnkuYXR0cmlidXRlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXNbbmFtZV0gPSBhdHRyLmNsb25lKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnZlcnNlVHJhbnNwb3NlTWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXJyYXkgZGF0YSBhbmQgbWVyZ2UgYm91bmRpbmcgYm94XG4gICAgICAgIHZhciBuVmVydGV4ID0gMDtcbiAgICAgICAgdmFyIG5GYWNlID0gMDtcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBtZXNoZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50R2VvID0gbWVzaGVzW2tdLmdlb21ldHJ5O1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRHZW8uYm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50R2VvLmJvdW5kaW5nQm94LmFwcGx5VHJhbnNmb3JtKGFwcGx5V29ybGRUcmFuc2Zvcm0gPyBtZXNoZXNba10ud29ybGRUcmFuc2Zvcm0gOiBtZXNoZXNba10ubG9jYWxUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmJvdW5kaW5nQm94LnVuaW9uKGN1cnJlbnRHZW8uYm91bmRpbmdCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgblZlcnRleCArPSBjdXJyZW50R2VvLnZlcnRleENvdW50O1xuICAgICAgICAgICAgbkZhY2UgKz0gY3VycmVudEdlby50cmlhbmdsZUNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZXNbbl07XG4gICAgICAgICAgICB2YXIgYXR0cmliID0gZ2VvbWV0cnkuYXR0cmlidXRlc1tuYW1lXTtcbiAgICAgICAgICAgIGF0dHJpYi5pbml0KG5WZXJ0ZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuVmVydGV4ID49IDB4ZmZmZikge1xuICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShuRmFjZSAqIDMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShuRmFjZSAqIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZlcnRleE9mZnNldCA9IDA7XG4gICAgICAgIHZhciBpbmRpY2VzT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIHVzZUluZGljZXMgPSB0ZW1wbGF0ZUdlby5pc1VzZUluZGljZXMoKTtcblxuICAgICAgICBmb3IgKHZhciBtbSA9IDA7IG1tIDwgbWVzaGVzLmxlbmd0aDsgbW0rKykge1xuICAgICAgICAgICAgdmFyIG1lc2ggPSBtZXNoZXNbbW1dO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRHZW8gPSBtZXNoLmdlb21ldHJ5O1xuXG4gICAgICAgICAgICB2YXIgblZlcnRleCA9IGN1cnJlbnRHZW8udmVydGV4Q291bnQ7XG5cbiAgICAgICAgICAgIHZhciBtYXRyaXggPSBhcHBseVdvcmxkVHJhbnNmb3JtID8gbWVzaC53b3JsZFRyYW5zZm9ybS5hcnJheSA6IG1lc2gubG9jYWxUcmFuc2Zvcm0uYXJyYXk7XG4gICAgICAgICAgICBtYXQ0LmludmVydChpbnZlcnNlVHJhbnNwb3NlTWF0cml4LCBtYXRyaXgpO1xuICAgICAgICAgICAgbWF0NC50cmFuc3Bvc2UoaW52ZXJzZVRyYW5zcG9zZU1hdHJpeCwgaW52ZXJzZVRyYW5zcG9zZU1hdHJpeCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIG5uID0gMDsgbm4gPCBhdHRyaWJ1dGVOYW1lcy5sZW5ndGg7IG5uKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWVzW25uXTtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEF0dHIgPSBjdXJyZW50R2VvLmF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEF0dHIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIHVudXNlZCBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudEF0dHIudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbGVuID0gY3VycmVudEF0dHIudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gY3VycmVudEF0dHIuc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdmVydGV4T2Zmc2V0ICogc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBsZW4gLyBzaXplO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXR0ci52YWx1ZVtvZmZzZXQgKyBpXSA9IGN1cnJlbnRBdHRyLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gcG9zaXRpb24sIG5vcm1hbCBhbmQgdGFuZ2VudFxuICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAncG9zaXRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzMuZm9yRWFjaCh0YXJnZXRBdHRyLnZhbHVlLCBzaXplLCBvZmZzZXQsIGNvdW50LCB2ZWMzLnRyYW5zZm9ybU1hdDQsIG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdub3JtYWwnIHx8IG5hbWUgPT09ICd0YW5nZW50Jykge1xuICAgICAgICAgICAgICAgICAgICB2ZWMzLmZvckVhY2godGFyZ2V0QXR0ci52YWx1ZSwgc2l6ZSwgb2Zmc2V0LCBjb3VudCwgdmVjMy50cmFuc2Zvcm1NYXQ0LCBpbnZlcnNlVHJhbnNwb3NlTWF0cml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1c2VJbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGN1cnJlbnRHZW8uaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5pbmRpY2VzW2kgKyBpbmRpY2VzT2Zmc2V0XSA9IGN1cnJlbnRHZW8uaW5kaWNlc1tpXSArIHZlcnRleE9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kaWNlc09mZnNldCArPSBsZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlcnRleE9mZnNldCArPSBuVmVydGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNZXNoKHtcbiAgICAgICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcbiAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3BsaXQgbWVzaCBpbnRvIHN1YiBtZXNoZXMsIGVhY2ggbWVzaCB3aWxsIGhhdmUgbWF4Sm9pbnROdW1iZXIgam9pbnRzLlxuICAgICAqIEBwYXJhbSB7Y2xheS5NZXNofSBtZXNoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heEpvaW50TnVtYmVyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpblBsYWNlXG4gICAgICogQHJldHVybiB7Y2xheS5Ob2RlfVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIGNsYXkudXRpbC5tZXNoXG4gICAgICovXG5cbiAgICAvLyBGSVhNRSwgSGF2ZSBpc3N1ZXMgb24gc29tZSBtb2RlbHNcbiAgICBzcGxpdEJ5Sm9pbnRzOiBmdW5jdGlvbiAobWVzaCwgbWF4Sm9pbnROdW1iZXIsIGluUGxhY2UpIHtcbiAgICAgICAgdmFyIGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeTtcbiAgICAgICAgdmFyIHNrZWxldG9uID0gbWVzaC5za2VsZXRvbjtcbiAgICAgICAgdmFyIG1hdGVyaWFsID0gbWVzaC5tYXRlcmlhbDtcbiAgICAgICAgdmFyIGpvaW50cyA9IG1lc2guam9pbnRzO1xuICAgICAgICBpZiAoIWdlb21ldHJ5IHx8ICFza2VsZXRvbiB8fCAham9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqb2ludHMubGVuZ3RoIDwgbWF4Sm9pbnROdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNoO1xuICAgICAgICB9XG5cblxuICAgICAgICB2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXM7XG5cbiAgICAgICAgdmFyIGZhY2VMZW4gPSBnZW9tZXRyeS50cmlhbmdsZUNvdW50O1xuICAgICAgICB2YXIgcmVzdCA9IGZhY2VMZW47XG4gICAgICAgIHZhciBpc0ZhY2VBZGRlZCA9IFtdO1xuICAgICAgICB2YXIgam9pbnRWYWx1ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLmpvaW50LnZhbHVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZhY2VMZW47IGkrKykge1xuICAgICAgICAgICAgaXNGYWNlQWRkZWRbaV0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWRkZWRKb2ludElkeFBlckZhY2UgPSBbXTtcblxuICAgICAgICB2YXIgYnVja2V0cyA9IFtdO1xuXG4gICAgICAgIHZhciBnZXRKb2ludEJ5SW5kZXggPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgICAgICByZXR1cm4gam9pbnRzW2lkeF07XG4gICAgICAgIH07XG4gICAgICAgIHdoaWxlIChyZXN0ID4gMCkge1xuICAgICAgICAgICAgdmFyIGJ1Y2tldFRyaWFuZ2xlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGJ1Y2tldEpvaW50UmV2ZXJzZU1hcCA9IFtdO1xuICAgICAgICAgICAgdmFyIGJ1Y2tldEpvaW50cyA9IFtdO1xuICAgICAgICAgICAgdmFyIHN1YkpvaW50TnVtYmVyID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgam9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRSZXZlcnNlTWFwW2ldID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGZhY2VMZW47IGYrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0ZhY2VBZGRlZFtmXSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNhbkFkZFRvQnVja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgYWRkZWROdW1iZXIgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IGluZGljZXNbZiAqIDMgKyBpXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpvaW50SWR4ID0gam9pbnRWYWx1ZXNbaWR4ICogNCArIGpdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoam9pbnRJZHggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXRKb2ludFJldmVyc2VNYXBbam9pbnRJZHhdID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViSm9pbnROdW1iZXIgPCBtYXhKb2ludE51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRSZXZlcnNlTWFwW2pvaW50SWR4XSA9IHN1YkpvaW50TnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRzW3N1YkpvaW50TnVtYmVyKytdID0gam9pbnRJZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEpvaW50SWR4UGVyRmFjZVthZGRlZE51bWJlcisrXSA9IGpvaW50SWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWRkVG9CdWNrZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNhbkFkZFRvQnVja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJldmVyc2Ugb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkZWROdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRSZXZlcnNlTWFwW2FkZGVkSm9pbnRJZHhQZXJGYWNlW2ldXSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0Sm9pbnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViSm9pbnROdW1iZXItLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0VHJpYW5nbGVzLnB1c2goaW5kaWNlcy5zdWJhcnJheShmICogMywgKGYgKyAxKSAqIDMpKTtcblxuICAgICAgICAgICAgICAgICAgICBpc0ZhY2VBZGRlZFtmXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3QtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWNrZXRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRyaWFuZ2xlczogYnVja2V0VHJpYW5nbGVzLFxuICAgICAgICAgICAgICAgIGpvaW50czogYnVja2V0Sm9pbnRzLm1hcChnZXRKb2ludEJ5SW5kZXgpLFxuICAgICAgICAgICAgICAgIGpvaW50UmV2ZXJzZU1hcDogYnVja2V0Sm9pbnRSZXZlcnNlTWFwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByb290ID0gbmV3IE5vZGUoe1xuICAgICAgICAgICAgbmFtZTogbWVzaC5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYXR0cmliTmFtZXMgPSBnZW9tZXRyeS5nZXRFbmFibGVkQXR0cmlidXRlcygpO1xuXG4gICAgICAgIGF0dHJpYk5hbWVzLnNwbGljZShhdHRyaWJOYW1lcy5pbmRleE9mKCdqb2ludCcpLCAxKTtcbiAgICAgICAgLy8gTWFwIGZyb20gb2xkIHZlcnRleCBpbmRleCB0byBuZXcgdmVydGV4IGluZGV4XG4gICAgICAgIHZhciBuZXdJbmRpY2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYnVja2V0cy5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgdmFyIGJ1Y2tldCA9IGJ1Y2tldHNbYl07XG4gICAgICAgICAgICB2YXIgam9pbnRSZXZlcnNlTWFwID0gYnVja2V0LmpvaW50UmV2ZXJzZU1hcDtcbiAgICAgICAgICAgIHZhciBzdWJKb2ludE51bWJlciA9IGJ1Y2tldC5qb2ludHMubGVuZ3RoO1xuXG4gICAgICAgICAgICB2YXIgc3ViTWF0ID0gbWF0ZXJpYWwuY2xvbmUoKTtcbiAgICAgICAgICAgIHN1Yk1hdC5uYW1lID0gW21hdGVyaWFsLm5hbWUsIGJdLmpvaW4oJy0nKTtcblxuICAgICAgICAgICAgdmFyIHN1YkdlbyA9IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgICAgICAgICB2YXIgc3ViTWVzaCA9IG5ldyBNZXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBbbWVzaC5uYW1lLCBpXS5qb2luKCctJyksXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWw6IHN1Yk1hdCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogc3ViR2VvLFxuICAgICAgICAgICAgICAgIHNrZWxldG9uOiBza2VsZXRvbixcbiAgICAgICAgICAgICAgICBqb2ludHM6IGJ1Y2tldC5qb2ludHMuc2xpY2UoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgblZlcnRleCA9IDA7XG4gICAgICAgICAgICB2YXIgblZlcnRleDIgPSBnZW9tZXRyeS52ZXJ0ZXhDb3VudDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblZlcnRleDI7IGkrKykge1xuICAgICAgICAgICAgICAgIG5ld0luZGljZXNbaV0gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvdW50IHN1YiBnZW8gbnVtYmVyXG4gICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGJ1Y2tldC50cmlhbmdsZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmFjZSA9IGJ1Y2tldC50cmlhbmdsZXNbZl07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IGZhY2VbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbmRpY2VzW2lkeF0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbmRpY2VzW2lkeF0gPSBuVmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgblZlcnRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhdHRyaWJOYW1lcy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJOYW1lID0gYXR0cmliTmFtZXNbYV07XG4gICAgICAgICAgICAgICAgdmFyIHN1YkF0dHJpYiA9IHN1Ykdlby5hdHRyaWJ1dGVzW2F0dHJpYk5hbWVdO1xuICAgICAgICAgICAgICAgIHN1YkF0dHJpYi5pbml0KG5WZXJ0ZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViR2VvLmF0dHJpYnV0ZXMuam9pbnQudmFsdWUgPSBuZXcgRmxvYXQzMkFycmF5KG5WZXJ0ZXggKiA0KTtcblxuICAgICAgICAgICAgaWYgKG5WZXJ0ZXggPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICBzdWJHZW8uaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShidWNrZXQudHJpYW5nbGVzLmxlbmd0aCAqIDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViR2VvLmluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoYnVja2V0LnRyaWFuZ2xlcy5sZW5ndGggKiAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGluZGljZXNPZmZzZXQgPSAwO1xuICAgICAgICAgICAgblZlcnRleCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5WZXJ0ZXgyOyBpKyspIHtcbiAgICAgICAgICAgICAgICBuZXdJbmRpY2VzW2ldID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGYgPSAwOyBmIDwgYnVja2V0LnRyaWFuZ2xlcy5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciB0cmlhbmdsZSA9IGJ1Y2tldC50cmlhbmdsZXNbZl07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdHJpYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0luZGljZXNbaWR4XSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luZGljZXNbaWR4XSA9IG5WZXJ0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGF0dHJpYk5hbWVzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYk5hbWUgPSBhdHRyaWJOYW1lc1thXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmliID0gZ2VvbWV0cnkuYXR0cmlidXRlc1thdHRyaWJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViQXR0cmliID0gc3ViR2VvLmF0dHJpYnV0ZXNbYXR0cmliTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemUgPSBhdHRyaWIuc2l6ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkF0dHJpYi52YWx1ZVtuVmVydGV4ICogc2l6ZSArIGpdID0gYXR0cmliLnZhbHVlW2lkeCAqIHNpemUgKyBqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqb2ludElkeCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuam9pbnQudmFsdWVbaWR4ICogNCArIGpdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBuVmVydGV4ICogNCArIGo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW50SWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViR2VvLmF0dHJpYnV0ZXMuam9pbnQudmFsdWVbb2Zmc2V0XSA9IGpvaW50UmV2ZXJzZU1hcFtqb2ludElkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJHZW8uYXR0cmlidXRlcy5qb2ludC52YWx1ZVtvZmZzZXRdID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgblZlcnRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1Ykdlby5pbmRpY2VzW2luZGljZXNPZmZzZXQrK10gPSBuZXdJbmRpY2VzW2lkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViR2VvLnVwZGF0ZUJvdW5kaW5nQm94KCk7XG5cbiAgICAgICAgICAgIHJvb3QuYWRkKHN1Yk1lc2gpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG1lc2guY2hpbGRyZW4oKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm9vdC5hZGQoY2hpbGRyZW5baV0pO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QucG9zaXRpb24uY29weShtZXNoLnBvc2l0aW9uKTtcbiAgICAgICAgcm9vdC5yb3RhdGlvbi5jb3B5KG1lc2gucm90YXRpb24pO1xuICAgICAgICByb290LnNjYWxlLmNvcHkobWVzaC5zY2FsZSk7XG5cbiAgICAgICAgaWYgKGluUGxhY2UpIHtcbiAgICAgICAgICAgIGlmIChtZXNoLmdldFBhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IG1lc2guZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZShtZXNoKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuYWRkKHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc2hVdGlsO1xuIiwiaW1wb3J0IHV0aWwgZnJvbSAnLi4vY29yZS91dGlsJztcbmltcG9ydCBHZW9tZXRyeSBmcm9tICcuLi9HZW9tZXRyeSc7XG5pbXBvcnQgQm91bmRpbmdCb3ggZnJvbSAnLi4vbWF0aC9Cb3VuZGluZ0JveCc7XG5pbXBvcnQgVmVjdG9yMyBmcm9tICcuLi9tYXRoL1ZlY3RvcjMnO1xuXG52YXIgTUVUQSA9IHtcbiAgICB2ZXJzaW9uOiAxLjAsXG4gICAgdHlwZTogJ0dlb21ldHJ5JyxcbiAgICBnZW5lcmF0b3I6ICd1dGlsLnRyYW5zZmVyYWJsZS50b09iamVjdCdcbn07XG5cbi8qKlxuICogQGFsaWFzIGNsYXkudXRpbC50cmFuc2ZlcmFibGVcbiAqL1xudmFyIHRyYW5zZmVyYWJsZVV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogQ29udmVydCBnZW9tZXRyeSB0byBhIG9iamVjdCBjb250YWluaW5nIHRyYW5zZmVyYWJsZSBkYXRhXG4gICAgICogQHBhcmFtIHtHZW9tZXRyeX0gZ2VvbWV0cnkgZ2VvbWV0cnlcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNoYWxsb3cgd2hldGhlciBzaGFsbG93IGNvcHlcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IGRhdGEgOiBkYXRhLCBidWZmZXJzIDogYnVmZmVycyB9LCBidWZmZXJzIGlzIHRoZSB0cmFuc2ZlcmFibGUgbGlzdFxuICAgICAqL1xuICAgIHRvT2JqZWN0IDogZnVuY3Rpb24gKGdlb21ldHJ5LCBzaGFsbG93KSB7XG4gICAgICAgIGlmICghZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgbWV0YWRhdGEgOiB1dGlsLmV4dGVuZCh7fSwgTUVUQSlcbiAgICAgICAgfTtcbiAgICAgICAgLy90cmFuc2ZlcmFibGUgYnVmZmVyc1xuICAgICAgICB2YXIgYnVmZmVycyA9IFtdO1xuXG4gICAgICAgIC8vZHluYW1pY1xuICAgICAgICBkYXRhLmR5bmFtaWMgPSBnZW9tZXRyeS5keW5hbWljO1xuXG4gICAgICAgIC8vYm91bmRpbmcgYm94XG4gICAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ0JveCkge1xuICAgICAgICAgICAgZGF0YS5ib3VuZGluZ0JveCA9IHtcbiAgICAgICAgICAgICAgICBtaW4gOiBnZW9tZXRyeS5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLFxuICAgICAgICAgICAgICAgIG1heCA6IGdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC50b0FycmF5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvL2luZGljZXNcbiAgICAgICAgaWYgKGdlb21ldHJ5LmluZGljZXMgJiYgZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkYXRhLmluZGljZXMgPSBjb3B5SWZOZWNlc3NhcnkoZ2VvbWV0cnkuaW5kaWNlcywgc2hhbGxvdyk7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goZGF0YS5pbmRpY2VzLmJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2F0dHJpYnV0ZXNcbiAgICAgICAgZGF0YS5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gZ2VvbWV0cnkuYXR0cmlidXRlcykgeyBcbiAgICAgICAgICAgIGlmIChnZW9tZXRyeS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzW3BdO1xuICAgICAgICAgICAgICAgIC8vaWdub3JlIGVtcHR5IGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICBpZiAoYXR0ciAmJiBhdHRyLnZhbHVlICYmIGF0dHIudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyID0gZGF0YS5hdHRyaWJ1dGVzW3BdID0gY29weUF0dHJpYnV0ZShhdHRyLCBzaGFsbG93KTtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGF0dHIudmFsdWUuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBidWZmZXJzIDogYnVmZmVyc1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcm9kdWNlIGEgZ2VvbWV0cnkgZnJvbSBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRvT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRvT2JqZWN0XG4gICAgICogQHJldHVybnMge0dlb21ldHJ5fSBnZW9tZXRyeVxuICAgICAqL1xuICAgIHRvR2VvbWV0cnkgOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0LmRhdGEgJiYgb2JqZWN0LmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2ZlcmFibGVVdGlsLnRvR2VvbWV0cnkob2JqZWN0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb2JqZWN0Lm1ldGFkYXRhIHx8IG9iamVjdC5tZXRhZGF0YS5nZW5lcmF0b3IgIT09IE1FVEEuZ2VuZXJhdG9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1t1dGlsLnRyYW5zZmVyYWJsZS50b0dlb21ldHJ5XSB0aGUgb2JqZWN0IGlzIG5vdCBnZW5lcmF0ZWQgYnkgdXRpbC50cmFuc2ZlcmFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2Jhc2ljIG9wdGlvbnNcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBkeW5hbWljIDogb2JqZWN0LmR5bmFtaWMsXG4gICAgICAgICAgICBpbmRpY2VzIDogb2JqZWN0LmluZGljZXNcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob2JqZWN0LmJvdW5kaW5nQm94KSB7XG4gICAgICAgICAgICB2YXIgbWluID0gbmV3IFZlY3RvcjMoKS5zZXRBcnJheShvYmplY3QuYm91bmRpbmdCb3gubWluKTtcbiAgICAgICAgICAgIHZhciBtYXggPSBuZXcgVmVjdG9yMygpLnNldEFycmF5KG9iamVjdC5ib3VuZGluZ0JveC5tYXgpO1xuICAgICAgICAgICAgb3B0aW9ucy5ib3VuZGluZ0JveCA9IG5ldyBCb3VuZGluZ0JveChtaW4sIG1heCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2F0dHJpYnV0ZXNcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBvYmplY3QuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKG9iamVjdC5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBvYmplY3QuYXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW3BdID0gbmV3IEdlb21ldHJ5LkF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudHlwZSwgYXR0ci5zaXplLCBhdHRyLnNlbWFudGljKTtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW3BdLnZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnkob3B0aW9ucyk7XG4gICAgfVxuICAgIFxufVxuXG5mdW5jdGlvbiBjb3B5QXR0cmlidXRlKGF0dHIsIHNoYWxsb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lIDogYXR0ci5uYW1lLFxuICAgICAgICB0eXBlIDogYXR0ci50eXBlLFxuICAgICAgICBzaXplIDogYXR0ci5zaXplLFxuICAgICAgICBzZW1hbnRpYyA6IGF0dHIuc2VtYW50aWMsXG4gICAgICAgIHZhbHVlIDogY29weUlmTmVjZXNzYXJ5KGF0dHIudmFsdWUsIHNoYWxsb3cpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29weUlmTmVjZXNzYXJ5KGFyciwgc2hhbGxvdykge1xuICAgIGlmICghc2hhbGxvdykge1xuICAgICAgICByZXR1cm4gbmV3IGFyci5jb25zdHJ1Y3RvcihhcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB0cmFuc2ZlcmFibGVVdGlsO1xuIiwiLyoqXG4gKiBAbmFtZSBjbGF5LnZlcnNpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgJzEuMC4wLXJjLjEnO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCJAZXhwb3J0IGNsYXkudnIuZGlzb3J0ZXIub3V0cHV0LnZlcnRleFxcbmF0dHJpYnV0ZSB2ZWMyIHRleGNvb3JkOiBURVhDT09SRF8wO1xcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOiBQT1NJVElPTjtcXG52YXJ5aW5nIHZlYzIgdl9UZXhjb29yZDtcXG52b2lkIG1haW4oKVxcbntcXG4gICAgdl9UZXhjb29yZCA9IHRleGNvb3JkO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueHksIDAuNSwgMS4wKTtcXG59XFxuQGVuZFxcbkBleHBvcnQgY2xheS52ci5kaXNvcnRlci5vdXRwdXQuZnJhZ21lbnRcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xcbnZhcnlpbmcgdmVjMiB2X1RleGNvb3JkO1xcbnZvaWQgbWFpbigpXFxue1xcbiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgdl9UZXhjb29yZCk7XFxufVxcbkBlbmRcIjtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGV2ci93ZWJ2ci1wb2x5ZmlsbC9ibG9iL21hc3Rlci9zcmMvY2FyZGJvYXJkLWRpc3RvcnRlci5qc1xuXG4vLyBVc2Ugd2VidnIgbWF5IGhhdmUgc2NhbGUgcHJvYmxlbS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGV2ci93ZWJ2ci1wb2x5ZmlsbC9pc3N1ZXMvMTQwXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xldnIvd2VidnItcG9seWZpbGwvc2VhcmNoP3E9U0NBTEUmdHlwZT1Jc3N1ZXMmdXRmOD0lRTIlOUMlOTNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGV2ci93ZWJ2ci1wb2x5ZmlsbC9pc3N1ZXMvMTQ3XG5cblxuaW1wb3J0IE1lc2ggZnJvbSAnLi4vTWVzaCc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi4vTWF0ZXJpYWwnO1xuaW1wb3J0IEdlb21ldHJ5IGZyb20gJy4uL0dlb21ldHJ5JztcbmltcG9ydCBTaGFkZXIgZnJvbSAnLi4vU2hhZGVyJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2NvcmUvQmFzZSc7XG5pbXBvcnQgUGVyc3BlY3RpdmVDYW1lcmEgZnJvbSAnLi4vY2FtZXJhL1BlcnNwZWN0aXZlJztcblxuaW1wb3J0IG91dHB1dEVzc2wgZnJvbSAnLi9vdXRwdXQuZ2xzbC5qcyc7XG5cblNoYWRlci5pbXBvcnQob3V0cHV0RXNzbCk7XG5cbmZ1bmN0aW9uIGxlcnAgKGEsIGIsIHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbn1cblxudmFyIENhcmRib2FyZERpc3RvcnRlciA9IEJhc2UuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuXG4gICAgICAgIGNsZWFyQ29sb3I6IFswLCAwLCAwLCAxXSxcblxuICAgICAgICBfbWVzaDogbmV3IE1lc2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ldyBHZW9tZXRyeSh7XG4gICAgICAgICAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjdWxsaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG1hdGVyaWFsOiBuZXcgTWF0ZXJpYWwoe1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIFdoeSBkaXNhYmxlIGRlcHRoTWFzayB3aWxsIGJlIHdyb25nXG4gICAgICAgICAgICAgICAgLy8gZGVwdGhNYXNrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNoYWRlcjogbmV3IFNoYWRlcih7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleDogU2hhZGVyLnNvdXJjZSgnY2xheS52ci5kaXNvcnRlci5vdXRwdXQudmVydGV4JyksXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50OiBTaGFkZXIuc291cmNlKCdjbGF5LnZyLmRpc29ydGVyLm91dHB1dC5mcmFnbWVudCcpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICBfZmFrZUNhbWVyYTogbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKClcbiAgICB9O1xufSwge1xuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIHNvdXJjZVRleHR1cmUpIHtcbiAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XG4gICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICBnbC5jbGVhckNvbG9yKGNsZWFyQ29sb3JbMF0sIGNsZWFyQ29sb3JbMV0sIGNsZWFyQ29sb3JbMl0sIGNsZWFyQ29sb3JbM10pO1xuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcblxuICAgICAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcblxuICAgICAgICB0aGlzLl9tZXNoLm1hdGVyaWFsLnNldCgndGV4dHVyZScsIHNvdXJjZVRleHR1cmUpO1xuXG4gICAgICAgIC8vIEZ1bGwgc2l6ZT9cbiAgICAgICAgcmVuZGVyZXIuc2F2ZVZpZXdwb3J0KCk7XG4gICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KDAsIDAsIHJlbmRlcmVyLmdldFdpZHRoKCksIHJlbmRlcmVyLmdldEhlaWdodCgpKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyUGFzcyhbdGhpcy5fbWVzaF0sIHRoaXMuX2Zha2VDYW1lcmEpO1xuICAgICAgICByZW5kZXJlci5yZXN0b3JlVmlld3BvcnQoKTtcbiAgICAgICAgLy8gdGhpcy5fbWVzaC5tYXRlcmlhbC5zaGFkZXIuYmluZChyZW5kZXJlcik7XG4gICAgICAgIC8vIHRoaXMuX21lc2gubWF0ZXJpYWwuYmluZChyZW5kZXJlcik7XG4gICAgICAgIC8vIHRoaXMuX21lc2gucmVuZGVyKHJlbmRlcmVyLmdsKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlRnJvbVZSRGlzcGxheTogZnVuY3Rpb24gKHZyRGlzcGxheSkge1xuXG4gICAgICAgIC8vIEZJWE1FXG4gICAgICAgIGlmICh2ckRpc3BsYXkuZGV2aWNlSW5mb18pIHtcbiAgICAgICAgICAgIC8vIEhhcmRjb2RlZCBtZXNoIHNpemVcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1lc2goMjAsIDIwLCB2ckRpc3BsYXkuZGV2aWNlSW5mb18pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDYW50IGdldCB2ckRpc3BsYXkuZGV2aWNlSW5mb18sIHNlZW1zIGNvZGUgY2hhbmdlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF91cGRhdGVNZXNoOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgZGV2aWNlSW5mbykge1xuXG4gICAgICAgIHZhciBwb3NpdGlvbkF0dHIgPSB0aGlzLl9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG4gICAgICAgIHZhciB0ZXhjb29yZEF0dHIgPSB0aGlzLl9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMudGV4Y29vcmQwO1xuICAgICAgICBwb3NpdGlvbkF0dHIuaW5pdCgyICogd2lkdGggKiBoZWlnaHQpO1xuICAgICAgICB0ZXhjb29yZEF0dHIuaW5pdCgyICogd2lkdGggKiBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBsZW5zRnJ1c3R1bSA9IGRldmljZUluZm8uZ2V0TGVmdEV5ZVZpc2libGVUYW5BbmdsZXMoKTtcbiAgICAgICAgdmFyIG5vTGVuc0ZydXN0dW0gPSBkZXZpY2VJbmZvLmdldExlZnRFeWVOb0xlbnNUYW5BbmdsZXMoKTtcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gZGV2aWNlSW5mby5nZXRMZWZ0RXllVmlzaWJsZVNjcmVlblJlY3Qobm9MZW5zRnJ1c3R1bSk7XG4gICAgICAgIHZhciB2aWR4ID0gMDtcblxuICAgICAgICB2YXIgcG9zID0gW107XG4gICAgICAgIHZhciB1diA9IFtdO1xuXG4gICAgICAgIC8vIFZlcnRpY2VzXG4gICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgMjsgZSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aDsgaSsrLCB2aWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBpIC8gKHdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gaiAvIChoZWlnaHQgLSAxKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBHcmlkIHBvaW50cyByZWd1bGFybHkgc3BhY2VkIGluIFN0cmVvU2NyZWVuLCBhbmQgYmFycmVsIGRpc3RvcnRlZCBpblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzaC5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB1O1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHY7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbGVycChsZW5zRnJ1c3R1bVswXSwgbGVuc0ZydXN0dW1bMl0sIHUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IGxlcnAobGVuc0ZydXN0dW1bM10sIGxlbnNGcnVzdHVtWzFdLCB2KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gZGV2aWNlSW5mby5kaXN0b3J0aW9uLmRpc3RvcnRJbnZlcnNlKGQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHggKiByIC8gZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSB5ICogciAvIGQ7XG4gICAgICAgICAgICAgICAgICAgIHUgPSAocCAtIG5vTGVuc0ZydXN0dW1bMF0pIC8gKG5vTGVuc0ZydXN0dW1bMl0gLSBub0xlbnNGcnVzdHVtWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdiA9IChxIC0gbm9MZW5zRnJ1c3R1bVszXSkgLyAobm9MZW5zRnJ1c3R1bVsxXSAtIG5vTGVuc0ZydXN0dW1bM10pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdSx2IHRvIG1lc2ggc2NyZWVuIGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgICAgICAgICB2YXIgYXNwZWN0ID0gZGV2aWNlSW5mby5kZXZpY2Uud2lkdGhNZXRlcnMgLyBkZXZpY2VJbmZvLmRldmljZS5oZWlnaHRNZXRlcnM7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoZSBvcmlnaW5hbCBVbml0eSBwbHVnaW4gbXVsdGlwbGllZCBVIGJ5IHRoZSBhc3BlY3QgcmF0aW9cbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRpZG4ndCBtdWx0aXBseSBlaXRoZXIgdmFsdWUgYnkgMiwgYnV0IHRoYXQgc2VlbXMgdG8gZ2V0IGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBjbG9zZSB0byBjb3JyZWN0IGxvb2tpbmcgZm9yIG1lLiBJIGhhdGUgdGhpcyBraW5kIG9mIFwiRG9uJ3RcbiAgICAgICAgICAgICAgICAgICAgLy8ga25vdyB3aHkgaXQgd29ya3NcIiBjb2RlIHRob3VnaCwgYW5kIHdvbGQgbG92ZSBhIG1vcmUgbG9naWNhbFxuICAgICAgICAgICAgICAgICAgICAvLyBleHBsYW5hdGlvbiBvZiB3aGF0IG5lZWRzIHRvIGhhcHBlbiBoZXJlLlxuICAgICAgICAgICAgICAgICAgICB1ID0gKHZpZXdwb3J0LnggKyB1ICogdmlld3BvcnQud2lkdGggLSAwLjUpICogMi4wOyAvLyogYXNwZWN0O1xuICAgICAgICAgICAgICAgICAgICB2ID0gKHZpZXdwb3J0LnkgKyB2ICogdmlld3BvcnQuaGVpZ2h0IC0gMC41KSAqIDIuMDtcblxuICAgICAgICAgICAgICAgICAgICBwb3NbMF0gPSB1O1xuICAgICAgICAgICAgICAgICAgICBwb3NbMV0gPSB2O1xuICAgICAgICAgICAgICAgICAgICBwb3NbMl0gPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIHV2WzBdID0gcyAqIDAuNSArIGUgKiAwLjU7XG4gICAgICAgICAgICAgICAgICAgIHV2WzFdID0gdDtcblxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkF0dHIuc2V0KHZpZHgsIHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHRleGNvb3JkQXR0ci5zZXQodmlkeCwgdXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHcgPSBsZW5zRnJ1c3R1bVsyXSAtIGxlbnNGcnVzdHVtWzBdO1xuICAgICAgICAgICAgbGVuc0ZydXN0dW1bMF0gPSAtKHcgKyBsZW5zRnJ1c3R1bVswXSk7XG4gICAgICAgICAgICBsZW5zRnJ1c3R1bVsyXSA9IHcgLSBsZW5zRnJ1c3R1bVsyXTtcbiAgICAgICAgICAgIHcgPSBub0xlbnNGcnVzdHVtWzJdIC0gbm9MZW5zRnJ1c3R1bVswXTtcbiAgICAgICAgICAgIG5vTGVuc0ZydXN0dW1bMF0gPSAtKHcgKyBub0xlbnNGcnVzdHVtWzBdKTtcbiAgICAgICAgICAgIG5vTGVuc0ZydXN0dW1bMl0gPSB3IC0gbm9MZW5zRnJ1c3R1bVsyXTtcbiAgICAgICAgICAgIHZpZXdwb3J0LnggPSAxIC0gKHZpZXdwb3J0LnggKyB2aWV3cG9ydC53aWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmRpY2VzXG4gICAgICAgIHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KDIgKiAod2lkdGggLSAxKSAqIChoZWlnaHQgLSAxKSAqIDYpO1xuICAgICAgICB2YXIgaGFsZndpZHRoID0gd2lkdGggLyAyO1xuICAgICAgICB2YXIgaGFsZmhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgICAgIHZhciB2aWR4ID0gMDtcbiAgICAgICAgdmFyIGlpZHggPSAwO1xuICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IDI7IGUrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkdGg7IGkrKywgdmlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IGogPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgcXVhZC4gIExvd2VyIHJpZ2h0IGFuZCB1cHBlciBsZWZ0IHF1YWRyYW50cyBoYXZlIHF1YWRzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyaWFuZ2xlIGRpYWdvbmFsIGZsaXBwZWQgdG8gZ2V0IHRoZSB2aWduZXR0ZSB0byBpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoaSA8PSBoYWxmd2lkdGgpID09IChqIDw9IGhhbGZoZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWFkIGRpYWdvbmFsIGxvd2VyIGxlZnQgdG8gdXBwZXIgcmlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpaWR4KytdID0gdmlkeCAtIHdpZHRoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpaWR4KytdID0gdmlkeCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWFkIGRpYWdvbmFsIHVwcGVyIGxlZnQgdG8gbG93ZXIgcmlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4IC0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2lpZHgrK10gPSB2aWR4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaWlkeCsrXSA9IHZpZHggLSB3aWR0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tZXNoLmdlb21ldHJ5LmluZGljZXMgPSBpbmRpY2VzO1xuXG4gICAgICAgIHRoaXMuX21lc2guZ2VvbWV0cnkuZGlydHkoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FyZGJvYXJkRGlzdG9ydGVyO1xuIiwiaW1wb3J0IEJhc2UgZnJvbSAnLi4vTm9kZSc7XG5pbXBvcnQgQ2FtZXJhIGZyb20gJy4uL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgTWF0cml4NCBmcm9tICcuLi9tYXRoL01hdHJpeDQnO1xuXG52YXIgdG1wUHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbnZhciBTdGVyZW9DYW1lcmEgPSBCYXNlLmV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgICAgICBhc3BlY3Q6IDAuNSxcblxuICAgICAgICBfbGVmdENhbWVyYTogbmV3IENhbWVyYSgpLFxuXG4gICAgICAgIF9yaWdodENhbWVyYTogbmV3IENhbWVyYSgpLFxuXG4gICAgICAgIF9leWVMZWZ0OiBuZXcgTWF0cml4NCgpLFxuICAgICAgICBfZXllUmlnaHQ6IG5ldyBNYXRyaXg0KCksXG5cbiAgICAgICAgX2ZyYW1lRGF0YTogbnVsbFxuICAgIH07XG59LCB7XG5cbiAgICB1cGRhdGVGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoY2FtZXJhLCBmb2N1cywgem9vbSwgZXllU2VwKSB7XG4gICAgICAgIGlmIChjYW1lcmEudHJhbnNmb3JtTmVlZHNVcGRhdGUoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdOb2RlIHRyYW5zZm9ybSBpcyBub3QgdXBkYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9jdXMgPSBmb2N1cyA9PSBudWxsID8gMTAgOiBmb2N1cztcbiAgICAgICAgem9vbSA9IHpvb20gPT0gbnVsbCA/IDEgOiB6b29tO1xuICAgICAgICBleWVTZXAgPSBleWVTZXAgPT0gbnVsbCA/IDAuMDY0IDogZXllU2VwO1xuXG4gICAgICAgIHZhciBmb3YgPSBjYW1lcmEuZm92O1xuICAgICAgICB2YXIgYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuICAgICAgICB2YXIgbmVhciA9IGNhbWVyYS5uZWFyO1xuXG4gICAgICAgIC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb25cbiAgICAgICAgLy8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci9cblxuICAgICAgICB0bXBQcm9qZWN0aW9uTWF0cml4LmNvcHkoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICB2YXIgZXllU2VwID0gZXllU2VwIC8gMjtcbiAgICAgICAgdmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1cztcbiAgICAgICAgdmFyIHltYXggPSAobmVhciAqIE1hdGgudGFuKE1hdGguUEkgLyAxODAgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcbiAgICAgICAgdmFyIHhtaW4sIHhtYXg7XG5cbiAgICAgICAgLy8gdHJhbnNsYXRlIHhPZmZzZXRcbiAgICAgICAgdGhpcy5fZXllTGVmdC5hcnJheVsxMl0gPSAtIGV5ZVNlcDtcbiAgICAgICAgdGhpcy5fZXllUmlnaHQuYXJyYXlbMTJdID0gZXllU2VwO1xuXG4gICAgICAgIC8vIGZvciBsZWZ0IGV5ZVxuICAgICAgICB4bWluID0gLSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuICAgICAgICB4bWF4ID0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuICAgICAgICB0bXBQcm9qZWN0aW9uTWF0cml4LmFycmF5WzBdID0gMiAqIG5lYXIgLyAoeG1heCAtIHhtaW4pO1xuICAgICAgICB0bXBQcm9qZWN0aW9uTWF0cml4LmFycmF5WzhdID0gKHhtYXggKyB4bWluICkgLyAoeG1heCAtIHhtaW4pO1xuXG4gICAgICAgIHRoaXMuX2xlZnRDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KHRtcFByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgIC8vIGZvciByaWdodCBleWVcbiAgICAgICAgeG1pbiA9IC0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcbiAgICAgICAgeG1heCA9IHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cbiAgICAgICAgdG1wUHJvamVjdGlvbk1hdHJpeC5hcnJheVswXSA9IDIgKiBuZWFyIC8gKHhtYXggLSB4bWluKTtcbiAgICAgICAgdG1wUHJvamVjdGlvbk1hdHJpeC5hcnJheVs4XSA9ICh4bWF4ICsgeG1pbiApIC8gKHhtYXggLSB4bWluKTtcblxuICAgICAgICB0aGlzLl9yaWdodENhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkodG1wUHJvamVjdGlvbk1hdHJpeCk7XG5cbiAgICAgICAgdGhpcy5fbGVmdENhbWVyYS53b3JsZFRyYW5zZm9ybVxuICAgICAgICAgICAgLmNvcHkoY2FtZXJhLndvcmxkVHJhbnNmb3JtKVxuICAgICAgICAgICAgLm11bHRpcGx5KHRoaXMuX2V5ZUxlZnQpO1xuXG4gICAgICAgIHRoaXMuX3JpZ2h0Q2FtZXJhLndvcmxkVHJhbnNmb3JtXG4gICAgICAgICAgICAuY29weShjYW1lcmEud29ybGRUcmFuc2Zvcm0pXG4gICAgICAgICAgICAubXVsdGlwbHkodGhpcy5fZXllUmlnaHQpO1xuXG4gICAgICAgIHRoaXMuX2xlZnRDYW1lcmEuZGVjb21wb3NlV29ybGRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdGhpcy5fbGVmdENhbWVyYS5kZWNvbXBvc2VQcm9qZWN0aW9uTWF0cml4KCk7XG5cbiAgICAgICAgdGhpcy5fcmlnaHRDYW1lcmEuZGVjb21wb3NlV29ybGRUcmFuc2Zvcm0oKTtcbiAgICAgICAgdGhpcy5fcmlnaHRDYW1lcmEuZGVjb21wb3NlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVGcm9tVlJEaXNwbGF5OiBmdW5jdGlvbiAodnJEaXNwbGF5LCBwYXJlbnROb2RlKSB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBWUkZyYW1lRGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmcmFtZURhdGEgPSB0aGlzLl9mcmFtZURhdGEgfHwgKHRoaXMuX2ZyYW1lRGF0YSA9IG5ldyBWUkZyYW1lRGF0YSgpKTtcbiAgICAgICAgdnJEaXNwbGF5LmdldEZyYW1lRGF0YShmcmFtZURhdGEpO1xuICAgICAgICB2YXIgbGVmdENhbWVyYSA9IHRoaXMuX2xlZnRDYW1lcmE7XG4gICAgICAgIHZhciByaWdodENhbWVyYSA9IHRoaXMuX3JpZ2h0Q2FtZXJhO1xuXG4gICAgICAgIGxlZnRDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5zZXRBcnJheShmcmFtZURhdGEubGVmdFByb2plY3Rpb25NYXRyaXgpO1xuICAgICAgICBsZWZ0Q2FtZXJhLmRlY29tcG9zZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgbGVmdENhbWVyYS52aWV3TWF0cml4LnNldEFycmF5KGZyYW1lRGF0YS5sZWZ0Vmlld01hdHJpeCk7XG4gICAgICAgIGxlZnRDYW1lcmEuc2V0Vmlld01hdHJpeChsZWZ0Q2FtZXJhLnZpZXdNYXRyaXgpO1xuXG4gICAgICAgIHJpZ2h0Q2FtZXJhLnByb2plY3Rpb25NYXRyaXguc2V0QXJyYXkoZnJhbWVEYXRhLnJpZ2h0UHJvamVjdGlvbk1hdHJpeCk7XG4gICAgICAgIHJpZ2h0Q2FtZXJhLmRlY29tcG9zZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgcmlnaHRDYW1lcmEudmlld01hdHJpeC5zZXRBcnJheShmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4KTtcbiAgICAgICAgcmlnaHRDYW1lcmEuc2V0Vmlld01hdHJpeChyaWdodENhbWVyYS52aWV3TWF0cml4KTtcblxuICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLndvcmxkVHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS50cmFuc2Zvcm1OZWVkc1VwZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdOb2RlIHRyYW5zZm9ybSBpcyBub3QgdXBkYXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVmdENhbWVyYS53b3JsZFRyYW5zZm9ybS5tdWx0aXBseUxlZnQocGFyZW50Tm9kZS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICBsZWZ0Q2FtZXJhLmRlY29tcG9zZVdvcmxkVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICByaWdodENhbWVyYS53b3JsZFRyYW5zZm9ybS5tdWx0aXBseUxlZnQocGFyZW50Tm9kZS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgICAgICByaWdodENhbWVyYS5kZWNvbXBvc2VXb3JsZFRyYW5zZm9ybSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldExlZnRDYW1lcmE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xlZnRDYW1lcmE7XG4gICAgfSxcblxuICAgIGdldFJpZ2h0Q2FtZXJhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yaWdodENhbWVyYTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgU3RlcmVvQ2FtZXJhO1xuIiwiLyoqIEBuYW1lc3BhY2UgY2xheSAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5tYXRoICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LmFuaW1hdGlvbiAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5hc3luYyAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5jYW1lcmEgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkuY29tcG9zaXRvciAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5jb3JlICovXG4vKiogQG5hbWVzcGFjZSBjbGF5Lmdlb21ldHJ5ICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LmhlbHBlciAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5saWdodCAqL1xuLyoqIEBuYW1lc3BhY2UgY2xheS5sb2FkZXIgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkucGFydGljbGVTeXN0ZW0gKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkucGx1Z2luICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LnByZVBhc3MgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkuc2hhZGVyICovXG4vKiogQG5hbWVzcGFjZSBjbGF5LnRleHR1cmUgKi9cbi8qKiBAbmFtZXNwYWNlIGNsYXkudXRpbCAqL1xuXG5pbXBvcnQgQW5pbWF0b3IkMCBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRvcic7XG5pbXBvcnQgQmxlbmQxRENsaXAkMSBmcm9tICcuL2FuaW1hdGlvbi9CbGVuZDFEQ2xpcCc7XG5pbXBvcnQgQmxlbmQyRENsaXAkMiBmcm9tICcuL2FuaW1hdGlvbi9CbGVuZDJEQ2xpcCc7XG5pbXBvcnQgQ2xpcCQzIGZyb20gJy4vYW5pbWF0aW9uL0NsaXAnO1xuaW1wb3J0IGVhc2luZyQ0IGZyb20gJy4vYW5pbWF0aW9uL2Vhc2luZyc7XG5pbXBvcnQgU2FtcGxlclRyYWNrJDUgZnJvbSAnLi9hbmltYXRpb24vU2FtcGxlclRyYWNrJztcbmltcG9ydCBUaW1lbGluZSQ2IGZyb20gJy4vYW5pbWF0aW9uL1RpbWVsaW5lJztcbmltcG9ydCBUcmFja0NsaXAkNyBmcm9tICcuL2FuaW1hdGlvbi9UcmFja0NsaXAnO1xuaW1wb3J0IFRyYW5zZm9ybVRyYWNrJDggZnJvbSAnLi9hbmltYXRpb24vVHJhbnNmb3JtVHJhY2snO1xuaW1wb3J0IGFwcGxpY2F0aW9uJDkgZnJvbSAnLi9hcHBsaWNhdGlvbic7XG5pbXBvcnQgVGFzayQxMCBmcm9tICcuL2FzeW5jL1Rhc2snO1xuaW1wb3J0IFRhc2tHcm91cCQxMSBmcm9tICcuL2FzeW5jL1Rhc2tHcm91cCc7XG5pbXBvcnQgQ2FtZXJhJDEyIGZyb20gJy4vQ2FtZXJhJztcbmltcG9ydCBPcnRob2dyYXBoaWMkMTMgZnJvbSAnLi9jYW1lcmEvT3J0aG9ncmFwaGljJztcbmltcG9ydCBQZXJzcGVjdGl2ZSQxNCBmcm9tICcuL2NhbWVyYS9QZXJzcGVjdGl2ZSc7XG5pbXBvcnQgTWF0ZXJpYWwkMTUgZnJvbSAnLi9jYW52YXMvTWF0ZXJpYWwnO1xuaW1wb3J0IFJlbmRlcmVyJDE2IGZyb20gJy4vY2FudmFzL1JlbmRlcmVyJztcbmltcG9ydCBDb21wb3NpdG9yJDE3IGZyb20gJy4vY29tcG9zaXRvci9Db21wb3NpdG9yJztcbmltcG9ydCBjcmVhdGVDb21wb3NpdG9yJDE4IGZyb20gJy4vY29tcG9zaXRvci9jcmVhdGVDb21wb3NpdG9yJztcbmltcG9ydCBGaWx0ZXJOb2RlJDE5IGZyb20gJy4vY29tcG9zaXRvci9GaWx0ZXJOb2RlJztcbmltcG9ydCBHcmFwaCQyMCBmcm9tICcuL2NvbXBvc2l0b3IvR3JhcGgnO1xuaW1wb3J0IE5vZGUkMjEgZnJvbSAnLi9jb21wb3NpdG9yL05vZGUnO1xuaW1wb3J0IFBhc3MkMjIgZnJvbSAnLi9jb21wb3NpdG9yL1Bhc3MnO1xuaW1wb3J0IFNjZW5lTm9kZSQyMyBmcm9tICcuL2NvbXBvc2l0b3IvU2NlbmVOb2RlJztcbmltcG9ydCBUZXh0dXJlTm9kZSQyNCBmcm9tICcuL2NvbXBvc2l0b3IvVGV4dHVyZU5vZGUnO1xuaW1wb3J0IFRleHR1cmVQb29sJDI1IGZyb20gJy4vY29tcG9zaXRvci9UZXh0dXJlUG9vbCc7XG5pbXBvcnQgQmFzZSQyNiBmcm9tICcuL2NvcmUvQmFzZSc7XG5pbXBvcnQgQ2FjaGUkMjcgZnJvbSAnLi9jb3JlL0NhY2hlJztcbmltcG9ydCBjb2xvciQyOCBmcm9tICcuL2NvcmUvY29sb3InO1xuaW1wb3J0IGdsZW51bSQyOSBmcm9tICcuL2NvcmUvZ2xlbnVtJztcbmltcG9ydCBHTEluZm8kMzAgZnJvbSAnLi9jb3JlL0dMSW5mbyc7XG5pbXBvcnQgTGlua2VkTGlzdCQzMSBmcm9tICcuL2NvcmUvTGlua2VkTGlzdCc7XG5pbXBvcnQgTFJVJDMyIGZyb20gJy4vY29yZS9MUlUnO1xuaW1wb3J0IGV4dGVuZCQzMyBmcm9tICcuL2NvcmUvbWl4aW4vZXh0ZW5kJztcbmltcG9ydCBub3RpZmllciQzNCBmcm9tICcuL2NvcmUvbWl4aW4vbm90aWZpZXInO1xuaW1wb3J0IHJlcXVlc3QkMzUgZnJvbSAnLi9jb3JlL3JlcXVlc3QnO1xuaW1wb3J0IHV0aWwkMzYgZnJvbSAnLi9jb3JlL3V0aWwnO1xuaW1wb3J0IHZlbmRvciQzNyBmcm9tICcuL2NvcmUvdmVuZG9yJztcbmltcG9ydCBHQnVmZmVyJDM4IGZyb20gJy4vZGVmZXJyZWQvR0J1ZmZlcic7XG5pbXBvcnQgUmVuZGVyZXIkMzkgZnJvbSAnLi9kZWZlcnJlZC9SZW5kZXJlcic7XG5pbXBvcnQgZ2xtYXRyaXgkNDAgZnJvbSAnLi9kZXAvZ2xtYXRyaXgnO1xuaW1wb3J0IEZyYW1lQnVmZmVyJDQxIGZyb20gJy4vRnJhbWVCdWZmZXInO1xuaW1wb3J0IEdlb21ldHJ5JDQyIGZyb20gJy4vR2VvbWV0cnknO1xuaW1wb3J0IENvbmUkNDMgZnJvbSAnLi9nZW9tZXRyeS9Db25lJztcbmltcG9ydCBDdWJlJDQ0IGZyb20gJy4vZ2VvbWV0cnkvQ3ViZSc7XG5pbXBvcnQgQ3lsaW5kZXIkNDUgZnJvbSAnLi9nZW9tZXRyeS9DeWxpbmRlcic7XG5pbXBvcnQgUGxhbmUkNDYgZnJvbSAnLi9nZW9tZXRyeS9QbGFuZSc7XG5pbXBvcnQgU3BoZXJlJDQ3IGZyb20gJy4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCBHTFByb2dyYW0kNDggZnJvbSAnLi9ncHUvR0xQcm9ncmFtJztcbmltcG9ydCBQcm9ncmFtTWFuYWdlciQ0OSBmcm9tICcuL2dwdS9Qcm9ncmFtTWFuYWdlcic7XG5pbXBvcnQgSm9pbnQkNTAgZnJvbSAnLi9Kb2ludCc7XG5pbXBvcnQgTGlnaHQkNTEgZnJvbSAnLi9MaWdodCc7XG5pbXBvcnQgQW1iaWVudCQ1MiBmcm9tICcuL2xpZ2h0L0FtYmllbnQnO1xuaW1wb3J0IEFtYmllbnRDdWJlbWFwJDUzIGZyb20gJy4vbGlnaHQvQW1iaWVudEN1YmVtYXAnO1xuaW1wb3J0IEFtYmllbnRTSCQ1NCBmcm9tICcuL2xpZ2h0L0FtYmllbnRTSCc7XG5pbXBvcnQgRGlyZWN0aW9uYWwkNTUgZnJvbSAnLi9saWdodC9EaXJlY3Rpb25hbCc7XG5pbXBvcnQgUG9pbnQkNTYgZnJvbSAnLi9saWdodC9Qb2ludCc7XG5pbXBvcnQgU3BoZXJlJDU3IGZyb20gJy4vbGlnaHQvU3BoZXJlJztcbmltcG9ydCBTcG90JDU4IGZyb20gJy4vbGlnaHQvU3BvdCc7XG5pbXBvcnQgVHViZSQ1OSBmcm9tICcuL2xpZ2h0L1R1YmUnO1xuaW1wb3J0IEZYJDYwIGZyb20gJy4vbG9hZGVyL0ZYJztcbmltcG9ydCBHTFRGJDYxIGZyb20gJy4vbG9hZGVyL0dMVEYnO1xuaW1wb3J0IE1hdGVyaWFsJDYyIGZyb20gJy4vTWF0ZXJpYWwnO1xuaW1wb3J0IEJvdW5kaW5nQm94JDYzIGZyb20gJy4vbWF0aC9Cb3VuZGluZ0JveCc7XG5pbXBvcnQgRnJ1c3R1bSQ2NCBmcm9tICcuL21hdGgvRnJ1c3R1bSc7XG5pbXBvcnQgTWF0cml4MiQ2NSBmcm9tICcuL21hdGgvTWF0cml4Mic7XG5pbXBvcnQgTWF0cml4MmQkNjYgZnJvbSAnLi9tYXRoL01hdHJpeDJkJztcbmltcG9ydCBNYXRyaXgzJDY3IGZyb20gJy4vbWF0aC9NYXRyaXgzJztcbmltcG9ydCBNYXRyaXg0JDY4IGZyb20gJy4vbWF0aC9NYXRyaXg0JztcbmltcG9ydCBQbGFuZSQ2OSBmcm9tICcuL21hdGgvUGxhbmUnO1xuaW1wb3J0IFF1YXRlcm5pb24kNzAgZnJvbSAnLi9tYXRoL1F1YXRlcm5pb24nO1xuaW1wb3J0IFJheSQ3MSBmcm9tICcuL21hdGgvUmF5JztcbmltcG9ydCB1dGlsJDcyIGZyb20gJy4vbWF0aC91dGlsJztcbmltcG9ydCBWYWx1ZSQ3MyBmcm9tICcuL21hdGgvVmFsdWUnO1xuaW1wb3J0IFZlY3RvcjIkNzQgZnJvbSAnLi9tYXRoL1ZlY3RvcjInO1xuaW1wb3J0IFZlY3RvcjMkNzUgZnJvbSAnLi9tYXRoL1ZlY3RvcjMnO1xuaW1wb3J0IFZlY3RvcjQkNzYgZnJvbSAnLi9tYXRoL1ZlY3RvcjQnO1xuaW1wb3J0IE1lc2gkNzcgZnJvbSAnLi9NZXNoJztcbmltcG9ydCBOb2RlJDc4IGZyb20gJy4vTm9kZSc7XG5pbXBvcnQgRW1pdHRlciQ3OSBmcm9tICcuL3BhcnRpY2xlL0VtaXR0ZXInO1xuaW1wb3J0IEZpZWxkJDgwIGZyb20gJy4vcGFydGljbGUvRmllbGQnO1xuaW1wb3J0IEZvcmNlRmllbGQkODEgZnJvbSAnLi9wYXJ0aWNsZS9Gb3JjZUZpZWxkJztcbmltcG9ydCBQYXJ0aWNsZSQ4MiBmcm9tICcuL3BhcnRpY2xlL1BhcnRpY2xlJztcbmltcG9ydCBQYXJ0aWNsZVJlbmRlcmFibGUkODMgZnJvbSAnLi9wYXJ0aWNsZS9QYXJ0aWNsZVJlbmRlcmFibGUnO1xuaW1wb3J0IFBpeGVsUGlja2luZyQ4NCBmcm9tICcuL3BpY2tpbmcvUGl4ZWxQaWNraW5nJztcbmltcG9ydCBSYXlQaWNraW5nJDg1IGZyb20gJy4vcGlja2luZy9SYXlQaWNraW5nJztcbmltcG9ydCBGcmVlQ29udHJvbCQ4NiBmcm9tICcuL3BsdWdpbi9GcmVlQ29udHJvbCc7XG5pbXBvcnQgR2VzdHVyZU1nciQ4NyBmcm9tICcuL3BsdWdpbi9HZXN0dXJlTWdyJztcbmltcG9ydCBJbmZpbml0ZVBsYW5lJDg4IGZyb20gJy4vcGx1Z2luL0luZmluaXRlUGxhbmUnO1xuaW1wb3J0IE9yYml0Q29udHJvbCQ4OSBmcm9tICcuL3BsdWdpbi9PcmJpdENvbnRyb2wnO1xuaW1wb3J0IFNreWJveCQ5MCBmcm9tICcuL3BsdWdpbi9Ta3lib3gnO1xuaW1wb3J0IFNreWRvbWUkOTEgZnJvbSAnLi9wbHVnaW4vU2t5ZG9tZSc7XG5pbXBvcnQgRW52aXJvbm1lbnRNYXAkOTIgZnJvbSAnLi9wcmVQYXNzL0Vudmlyb25tZW50TWFwJztcbmltcG9ydCBTaGFkb3dNYXAkOTMgZnJvbSAnLi9wcmVQYXNzL1NoYWRvd01hcCc7XG5pbXBvcnQgUmVuZGVyYWJsZSQ5NCBmcm9tICcuL1JlbmRlcmFibGUnO1xuaW1wb3J0IFJlbmRlcmVyJDk1IGZyb20gJy4vUmVuZGVyZXInO1xuaW1wb3J0IFNjZW5lJDk2IGZyb20gJy4vU2NlbmUnO1xuaW1wb3J0IFNoYWRlciQ5NyBmcm9tICcuL1NoYWRlcic7XG5pbXBvcnQgbGlicmFyeSQ5OCBmcm9tICcuL3NoYWRlci9saWJyYXJ5JztcbmltcG9ydCBsaWdodCQ5OSBmcm9tICcuL3NoYWRlci9zb3VyY2UvaGVhZGVyL2xpZ2h0JztcbmltcG9ydCBTa2VsZXRvbiQxMDAgZnJvbSAnLi9Ta2VsZXRvbic7XG5pbXBvcnQgU3RhbmRhcmRNYXRlcmlhbCQxMDEgZnJvbSAnLi9TdGFuZGFyZE1hdGVyaWFsJztcbmltcG9ydCBTdGF0aWNHZW9tZXRyeSQxMDIgZnJvbSAnLi9TdGF0aWNHZW9tZXRyeSc7XG5pbXBvcnQgVGV4dHVyZSQxMDMgZnJvbSAnLi9UZXh0dXJlJztcbmltcG9ydCBUZXh0dXJlMkQkMTA0IGZyb20gJy4vVGV4dHVyZTJEJztcbmltcG9ydCBUZXh0dXJlQ3ViZSQxMDUgZnJvbSAnLi9UZXh0dXJlQ3ViZSc7XG5pbXBvcnQgY3ViZW1hcCQxMDYgZnJvbSAnLi91dGlsL2N1YmVtYXAnO1xuaW1wb3J0IGRkcyQxMDcgZnJvbSAnLi91dGlsL2Rkcyc7XG5pbXBvcnQgZGVsYXVuYXkkMTA4IGZyb20gJy4vdXRpbC9kZWxhdW5heSc7XG5pbXBvcnQgaGRyJDEwOSBmcm9tICcuL3V0aWwvaGRyJztcbmltcG9ydCBtZXNoJDExMCBmcm9tICcuL3V0aWwvbWVzaCc7XG5pbXBvcnQgc2gkMTExIGZyb20gJy4vdXRpbC9zaCc7XG5pbXBvcnQgdGV4dHVyZSQxMTIgZnJvbSAnLi91dGlsL3RleHR1cmUnO1xuaW1wb3J0IHRyYW5zZmVyYWJsZSQxMTMgZnJvbSAnLi91dGlsL3RyYW5zZmVyYWJsZSc7XG5pbXBvcnQgdmVyc2lvbiQxMTQgZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCBDYXJkYm9hcmREaXN0b3J0ZXIkMTE1IGZyb20gJy4vdnIvQ2FyZGJvYXJkRGlzdG9ydGVyJztcbmltcG9ydCBTdGVyZW9DYW1lcmEkMTE2IGZyb20gJy4vdnIvU3RlcmVvQ2FtZXJhJztcblxuXG52YXIgYW5pbWF0aW9uID0ge1xuICAgIEFuaW1hdG9yIDogQW5pbWF0b3IkMCxcbiAgICBCbGVuZDFEQ2xpcCA6IEJsZW5kMURDbGlwJDEsXG4gICAgQmxlbmQyRENsaXAgOiBCbGVuZDJEQ2xpcCQyLFxuICAgIENsaXAgOiBDbGlwJDMsXG4gICAgZWFzaW5nIDogZWFzaW5nJDQsXG4gICAgU2FtcGxlclRyYWNrIDogU2FtcGxlclRyYWNrJDUsXG4gICAgVGltZWxpbmUgOiBUaW1lbGluZSQ2LFxuICAgIFRyYWNrQ2xpcCA6IFRyYWNrQ2xpcCQ3LFxuICAgIFRyYW5zZm9ybVRyYWNrIDogVHJhbnNmb3JtVHJhY2skOFxufTtcbmV4cG9ydCB7IGFuaW1hdGlvbiB9O1xuXG5leHBvcnQgeyBhcHBsaWNhdGlvbiQ5IGFzIGFwcGxpY2F0aW9uIH07XG5cbnZhciBhc3luYyA9IHtcbiAgICBUYXNrIDogVGFzayQxMCxcbiAgICBUYXNrR3JvdXAgOiBUYXNrR3JvdXAkMTFcbn07XG5leHBvcnQgeyBhc3luYyB9O1xuXG5leHBvcnQgeyBDYW1lcmEkMTIgYXMgQ2FtZXJhIH07XG5cbnZhciBjYW1lcmEgPSB7XG4gICAgT3J0aG9ncmFwaGljIDogT3J0aG9ncmFwaGljJDEzLFxuICAgIFBlcnNwZWN0aXZlIDogUGVyc3BlY3RpdmUkMTRcbn07XG5leHBvcnQgeyBjYW1lcmEgfTtcblxuXG52YXIgY2FudmFzID0ge1xuICAgIE1hdGVyaWFsIDogTWF0ZXJpYWwkMTUsXG4gICAgUmVuZGVyZXIgOiBSZW5kZXJlciQxNlxufTtcbmV4cG9ydCB7IGNhbnZhcyB9O1xuXG5cbnZhciBjb21wb3NpdG9yID0ge1xuICAgIENvbXBvc2l0b3IgOiBDb21wb3NpdG9yJDE3LFxuICAgIGNyZWF0ZUNvbXBvc2l0b3IgOiBjcmVhdGVDb21wb3NpdG9yJDE4LFxuICAgIEZpbHRlck5vZGUgOiBGaWx0ZXJOb2RlJDE5LFxuICAgIEdyYXBoIDogR3JhcGgkMjAsXG4gICAgTm9kZSA6IE5vZGUkMjEsXG4gICAgUGFzcyA6IFBhc3MkMjIsXG4gICAgU2NlbmVOb2RlIDogU2NlbmVOb2RlJDIzLFxuICAgIFRleHR1cmVOb2RlIDogVGV4dHVyZU5vZGUkMjQsXG4gICAgVGV4dHVyZVBvb2wgOiBUZXh0dXJlUG9vbCQyNVxufTtcbmV4cG9ydCB7IGNvbXBvc2l0b3IgfTtcblxuXG52YXIgY29yZSA9IHtcbiAgICBCYXNlIDogQmFzZSQyNixcbiAgICBDYWNoZSA6IENhY2hlJDI3LFxuICAgIGNvbG9yIDogY29sb3IkMjgsXG4gICAgZ2xlbnVtIDogZ2xlbnVtJDI5LFxuICAgIEdMSW5mbyA6IEdMSW5mbyQzMCxcbiAgICBMaW5rZWRMaXN0IDogTGlua2VkTGlzdCQzMSxcbiAgICBMUlUgOiBMUlUkMzIsXG4gICAgbWl4aW4gOiB7XG4gICAgICAgIGV4dGVuZCA6IGV4dGVuZCQzMyxcbiAgICAgICAgbm90aWZpZXIgOiBub3RpZmllciQzNFxuICAgIH0sXG4gICAgcmVxdWVzdCA6IHJlcXVlc3QkMzUsXG4gICAgdXRpbCA6IHV0aWwkMzYsXG4gICAgdmVuZG9yIDogdmVuZG9yJDM3XG59O1xuZXhwb3J0IHsgY29yZSB9O1xuXG5cbnZhciBkZWZlcnJlZCA9IHtcbiAgICBHQnVmZmVyIDogR0J1ZmZlciQzOCxcbiAgICBSZW5kZXJlciA6IFJlbmRlcmVyJDM5XG59O1xuZXhwb3J0IHsgZGVmZXJyZWQgfTtcblxuXG52YXIgZGVwID0ge1xuICAgIGdsbWF0cml4IDogZ2xtYXRyaXgkNDBcbn07XG5leHBvcnQgeyBkZXAgfTtcblxuZXhwb3J0IHsgRnJhbWVCdWZmZXIkNDEgYXMgRnJhbWVCdWZmZXIgfTtcbmV4cG9ydCB7IEdlb21ldHJ5JDQyIGFzIEdlb21ldHJ5IH07XG5cbnZhciBnZW9tZXRyeSA9IHtcbiAgICBDb25lIDogQ29uZSQ0MyxcbiAgICBDdWJlIDogQ3ViZSQ0NCxcbiAgICBDeWxpbmRlciA6IEN5bGluZGVyJDQ1LFxuICAgIFBsYW5lIDogUGxhbmUkNDYsXG4gICAgU3BoZXJlIDogU3BoZXJlJDQ3XG59O1xuZXhwb3J0IHsgZ2VvbWV0cnkgfTtcblxuXG52YXIgZ3B1ID0ge1xuICAgIEdMUHJvZ3JhbSA6IEdMUHJvZ3JhbSQ0OCxcbiAgICBQcm9ncmFtTWFuYWdlciA6IFByb2dyYW1NYW5hZ2VyJDQ5XG59O1xuZXhwb3J0IHsgZ3B1IH07XG5cbmV4cG9ydCB7IEpvaW50JDUwIGFzIEpvaW50IH07XG5leHBvcnQgeyBMaWdodCQ1MSBhcyBMaWdodCB9O1xuXG52YXIgbGlnaHQgPSB7XG4gICAgQW1iaWVudCA6IEFtYmllbnQkNTIsXG4gICAgQW1iaWVudEN1YmVtYXAgOiBBbWJpZW50Q3ViZW1hcCQ1MyxcbiAgICBBbWJpZW50U0ggOiBBbWJpZW50U0gkNTQsXG4gICAgRGlyZWN0aW9uYWwgOiBEaXJlY3Rpb25hbCQ1NSxcbiAgICBQb2ludCA6IFBvaW50JDU2LFxuICAgIFNwaGVyZSA6IFNwaGVyZSQ1NyxcbiAgICBTcG90IDogU3BvdCQ1OCxcbiAgICBUdWJlIDogVHViZSQ1OVxufTtcbmV4cG9ydCB7IGxpZ2h0IH07XG5cblxudmFyIGxvYWRlciA9IHtcbiAgICBGWCA6IEZYJDYwLFxuICAgIEdMVEYgOiBHTFRGJDYxXG59O1xuZXhwb3J0IHsgbG9hZGVyIH07XG5cbmV4cG9ydCB7IE1hdGVyaWFsJDYyIGFzIE1hdGVyaWFsIH07XG5cbnZhciBtYXRoID0ge1xuICAgIEJvdW5kaW5nQm94IDogQm91bmRpbmdCb3gkNjMsXG4gICAgRnJ1c3R1bSA6IEZydXN0dW0kNjQsXG4gICAgTWF0cml4MiA6IE1hdHJpeDIkNjUsXG4gICAgTWF0cml4MmQgOiBNYXRyaXgyZCQ2NixcbiAgICBNYXRyaXgzIDogTWF0cml4MyQ2NyxcbiAgICBNYXRyaXg0IDogTWF0cml4NCQ2OCxcbiAgICBQbGFuZSA6IFBsYW5lJDY5LFxuICAgIFF1YXRlcm5pb24gOiBRdWF0ZXJuaW9uJDcwLFxuICAgIFJheSA6IFJheSQ3MSxcbiAgICB1dGlsIDogdXRpbCQ3MixcbiAgICBWYWx1ZSA6IFZhbHVlJDczLFxuICAgIFZlY3RvcjIgOiBWZWN0b3IyJDc0LFxuICAgIFZlY3RvcjMgOiBWZWN0b3IzJDc1LFxuICAgIFZlY3RvcjQgOiBWZWN0b3I0JDc2XG59O1xuZXhwb3J0IHsgbWF0aCB9O1xuXG5leHBvcnQgeyBNZXNoJDc3IGFzIE1lc2ggfTtcbmV4cG9ydCB7IE5vZGUkNzggYXMgTm9kZSB9O1xuXG52YXIgcGFydGljbGUgPSB7XG4gICAgRW1pdHRlciA6IEVtaXR0ZXIkNzksXG4gICAgRmllbGQgOiBGaWVsZCQ4MCxcbiAgICBGb3JjZUZpZWxkIDogRm9yY2VGaWVsZCQ4MSxcbiAgICBQYXJ0aWNsZSA6IFBhcnRpY2xlJDgyLFxuICAgIFBhcnRpY2xlUmVuZGVyYWJsZSA6IFBhcnRpY2xlUmVuZGVyYWJsZSQ4M1xufTtcbmV4cG9ydCB7IHBhcnRpY2xlIH07XG5cblxudmFyIHBpY2tpbmcgPSB7XG4gICAgUGl4ZWxQaWNraW5nIDogUGl4ZWxQaWNraW5nJDg0LFxuICAgIFJheVBpY2tpbmcgOiBSYXlQaWNraW5nJDg1XG59O1xuZXhwb3J0IHsgcGlja2luZyB9O1xuXG5cbnZhciBwbHVnaW4gPSB7XG4gICAgRnJlZUNvbnRyb2wgOiBGcmVlQ29udHJvbCQ4NixcbiAgICBHZXN0dXJlTWdyIDogR2VzdHVyZU1nciQ4NyxcbiAgICBJbmZpbml0ZVBsYW5lIDogSW5maW5pdGVQbGFuZSQ4OCxcbiAgICBPcmJpdENvbnRyb2wgOiBPcmJpdENvbnRyb2wkODksXG4gICAgU2t5Ym94IDogU2t5Ym94JDkwLFxuICAgIFNreWRvbWUgOiBTa3lkb21lJDkxXG59O1xuZXhwb3J0IHsgcGx1Z2luIH07XG5cblxudmFyIHByZVBhc3MgPSB7XG4gICAgRW52aXJvbm1lbnRNYXAgOiBFbnZpcm9ubWVudE1hcCQ5MixcbiAgICBTaGFkb3dNYXAgOiBTaGFkb3dNYXAkOTNcbn07XG5leHBvcnQgeyBwcmVQYXNzIH07XG5cbmV4cG9ydCB7IFJlbmRlcmFibGUkOTQgYXMgUmVuZGVyYWJsZSB9O1xuZXhwb3J0IHsgUmVuZGVyZXIkOTUgYXMgUmVuZGVyZXIgfTtcbmV4cG9ydCB7IFNjZW5lJDk2IGFzIFNjZW5lIH07XG5leHBvcnQgeyBTaGFkZXIkOTcgYXMgU2hhZGVyIH07XG5cbnZhciBzaGFkZXIgPSB7XG4gICAgbGlicmFyeSA6IGxpYnJhcnkkOTgsXG4gICAgc291cmNlIDoge1xuICAgIGhlYWRlciA6IHtcbiAgICAgICAgbGlnaHQgOiBsaWdodCQ5OVxuICAgIH1cbiAgICB9XG59O1xuZXhwb3J0IHsgc2hhZGVyIH07XG5cbmV4cG9ydCB7IFNrZWxldG9uJDEwMCBhcyBTa2VsZXRvbiB9O1xuZXhwb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCQxMDEgYXMgU3RhbmRhcmRNYXRlcmlhbCB9O1xuZXhwb3J0IHsgU3RhdGljR2VvbWV0cnkkMTAyIGFzIFN0YXRpY0dlb21ldHJ5IH07XG5leHBvcnQgeyBUZXh0dXJlJDEwMyBhcyBUZXh0dXJlIH07XG5leHBvcnQgeyBUZXh0dXJlMkQkMTA0IGFzIFRleHR1cmUyRCB9O1xuZXhwb3J0IHsgVGV4dHVyZUN1YmUkMTA1IGFzIFRleHR1cmVDdWJlIH07XG5cbnZhciB1dGlsID0ge1xuICAgIGN1YmVtYXAgOiBjdWJlbWFwJDEwNixcbiAgICBkZHMgOiBkZHMkMTA3LFxuICAgIGRlbGF1bmF5IDogZGVsYXVuYXkkMTA4LFxuICAgIGhkciA6IGhkciQxMDksXG4gICAgbWVzaCA6IG1lc2gkMTEwLFxuICAgIHNoIDogc2gkMTExLFxuICAgIHRleHR1cmUgOiB0ZXh0dXJlJDExMixcbiAgICB0cmFuc2ZlcmFibGUgOiB0cmFuc2ZlcmFibGUkMTEzXG59O1xuZXhwb3J0IHsgdXRpbCB9O1xuXG5leHBvcnQgeyB2ZXJzaW9uJDExNCBhcyB2ZXJzaW9uIH07XG5cbnZhciB2ciA9IHtcbiAgICBDYXJkYm9hcmREaXN0b3J0ZXIgOiBDYXJkYm9hcmREaXN0b3J0ZXIkMTE1LFxuICAgIFN0ZXJlb0NhbWVyYSA6IFN0ZXJlb0NhbWVyYSQxMTZcbn07XG5leHBvcnQgeyB2ciB9O1xuO1xuIl0sIm5hbWVzIjpbImVhc2luZyIsIkVhc2luZyIsInRoaXMiLCJnbE1hdHJpeCIsInF1YXQiLCJ2ZWMzIiwidXRpbCIsIm5vdGlmaWVyTWl4aW4iLCJjYW52YXMiLCJwcm90byIsIm1hdDQiLCJkZWZpbmVQcm9wZXJ0eSIsIkxSVSIsInBhcnNlQ29sb3IiLCJnZXREZWZpbmVDb2RlIiwibWF0MyIsImxpZ2h0U2hhZGVyIiwicHJlekVzc2wiLCJub29wIiwidmVjNCIsIlBsYW5lIiwidmVjM1NldCIsInZlYzNDb3B5IiwiRVBTSUxPTiIsInByb2dyYW1LZXlDYWNoZSIsImdldFByb2dyYW1LZXkiLCJDdWJlIiwiU3BoZXJlIiwiUGVyc3BlY3RpdmUiLCJPcnRob2dyYXBoaWMiLCJ1dGlsRXNzbCIsInNoYWRlckxpYnJhcnkiLCJQZXJzcGVjdGl2ZUNhbWVyYSIsIk9ydGhvZ3JhcGhpY0NhbWVyYSIsImlzUG93ZXJPZlR3byIsImNhbWVyYSIsIk9ydGhvQ2FtZXJhIiwiQ3ViZUdlb21ldHJ5IiwidGFyZ2V0cyIsIlNwaGVyZUdlb21ldHJ5IiwicmV0IiwiaGRyIiwiZGRzIiwiTFJVQ2FjaGUiLCJDdWJlR2VvIiwiU3BoZXJlR2VvIiwiUGxhbmVHZW8iLCJzaFV0aWwiLCJOb2RlIiwiR3JhcGhOb2RlIiwiU2NlbmVOb2RlIiwiVGV4dHVyZU5vZGUiLCJGaWx0ZXJOb2RlIiwiQ29tcG9TY2VuZU5vZGUiLCJDb21wb1RleHR1cmVOb2RlIiwiQ29tcG9GaWx0ZXJOb2RlIiwidmVjMiIsIkNvbmUiLCJDeWxpbmRlciIsIkNvbmVHZW9tZXRyeSIsIkNvbmVHZW8iLCJDeWxpbmRlckdlbyIsIkZ1bGxRdWFkUGFzcyIsIm1hdDIiLCJvdXRwdXRFc3NsIiwiQmFzZSIsIkNhbWVyYSIsIkFuaW1hdG9yJDAiLCJCbGVuZDFEQ2xpcCQxIiwiQmxlbmQyRENsaXAkMiIsIkNsaXAkMyIsImVhc2luZyQ0IiwiU2FtcGxlclRyYWNrJDUiLCJUaW1lbGluZSQ2IiwiVHJhY2tDbGlwJDciLCJUcmFuc2Zvcm1UcmFjayQ4IiwiVGFzayQxMCIsIlRhc2tHcm91cCQxMSIsIk9ydGhvZ3JhcGhpYyQxMyIsIlBlcnNwZWN0aXZlJDE0IiwiTWF0ZXJpYWwkMTUiLCJSZW5kZXJlciQxNiIsIkNvbXBvc2l0b3IkMTciLCJjcmVhdGVDb21wb3NpdG9yJDE4IiwiRmlsdGVyTm9kZSQxOSIsIkdyYXBoJDIwIiwiTm9kZSQyMSIsIlBhc3MkMjIiLCJTY2VuZU5vZGUkMjMiLCJUZXh0dXJlTm9kZSQyNCIsIlRleHR1cmVQb29sJDI1IiwiQmFzZSQyNiIsIkNhY2hlJDI3IiwiY29sb3IkMjgiLCJnbGVudW0kMjkiLCJHTEluZm8kMzAiLCJMaW5rZWRMaXN0JDMxIiwiTFJVJDMyIiwiZXh0ZW5kJDMzIiwibm90aWZpZXIkMzQiLCJyZXF1ZXN0JDM1IiwidXRpbCQzNiIsInZlbmRvciQzNyIsIkdCdWZmZXIkMzgiLCJSZW5kZXJlciQzOSIsImdsbWF0cml4JDQwIiwiQ29uZSQ0MyIsIkN1YmUkNDQiLCJDeWxpbmRlciQ0NSIsIlBsYW5lJDQ2IiwiU3BoZXJlJDQ3IiwiR0xQcm9ncmFtJDQ4IiwiUHJvZ3JhbU1hbmFnZXIkNDkiLCJBbWJpZW50JDUyIiwiQW1iaWVudEN1YmVtYXAkNTMiLCJBbWJpZW50U0gkNTQiLCJEaXJlY3Rpb25hbCQ1NSIsIlBvaW50JDU2IiwiU3BoZXJlJDU3IiwiU3BvdCQ1OCIsIlR1YmUkNTkiLCJGWCQ2MCIsIkdMVEYkNjEiLCJCb3VuZGluZ0JveCQ2MyIsIkZydXN0dW0kNjQiLCJNYXRyaXgyJDY1IiwiTWF0cml4MmQkNjYiLCJNYXRyaXgzJDY3IiwiTWF0cml4NCQ2OCIsIlBsYW5lJDY5IiwiUXVhdGVybmlvbiQ3MCIsIlJheSQ3MSIsInV0aWwkNzIiLCJWYWx1ZSQ3MyIsIlZlY3RvcjIkNzQiLCJWZWN0b3IzJDc1IiwiVmVjdG9yNCQ3NiIsIkVtaXR0ZXIkNzkiLCJGaWVsZCQ4MCIsIkZvcmNlRmllbGQkODEiLCJQYXJ0aWNsZSQ4MiIsIlBhcnRpY2xlUmVuZGVyYWJsZSQ4MyIsIlBpeGVsUGlja2luZyQ4NCIsIlJheVBpY2tpbmckODUiLCJGcmVlQ29udHJvbCQ4NiIsIkdlc3R1cmVNZ3IkODciLCJJbmZpbml0ZVBsYW5lJDg4IiwiT3JiaXRDb250cm9sJDg5IiwiU2t5Ym94JDkwIiwiU2t5ZG9tZSQ5MSIsIkVudmlyb25tZW50TWFwJDkyIiwiU2hhZG93TWFwJDkzIiwibGlicmFyeSQ5OCIsImxpZ2h0JDk5IiwiY3ViZW1hcCQxMDYiLCJkZHMkMTA3IiwiZGVsYXVuYXkkMTA4IiwiaGRyJDEwOSIsIm1lc2gkMTEwIiwic2gkMTExIiwidGV4dHVyZSQxMTIiLCJ0cmFuc2ZlcmFibGUkMTEzIiwiQ2FyZGJvYXJkRGlzdG9ydGVyJDExNSIsIlN0ZXJlb0NhbWVyYSQxMTYiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7OztBQUtBLElBQUksTUFBTSxHQUFHOzs7Ozs7SUFNVCxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDaEIsT0FBTyxDQUFDLENBQUM7S0FDWjs7Ozs7O0lBTUQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNoQjs7Ozs7O0lBTUQsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN0Qjs7Ozs7O0lBTUQsY0FBYyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN0Qzs7Ozs7O0lBTUQsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7Ozs7OztJQU1ELFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNsQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzFCOzs7Ozs7SUFNRCxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FD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Q0FBQztRQUMvQixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUN0QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDL0I7O1NBRUk7UUFDRCxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO1FBQ3RCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwRCxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUTtZQUN0QixFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7WUFDckIsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDN0I7O0lBRUQsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDYixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FB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LEdBQUcsQ0FBQyxFQUFFO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEQ7U0FDSjs7O1FBR0QsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELFFBQVEsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7O1FBRXZCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRSxPQUFPLElBQUksQ0FBQztTQUNmOztRQUVELElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7UUFHdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUM7U0FDZjs7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxDQUFD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QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7OztBQVdGLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7SUFDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDL0IsR0FBRyxDQUFDLENBQUMs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QyxFQUFFLENBQUMsRUFBRTtJQUNoQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRTtJQUNoQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztJQUNyQixJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7Ozs7QUFZRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLFdBQVc7SUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztJQUV4QixPQUFPLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNSLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDZDs7UUFFRCxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ1IsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNkOztRQUVELEdBQUcsS0FBSyxFQUFFO1lBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENB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Ozs7O0FBTUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBVXZCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0lBQzFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7OztBQVMxQixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMUIsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDOzs7Ozs7OztBQVFwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7O0FBUXZCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMUIsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDOzs7Ozs7Ozs7QUFTakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtFQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNwQixPQUFPLEdBQUcsQ0FBQztDQUNaLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7O1FBRVQsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ3ZCO0lBQ0QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2xELENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXBDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFO0lBQ2hDLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDOztJQUVyQixJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQzs7SUFFeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNuQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7OztJQUdyQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O1FBRzFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDN0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUM3QixFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7SUFHbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDbEQsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztHQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7TUFFZCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O01BR2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7TUFHM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXZCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0lBRWpCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7SUFHbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztJQUczQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7SUFFakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OztJQUduQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7OztJQUdaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVyQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLFdBQVc7SUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztJQUV4QixPQUFPLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNSLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDZDs7UUFFRCxHQUFHLENBQUMsTUFBTSxFQUFFO1lBQ1IsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNkOztRQUVELEdBQUcsS0FBSyxFQUFFO1lBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckQsTUFBTTtZQUNILENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ2hCOztRQUVELElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7O1FBRUQsT0FBTyxDQUFDLENBQUM7S0FDWixDQUFDO0NBQ0wsR0FBRyxDQUFDOzs7Ozs7OztBQVFMLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFOztJQUV4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUU5QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs7SUFFN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7O0lBRXBDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNaLE9BQU8sQ0FBQyxDQUFDO0tBQ1osTUFBTTtRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM1QjtDQUNKLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNwQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxDQUFDOztBQUVGLEdBQUcsT0FBTyxPQUFPLENBQUMsS0FBSyxXQUFXLEVBQUU7SUFDaEMsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Q0FDdkI7QUFDRCxBQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQzs7Ozs7OztBQU9kLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVztJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRTtJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNuQyxJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7OztBQVlGLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7O0FBVXpCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7OztBQU1GLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7OztBQVV6QixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7Ozs7QUFVdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtJQUMxQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMzQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7OztBQVMxQixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNoQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7Ozs7O0FBUXBDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMzQyxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7O0FBUXZCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2hDLENBQUM7Ozs7OztBQU1GLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0FBU2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEIsT0FBTyxHQUFHLENBQUM7Q0FDWixDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtRQUNULEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxH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QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztRQUcxQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDN0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7O0lBR25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ2xELE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFjRixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsV0FBVztJQUN2QixJQUFJLEdB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QUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7O0FBVXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNqQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNqQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDcEIsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztDQUN6RSxDQUFDOzs7Ozs7OztBQVFGLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbkcsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDcEIsQ0FBQzs7QUFFRixHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO0lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3ZCO0FBQ0QsQUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7Ozs7OztBQU9mLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVztJQUN0QixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxFQUFFO0lBQ3RCLElBQUksR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLEdBQUcsRUFBRTtJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzVCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUUzQixJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDNUIsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUNuQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDckMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNyQyxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUM3QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNwQyxDQUFDOzs7Ozs7Ozs7O0FBVUYsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDaEMsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBVzNCLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxF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QUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsRUFBRTtJQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEVBQUU7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTs7SUFFOUIsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQ1gsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDaEIsTUFBTTtRQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNqQjs7SUFFRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzNCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcs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Q0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUN6RyxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRWxDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztJQUUzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7QUFVekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUV2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7O0lBRWIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOztJQUViLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNqQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUVsQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRXRCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztJQUUzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7SUFFM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2IsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUV2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRWxCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUVYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNWLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNWLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7UUFFVixFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztJQUVqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNqQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDckIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0lBRWpCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFckIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7UUFFbEQsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7UUFDM0IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7OztRQUczQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0lBRWhGLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDTixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0lBRWhCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDOztJQUVuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQzs7SUFFbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7O0lBRW5ELE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtvQkFDeEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO29CQUN2QyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcs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QUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxFQUFFO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFOztJQUU5QixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7UUFDWCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRWhCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDakIsTUFBTTtRQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDbkI7O0lBRUQsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUMzQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hELEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztRQUVsRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztRQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRzs7O1FBRzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFaEYsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNOLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3BELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNwRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDcEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDOztJQUVwRCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQzVCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7SUFFdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0csR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNHLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQzVCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O1FBRWxELEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO1FBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7OztJQUdoQyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQ2hGLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDakMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7SUFHdkQsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztJQUUzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztJQUUzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztJQUU1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVDLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN2QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25DLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7SUFHMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7O0lBR2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7O0lBR2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQzs7O0lBR25DLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDekMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7SUFFekMsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztBQU16QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7Ozs7Ozs7OztBQVNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7SUFFdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ1gsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNyRCxNQUFNO1FBQ0gsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRWpELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDOztRQUV6RCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2pEOztJQUVELE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUVqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNQLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7UUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO1FBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNiLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztRQUNiLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDOztJQUVsQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRTs7SUFFbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZCxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ1QsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNULENBQUMsSUFBSSxHQUFHLENBQUM7O0lBRVQsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVYsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7OztJQUdqRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7O0lBR3RFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMzQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDNUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztJQUU1QyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ2pCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNqQixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNYLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O0lBRWhCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ25COzs7SUFHRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ2pCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNqQixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNWLEdBQUcsR0FBRyxDQUFDLENBQUMs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QUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNuQjs7O0lBR0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxD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QUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDWCxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7SUFFaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVgsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVgsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRVosR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBY0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUMvRCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUN2QixFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDdkIsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDN0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7O0FBWUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDdkQsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUM1QixFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUNwQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1QixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNoQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQWNGLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDN0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7UUFDdkIsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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Q0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDYixHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9DLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDL0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFWixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNwQixPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtvQkFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7b0JBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJO29CQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQzVFLENBQUM7Ozs7Ozs7O0FBUUYsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsRUFBRTtJQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMxVixDQUFDOzs7QUFHRixHQUFHLE9BQU8sT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO0lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3ZCO0FBQ0QsQUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7Ozs7Ozs7QUFPZCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVc7SUFDckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJ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QyxDQUFDLENBQUMsQ0FBQzs7SUFFL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0MsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7Ozs7O0FBV3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Ozs7Ozs7OztBQVV4QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDbEMsR0FBRyxJQUFJLEdBQUcsQ0FBQzs7SUFFWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUUzQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNsQyxHQUFHLElBQUksR0FBRyxDQUFDOztJQUVYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRTNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7O0FBVUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLEdBQUcsSUFBSSxHQUFHLENBQUM7O0lBRVgsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7SUFFM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMzQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUs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Q0FBQyxFQUFFLEtBQUssQ0FBQztRQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztLQUM5QixNQUFNOztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQ2xCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRWhCLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFD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QUMsQ0FBQzs7UUFFbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBRWhGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJ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QUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztJQUVuRSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7OztJQUd4QyxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7SUFFOUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2IsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ2YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ1YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ1YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ1YsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0tBQ2I7O0lBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLElBQUksUUFBUSxFQUFFOztRQUUxQixLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksS0FB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QUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN2RTtRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM5RCxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDN0U7O0lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLENBQUMsUUFB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QU9BLE1BQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xDOzs7Ozs7OztJQVFELElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3JCQSxNQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDbkJBLE1BQUksQ0FBQyxRQUFR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QUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLE9BQU8sQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM5QkEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUJBLE1BQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUJBLE1BQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDOzs7Ozs7QUFNL0IsT0FBTyxD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Q2xCLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztJQUVaLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRWYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDOztJQUUzQyxRQUFRLEtBQUs7UUFDVCxLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTTtRQUNWLEtBQUssS0FBSztZQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzVELE1BQU07UUFDVixLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1RCxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQs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QUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVFOzs7Ozs7O0lBT0QsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDOztRQUUxQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztRQUVqQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztlQUN4RCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNuRTs7Ozs7SUFLRCxRQUFRLEVBQUUsWUFBWTtRQUNsQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUMxQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztlQUMzRCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN0RTs7Ozs7O0lBTUQsY0FBYyxFQUFFLENBQUMsWUFBWTs7UUFFekIsSUFBSSxFQUFFLEdBQUdBLE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsR0FBR0EsTUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxFQUFFLEdBQUdBLE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLEVBQUUsR0FBR0EsTUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O1FBRXZCLE9BQU8sVUFBVSxNQUFNLEVBQUU7WUFDckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7O1lBRXpCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7O1lBRXJCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXBFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXBFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXJFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUUxRixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxF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Q0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUU3QyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7UUFHN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMs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QyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDcENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDcENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDcENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDaENBLE1BQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFF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QUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckQsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUQsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdELGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RCxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkQsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENB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QUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RCxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JELFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BELFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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QUFJO2dCQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxNQUFNO1lBQ1YsS0FBSyxLQUFLO2dCQUNOLEdBQUcsQ0FBQyxVQUFVLENBQUMs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LENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixVQUFVLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQzFCLE9BQU9BLE1BQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQy9CLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN0Q0EsTUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdkNBLE1BQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNsQ0EsTUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsVUFBVSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDOzs7Ozs7OztBQVFyQyxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDeENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDaERBLE1BQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLFVBQVUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDQSxNQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7O0FBTUYsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsRUFBRTtJQUM3QixPQUFPQSxNQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUMvQixDQUFDOzs7Ozs7O0FBT0YsVUFBVSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDOzs7Ozs7O0FBTzdDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3BDQSxNQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsVUFBVSxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUNqREEsTUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN6Q0EsTUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7O0lBRTVDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztJQUVsQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0lBRTVCLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQzs7Ozs7O0lBTTNDLFFBQVEsS0FBSztRQUNULEtBQUssS0FBSztZQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU07UUFDVixLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTTtRQUNWLEtBQUssS0FBSztZQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNO1FBQ1YsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFF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QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7OztRQUd2RGdCLFNBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOztRQUV0QkEsU0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7O1FBRXRCQSxTQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7UUFFdEJBLFNBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOztRQUV0QkEsU0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7O1FBRXRCQSxTQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7O1FBR3RCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHO1lBQ1osSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7O1lBRXhCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7WUFFaEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7O1lBRzdCQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUVqREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pEQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUVoREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckRBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwREEsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BEQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3REO2FBQ0k7WUFDRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDNUIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQzs7O1lBRzFCLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkYsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7WUFFdkYsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDaEMsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDaEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7O1lBRzdCQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0NBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFN0NBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3Q0EsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUU3Q0EsU0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDQSxTQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0NBLFNBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxH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Q0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3JDLENBQUM7WUFDRixNQUFNO1FBQ1YsS0FBSyxDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQzNCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxHQUFHLENBQUM7YUFDZCxDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQzNCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQixDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUU7Z0JBQ2xDLElB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LEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O1lBRWhDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNkLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDZCxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUc7Z0JBQ2QsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHO2dCQUNkLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRztnQkFDZCxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7WUFFbkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7Z0JBQ2hCLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSTtnQkFDaEIsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJO2dCQUNoQixFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQzs7WUFFckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOztZQUVsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7WUFFbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLEdBQUcsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUN2QixJQUFJLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQyxD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S0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDOztRQUV4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUM5QixJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O1lBRTVCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQzVCO0tBQ0o7SUFDRCxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztJQUVuQyxPQUFPLGtCQUFrQixDQUFDO0NBQzdCLENBQUM7O0FDMVFGO0FBQ0EsQUFHQTs7Ozs7O0FBTUEsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOzs7Ozs7SUFNbkMsT0FBTyxFQUFFLElBQUk7Ozs7O0lBS2IsVUFBVSxFQUFFLEtBQUs7O0lBRWpCLG1CQUFtQixFQUFFLElBQUk7SUFDekIsV0FBVyxFQUFFLElBQUk7O0NBRXBCLDJDQUEyQzs7SUFFeEMsSUFBSSxFQUFFLHVCQUF1Qjs7Ozs7OztJQU83QixTQUFTLEVBQUUsVUFBVSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3BGO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQixJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDdkIsT0FBTztTQUNWOztRQUVELElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyx1QkFBdUI7WUFDNUMsUUFBUSxFQUFFLE9BQU8sRUFBRTtnQkFDZixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsTUFBTSxFQUFFLElBQUk7YUFDZixFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVztTQUNoRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzs7UUFFbEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUM3Qjs7SUFFRCxnQkFBZ0IsRUFBRTtRQUNkLHdCQUF3QixFQUFFO1lBQ3RCLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLFVBQVUsUUFBUSxFQUFFO2dCQUN2QixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMzQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN2RTtTQUNKOztRQUVELDBCQUEwQixFQUFFO1lBQ3hCLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLFVBQVUsUUFBUSxFQUFFO2dCQUN2QixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7YUFDM0I7U0FDSjs7UUFFRCw2QkFBNkIsRUFBRTtZQUMzQixJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxVQUFVLFFBQVEsRUFBRTtnQkFDdkIsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDO2FBQy9CO1NBQ0o7S0FDSjs7Ozs7OztDQU9KLENBQUM7O0FDckZGOzs7OztBQUtBLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0lBRTlCLFVBQVUsRUFBRSxLQUFLOzs7Ozs7O0lBT2pCLFlBQVksRUFBRSxFQUFFOztDQUVuQixFQUFFLFlBQVk7SUFDWCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUM3RCxFQUFFOztJQUVDLElBQUksRUFBRSxrQkFBa0I7O0lBRXhCLGdCQUFnQixFQUFFO1FBQ2QsbUJBQW1CLEVBQUU7WUFDakIsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsVUFBVSxRQUFRLEVBQUU7Z0JBQ3ZCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQzNCLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO2FBQzdFO1NBQ0o7O1FBRUQsMEJBQTBCLEVBQUU7WUFDeEIsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsVUFBVSxRQUFRLEVBQUU7Z0JBQ3ZCLElBQUksa0JBQWtCLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDO2dCQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ25ELGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BEO2dCQUNELE9BQU8sa0JBQWtCLENBQUM7YUFDN0I7U0FDSjtLQUNKOzs7Ozs7O0NBT0osQ0FBQzs7QUNoREYsSUFBSSxXQUFXLEdBQUcsWUFBWTs7SUFFMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7O0lBRWhCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7Q0FDaEMsQ0FBQzs7QUFFRixXQUFXLENBQUMsU0FBUyxHQUFHOztJQUVwQixXQUFXLEVBQUUsV0FBVzs7SUFFeEIsR0FBRyxFQUFFLFVBQVUsVUFBVSxFQUFFO1FBQ3ZCLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxPQUFPLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ3JCOztJQUVELEdBQUcsRUFBRSxVQUFVLE9BQU8sRUFBRTtRQUNwQixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3RCOztJQUVELEtBQUssRUFBRSxVQUFVLFFBQVEsRUFBRTtRQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztLQUNoQztDQUNKLENBQUM7O0FBRUYsSUFBSSxhQUFhLEdBQUc7SUFDaEIsS0FBSyxFQUFFLEdBQUc7SUFDVixNQUFNLEVBQUUsR0FBRztJQUNYLElBQUksRUFBRSxNQUFNLENBQUMsYUFBYTtJQUMxQixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7SUFDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxhQUFhO0lBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYTtJQUMzQixTQUFTLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtJQUN0QyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU07SUFDeEIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsQ0FBQztJQUNkLEtBQUssRUFBRSxJQUFJO0lBQ1gsZUFBZSxFQUFFLENBQUM7SUFDbEIsZ0JBQWdCLEVBQUUsS0FBSztDQUMxQixDQUFDOztBQUVGLElBQUksb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzs7QUFFdEQsU0FBUyxXQUFXLENBQUMsVUFBVSxFQUFFO0lBQzdCcEMsTUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUMzRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7O0lBRXJCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEQsSUFBSSxJQUFJLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLEdBQUcsSUFBSSxLQUFLLENBQUM7S0FDaEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztDQUNkOztBQUVELFNBQVMsUUFBUSxDQUFDLE1BQU0sRUFBRTs7SUFFdEIsSUFBSSxJQUFJLEdBQUc0QixjQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7O0lBRXJELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsZUFBZSxFQUFFO1FBQzFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0tBQzVCOztJQUVELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQzVCLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsc0JBQXNCO1lBQ2pELE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFO1lBQ2xELE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUNyQyxNQUFNO1lBQ0gsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsb0JBQW9CO1lBQy9DLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLHFCQUFxQjtVQUNsRDtZQUNFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNwQztLQUNKO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNQLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUNwQyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7S0FDdkM7Q0FDSjs7QUFFRCxTQUFTQSxjQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtJQUNqQyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3hCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDdkM7O0FDMUdELG9CQUFlLDQ3VUFBNDdVLENBQUM7O0FDMEI1OFUsSUFBSXhCLE1BQUksR0FBR1AsUUFBUSxDQUFDLElBQUksQ0FBQztBQUN6QixBQUVBLElBQUltQyxTQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztBQUVuRCxBQUNBLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQmhDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUN4Qyw2Q0FBNkM7Ozs7OztRQU16QyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUc7Ozs7OztRQU03QixVQUFVLEVBQUUsR0FBRzs7UUFFZixnQkFBZ0IsRUFBRSxNQUFNOztRQUV4QixTQUFTLEVBQUUsSUFBSSxZQUFZLENBQUM7WUFDeEIsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDTCxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDTixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNSLENBQUM7O1FBRUYsU0FBUyxFQUFFLFNBQVM7O1FBRXBCLHdCQUF3QixFQUFFLEtBQUs7O1FBRS9CLFlBQVksRUFBRSxJQUFJLFdBQVcsRUFBRTs7UUFFL0IsU0FBUyxFQUFFLEVBQUU7UUFDYixnQkFBZ0IsRUFBRTtZQUNkLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsWUFBWSxFQUFFLENBQUM7U0FDbEI7O1FBRUQsZUFBZSxFQUFFLEVBQUU7UUFDbkIsa0JBQWtCLEVBQUUsRUFBRTs7UUFFdEIsY0FBYyxFQUFFLEVBQUU7UUFDbEIsVUFBVSxFQUFFLEVBQUU7UUFDZCxpQkFBaUIsRUFBRSxFQUFFOztRQUVyQixhQUFhLEVBQUUsRUFBRTtRQUNqQixlQUFlLEVBQUUsRUFBRTs7UUFFbkIsWUFBWSxFQUFFLElBQUksV0FBVyxFQUFFO0tBQ2xDLENBQUM7Q0FDTCxFQUFFLFlBQVk7O0lBRVgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztRQUMzQixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQztLQUMzRCxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDO1FBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDO0tBQzNELENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztJQUUvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLENBQUM7UUFDN0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7S0FDakQsQ0FBQyxDQUFDO0NBQ04sRUFBRTs7Ozs7Ozs7O0lBU0MsTUFBTSxFQUFFLFVBQVUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFO1FBQzVELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxXQUFXLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3ZDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQ25FOzs7Ozs7OztJQVFELFdBQVcsRUFBRSxVQUFVLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDaEU7YUFDSTtZQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNsRTtRQUNELEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsQ0FBQyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDL0M7UUFDRCxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUMzQjs7SUFFRCx3QkFBd0IsRUFBRSxVQUFVLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDaEQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQzs7WUFFdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNsRDthQUNJO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3pDOztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtZQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUN6RDthQUNJO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDL0IsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDN0U7aUJBQ0k7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7YUFDekQ7U0FDSjtLQUNKOztJQUVELE9BQU8sRUFBRSxVQUFVLFFBQVEsRUFBRSxLQUFLLEVBQUU7UUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzs7WUFHbkQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckU7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEM7U0FDSjtLQUNKOztJQUVELGlCQUFpQixFQUFFLFVBQVUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFOztRQUV2RSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7UUFFM0IsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQzs7UUFFdEIsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbEI7UUFDRCxJQUFJLFdBQVcsRUFBRTtZQUNiLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN4Qjs7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQzs7O1FBRzlCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqRSxPQUFPO1NBQ1Y7O1FBRUQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLENBQUM7O1FBRTdELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O1FBS3ZCLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7OztRQUduQyxJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQzs7UUFFOUIsSUFBSSxrQkFBa0IsQ0FBQzs7UUFFdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksS0FBSyxZQUFZLGdCQUFnQixFQUFFOztnQkFFbkMsSUFBSSxrQkFBa0IsRUFBRTtvQkFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO29CQUMxRSxTQUFTO2lCQUNaO2dCQUNELElBQUksS0FBSyxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUU7b0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztvQkFDMUMsU0FBUztpQkFDWjtnQkFDRCxJQUFJLEtBQUssQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFO29CQUN6QixrQkFBa0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO2lCQUM1Qzs7Z0JBRUQsSUFBSSxDQUFDLDRCQUE0QjtvQkFDN0IsUUFBUTtvQkFDUixLQUFLO29CQUNMLFdBQVc7b0JBQ1gsS0FBSztvQkFDTCxJQUFJLENBQUMsY0FBYztvQkFDbkIsa0JBQWtCO29CQUNsQix3QkFBd0I7b0JBQ3hCLDBCQUEwQjtpQkFDN0IsQ0FBQzthQUNMO2lCQUNJLElBQUksS0FBSyxZQUFZLFNBQVMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLHFCQUFxQjtvQkFDdEIsUUFBUTtvQkFDUixLQUFLO29CQUNMLEtBQUs7b0JBQ0wsSUFBSSxDQUFDLGNBQWM7b0JBQ25CLGlCQUFpQjtvQkFDakIsbUJBQW1CO2lCQUN0QixDQUFDO2FBQ0w7aUJBQ0ksSUFBSSxLQUFLLFlBQVksVUFBVSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsc0JBQXNCO29CQUN2QixRQUFRO29CQUNSLEtBQUs7b0JBQ0wsS0FBSztvQkFDTCxJQUFJLENBQUMsY0FBYztvQkFDbkIsb0JBQW9CO2lCQUN2QixDQUFDO2FBQ0w7O1lBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ3ZDOztRQUVELEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsa0JBQWtCLENBQUM7WUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM3QixJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxFQUFFO29CQUMxQyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ1osUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3FCQUM1Qzt5QkFDSSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFO3dCQUMxQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztxQkFDdEM7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLGtCQUFrQixFQUFFO2dCQUNwQixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNuRjtpQkFDSTtnQkFDRCxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ25EO1NBQ0o7O1FBRUQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7UUFFMUMsU0FBUyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUN6QjtRQUNELElBQUksMEJBQTBCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QyxJQUFJLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RSxjQUFjLENBQUMsMEJBQTBCLEdBQUcsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzlGLGNBQWMsQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDM0YsY0FBYyxDQUFDLDhCQUE4QixHQUFHLEVBQUUsS0FBSyxFQUFFLDhCQUE4QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN2RyxJQUFJLGtCQUFrQixFQUFFO2dCQUNwQixJQUFJLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4RCxJQUFJLHFCQUFxQixHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2RCxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IscUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUM7OztnQkFHOUIsc0JBQXNCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxDQUFDOztnQkFFaEMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLGNBQWMsQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ3ZGLGNBQWMsQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFDeEY7U0FDSjs7UUFFRCxJQUFJLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0QsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUMxQyxjQUFjLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2hGLGNBQWMsQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDN0UsY0FBYyxDQUFDLHVCQUF1QixHQUFHLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUM1Rjs7UUFFRCxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakMsY0FBYyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNyRjtLQUNKOztJQUVELDRCQUE0QixFQUFFLENBQUMsWUFBWTs7UUFFdkMsSUFBSSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNqQyxJQUFJLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksUUFBUSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMvQixJQUFJLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksbUJBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN4QyxJQUFJLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztRQUVwQyxPQUFPLFVBQVUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRTs7WUFFckksSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsSUFBSSxVQUFVLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLFVBQVUsVUFBVSxFQUFFO29CQUMvQixPQUFPLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxxQkFBcUIsQ0FBQztpQkFDbEU7Z0JBQ0QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7YUFDMUMsQ0FBQzs7O1lBR0YsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDNUMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QyxLQUFLLENBQUMsd0JBQXdCO3FCQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNqRTs7O1lBR0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOztZQUVwRixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQzs7WUFFN0UsSUFBSSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQzNDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkQ1QixNQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRUEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RkEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBRXhFLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLGFBQWEsR0FBRyxXQUFXLFlBQVlzQixhQUFpQixDQUFDOztZQUU3RCxJQUFJLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6RixJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQyxJQUFJLElBQUksR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksSUFBSSxHQUFHLFdBQVcsR0FBRyxDQUFDLFVBQVUsR0FBRyxXQUFXLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMscUJBQXFCLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDdEYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUQ7WUFDRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDM0QsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztZQUV6QyxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDOztZQUVqQyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztZQUV2RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBRTFDLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBSSxhQUFhLEVBQUU7b0JBQ2Z0QixNQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDckg7cUJBQ0k7b0JBQ0RBLE1BQUksQ0FBQyxLQUFLO3dCQUNOLGVBQWUsQ0FBQyxLQUFLO3dCQUNyQixXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRzt3QkFDeEUsU0FBUyxFQUFFLFFBQVE7cUJBQ3RCLENBQUM7aUJBQ0w7Z0JBQ0QsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNoRCxZQUFZLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNsRSxRQUFRLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztnQkFFdEQsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQzs7O2dCQUcvQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Z0JBRS9GLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQzs7O2dCQUd0RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLEdBQUcsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDMUQ7O2dCQUVELElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztxQkFDOUIsWUFBWSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztnQkFFaEQsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0JBRTVDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDdEQ7O1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBRW5DLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEMsQ0FBQztLQUNMLEdBQUc7O0lBRUoscUJBQXFCLEVBQUUsVUFBVSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUU7O1FBRXRHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7O1FBRXRCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUVqQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7UUFFdkQsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxVQUFVLEdBQUc7WUFDYixXQUFXLEVBQUUsVUFBVSxVQUFVLEVBQUU7Z0JBQy9CLE9BQU8sVUFBVSxDQUFDLG1CQUFtQixJQUFJLHFCQUFxQixDQUFDO2FBQ2xFO1lBQ0QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7U0FDMUMsQ0FBQzs7UUFFRixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7O1FBRWxHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7UUFHbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxRDs7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQzthQUNsQyxNQUFNLEVBQUU7YUFDUixZQUFZLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O1FBRWhELG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hDOztJQUVELHNCQUFzQixFQUFFLFVBQVUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFO1FBQ3JGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBRW5DLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksVUFBVSxHQUFHO1lBQ2IsV0FBVyxFQUFFLFVBQVUsVUFBVSxFQUFFO2dCQUMvQixPQUFPLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxxQkFBcUIsQ0FBQzthQUNsRTtZQUNELFdBQVcsRUFBRSxRQUFRLENBQUMsaUJBQWlCO1NBQzFDLENBQUM7O1FBRUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixJQUFJLE1BQU0sR0FBRzRCLFNBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDOztZQUV0RCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7WUFFdkQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzNGOztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3RDOztJQUVELGlCQUFpQixFQUFFLFVBQVUsS0FBSyxFQUFFO1FBQ2hDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQUksWUFBWSxHQUFHLEtBQUssWUFBWSxVQUFVLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixJQUFJLFlBQVksR0FBRyxZQUFZLEdBQUcsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUM7WUFDekUsY0FBYyxHQUFHLElBQUksUUFBUSxDQUFDO2dCQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQzthQUN2RyxDQUFDLENBQUM7O1lBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsY0FBYyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFO1lBQ2hDLGNBQWMsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUMxQixjQUFjLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0Q7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNoRDthQUNJO1lBQ0QsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDbEQ7O1FBRUQsSUFBSSxZQUFZLEVBQUU7WUFDZCxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRSxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7O1FBRUQsT0FBTyxjQUFjLENBQUM7S0FDekI7O0lBRUQsZUFBZSxFQUFFLFVBQVUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7UUFDaEQsSUFBSSxTQUFTLEdBQUc7WUFDWixLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU0sRUFBRSxJQUFJO1lBQ1osSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLO1NBQ3RCLENBQUM7UUFDRixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7UUFFbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFFckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7UUFFbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDckM7O0lBRUQsV0FBVyxFQUFFLFVBQVUsS0FBSyxFQUFFLE9BQU8sRUFBRTtRQUNuQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLEdBQUcsQ0FBQztRQUMvQyxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsSUFBSSxLQUFLLFlBQVksVUFBVSxFQUFFO2dCQUM3QixPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzthQUMvQjtpQkFDSTtnQkFDRCxPQUFPLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQzthQUM3Qjs7O1lBR0QsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxhQUFhLENBQUMsR0FBRyxFQUFFO2dCQUN2QyxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2FBQzNCO2lCQUNJO2dCQUNELE9BQU8sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDbkMsT0FBTyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUM3QjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO1NBQ2pDOztRQUVELE9BQU8sT0FBTyxDQUFDO0tBQ2xCOztJQUVELG9CQUFvQixFQUFFLFVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUc7Z0JBQ3ZCLEVBQUUsRUFBRSxJQUFJTixhQUFpQixFQUFFO2dCQUMzQixFQUFFLEVBQUUsSUFBSUEsYUFBaUIsRUFBRTtnQkFDM0IsRUFBRSxFQUFFLElBQUlBLGFBQWlCLEVBQUU7Z0JBQzNCLEVBQUUsRUFBRSxJQUFJQSxhQUFpQixFQUFFO2dCQUMzQixFQUFFLEVBQUUsSUFBSUEsYUFBaUIsRUFBRTtnQkFDM0IsRUFBRSxFQUFFLElBQUlBLGFBQWlCLEVBQUU7YUFDOUIsQ0FBQztTQUNMO1FBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBRTlDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdCLFFBQVEsTUFBTTtZQUNWLEtBQUssSUFBSTtnQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELE1BQU07WUFDVixLQUFLLElBQUk7Z0JBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdEQsTUFBTTtZQUNWLEtBQUssSUFBSTtnQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO1lBQ1YsS0FBSyxJQUFJO2dCQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELE1BQU07WUFDVixLQUFLLElBQUk7Z0JBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdEQsTUFBTTtTQUNiO1FBQ0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7O1FBRWhCLE9BQU8sTUFBTSxDQUFDO0tBQ2pCOztJQUVELDBCQUEwQixFQUFFLENBQUMsWUFBWTtRQUNyQyxJQUFJLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksb0JBQW9CLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM3QyxJQUFJLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDOzs7UUFHdEMsT0FBTyxVQUFVLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSUksY0FBVyxFQUFFLENBQUM7YUFDdEQ7WUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzs7WUFFNUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzFELG9CQUFvQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDOztZQUVuRSxNQUFNLENBQUMsUUFBUTtpQkFDVixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO2lCQUM5QixHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO2lCQUM3QixLQUFLLENBQUMsR0FBRyxDQUFDO2lCQUNWLGFBQWEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7O1lBRzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN2RCxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDOztZQUUvRSxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztZQUV6RSxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNsQyxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQzs7O1lBR2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BFLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRTlCLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUNuQjtpQkFDSTtnQkFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUN2QztZQUNELE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRXBCLE9BQU8sTUFBTSxDQUFDO1NBQ2pCLENBQUM7S0FDTCxHQUFHOztJQUVKLG1CQUFtQixFQUFFLFVBQVUsS0FBSyxFQUFFO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxJQUFJSixhQUFpQixFQUFFLENBQUM7U0FDckQ7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQzs7UUFFckMsTUFBTSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hDdEIsTUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDOztRQUVsRSxPQUFPLE1BQU0sQ0FBQztLQUNqQjs7Ozs7OztJQU9ELE9BQU8sRUFBRSxVQUFVLFFBQVEsRUFBRTtRQUN6QixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQzs7UUFFbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xDOztRQUVELEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQzs7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7O1FBRXJDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3BCLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsWUFBWSxFQUFFLENBQUM7U0FDbEIsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDOztRQUV6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN2QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM3QixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM3QixNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO2dCQUMxRCxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwQztTQUNKOztRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7S0FDL0I7Q0FDSixDQUFDLENBQUM7Ozs7OztBQU1ILGFBQWEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7QUFNdEIsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7O0FDbnlCdEIsSUFBSUwsT0FBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Ozs7OztBQU16QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTTs7QUFFNUI7Ozs7O0lBS0ksS0FBSyxFQUFFLElBQUk7Ozs7O0lBS1gsTUFBTSxFQUFFLElBQUk7Ozs7O0lBS1osUUFBUSxFQUFFLElBQUk7Q0FDakIsRUFBRSxZQUFZO0lBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM3Qjs7QUFFRDs7Ozs7Ozs7O0lBU0ksSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUU7UUFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7S0FDekI7Ozs7Ozs7Ozs7SUFVRCxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUU7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O1FBRTFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDOztRQUV0QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksSUFBSSxLQUFLLENBQUMsQ0FBQzs7UUFFL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQzs7UUFFM0MsT0FBTyxNQUFNLENBQUM7S0FDakI7O0lBRUQsY0FBYyxFQUFFLFVBQVUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUU7UUFDL0MsSUFBSSxDQUFDLElBQUksWUFBWSxVQUFVLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3JELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksWUFBWTs7O29CQUdoQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTs7dUJBRTVELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUzt1QkFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2lCQUN4QjtjQUNIO2dCQUNFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDeEM7U0FDSjtRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQzdEO0tBQ0o7O0lBRUQsb0JBQW9CLEVBQUUsQ0FBQyxZQUFZOztRQUUvQixJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksWUFBWSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O1FBRWpDLE9BQU8sVUFBVSxVQUFVLEVBQUUsR0FBRyxFQUFFOztZQUU5QixJQUFJLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0MsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDOzs7WUFHeEQsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDaEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNwQzs7WUFFRCxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDOztZQUVuQyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNoQixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUNqRCxPQUFPO3FCQUNWO2lCQUNKO2FBQ0o7O1lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUNmLFFBQVEsQ0FBQyxJQUFJO29CQUNULElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFFBQVE7b0JBQ2IsSUFBSSxDQUFDLE1BQU07b0JBQ1gsVUFBVSxFQUFFLEdBQUc7aUJBQ2xCLENBQUM7Z0JBQ0YsT0FBTzthQUNWOztpQkFFSSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pCLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDekMsT0FBTzthQUNWOztZQUVELElBQUksUUFBUSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLEdBQUc7NEJBQzFFLFVBQVUsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFFNUYsSUFBSSxLQUFLLENBQUM7WUFDVixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQy9CLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2hELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzVDLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQzFDLElBQUksaUJBQWlCLENBQUM7WUFDdEIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDOztZQUV0QixJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbEQsT0FBTzthQUNWO1lBQ0QsSUFBSSxhQUFhLEVBQUU7Z0JBQ2YsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMvQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDekIsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ3REO2lCQUNKO2dCQUNELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDZixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO2dCQUM5RCxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUU7b0JBQ3BELFFBQVEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwRCxtQkFBbUIsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztvQkFDMUQsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDbEQ7Z0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzNDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUN6QixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xEQSxPQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN4QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRTs0QkFDbkNBLE9BQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDckRBLE9BQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVEO3FCQUNKO29CQUNELG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7aUJBQzFDO2FBQ0o7O1lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDeEMsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLFlBQVksR0FBRyxhQUFhO3NCQUMxQixRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWU7c0JBQ25DLFlBQVksQ0FBQztnQkFDbkIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0JBRS9CLElBQUksUUFBUSxFQUFFO29CQUNWLEtBQUssR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNqRTtxQkFDSTtvQkFDRCxLQUFLLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDakU7Z0JBQ0QsSUFBSSxLQUFLLEVBQUU7b0JBQ1AsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRTt3QkFDaEIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDbkU7eUJBQ0k7O3dCQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUMvQjtvQkFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLFlBQVk7d0JBQ2hDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQzt3QkFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7cUJBQ3pDLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0osQ0FBQztLQUNMLEdBQUc7O0lBRUosd0JBQXdCLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0tBQ2xDO0NBQ0osQ0FBQyxDQUFDOzs7Ozs7Ozs7OztBQVdILFVBQVUsQ0FBQyxZQUFZLEdBQUcsVUFBVSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRTs7Ozs7SUFLOUYsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Ozs7O0lBS25CLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDOzs7OztJQUs3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Ozs7SUFLckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Ozs7SUFJekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7Ozs7O0lBS25DLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQzVCLENBQUM7O0FDeFFGO0FBQ0EsQUFVQSxJQUFJQSxPQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztBQUN6QixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0FBRVosQUFFQSxJQUFJaUMsU0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7QUFFbkQsQUFtQ0EsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztJQUM3QixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFbEIsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1FBQ2IsT0FBTyxHQUFHLENBQUM7S0FDZDtTQUNJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNsQixPQUFPLENBQUMsQ0FBQztLQUNaO1NBQ0ksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDO0tBQ1o7U0FDSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxDQUFDLENBQUM7S0FDWjtTQUNJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDaEI7U0FDSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2hCO1NBQ0ksSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNoQjtTQUNJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNsQixPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztLQUM1QjtTQUNJO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDeEI7Q0FDSjs7QUFFRCxJQUFJLGVBQWUsR0FBRztJQUNsQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQzFCLENBQUM7OztBQUdGLFNBQVMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQ25FLElBQUksS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBSSxNQUFNLEdBQUdqQyxPQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsSUFBSSxLQUFLLEdBQUdBLE9BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixJQUFJLFdBQVcsR0FBR0EsT0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsSUFBSSxNQUFNLEdBQUdBLE9BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUdpQyxTQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQ0EsU0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRXBDLElBQUksVUFBVSxHQUFHakMsT0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLFNBQVMsR0FBRyxlQUFlLENBQUNpQyxTQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFOztvQkFFNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7b0JBRTFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFDakJqQyxPQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzs7b0JBRS9CLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyRCxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckQsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUVyRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUM3QixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUM3QixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDOztvQkFFN0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztvQkFDckMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDbEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztvQkFDbEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQzs7b0JBRWxCQSxPQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBRXhGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekI7YUFDSjtZQUNEQSxPQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztTQUM3RDs7UUFFRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNuQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ3RDO0lBQ0QsT0FBTyxLQUFLLENBQUM7Q0FDaEI7Ozs7Ozs7OztBQVNELEVBQUUsQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzs7O0lBSXpELElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7O0lBRXpCLElBQUksTUFBTSxDQUFDO0lBQ1gsSUFBSSxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUM3QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7SUFDZCxJQUFJLE1BQU0sWUFBWSxTQUFTLEVBQUU7UUFDN0IsTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLGNBQWMsRUFBRSxNQUFNO1NBQ3pCLENBQUMsQ0FBQztLQUNOO1NBQ0k7UUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2hGLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQztZQUNoQixLQUFLLEVBQUUsVUFBVTtZQUNqQixjQUFjLEVBQUUsTUFBTTtTQUN6QixDQUFDLENBQUM7S0FDTjs7SUFFRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRCxJQUFJLFdBQVcsR0FBRyxJQUFJLFNBQVMsQ0FBQztRQUM1QixLQUFLLEVBQUUsS0FBSztRQUNaLE1BQU0sRUFBRSxNQUFNO0tBQ2pCLENBQUMsQ0FBQztJQUNILElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNqQixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7S0FDckQ7SUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLElBQUksVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUM7UUFDcEMsT0FBTyxFQUFFLFdBQVc7S0FDdkIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBR2lDLFNBQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsVUFBVSxDQUFDQSxTQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUNBLFNBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwQyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVU7WUFDbEIsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTTtZQUNuQixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDQSxTQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUQsQ0FBQztRQUNGLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDaEM7O0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O0lBRTlCLE9BQU8sd0JBQXdCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDeEUsQ0FBQzs7QUNyTkY7Ozs7Ozs7Ozs7O0FBV0EsQUE4QkEsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQzs7QUFFeEMsQUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTs7SUFFdkIsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDcEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQzs7SUFFcEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDekIsR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDckM7O0lBRUQsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRTs7SUFFN0MsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLENBQUM7SUFDMUQsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLFdBQVcsS0FBSyxZQUFZLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O0lBRW5GLElBQUksU0FBUyxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQztJQUM1QyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUM7O0lBRS9DLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDekIsSUFBSSxTQUFTLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUMvQixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQzlELElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxVQUFVLENBQUM7UUFDNUMsS0FBSyxFQUFFLE1BQU07UUFDYixRQUFRLEVBQUUsU0FBUztLQUN0QixDQUFDLENBQUM7O0lBRUgsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7O0lBRWxELFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztJQUVsQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOztJQUVyQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7O0lBRWxCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7Ozs7OztRQU0xQixTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRTs7Ozs7UUFLL0MsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUM7Ozs7O1FBS25ELEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDOzs7OztRQUs3QyxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQzs7Ozs7O1FBTW5ELFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDOzs7Ozs7UUFNckQsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxPQUFPLFlBQVksQ0FBQyxFQUFFLENBQUM7S0FDNUQsQ0FBQyxDQUFDOzs7Ozs7Ozs7SUFTSCxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUNuQyxNQUFNLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNqRCxPQUFPLEdBQUcsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQztRQUNuRCxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNyQyxDQUFDOzs7Ozs7SUFNRixJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVk7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7O1FBRXRCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNmLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsU0FBUyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7UUFFOUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsT0FBTyxFQUFFO1lBQ25GLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDdkYsQ0FBQyxDQUFDO0tBQ04sQ0FBQzs7SUFFRixXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDOztJQUVsRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUlLLEtBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUlBLEtBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7O0lBR2xDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7O0lBRWxFLFdBQVcsS0FBSyxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDOztJQUU3RCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDOztJQUV6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQUNyQzs7SUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7SUFDaEIsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxTQUFTLEVBQUU7WUFDckQsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUN2QixZQUFZLElBQUksU0FBUyxDQUFDO1lBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBRWpCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDOztZQUVsRSxXQUFXLEtBQUssV0FBVyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQzs7WUFFN0QsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7O1lBRWpFLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOzs7WUFHN0MsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQzs7O1lBRzVCLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUMzQixnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7OztZQUc3RCxlQUFlLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7O1lBRTVDLGFBQWEsR0FBRyxlQUFlLENBQUM7WUFDaEMsZUFBZSxHQUFHLGlCQUFpQixDQUFDO1NBQ3ZDLENBQUMsQ0FBQztLQUNOLENBQUMsQ0FBQztDQUNOOztBQUVELFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFO0lBQzdCLE9BQU8sR0FBRyxZQUFZLEtBQUs7V0FDcEIsR0FBRyxZQUFZLGlCQUFpQjtXQUNoQyxHQUFHLFlBQVksZ0JBQWdCLENBQUM7Q0FDMUM7O0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7SUFDOUIsT0FBTyxHQUFHLEtBQUssUUFBUTtVQUNqQixHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxHQUFHLENBQUMsT0FBTyxHQUFHckMsTUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztDQUMvRDs7QUFFRCxTQUFTLGVBQWUsQ0FBQyxPQUFPLEVBQUU7SUFDOUIsT0FBTyxHQUFHLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQztDQUNwQzs7QUFFRCxTQUFTLFlBQVksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7SUFDM0QsSUFBSSxLQUFLLEdBQUdBLE1BQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7SUFDdkIsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDeEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDeEIsT0FBTyxLQUFLLENBQUM7Q0FDaEI7O0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtJQUNsQyxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7UUFDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDL0I7Q0FDSjs7QUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFVBQVUsVUFBVSxFQUFFO0lBQ3JELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0lBRXpCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxPQUFPLEVBQUU7UUFDbkYsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUU7WUFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BCLE9BQU87YUFDVjs7WUFFRCxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDbkMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDOztZQUVsQyxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQzs7WUFFbkQsSUFBSSxVQUFVLEVBQUU7O2dCQUVaLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7b0JBQzFCLE9BQU87aUJBQ1Y7O2dCQUVELElBQUksT0FBTyxLQUFLLFdBQVcsRUFBRTtvQkFDekIsSUFBSSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7b0JBQ3BELElBQUksYUFBYSxFQUFFO3dCQUNmLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUU7NEJBQzNELE1BQU0sRUFBRSxTQUFTO3lCQUNwQixFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUN6QjtvQkFDRCxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDMUYsSUFBSSxhQUFhLEVBQUU7d0JBQ2YsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7cUJBQzdGO2lCQUNKO3FCQUNJO29CQUNELGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUN6RjtnQkFDRCxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUNqQztpQkFDSSxJQUFJLFNBQVMsRUFBRTtnQkFDaEIsYUFBYSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFO29CQUM5QyxNQUFNLEVBQUUsU0FBUztpQkFDcEIsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsU0FBUyxHQUFHLElBQUksQ0FBQzthQUNwQjtTQUNKLENBQUMsQ0FBQztLQUNOLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDWixDQUFDOztBQUVGLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsVUFBVSxXQUFXLEVBQUUsSUFBSSxFQUFFO0lBQ2pFLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDbEQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7O0lBRXpDLElBQUksWUFBWSxDQUFDOztJQUVqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzNCLElBQUksR0FBRyxLQUFLLFlBQVksRUFBRTtZQUN0QixTQUFTO1NBQ1o7O1FBRUQsaUJBQWlCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDcEcsSUFBSSxhQUFhLEVBQUU7WUFDZixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN0QyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN6QzthQUNJO1lBQ0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDeEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDM0M7O1FBRUQsWUFBWSxHQUFHLEdBQUcsQ0FBQztLQUN0QjtDQUNKLENBQUM7O0FBRUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxRQUFRLEVBQUUsS0FBSyxFQUFFO0lBQ25ELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDMUIsQ0FBQzs7O0FBR0YsU0FBUyxVQUFVLENBQUMsWUFBWSxFQUFFO0lBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0tBQ2hDO0NBQ0o7O0FBRUQsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRTtJQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUMzQixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO0tBQ0o7Q0FDSjs7QUFFRCxTQUFTLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFO0lBQ2hDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDM0MsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7O1FBRXpCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDdkI7Q0FDSjtBQUNELFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFO0lBQ3hFLFNBQVMsVUFBVSxDQUFDLEtBQUssRUFBRTtRQUN2QixJQUFJLFlBQVksQ0FBQztRQUNqQixJQUFJLFlBQVksQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDOzs7WUFHbkMsSUFBSSxRQUFRLEtBQUssWUFBWSxFQUFFO2dCQUMzQixJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzdDLElBQUksV0FBVyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQy9DLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ04sU0FBUztxQkFDWjtvQkFDRCxJQUFJLEdBQUcsWUFBWSxPQUFPLEVBQUU7d0JBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztxQkFDeEM7eUJBQ0ksSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFO3dCQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDakMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksT0FBTyxFQUFFO2dDQUMzQixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7NkJBQzNDO3lCQUNKO3FCQUNKO2lCQUNKO2FBQ0o7WUFDRCxJQUFJLFFBQVEsS0FBSyxZQUFZLEVBQUU7Z0JBQzNCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQzthQUM5Qzs7WUFFRCxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLFlBQVksR0FBRyxRQUFRLENBQUM7U0FDM0I7S0FDSjs7SUFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdCLFVBQVUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7O0lBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7UUFFMUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUN6QixVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztTQUM1RDtLQUNKO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JELEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDOUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLElBQUksR0FBRyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLElBQUksUUFBUSxFQUFFO1FBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xDO0tBQ0o7O0lBRUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO1FBQ2pELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDekIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZO2dCQUN4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2hCLE9BQU87aUJBQ1Y7Z0JBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3BCLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWTtnQkFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNoQixPQUFPO2lCQUNWO2dCQUNELE1BQU0sRUFBRSxDQUFDO2FBQ1osQ0FBQyxDQUFDO1NBQ047YUFDSTtZQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQjtLQUNKLENBQUMsQ0FBQztJQUNILElBQUksUUFBUSxFQUFFO1FBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3BDO0lBQ0QsT0FBTyxPQUFPLENBQUM7Q0FDbEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJGLEtBQUssQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFVBQVUsUUFBUSxFQUFFLElBQUksRUFBRTtJQUN4RCxJQUFJLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUM5QixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsdUNBQXVDLENBQUMsRUFBRTtZQUN6RCxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3hDLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQy9CLFFBQVEsRUFBRSxLQUFLO2FBQ2xCLEVBQUUsWUFBWTtnQkFDWCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDOUIsQ0FBQyxDQUFDO1NBQ047YUFDSTtZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDMUI7S0FDSjtTQUNJLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDbkMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDekIsT0FBTyxDQUFDLE9BQU8sR0FBRyxRQUFRLFlBQVksZ0JBQWdCLENBQUM7S0FDMUQ7SUFDRCxPQUFPLE9BQU8sQ0FBQztDQUNsQixDQUFDOzs7Ozs7Ozs7O0FBVUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxTQUFTLEVBQUU7SUFDbEQsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDNUIsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLGlCQUFpQixDQUFDO0lBQ3pELElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLFlBQVksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUd5QixPQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RyxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQztRQUN4QixNQUFNLEVBQUUsTUFBTTtLQUNqQixDQUFDLENBQUM7SUFDSCxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtRQUM1QixPQUFPLFVBQVUsT0FBTyxFQUFFO1lBQ3RCLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDLENBQUM7S0FDTDtJQUNELEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFO1FBQ3ZCLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN4QixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUU7O2dCQUVoRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3REO2lCQUNJO2dCQUNELFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ2pDO1NBQ0o7S0FDSjs7SUFFRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUU7UUFDdkIsU0FBUyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDNUIsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7S0FDaEM7SUFDRCxPQUFPLFFBQVEsQ0FBQztDQUNuQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQWNGLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7SUFDakUsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1FBQ2hCLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDZDtJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzVCLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDckM7O0lBRUQsSUFBSSxNQUFNLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNQLElBQUksR0FBRyxJQUFJYSxNQUFPLENBQUM7WUFDZixhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QixjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDcEM7SUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUN0RCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQWNGLEtBQUssQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTtJQUN2RSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDaEIsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNkO0lBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNyQztJQUNELElBQUksTUFBTSxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDUCxJQUFJLEdBQUcsSUFBSUEsTUFBTyxDQUFDO1lBQ2YsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QixjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDcEM7O0lBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Q0FDdEQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTtJQUN4RSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7UUFDckIsV0FBVyxHQUFHLEVBQUUsQ0FBQztLQUNwQjtJQUNELElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxXQUFXLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNULE1BQU0sR0FBRyxJQUFJQyxRQUFTLENBQUM7WUFDbkIsYUFBYSxFQUFFLFdBQVcsR0FBRyxDQUFDO1lBQzlCLGNBQWMsRUFBRSxXQUFXO1NBQzlCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUN0QztJQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0NBQ3hELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTtJQUNsRSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDaEIsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNkO0lBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsSUFBSSxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNYLFFBQVEsR0FBRyxJQUFJQyxPQUFRLENBQUM7WUFDcEIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Q0FDMUQsQ0FBQzs7Ozs7O0FBTUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsVUFBVSxRQUFRLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRTtJQUM5RCxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztRQUNoQixRQUFRLEVBQUUsUUFBUTtRQUNsQixRQUFRLEVBQUUsR0FBRyxZQUFZLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7S0FDckUsQ0FBQyxDQUFDO0lBQ0gsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsT0FBTyxJQUFJLENBQUM7Q0FDZixDQUFDOzs7Ozs7Ozs7QUFTRixLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQzdELElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxjQUFjLEVBQUU7UUFDN0MsVUFBVSxHQUFHYixjQUFrQixDQUFDO0tBQ25DO1NBQ0k7UUFDRCxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEdBQUcsSUFBSSxHQUFHLGtDQUFrQyxDQUFDLENBQUM7U0FDcEY7UUFDRCxVQUFVLEdBQUdELGFBQWlCLENBQUM7S0FDbEM7O0lBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUM5QixJQUFJLFFBQVEsWUFBWSxPQUFPLEVBQUU7UUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDbEM7U0FDSSxJQUFJLFFBQVEsWUFBWSxLQUFLLEVBQUU7UUFDaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDdEM7O0lBRUQsSUFBSSxNQUFNLFlBQVksS0FBSyxFQUFFO1FBQ3pCLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDekI7O0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7O0lBRXZCLE9BQU8sTUFBTSxDQUFDO0NBQ2pCLENBQUM7Ozs7Ozs7Ozs7O0FBV0YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsR0FBRyxVQUFVLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0lBQ3RFLElBQUksS0FBSyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNuQyxJQUFJLEdBQUcsWUFBWSxPQUFPLEVBQUU7UUFDeEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7S0FDbkI7SUFDRCxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0QyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUMzQixLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQzs7SUFFbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsT0FBTyxLQUFLLENBQUM7Q0FDaEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUU7SUFDOUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLFlBQVksT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUM7O0lBRWpGLElBQUksTUFBTSxZQUFZLEtBQUssRUFBRTtRQUN6QixNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RDtJQUNELElBQUksTUFBTSxZQUFZLE9BQU8sRUFBRTtRQUMzQixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3hCOztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzNCLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7SUFDRCxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDdkMsS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNuRCxVQUFVLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDdEQsYUFBYSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxDQUFDOztJQUUvRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFFdEIsT0FBTyxLQUFLLENBQUM7Q0FDaEIsQ0FBQzs7Ozs7Ozs7O0FBU0YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUM1RSxJQUFJLEtBQUssR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQzdCLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsWUFBWSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQzs7SUFFakYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDM0IsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QjtJQUNELEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztJQUN2QyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDdkMsU0FBUyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDOztJQUVuRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFFdEIsT0FBTyxLQUFLLENBQUM7Q0FDaEIsQ0FBQzs7Ozs7OztBQU9GLEtBQUssQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFO0lBQzdELElBQUksS0FBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7O0lBRS9CLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzNCLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7SUFDRCxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDdkMsU0FBUyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDOztJQUVuRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7SUFFdEIsT0FBTyxLQUFLLENBQUM7Q0FDaEIsQ0FBQzs7Ozs7Ozs7Ozs7QUFXRixLQUFLLENBQUMsU0FBUyxDQUFDLHlCQUF5QixHQUFHLFVBQVUsUUFBUSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFO0lBQzVILElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUNoQixJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7UUFDbEIsUUFBUSxHQUFHLENBQUMsQ0FBQztLQUNoQjtJQUNELElBQUksc0JBQXNCLElBQUksSUFBSSxFQUFFO1FBQ2hDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztLQUMvQjs7SUFFRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztJQUV2QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO1FBQzlCLFFBQVEsRUFBRSxRQUFRO0tBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxVQUFVLEVBQUU7UUFDMUIsSUFBSSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztZQUNwQyxTQUFTLEVBQUUsYUFBYSxJQUFJLElBQUksR0FBRyxhQUFhLEdBQUcsR0FBRztTQUN6RCxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUMvQixVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7UUFFekIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDOztRQUV2QyxJQUFJLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBQztZQUMvQixTQUFTLEVBQUUsYUFBYSxJQUFJLElBQUksR0FBRyxhQUFhLEdBQUcsR0FBRztZQUN0RCxZQUFZLEVBQUVlLEVBQU0sQ0FBQyxxQkFBcUI7Z0JBQ3RDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRTtvQkFDOUIsR0FBRyxFQUFFLENBQUM7aUJBQ1Q7YUFDSjtTQUNKLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7UUFFckIsT0FBTztZQUNILFFBQVEsRUFBRSxTQUFTO1lBQ25CLE9BQU8sRUFBRSxTQUFTOztZQUVsQixjQUFjLEVBQUUsVUFBVTtTQUM3QixDQUFDO0tBQ0wsQ0FBQyxDQUFDO0NBQ04sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQWdCRixLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUU7SUFDN0MsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUNuQzs7SUFFRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNsQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLEVBQUU7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztLQUNqQztJQUNELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksZUFBZSxDQUFDOztJQUU1QyxJQUFJLFVBQVUsR0FBRztRQUNiLFFBQVEsRUFBRSxJQUFJLElBQUksRUFBRTtRQUNwQixNQUFNLEVBQUUsTUFBTTtRQUNkLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtRQUNyQyxXQUFXLEVBQUUsV0FBVztRQUN4QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7S0FDbEMsQ0FBQztJQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsRUFBRTtRQUNsRCxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2pFOztJQUVELElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztJQUV4QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDOztJQUVoQixPQUFPLElBQUksT0FBTyxDQUFDLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtRQUMxQyxTQUFTLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNoQixPQUFPO2FBQ1Y7O1lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFO29CQUNqQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxQixDQUFDLENBQUM7YUFDTjtZQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQjtRQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFNLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNoQixPQUFPO2FBQ1Y7O1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDekIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JCO2lCQUNJO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPLEVBQUU7b0JBQy9DLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUN4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ25DO29CQUNELE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxPQUFPLEVBQUU7d0JBQ2xDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQzFCLENBQUMsQ0FBQztpQkFDTixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTtvQkFDakIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyQixDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVk7b0JBQ2pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDckIsQ0FBQyxDQUFDO2FBQ047U0FDSixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVk7WUFDckIsTUFBTSxFQUFFLENBQUM7U0FDWixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3BCLENBQUMsQ0FBQztDQUNOLENBQUM7OztBQUdGLGtCQUFlO0lBQ1gsS0FBSyxFQUFFLEtBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBdUJaLE1BQU0sRUFBRSxVQUFVLEdBQUcsRUFBRSxLQUFLLEVBQUU7UUFDMUIsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDaEM7Q0FDSjs7RUFBQyxGQ2gvQkY7Ozs7O0FBS0EsSUFBSSxJQUFJLEdBQUcsV0FBVztJQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztDQUMxQixDQUFDOzs7OztBQUtGLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsSUFBSSxFQUFFO0lBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ2pDLENBQUM7Ozs7O0FBS0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUU7SUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDOUIsQ0FBQzs7Ozs7QUFLRixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxXQUFXO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztDQUMzQixDQUFDOzs7OztBQUtGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFdBQVc7SUFDbkMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQ3pCLENBQUM7Ozs7O0FBS0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsV0FBVztJQUNsQyxPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUM3QyxDQUFDOztBQUVGekMsTUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDOztBQUV0QyxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFO0lBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNSLEdBQUcsRUFBRSxHQUFHO1FBQ1IsWUFBWSxFQUFFLFlBQVk7UUFDMUIsTUFBTSxFQUFFLFNBQVMsR0FBRyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckI7UUFDRCxPQUFPLEVBQUUsU0FBUyxLQUFLLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjtLQUNKLENBQUMsQ0FBQztJQUNILE9BQU8sSUFBSSxDQUFDO0NBQ2Y7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCRCxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsR0FBRyxFQUFFLFlBQVksRUFBRTtJQUMvQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUN6QixPQUFPLGVBQWUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDN0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDaEIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2QsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDM0IsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxHQUFHLEVBQUUsWUFBWSxDQUFDO1lBQ3RCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDO2FBQ2IsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUU7Z0JBQzVCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUNkLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ25DO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDbEQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7S0FDaEI7Q0FDSixDQUFDOzs7O0FBSUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXO0lBQ3ZCLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztDQUNyQixDQUFDOztBQUVGQSxNQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7O0FDaEh0Qzs7Ozs7QUFLQSxJQUFJLFNBQVMsR0FBRyxZQUFZOztJQUV4QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzs7SUFFNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7O0lBRWpCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7O0lBRTFCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLENBQUM7O0FBRUYsSUFBSSxJQUFJLEdBQUcsV0FBVyxFQUFFLENBQUM7QUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ2hDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7QUFFakMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUI1QyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEtBQUssRUFBRTtJQUN2QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7SUFDaEIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQzs7SUFFekJBLE1BQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNsQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFDRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsR0FBRyxFQUFFO1lBQ2hDLEtBQUssRUFBRSxDQUFDOztZQUVSLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOzs7O1lBSXhCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztZQUV2QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2hCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RCO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWTs7WUFFM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDOztZQUV4QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs7WUFFdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQixDQUFDLENBQUM7S0FDTixDQUFDLENBQUM7SUFDSCxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7UUFDYixVQUFVLENBQUMsWUFBWTtZQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxPQUFPLElBQUksQ0FBQztDQUNmLENBQUM7Ozs7OztBQU1GLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsS0FBSyxFQUFFO0lBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUNoQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7SUFDZCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLFVBQVUsQ0FBQyxZQUFZO1lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzs7SUFFcEJBLE1BQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNsQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFDRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsR0FBRyxFQUFFO1lBQ2hDLEtBQUssRUFBRSxDQUFDOztZQUVSLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztZQUV4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7WUFFdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNoQixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QjtTQUNKLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRyxFQUFFO1lBQzlCLEtBQUssRUFBRSxDQUFDOztZQUVSLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7WUFFdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7OztZQUd0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RCO1NBQ0osQ0FBQyxDQUFDO0tBQ04sQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLENBQUM7Q0FDZixDQUFDOzs7Ozs7QUFNRixTQUFTLENBQUMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLFVBQVUsU0FBUyxFQUFFO0lBQzFELElBQUksU0FBUyxFQUFFO1FBQ1gsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxZQUFZLFNBQVMsRUFBRTtnQkFDM0IsVUFBVSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNwRCxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDdkIsVUFBVSxJQUFJLENBQUMsQ0FBQzthQUNuQjtTQUNKO1FBQ0QsT0FBTyxVQUFVLENBQUM7S0FDckIsTUFBTTtRQUNILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0tBQ2hDO0NBQ0osQ0FBQzs7Ozs7OztBQU9GLFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxTQUFTLEVBQUU7SUFDekQsSUFBSSxTQUFTLEVBQUU7UUFDWCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxJQUFJLFlBQVksU0FBUyxFQUFFO2dCQUMzQixTQUFTLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2xELE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN0QixTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2xCO1NBQ0o7UUFDRCxPQUFPLFNBQVMsQ0FBQztLQUNwQixNQUFNO1FBQ0gsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0tBQy9CO0NBQ0osQ0FBQzs7Ozs7OztBQU9GLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxTQUFTLEVBQUU7O0lBRXhELElBQUksU0FBUyxFQUFFO1FBQ1gsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxZQUFZLFNBQVMsRUFBRTtnQkFDM0IsUUFBUSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNoRCxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUN6QyxRQUFRLElBQUksQ0FBQyxDQUFDO2FBQ2pCO1NBQ0o7UUFDRCxPQUFPLFFBQVEsQ0FBQztLQUNuQixNQUFNO1FBQ0gsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztLQUN2RDtDQUNKLENBQUM7Ozs7Ozs7QUFPRixTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLFNBQVMsRUFBRTtJQUNyRCxJQUFJLFNBQVMsRUFBRTtRQUNYLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksSUFBSSxZQUFZLFNBQVMsRUFBRTtnQkFDM0IsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDMUMsTUFBTTtnQkFDSCxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQ2Q7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2hCLE1BQU07UUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0tBQzdCO0NBQ0osQ0FBQzs7QUNqT0YsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7SUFFN0IsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztJQUVuQixPQUFPLEVBQUUsQ0FBQzs7SUFFVixTQUFTLEVBQUUsQ0FBQzs7SUFFWixVQUFVLEVBQUUsV0FBVztDQUMxQixDQUFDOztBQ1JGLElBQUlJLE1BQUksR0FBR1AsUUFBUSxDQUFDLElBQUksQ0FBQztBQUN6QixJQUFJRSxPQUFJLEdBQUdGLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFDekIsSUFBSWdCLE1BQUksR0FBR2hCLFFBQVEsQ0FBQyxJQUFJLENBQUM7O0FBRXpCLEFBR0EsSUFBSSxVQUFVLEdBQUdnQixNQUFJLENBQUMsTUFBTSxDQUFDOztBQUU3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztBQUV2QixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDdkIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDOztBQUV4QixTQUFTLGFBQWEsQ0FBQyxXQUFXLEVBQUU7SUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7O0lBRXhCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDOztJQUVoQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztDQUNsQjs7QUFFRCxhQUFhLENBQUMsU0FBUyxHQUFHO0lBQ3RCLElBQUksRUFBRSxZQUFZO1FBQ2QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLEVBQUUsR0FBRyxFQUFFOztZQUVQLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxHQUFHLENBQUM7S0FDZDs7SUFFRCxLQUFLLEVBQUUsWUFBWTtRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ2xCOztJQUVELE1BQU0sRUFBRSxZQUFZO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbEM7O0lBRUQsS0FBSyxFQUFFLFlBQVk7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztLQUNsQjtFQUNKOztBQUVELFNBQVMsUUFBUSxHQUFHO0lBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxFQUFFLENBQUM7O0lBRTFCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0NBQ2xCOztBQUVELFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDOztBQUU3QyxTQUFTLEtBQUssR0FBRzs7SUFFYixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzs7SUFFL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLEVBQUUsQ0FBQzs7SUFFMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbEI7O0FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDOztBQUV2QyxTQUFTLElBQUksR0FBRztJQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxFQUFFLENBQUM7O0lBRTFCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztJQUVmLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ3RCOztBQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQzs7QUFFckMsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTs7SUFFekIsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Q0FDNUI7O0FBRUQsU0FBUyxjQUFjLENBQUMsRUFBRSxFQUFFO0lBQ3hCLE9BQU8sTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQ2xHOztBQUVELFNBQVMsY0FBYyxDQUFDLEVBQUUsRUFBRTtJQUN4QixPQUFPLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQ2pIOztBQUVELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0lBRTdCLE1BQU0sRUFBRSxJQUFJOztJQUVaLE1BQU0sRUFBRSxHQUFHOztJQUVYLE9BQU8sRUFBRSxHQUFHOztJQUVaLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHOztJQUVoRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7O0lBRTNCLEtBQUssRUFBRSxJQUFJOztJQUVYLEdBQUcsRUFBRSxJQUFJOzs7SUFHVCxXQUFXLEVBQUUsRUFBRTs7O0lBR2YsVUFBVSxFQUFFLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQzs7O0lBR3ZDLE1BQU0sRUFBRSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUM7OztJQUcvQixPQUFPLEVBQUUsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDO0NBQ3BDLEVBQUUsWUFBWTtJQUNYLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7SUFFekIsSUFBSTtRQUNBLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7U0FDckI7S0FDSjtJQUNELE9BQU8sQ0FBQyxFQUFFO1FBQ04sTUFBTSwrQkFBK0IsR0FBRyxDQUFDLENBQUM7S0FDN0M7O0lBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ2pCLEVBQUU7O0lBRUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUM3QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDcEMsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7WUFFN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDekI7YUFDSTtZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztTQUN0QztLQUNKOztJQUVELFFBQVEsRUFBRSxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUN0Qjs7SUFFRCxTQUFTLEVBQUUsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDdkI7O0lBRUQsaUJBQWlCLEVBQUUsWUFBWTtRQUMzQixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUNyQzs7SUFFRCxNQUFNLEVBQUUsVUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFOztRQUU3QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQzNCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDN0I7aUJBQ0k7O2dCQUVELElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDZCxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM3QjtnQkFDRCxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25GLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDNUI7U0FDSjs7UUFFRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7O1FBRWhCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbEMsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUM1QyxBQUVBLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBRTlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ2pDOztJQUVELFVBQVUsRUFBRSxVQUFVLElBQUksRUFBRSxNQUFNLEVBQUU7UUFDaEMsSUFBSSxRQUFRLEdBQUdULE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QkEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hGLElBQUksZ0JBQWdCLEdBQUdBLE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQyxJQUFJLFlBQVksR0FBR0wsT0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztRQUVqQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOztRQUU5QixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7UUFFbkIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDOztRQUVuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFekJLLE1BQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBRTNFLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkMsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDOzs7WUFHckMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQzVCTCxPQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbkI7aUJBQ0k7Z0JBQ0RjLE1BQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2Qzs7WUFFRCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztZQUVuQyxRQUFRLFVBQVUsQ0FBQyxJQUFJO2dCQUNuQixLQUFLLE1BQU0sQ0FBQyxTQUFTO29CQUNqQixJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsRUFBRTt3QkFDekIsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQzt3QkFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDNUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7OzRCQUU3QixJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3BDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOzs0QkFFN0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7OzRCQUUvRixJQUFJLEVBQUUsT0FBTyxFQUFFO2dDQUNYLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQzs2QkFDdkM7eUJBQ0o7cUJBQ0o7eUJBQ0k7d0JBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sR0FBRzs0QkFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNqQixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ2pCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7NEJBRWpCLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDcEMsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7OzRCQUU3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQzs7NEJBRS9GLElBQUksRUFBRSxPQUFPLEVBQUU7Z0NBQ1gsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDOzZCQUN2Qzt5QkFDSjtxQkFDSjtvQkFDRCxNQUFNO2dCQUNWLEtBQUssTUFBTSxDQUFDLEtBQUs7O29CQUViLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEdBQUc7d0JBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDakIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNqQixJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO3dCQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7O3dCQUV0QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQzs7d0JBRTNGLElBQUksRUFBRSxPQUFPLEVBQUU7NEJBQ1gsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO3lCQUNuQztxQkFDSjtvQkFDRCxNQUFNO2dCQUNWLEtBQUssTUFBTSxDQUFDLE1BQU07b0JBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDOUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDZixJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQzlCLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOzt3QkFFMUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7O3dCQUU1RixJQUFJLEVBQUUsT0FBTyxFQUFFOzRCQUNYLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQzt5QkFDcEM7cUJBQ0o7O29CQUVELE1BQU07YUFDYjtTQUNKOztRQUVELGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDOztRQUVwQixVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQzs7UUFFL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3BDOztJQUVELGFBQWEsRUFBRSxDQUFDLFlBQVk7UUFDeEIsSUFBSSxXQUFXLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDL0IsT0FBTyxVQUFVLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUU7WUFDL0UsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNuQyxJQUFJLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUN2RSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDOztZQUUvQixTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLGNBQWMsRUFBRTtnQkFDaEJBLE1BQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2xDOztZQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQzs7WUFFbkIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2JBLE1BQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLGNBQWMsRUFBRTtvQkFDaEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7Ozs7b0JBSXpDQSxNQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUM5RDs7O2dCQUdELElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O2dCQUdqQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN2RCxPQUFPLEdBQUcsS0FBSyxDQUFDO2lCQUNuQjs7Z0JBRUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs7Z0JBRXBCLFNBQVMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9COztZQUVELElBQUksRUFBRSxPQUFPLEVBQUU7Z0JBQ1gsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7O2dCQUV4QixJQUFJLGNBQWMsRUFBRTtvQkFDaEJBLE1BQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDMUM7cUJBQ0k7b0JBQ0RBLE1BQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUNqQzthQUNKOztZQUVELE9BQU8sT0FBTyxDQUFDO1NBQ2xCO0tBQ0osR0FBRzs7SUFFSixlQUFlLEVBQUUsVUFBVSxVQUFVLEVBQUU7UUFDbkMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNuQixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7O1FBRVgsSUFBSSxZQUFZLENBQUM7O1FBRWpCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNoQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUM5QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNoQyxJQUFJLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O1FBRTVCLElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksZUFBZSxDQUFDOztRQUVwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7WUFFbEMsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNuQyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQ2xDLElBQUksUUFBUSxLQUFLLFlBQVksRUFBRTs7Z0JBRTNCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDbkMsWUFBWSxHQUFHLFFBQVEsQ0FBQzthQUMzQjs7WUFFRCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLFFBQVEsYUFBYTtnQkFDakIsS0FBSyxrQkFBa0I7b0JBQ25CLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO29CQUN6QixHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQztvQkFDL0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDO29CQUMvRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUM7b0JBQy9ELEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNYLE1BQU07Z0JBQ1YsS0FBSyxjQUFjO29CQUNmLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO29CQUNwQyxJQUFJLGVBQWUsS0FBSyxRQUFRLEVBQUU7d0JBQzlCLGVBQWUsR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztxQkFDaEQ7b0JBQ0QsSUFBSSxTQUFTLEtBQUssYUFBYSxFQUFFO3dCQUM3QixHQUFHLENBQUMsU0FBUyxHQUFHLGFBQWEsR0FBRyxTQUFTLENBQUM7cUJBQzdDO29CQUNELEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDO29CQUMvRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUM7b0JBQy9ELEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDYixNQUFNO2dCQUNWLEtBQUssZUFBZTtvQkFDaEIsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztvQkFDbkMsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztvQkFDckMsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO3dCQUNmLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQzt3QkFDakMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDOzt3QkFFbkMsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7d0JBQ3pCLElBQUksVUFBVSxLQUFLLFdBQVcsRUFBRTs0QkFDNUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLEVBQUUsR0FBRyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO3lCQUNwRTs2QkFDSSxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7NEJBQzlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDaEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDMUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO3lCQUNkO3FCQUNKO29CQUNELE1BQU07YUFDYjtTQUNKOztRQUVELEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNqQjs7SUFFRCxPQUFPLEVBQUUsWUFBWTtRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQzs7UUFFdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7S0FDdEI7Q0FDSixDQUFDOztBQzNkRjs7Ozs7Ozs7OztBQVVBLElBQUk2QixNQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBQy9CLDJDQUEyQzs7OztRQUl2QyxJQUFJLEVBQUUsRUFBRTs7Ozs7Ozs7Ozs7UUFXUixVQUFVLEVBQUUsRUFBRTs7Ozs7Ozs7Ozs7UUFXZCxXQUFXLEVBQUUsRUFBRTs7OztRQUlmLG1CQUFtQixFQUFFLEVBQUU7UUFDdkIsZUFBZSxFQUFFLEVBQUU7OztRQUduQixpQkFBaUIsRUFBRSxFQUFFOztRQUVyQixVQUFVLEVBQUUsS0FBSzs7UUFFakIsU0FBUyxFQUFFLEtBQUs7O1FBRWhCLFdBQVcsRUFBRSxJQUFJO0tBQ3BCLENBQUM7Q0FDTDs7QUFFRDs7O0lBR0ksZUFBZSxFQUFFLFVBQVUsVUFBVSxFQUFFLFFBQVEsRUFBRTtRQUM3QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDdkMsSUFBSSxjQUFjLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUNoRCxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pCLGNBQWMsR0FBRyxVQUFVLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztTQUNwRDtRQUNELElBQUksVUFBVSxFQUFFO1lBQ1osS0FBSyxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUU7Z0JBQ3hCLElBQUksR0FBRyxLQUFLLE9BQU8sSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO29CQUNyQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN6QzthQUNKO1NBQ0o7UUFDRCxJQUFJLEtBQUssRUFBRSxNQUFNLENBQUM7UUFDbEIsSUFBSSxVQUFVLENBQUMsS0FBSyxZQUFZLFFBQVEsRUFBRTtZQUN0QyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ2pEO2FBQ0k7WUFDRCxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztTQUM1QjtRQUNELElBQUksVUFBVSxDQUFDLE1BQU0sWUFBWSxRQUFRLEVBQUU7WUFDdkMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNuRDthQUNJO1lBQ0QsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7U0FDOUI7UUFDRDtZQUNJLGNBQWMsQ0FBQyxLQUFLLEtBQUssS0FBSztlQUMzQixjQUFjLENBQUMsTUFBTSxLQUFLLE1BQU07VUFDckM7WUFDRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN6RDtTQUNKO1FBQ0QsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDN0IsY0FBYyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O1FBRS9CLE9BQU8sY0FBYyxDQUFDO0tBQ3pCOzs7Ozs7O0lBT0QsWUFBWSxFQUFFLFVBQVUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFOzs7Ozs7SUFNdkMsWUFBWSxFQUFFLFVBQVUsSUFBSSxFQUFFLEVBQUU7Ozs7O0lBS2hDLGFBQWEsRUFBRSxVQUFVLEdBQUcsRUFBRTtRQUMxQixLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN0QztLQUNKOztJQUVELE1BQU0sRUFBRSxZQUFZLEVBQUU7O0lBRXRCLFNBQVMsRUFBRSxVQUFVLFFBQVEsZUFBZSxJQUFJLEVBQUU7UUFDOUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFOztZQUVkLElBQUksR0FBRyxRQUFRLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsUUFBUTtTQUNYOzs7UUFHRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7O1lBRWhCLElBQUksVUFBVSxDQUFDLGVBQWUsRUFBRTtnQkFDNUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDekM7aUJBQ0k7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JDO1NBQ0o7YUFDSTs7WUFFRCxJQUFJLENBQUMsVUFBVTtVQUNqQjtZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUU7O2dCQUVqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNsRztZQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pDOztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7O1FBRXRCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyQzs7SUFFRCxlQUFlLEVBQUUsVUFBVSxVQUFVLEVBQUU7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO2dCQUMxQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQ3pFO2dCQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNFO2lCQUNJOzs7Z0JBR0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0o7S0FDSjs7SUFFRCxJQUFJLEVBQUUsVUFBVSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTs7O1FBR2pELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUc7WUFDNUIsSUFBSSxFQUFFLFFBQVE7WUFDZCxHQUFHLEVBQUUsV0FBVztTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDcEMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDMUM7UUFDRCxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQyxJQUFJLEVBQUUsSUFBSTtZQUNWLEdBQUcsRUFBRSxZQUFZO1NBQ3BCLENBQUMsQ0FBQzs7O1FBR0gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ2xEOztJQUVELEtBQUssRUFBRSxZQUFZO1FBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7S0FDekI7O0lBRUQsZUFBZSxFQUFFLFVBQVUsVUFBVSxFQUFFO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDM0I7UUFDRCxJQUFJLFVBQVUsRUFBRTtZQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1NBQ3pDO0tBQ0o7O0lBRUQsV0FBVyxFQUFFLFlBQVk7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7O1FBRXZCLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BDO0tBQ0o7O0lBRUQsVUFBVSxFQUFFLFlBQVk7O1FBRXBCLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2xDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRTtvQkFDMUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUNuRTtvQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0Q7cUJBQ0k7b0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDthQUNKO1NBQ0o7S0FDSjtDQUNKLENBQUM7O0FDaFBGOzs7O0FBSUEsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBQ2hDLDRDQUE0Qzs7OztRQUl4QyxLQUFLLEVBQUUsRUFBRTtLQUNaLENBQUM7Q0FDTDs7QUFFRDs7Ozs7SUFLSSxLQUFLLEVBQUUsWUFBWTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0tBQ3RCOzs7O0lBSUQsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFOztRQUVyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixPQUFPO1NBQ1Y7O1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O1FBRXRCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0tBQ3RCOzs7O0lBSUQsVUFBVSxFQUFFLFVBQVUsSUFBSSxFQUFFO1FBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3RCO0tBQ0o7Ozs7O0lBS0QsYUFBYSxFQUFFLFVBQVUsSUFBSSxFQUFFO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1NBQ0o7S0FDSjs7OztJQUlELE1BQU0sRUFBRSxZQUFZO1FBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3pCOztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUV6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZCxTQUFTO2FBQ1o7WUFDRCxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUN6QixTQUFTO2lCQUNaO2dCQUNELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUM7b0JBQ25FLFNBQVM7aUJBQ1o7Z0JBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Z0JBRXpDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksT0FBTyxFQUFFO29CQUNULElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNuRDtxQkFDSTtvQkFDRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTt3QkFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDO3FCQUN0RDt5QkFDSTt3QkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDO3FCQUNyRjtpQkFDSjthQUNKO1NBQ0o7S0FDSjs7SUFFRCxPQUFPLEVBQUUsVUFBVSxLQUFLLEVBQUU7UUFDdEIsSUFBSSxJQUFJLENBQUM7O1FBRVQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZQyxNQUFTLEVBQUU7WUFDekQsS0FBSyxHQUFHO2dCQUNKLElBQUksRUFBRSxLQUFLO2FBQ2QsQ0FBQztTQUNMOztRQUVELElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFO29CQUN6QixJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUNkO2FBQ0o7U0FDSjthQUNJO1lBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDckI7UUFDRCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsRUFBRTs7Z0JBRVgsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNkLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0M7YUFDSjtZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDeEIsT0FBTztvQkFDSCxJQUFJLEVBQUUsSUFBSTtvQkFDVixHQUFHLEVBQUUsUUFBUTtpQkFDaEIsQ0FBQzthQUNMO1NBQ0o7S0FDSjtDQUNKLENBQUM7O0FDcklGOzs7Ozs7O0FBT0EsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXO0lBQ3JDLE9BQU87O1FBRUgsUUFBUSxFQUFFLEVBQUU7O1FBRVosWUFBWSxFQUFFLElBQUksV0FBVyxFQUFFOztRQUUvQixZQUFZLEVBQUUsSUFBSSxXQUFXLENBQUM7WUFDMUIsV0FBVyxFQUFFLEtBQUs7U0FDckIsQ0FBQztLQUNMLENBQUM7Q0FDTDs7QUFFRDtJQUNJLE9BQU8sRUFBRSxTQUFTLElBQUksRUFBRTtRQUNwQixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0tBQzNCOzs7O0lBSUQsTUFBTSxFQUFFLFNBQVMsUUFBUSxFQUFFLFdBQVcsRUFBRTtRQUNwQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzs7WUFFcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JDO2FBQ0o7U0FDSjs7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBRXhDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0I7O1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDdEM7O1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUNsRDs7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBRXhDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDOUI7S0FDSjs7SUFFRCxlQUFlLEVBQUUsVUFBVSxVQUFVLEVBQUU7UUFDbkMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUM1Qzs7SUFFRCxjQUFjLEVBQUUsVUFBVSxVQUFVLEVBQUU7UUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDckM7O0lBRUQsY0FBYyxFQUFFLFlBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzVCOzs7Ozs7SUFNRCxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDckM7Q0FDSixDQUFDOztBQy9FRjs7OztBQUlBLElBQUlDLFdBQVMsR0FBR0YsTUFBSSxDQUFDLE1BQU07O0FBRTNCO0lBQ0ksSUFBSSxFQUFFLE9BQU87Ozs7SUFJYixLQUFLLEVBQUUsSUFBSTs7OztJQUlYLE1BQU0sRUFBRSxJQUFJOzs7O0lBSVosZUFBZSxFQUFFLElBQUk7Ozs7SUFJckIsSUFBSSxFQUFFLEtBQUs7O0NBRWQsRUFBRSxXQUFXO0lBQ1YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0NBQ3hDLEVBQUU7SUFDQyxNQUFNLEVBQUUsU0FBUyxRQUFRLEVBQUU7O1FBRXZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7O1FBRXRCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7O1FBRTdCLElBQUksVUFBVSxDQUFDOztRQUVmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFOztZQUVmLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztTQUUzRjthQUNJOztZQUVELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbkMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUMzQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDOztnQkFFckMsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2hFLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxRQUFRLEVBQUU7b0JBQ2hDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2hDO2dCQUNELFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzNDO1lBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7OztZQUkzQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEQsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNkLEtBQUssSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDakMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDbEMsSUFBSSxVQUFVLElBQUksR0FBRyxDQUFDLGlCQUFpQixJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFO3dCQUNoRixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN6QjtpQkFDSjtnQkFDRCxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCOzs7O1lBSUQsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN0RSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RixRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7O1lBRXhCLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEM7O1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7O1FBRXhDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0tBQ3pCO0NBQ0osQ0FBQzs7QUMxRkY7Ozs7QUFJQSxJQUFJRyxhQUFXLEdBQUdILE1BQUksQ0FBQyxNQUFNLENBQUMsV0FBVztJQUNyQyxrREFBa0Q7Ozs7UUFJOUMsT0FBTyxFQUFFLElBQUk7OztRQUdiLE9BQU8sRUFBRTtZQUNMLEtBQUssRUFBRSxFQUFFO1NBQ1o7S0FDSixDQUFDO0NBQ0wsRUFBRSxZQUFZO0NBQ2QsRUFBRTs7SUFFQyxTQUFTLEVBQUUsVUFBVSxRQUFRLEVBQUUsSUFBSSxFQUFFO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUN2Qjs7O0lBR0QsV0FBVyxFQUFFLFlBQVksRUFBRTtJQUMzQixVQUFVLEVBQUUsWUFBWSxFQUFFO0NBQzdCLENBQUM7O0FDNUJGO0FBQ0EsQUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUNBLElBQUlJLFlBQVUsR0FBR0osTUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBQ3JDLDJDQUEyQzs7OztRQUl2QyxJQUFJLEVBQUUsRUFBRTs7Ozs7UUFLUixNQUFNLEVBQUUsRUFBRTs7Ozs7UUFLVixPQUFPLEVBQUUsSUFBSTs7Ozs7UUFLYixNQUFNLEVBQUUsRUFBRTs7Ozs7Ozs7Ozs7UUFXVixVQUFVLEVBQUUsRUFBRTs7Ozs7Ozs7Ozs7UUFXZCxXQUFXLEVBQUUsRUFBRTs7Ozs7UUFLZixJQUFJLEVBQUUsSUFBSTs7OztRQUlWLG1CQUFtQixFQUFFLEVBQUU7UUFDdkIsZUFBZSxFQUFFLEVBQUU7OztRQUduQixpQkFBaUIsRUFBRSxFQUFFOztRQUVyQixVQUFVLEVBQUUsS0FBSzs7UUFFakIsU0FBUyxFQUFFLEtBQUs7O1FBRWhCLFdBQVcsRUFBRSxJQUFJO0tBQ3BCLENBQUM7Q0FDTCxFQUFFLFlBQVk7O0lBRVgsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUM7UUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO0tBQ3hCLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ3BCOztBQUVEOzs7O0lBSUksTUFBTSxFQUFFLFVBQVUsUUFBUSxFQUFFLFdBQVcsRUFBRTtRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQzs7UUFFdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7O1FBRXZCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7O1FBRXRCLEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ2pEOztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOztZQUV6QixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7WUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQzNDO2FBQ0k7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7O1lBRXZCLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1lBQzFCLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDM0IsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ3hDO2dCQUNELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDckMsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2hFLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxRQUFRLEVBQUU7b0JBQ2hDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2hDO2dCQUNELGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUVqRCxLQUFLLElBQUksVUFBVSxJQUFJLGdCQUFnQixFQUFFOztnQkFFckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNO29CQUNwQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxVQUFVO2lCQUMzQyxDQUFDO2FBQ0w7O1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7WUFJM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQy9EOztRQUVELEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2Qzs7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs7UUFFdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDekM7OztJQUdELGVBQWUsRUFBRSxVQUFVLFVBQVUsRUFBRSxRQUFRLEVBQUU7UUFDN0MsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksY0FBYyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUM7UUFDaEQsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixjQUFjLEdBQUcsVUFBVSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7U0FDcEQ7UUFDRCxJQUFJLFVBQVUsRUFBRTtZQUNaLEtBQUssSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFO2dCQUN4QixJQUFJLEdBQUcsS0FBSyxPQUFPLElBQUksR0FBRyxLQUFLLFFBQVEsRUFBRTtvQkFDckMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDekM7YUFDSjtTQUNKO1FBQ0QsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2xCLElBQUksVUFBVSxDQUFDLEtBQUssWUFBWSxRQUFRLEVBQUU7WUFDdEMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNqRDthQUNJO1lBQ0QsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDNUI7UUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLFlBQVksUUFBUSxFQUFFO1lBQ3ZDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDbkQ7YUFDSTtZQUNELE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBQ0Q7WUFDSSxjQUFjLENBQUMsS0FBSyxLQUFLLEtBQUs7ZUFDM0IsY0FBYyxDQUFDLE1BQU0sS0FBSyxNQUFNO1VBQ3JDO1lBQ0UsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN0RDtTQUNKO1FBQ0QsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDN0IsY0FBYyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O1FBRS9CLE9BQU8sY0FBYyxDQUFDO0tBQ3pCOzs7Ozs7O0lBT0QsWUFBWSxFQUFFLFVBQVUsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDckM7Ozs7OztJQU1ELFlBQVksRUFBRSxVQUFVLElBQUksRUFBRTtRQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JDOzs7OztJQUtELGFBQWEsRUFBRSxVQUFVLEdBQUcsRUFBRTtRQUMxQixLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN0QztLQUNKOzs7Ozs7Ozs7Ozs7Ozs7SUFlRCxNQUFNLEVBQUUsVUFBVSxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3REOzs7Ozs7SUFNRCxRQUFRLEVBQUUsVUFBVSxNQUFNLEVBQUU7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNuRDs7SUFFRCxlQUFlLEVBQUUsVUFBVSxVQUFVLEVBQUU7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUMsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO2dCQUMxQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQ3pFO2dCQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNFO2lCQUNJOzs7Z0JBR0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0o7S0FDSjs7SUFFRCxLQUFLLEVBQUUsWUFBWTtRQUNmQSxNQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7OztRQUdoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0tBQzNDO0NBQ0osQ0FBQzs7QUNsU0YsSUFBSSxlQUFlLEdBQUcsbUJBQW1CLENBQUM7Ozs7Ozs7QUFPMUMsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ2xDLElBQUksVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDbEMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7O0lBRWxCLElBQUksR0FBRyxHQUFHO1FBQ04sUUFBUSxFQUFFLEVBQUU7UUFDWixVQUFVLEVBQUUsRUFBRTtLQUNqQixDQUFDO0lBQ0YsSUFBSSxTQUFTLEdBQUcsU0FBUyxTQUFTLEVBQUUsVUFBVSxFQUFFO1FBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksSUFBSSxFQUFFO2dCQUNOLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUI7U0FDSjtLQUNKLENBQUM7O0lBRUYsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQzlCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUN0RDs7SUFFRCxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxVQUFVLEVBQUU7UUFDL0MsR0FBRyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDMUIsU0FBUyxFQUFFLENBQUM7S0FDZixDQUFDLENBQUM7O0lBRUgsT0FBTyxVQUFVLENBQUM7Q0FDckI7O0FBRUQsU0FBUyxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7SUFDckMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUM7SUFDckMsSUFBSSxZQUFZLENBQUM7SUFDakIsSUFBSSxNQUFNLENBQUM7SUFDWCxJQUFJLE9BQU8sQ0FBQzs7SUFFWixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDbkIsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLElBQUksR0FBRyxFQUFFO1lBQ0wsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDL0M7YUFDSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ2xDLFlBQVksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixZQUFZLEdBQUcsU0FBUyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLE9BQU87U0FDVjtLQUNKOztJQUVELElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUNqQixNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osS0FBSyxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQzlCLElBQUksT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEM7aUJBQ0k7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO29CQUNYLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7b0JBQ2hDLEdBQUcsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUc7aUJBQ2pDLENBQUM7YUFDTDtTQUNKO0tBQ0o7SUFDRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDbEIsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUMvQixJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtnQkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO2FBQ3BEO1lBQ0QsSUFBSSxVQUFVLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRTtnQkFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxVQUFVLENBQUMsZUFBZSxJQUFJLElBQUksRUFBRTtnQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDO2FBQzlEO1lBQ0QsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN0RTtTQUNKO0tBQ0o7SUFDRCxJQUFJLElBQUksQ0FBQztJQUNULElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUNsQixJQUFJLEdBQUcsSUFBSUssV0FBYyxDQUFDO1lBQ3RCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxPQUFPO1NBQ25CLENBQUMsQ0FBQztLQUNOO1NBQ0ksSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ3pCLElBQUksR0FBRyxJQUFJQyxhQUFnQixDQUFDO1lBQ3hCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixPQUFPLEVBQUUsT0FBTztTQUNuQixDQUFDLENBQUM7S0FDTjs7U0FFSTtRQUNELElBQUksR0FBRyxJQUFJQyxZQUFlLENBQUM7WUFDdkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLE9BQU87U0FDbkIsQ0FBQyxDQUFDO0tBQ047SUFDRCxJQUFJLElBQUksRUFBRTtRQUNOLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRTtZQUNyQixLQUFLLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2xDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQzFCLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2pCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7d0JBQ3ZCLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDckM7eUJBQ0k7d0JBQ0QsSUFBSSxDQUFDLEVBQUU7NEJBQ0gsY0FBYyxFQUFFLG9CQUFvQjtnQ0FDaEMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUM7NkJBQzVCO3lCQUNKLENBQUM7cUJBQ0w7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDaEM7U0FDSjtRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQy9CLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtnQkFDL0IsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDcEQ7U0FDSjtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUM7Q0FDZjs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFNBQVMsRUFBRTtJQUNqQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDZixJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ1osT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFDRCxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQztTQUNyRSxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTs7Z0JBRWIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7b0JBQ3pCLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3RCO2dCQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDckI7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7U0FDZCxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUN6QixJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO29CQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCO3dCQUMxQixJQUFJLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQztxQkFDNUIsQ0FBQztpQkFDTDtxQkFDSTtvQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUNyQjthQUNKO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtRQUM3QixLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7S0FDekM7SUFDRCxPQUFPLEtBQUssQ0FBQztDQUNoQjs7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDaEIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2IsT0FBTztLQUNWO0lBQ0QsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQzs7SUFFaEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDM0NqRCxNQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxXQUFXLEVBQUUsSUFBSSxFQUFFO1FBQ2pELElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFDLElBQUksZUFBZSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRTtvQkFDM0IsT0FBT0EsTUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFDeEQsQ0FBQyxDQUFDO2FBQ047WUFDRCxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDekM7YUFDSSxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM5QixJQUFJLGVBQWUsRUFBRTtnQkFDakIsSUFBSSxHQUFHQSxNQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZDO2FBQ0k7WUFDRCxPQUFPO1NBQ1Y7O1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVc7WUFDL0IsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUN6QixPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtnQkFDZixRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDZDtTQUNKLENBQUMsQ0FBQztLQUNOLENBQUMsQ0FBQzs7SUFFSCxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDdkIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3RCO0NBQ0o7O0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQzFDLE9BQU8sVUFBVSxRQUFRLEVBQUU7O1FBRXZCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOztRQUV6QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ25DLENBQUM7Q0FDTDs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDdEMsT0FBTyxVQUFVLFFBQVEsRUFBRTtRQUN2QixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDdkMsQ0FBQztDQUNMOztBQUVELFNBQVMsY0FBYyxDQUFDLE1BQU0sRUFBRTs7SUFFNUIsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLElBQUksT0FBTyxFQUFFO1FBQ1QsSUFBSTtZQUNBLElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFMUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7WUFFWCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxDQUFDLEVBQUU7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDMUM7S0FDSjtDQUNKOztBQ3hSRCxrQkFBZSxzMklBQXMySSxDQUFDOztBQ0F0M0ksZ0JBQWUsMnlEQUEyeUQsQ0FBQzs7QUNhM3pELE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFFekIsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7SUFDN0IsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsR0FBRyxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ2hDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0lBRXpCLE9BQU8sTUFBTSxDQUFDO0NBQ2pCOztBQUVELFNBQVMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtJQUNuRSxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3JCLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7O0lBRTNDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQzs7SUFFckMsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMxQjtTQUNJOztRQUVELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDNUI7Q0FDSjs7O0FBR0QsU0FBUyxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUU7O0lBRXRFLElBQUksaUJBQWlCLENBQUM7SUFDdEIsSUFBSSxvQkFBb0IsQ0FBQztJQUN6QixJQUFJLGtCQUFrQixDQUFDOztJQUV2QixPQUFPLFVBQVUsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUU7O1FBRW5ELElBQUksa0JBQWtCLElBQUksa0JBQWtCLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDM0UsT0FBTztTQUNWOztRQUVELElBQUksZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDOztRQUVuQyxJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNuRixJQUFJLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksaUJBQWlCLENBQUM7UUFDdEIsSUFBSSxvQkFBb0IsRUFBRTtZQUN0QixVQUFVLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRCxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JELGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztTQUNuRjthQUNJO1lBQ0QsVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRCxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RELGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztTQUNwRjtRQUNELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQzs7UUFFdkMsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDO1FBQ3RFLElBQUksUUFBUSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7O1FBRWhELGFBQWEsR0FBRyxhQUFhLElBQUksbUJBQW1CLENBQUM7O1FBRXJELElBQUksWUFBWSxLQUFLLFVBQVUsRUFBRTtZQUM3QixVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6QyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2QyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUMvQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN0RCxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDdEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxVQUFVLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDeEM7YUFDSTtZQUNELE9BQU8sQ0FBQyxVQUFVO2dCQUNkLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVU7YUFDckMsQ0FBQzs7WUFFRixJQUFJLGlCQUFpQixLQUFLLFNBQVMsRUFBRTtnQkFDakMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2pFO1lBQ0QsSUFBSSxvQkFBb0IsS0FBSyxhQUFhLEVBQUU7Z0JBQ3hDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN6RTtZQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDcEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDcEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFELE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNFLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDbEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN0RDtZQUNELElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDbEIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN0RDtTQUNKOztRQUVELGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUM5QixvQkFBb0IsR0FBRyxhQUFhLENBQUM7O1FBRXJDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztLQUNuQyxDQUFDO0NBQ0w7O0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUU7SUFDdEUsSUFBSSxrQkFBa0IsQ0FBQztJQUN2QixJQUFJLGtCQUFrQixDQUFDO0lBQ3ZCLElBQUksb0JBQW9CLENBQUM7O0lBRXpCLE9BQU8sVUFBVSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRTs7UUFFbkQsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUMzRSxPQUFPO1NBQ1Y7O1FBRUQsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7O1FBRTNDLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7O1FBRWxELElBQUksVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRCxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7O1FBRXhELElBQUksUUFBUSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7O1FBRWhELElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7O1FBRXJDLFVBQVUsR0FBRyxVQUFVLElBQUksaUJBQWlCLENBQUM7UUFDN0MsWUFBWSxHQUFHLFlBQVksSUFBSSxtQkFBbUIsQ0FBQzs7UUFFbkQsSUFBSSxZQUFZLEtBQUssVUFBVSxFQUFFO1lBQzdCLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9CLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzdDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNwRCxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNyQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzs7WUFFckMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0RDthQUNJO1lBQ0QsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQzs7WUFFckQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLGtCQUFrQixLQUFLLFVBQVUsRUFBRTtnQkFDbkMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsSUFBSSxvQkFBb0IsS0FBSyxZQUFZLEVBQUU7Z0JBQ3ZDLG1CQUFtQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN2RTtZQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzs7WUFFbkQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BFOztRQUVELGtCQUFrQixHQUFHLFVBQVUsQ0FBQztRQUNoQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7O1FBRXBDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztLQUNuQyxDQUFDO0NBQ0w7Ozs7Ozs7Ozs7OztBQVlELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTs7SUFFbEMsT0FBTzs7UUFFSCxvQkFBb0IsRUFBRSxJQUFJOztRQUUxQixvQkFBb0IsRUFBRSxJQUFJOztRQUUxQixvQkFBb0IsRUFBRSxJQUFJOztRQUUxQixpQkFBaUIsRUFBRSxLQUFLOztRQUV4QixXQUFXLEVBQUUsRUFBRTs7Ozs7UUFLZixZQUFZLEVBQUUsSUFBSSxTQUFTLENBQUM7WUFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTzs7WUFFMUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1NBQzNCLENBQUM7OztRQUdGLFlBQVksRUFBRSxJQUFJLFNBQVMsQ0FBQztZQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDMUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPOzs7O1lBSTFCLE1BQU0sRUFBRSxPQUFPLENBQUMsYUFBYTtZQUM3QixJQUFJLEVBQUUsT0FBTyxDQUFDLHVCQUF1QjtTQUN4QyxDQUFDOzs7Ozs7UUFNRixZQUFZLEVBQUUsSUFBSSxTQUFTLENBQUM7WUFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTztTQUM3QixDQUFDOztRQUVGLGlCQUFpQixFQUFFLElBQUksU0FBUyxDQUFDO1lBQzdCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDbEMsQ0FBQztRQUNGLG9CQUFvQixFQUFFLElBQUksU0FBUyxDQUFDO1lBQ2hDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDbEMsQ0FBQztRQUNGLG9CQUFvQixFQUFFLElBQUksU0FBUyxDQUFDO1lBQ2hDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDbEMsQ0FBQztRQUNGLGtCQUFrQixFQUFFLElBQUksU0FBUyxDQUFDO1lBQzlCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDbEMsQ0FBQzs7UUFFRixZQUFZLEVBQUUsSUFBSSxXQUFXLEVBQUU7O1FBRS9CLGlCQUFpQixFQUFFLElBQUksUUFBUSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxJQUFJLE1BQU07Z0JBQ2QsTUFBTSxDQUFDLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQztnQkFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQzthQUNuRDtZQUNELGFBQWEsRUFBRTtnQkFDWCxVQUFVLEVBQUUsSUFBSTthQUNuQjtZQUNELGVBQWUsRUFBRTtnQkFDYixVQUFVLEVBQUUsSUFBSTthQUNuQjtTQUNKLENBQUM7UUFDRixpQkFBaUIsRUFBRSxJQUFJLFFBQVEsQ0FBQztZQUM1QixNQUFNLEVBQUUsSUFBSSxNQUFNO2dCQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUM7Z0JBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUNBQWlDLENBQUM7YUFDbkQ7U0FDSixDQUFDOztRQUVGLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQztZQUNqQixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQztTQUN6RCxDQUFDO0tBQ0wsQ0FBQztDQUNMLHNDQUFzQzs7Ozs7OztJQU9uQyxNQUFNLEVBQUUsVUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssS0FBSztlQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxNQUFNO1VBQ3hDO1lBQ0UsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7UUFFbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7UUFFbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztLQUNyQzs7O0lBR0QsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtRQUM3QyxJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3ZCLFFBQVEsR0FBRyxDQUFDLENBQUM7U0FDaEI7YUFDSTtZQUNELFFBQVEsR0FBRztnQkFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNWLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07Z0JBQzVCLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDO2FBQzdCLENBQUM7U0FDTDtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztLQUN6Qzs7SUFFRCxXQUFXLEVBQUUsWUFBWTtRQUNyQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7U0FDckM7YUFDSTtZQUNELE9BQU87Z0JBQ0gsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO2dCQUM5QixNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO2dCQUNoQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQ3RCLENBQUM7U0FDTDtLQUNKOzs7Ozs7OztJQVFELE1BQU0sRUFBRSxVQUFVLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFOztRQUV2QyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDOztRQUVyQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDOztRQUU1QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO2dCQUM5QixVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEM7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRTtvQkFDbkMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3QzthQUNKO1NBQ0o7UUFDRCxVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7UUFFM0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7O1FBRXJCLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3JELElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3JELElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3JELElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELENBQUMsQ0FBQztZQUNsRSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7U0FDL0I7O1FBRUQsSUFBSSxvQkFBb0IsRUFBRTtZQUN0QixXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQy9FOzs7UUFHRCxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxvQkFBb0IsRUFBRTs7WUFFdEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7WUFFM0IsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztnQkFFcEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQzthQUMvRjtZQUNELEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BELElBQUksUUFBUSxFQUFFO2dCQUNWLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDOUMsSUFBSSxVQUFVLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLFlBQVk7b0JBQ3JCLE9BQU8sZ0JBQWdCLENBQUM7aUJBQzNCO2dCQUNELFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztnQkFDekYsV0FBVyxFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7YUFDMUMsQ0FBQzs7WUFFRixRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7O1NBRXZEO1FBQ0QsSUFBSSxvQkFBb0IsRUFBRTs7O1lBR3RCLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7O1lBRTNCLElBQUksUUFBUSxFQUFFO2dCQUNWLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzs7Z0JBRXBDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMzQixFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDL0Y7WUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRCxJQUFJLFFBQVEsRUFBRTtnQkFDVixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMvQjs7WUFFRCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUM5QyxJQUFJLFVBQVUsR0FBRztnQkFDYixXQUFXLEVBQUUsWUFBWTtvQkFDckIsT0FBTyxnQkFBZ0IsQ0FBQztpQkFDM0I7Z0JBQ0QsWUFBWSxFQUFFLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2dCQUMxRixXQUFXLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjthQUMxQyxDQUFDO1lBQ0YsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZEOztRQUVELFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2hDOztJQUVELFdBQVcsRUFBRSxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtRQUNyRCxJQUFJLFVBQVUsR0FBRztZQUNiLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLEVBQUUsQ0FBQztZQUNYLFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUyxFQUFFLENBQUM7WUFDWixNQUFNLEVBQUUsQ0FBQztTQUNaLENBQUM7UUFDRixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztZQUUzQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1NBQ25COztRQUVELFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDOztRQUVqRCxJQUFJLFFBQVEsRUFBRTtZQUNWLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEM7UUFDRCxJQUFJLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOztRQUV2RixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2hDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEYsU0FBUyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsU0FBUyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsU0FBUyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUUzQixRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0IsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBQzNCOzs7Ozs7Ozs7OztJQVdELGlCQUFpQixFQUFFLFlBQVk7UUFDM0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzVCOzs7Ozs7OztJQVFELGlCQUFpQixFQUFFLFlBQVk7UUFDM0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzVCOzs7Ozs7Ozs7OztJQVdELGlCQUFpQixFQUFFLFlBQVk7UUFDM0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzVCOzs7Ozs7SUFNRCxPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7S0FDNUI7Q0FDSixDQUFDOztBQ25nQkYsSUFBSUQsT0FBSSxHQUFHRixRQUFRLENBQUMsSUFBSSxDQUFDO0FBQ3pCLElBQUlxRCxNQUFJLEdBQUdyRCxRQUFRLENBQUMsSUFBSSxDQUFDOzs7Ozs7Ozs7Ozs7QUFZekIsSUFBSXNELE1BQUksR0FBRyxRQUFRLENBQUMsTUFBTTs7QUFFMUI7SUFDSSxPQUFPLEVBQUUsS0FBSzs7OztJQUlkLFNBQVMsRUFBRSxDQUFDOzs7OztJQUtaLFlBQVksRUFBRSxDQUFDOzs7OztJQUtmLE1BQU0sRUFBRSxDQUFDOzs7OztJQUtULFdBQVcsRUFBRSxFQUFFOzs7OztJQUtmLGNBQWMsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsV0FBVztJQUNWLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNoQjs7QUFFRDs7OztJQUlJLEtBQUssRUFBRSxXQUFXO1FBQ2QsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyQixTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7UUFFakIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7UUFFbEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQzs7UUFFbkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztRQUV4QixJQUFJLEVBQUUsR0FBR3BELE9BQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFJLEVBQUUsR0FBR0EsT0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztZQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDQSxPQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFdEMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDQSxPQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdDOzs7UUFHRCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztRQUVuQixTQUFTLENBQUMsSUFBSSxDQUFDbUQsTUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFFMUIsU0FBUyxDQUFDLElBQUksQ0FBQ0EsTUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2Qzs7O1FBR0QsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM5QixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLFNBQVMsQ0FBQyxJQUFJLENBQUNBLE1BQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUU3QixTQUFTLENBQUMsSUFBSSxDQUFDQSxNQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1RDs7O1FBR0QsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUNuRCxPQUFJLENBQUMsSUFBSSxDQUFDQSxPQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxTQUFTLENBQUMsSUFBSSxDQUFDbUQsTUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0M7U0FDSjtRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNqRDtTQUNKOztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7O1FBRS9DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7UUFFakMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O1FBRTdCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNqRDtDQUNKLENBQUM7O0FDdklGOzs7Ozs7Ozs7QUFTQSxJQUFJRSxVQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU07O0FBRTlCO0lBQ0ksT0FBTyxFQUFFLEtBQUs7Ozs7SUFJZCxNQUFNLEVBQUUsQ0FBQzs7Ozs7SUFLVCxNQUFNLEVBQUUsQ0FBQzs7Ozs7SUFLVCxXQUFXLEVBQUUsRUFBRTs7Ozs7SUFLZixjQUFjLEVBQUUsQ0FBQztDQUNwQixFQUFFLFdBQVc7SUFDVixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDaEI7O0FBRUQ7Ozs7SUFJSSxLQUFLLEVBQUUsV0FBVztRQUNkLElBQUksSUFBSSxHQUFHLElBQUlDLE1BQVksQ0FBQztZQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDdEIsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3RCLENBQUMsQ0FBQzs7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNsRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7O1FBRTVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztLQUN2QztDQUNKLENBQUM7O0FDM0RGLHNCQUFlLHNSQUFzUixDQUFDOztBQ0F0UyxlQUFlLDhpREFBOGlELENBQUM7O0FDQTlqRCxzQkFBZSxtaURBQW1pRCxDQUFDOztBQ0FuakQsa0JBQWUsNmVBQTZlLENBQUM7O0FDQTdmLG9CQUFlLG9nQ0FBb2dDLENBQUM7O0FDQXBoQyx5QkFBZSxzeUJBQXN5QixDQUFDOztBQ0F0ekIsZ0JBQWUsb3RDQUFvdEMsQ0FBQzs7QUNBcHVDLGlCQUFlLDRzQ0FBNHNDLENBQUM7O0FDQTV0QyxlQUFlLGszQ0FBazNDLENBQUM7O0FDQWw0Qzs7QUFFQSxBQW1CQTtBQUNBLEFBU0EsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7OztBQUcvQixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Ozs7Ozs7QUFReEIsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7O0lBRTNDLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RCxJQUFJLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQzs7SUFFM0UsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUM7O0lBRTFHLElBQUksd0JBQXdCLEdBQUcsVUFBVSxFQUFFLEVBQUU7UUFDekMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNoQyxDQUFDOztJQUVGLElBQUksa0JBQWtCLEdBQUcsVUFBVSxNQUFNLEVBQUU7UUFDdkMsT0FBTyxJQUFJLFFBQVEsQ0FBQztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSx3QkFBd0I7WUFDL0IsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO0tBQ04sQ0FBQzs7SUFFRixJQUFJLGtCQUFrQixHQUFHLFVBQVUsSUFBSSxFQUFFO1FBQ3JDLE9BQU8sSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ2hGLENBQUM7Ozs7O0lBS0YsSUFBSSxPQUFPLEdBQUcsSUFBSUMsTUFBTyxDQUFDO1FBQ3RCLFdBQVcsRUFBRSxFQUFFO0tBQ2xCLENBQUMsQ0FBQztJQUNILElBQUksR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDeEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNuQixTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXRDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRTVCLElBQUksV0FBVyxHQUFHLElBQUlDLFVBQVcsQ0FBQztRQUM5QixXQUFXLEVBQUUsRUFBRTtLQUNsQixDQUFDLENBQUM7O0lBRUgsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7O0lBRWhDLDZDQUE2Qzs7Ozs7O1FBTXpDLGFBQWEsRUFBRSxJQUFJOzs7OztRQUtuQixVQUFVLEVBQUUsSUFBSTs7UUFFaEIsbUJBQW1CLEVBQUUsa0JBQWtCOztRQUV2QyxRQUFRLEVBQUUsSUFBSSxPQUFPLEVBQUU7O1FBRXZCLHNCQUFzQixFQUFFLElBQUksV0FBVyxDQUFDO1lBQ3BDLFdBQVcsRUFBRSxLQUFLO1NBQ3JCLENBQUM7O1FBRUYsY0FBYyxFQUFFLElBQUksU0FBUyxDQUFDOztZQUUxQixJQUFJLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTztTQUM3QixDQUFDOztRQUVGLGFBQWEsRUFBRSxJQUFJQyxJQUFZLENBQUM7WUFDNUIsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDOztRQUVGLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDOztRQUVoRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxNQUFNO1lBQ3RDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDO1NBQy9ELENBQUM7UUFDRixhQUFhLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxNQUFNO1lBQ3hDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxDQUFDO1NBQ2xFLENBQUM7UUFDRixrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLE1BQU07WUFDN0MsY0FBYyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUM7U0FDdkUsQ0FBQzs7UUFFRixnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7UUFDbEQsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsYUFBYSxDQUFDOztRQUVwRCxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxjQUFjLENBQUM7UUFDdEQsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDOztRQUVsRCxlQUFlLEVBQUUsSUFBSWpCLFFBQVMsQ0FBQztZQUMzQixhQUFhLEVBQUUsRUFBRTtZQUNqQixlQUFlLEVBQUUsRUFBRTtTQUN0QixDQUFDOztRQUVGLGFBQWEsRUFBRSxPQUFPOztRQUV0QixpQkFBaUIsRUFBRSxXQUFXOztRQUU5QixXQUFXLEVBQUUsSUFBSWlCLElBQVksQ0FBQztZQUMxQixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztTQUNwRCxDQUFDO0tBQ0wsQ0FBQztDQUNMLHdDQUF3Qzs7Ozs7Ozs7Ozs7SUFXckMsTUFBTSxFQUFFLFVBQVUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOztRQUU3QyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQzs7UUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDN0I7O1FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O1FBR3BCLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLFVBQVU7Z0JBQ1gsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUs7ZUFDeEQsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztVQUMvRDtZQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDdEU7O1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQzs7O1FBRzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzs7UUFFNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzs7WUFFNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7O1NBRXJDO0tBQ0o7Ozs7O0lBS0QsZ0JBQWdCLEVBQUUsWUFBWTtRQUMxQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7S0FDOUI7Ozs7O0lBS0Qsb0JBQW9CLEVBQUUsWUFBWTtRQUM5QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztLQUN0Qzs7Ozs7SUFLRCxVQUFVLEVBQUUsWUFBWTtRQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDeEI7OztJQUdELFdBQVcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUN0RTs7Ozs7Ozs7Ozs7SUFXRCxNQUFNLEVBQUUsVUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7OztRQUdwQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDdkM7O0lBRUQsc0JBQXNCLEVBQUUsVUFBVSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUU7UUFDckUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3hDLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDOztRQUV4RCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUM7OztRQUdsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQzs7UUFFRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksYUFBYSxJQUFJLFlBQVksRUFBRTtZQUMvQixFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3JEOztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7O1FBRTdFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQzs7UUFFckMsSUFBSSxRQUFRLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDO1FBQzlDLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztZQUVwQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDL0Y7UUFDRCxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDOUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsSUFBSSxRQUFRLEVBQUU7WUFDVixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQjs7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7O1FBRTlELElBQUksaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN0QyxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7O1FBRXZGLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQzs7UUFFeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztZQUVsQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUM7O1lBRXhELElBQUksVUFBVSxFQUFFO2dCQUNaLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7OztnQkFHbkMsVUFBVSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7O2dCQUU5QixJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDN0IsUUFBUSxLQUFLLENBQUMsSUFBSTtvQkFDZCxLQUFLLGFBQWE7d0JBQ2QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUMzRSxNQUFNO29CQUNWLEtBQUssWUFBWTt3QkFDYixRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQzFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUM1RSxRQUFRLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckYsUUFBUSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQzNGLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDL0UsTUFBTTtvQkFDVixLQUFLLGNBQWM7d0JBQ2YsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN0RSxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3RFLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDeEUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUM1RSxNQUFNO29CQUNWLEtBQUssWUFBWTt3QkFDYixRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNwRSxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNwRSxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN0RSxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQzFFLE1BQU07b0JBQ1Y7d0JBQ0ksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2lCQUMvQjs7Z0JBRUQsSUFBSSxnQkFBZ0IsRUFBRTtvQkFDbEIsU0FBUztpQkFDWjs7Z0JBRUQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ2hELFFBQVEsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xFLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7O2dCQUUxRSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzthQUVuQztpQkFDSTtnQkFDRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUM5QixJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Z0JBRTdCLFFBQVEsS0FBSyxDQUFDLElBQUk7b0JBQ2QsS0FBSyxlQUFlO3dCQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQzVFLE1BQU07b0JBQ1YsS0FBSyxrQkFBa0I7d0JBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUM1RixNQUFNO29CQUNWLEtBQUssdUJBQXVCO3dCQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDeEYsTUFBTTtvQkFDVixLQUFLLG1CQUFtQjt3QkFDcEIsSUFBSSxTQUFTLEdBQUcsYUFBYSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7d0JBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO3dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7d0JBQ2xGLElBQUksU0FBUyxFQUFFOzRCQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQzNFO3dCQUNELElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDeEYsTUFBTTtvQkFDVjs7d0JBRUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2lCQUMvQjtnQkFDRCxJQUFJLGdCQUFnQixFQUFFO29CQUNsQixTQUFTO2lCQUNaOztnQkFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNqQyxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDcEQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDOUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDOUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQzs7O2dCQUc5RSxJQUFJLGFBQWEsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO29CQUNuQyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDN0QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNoRSxZQUFZLENBQUMsVUFBVSxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUM1RSxZQUFZLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOztvQkFFMUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDekU7O2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0I7U0FDSjs7UUFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQzs7UUFFN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDOztRQUV6RCxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7O1FBRXZDLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQzs7S0FFakU7O0lBRUQsbUJBQW1CLEVBQUUsQ0FBQyxZQUFZO1FBQzlCLElBQUksU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDOUIsT0FBTyxVQUFVLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQ3RDLElBQUksYUFBYSxDQUFDOztZQUVsQixhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRTtvQkFDcEIsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwQzthQUNKO1lBQ0QsYUFBYSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O1lBRTdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsU0FBUztpQkFDWjs7Z0JBRUQsUUFBUSxLQUFLLENBQUMsSUFBSTtvQkFDZCxLQUFLLGFBQWEsQ0FBQztvQkFDbkIsS0FBSyxZQUFZOzt3QkFFYixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDMUUsSUFBSSxRQUFRLENBQUMsZUFBZTs0QkFDeEIsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSzt5QkFDM0UsRUFBRTs0QkFDQyxTQUFTO3lCQUNaOzt3QkFFRCxJQUFJLENBQUMseUJBQXlCOzRCQUMxQixRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxRQUFRO3lCQUNyRSxDQUFDO3dCQUNGLE1BQU07b0JBQ1YsS0FBSyxtQkFBbUI7d0JBQ3BCLElBQUksQ0FBQyx5QkFBeUI7NEJBQzFCLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSTt5QkFDdEQsQ0FBQztpQkFDVDthQUNKO1NBQ0osQ0FBQztLQUNMLEdBQUc7O0lBRUoseUJBQXlCLEVBQUUsVUFBVSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtRQUNwRixRQUFRLEtBQUssQ0FBQyxJQUFJO1lBQ2QsS0FBSyxhQUFhO2dCQUNkLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0I7b0JBQ3JDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVO2lCQUM5QyxDQUFDO2dCQUNGLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2xFLE1BQU07WUFDVixLQUFLLFlBQVk7Z0JBQ2IsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCO29CQUNwQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVU7aUJBQzdELENBQUM7Z0JBQ0YsUUFBUSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2xFLE1BQU07WUFDVixLQUFLLG1CQUFtQjtnQkFDcEIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEI7b0JBQzNDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxVQUFVO2lCQUNuRixDQUFDO2dCQUNGLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxJQUFJLGVBQWUsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzNDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7OztnQkFHeEIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNCLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDOztnQkFFeEIsS0FBSyxDQUFDLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDO2dCQUM1QyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsZUFBZSxDQUFDO2dCQUMxQyxLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsS0FBSyxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7Z0JBQ3RDLE1BQU07U0FDYjtLQUNKOzs7Ozs7OztJQVFELGlCQUFpQixFQUFFLFVBQVUsS0FBSyxFQUFFO1FBQ2hDLElBQUksVUFBVSxDQUFDO1FBQ2YsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ2xCLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1NBQ2pDO2FBQ0k7WUFDRCxRQUFRLEtBQUssQ0FBQyxJQUFJOzs7Z0JBR2QsS0FBSyxhQUFhLENBQUM7Z0JBQ25CLEtBQUssY0FBYztvQkFDZixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLGNBQWM7MEJBQ3BDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7O29CQUV2RCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTt3QkFDckIsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQzs0QkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7NEJBQzFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZTs7Ozs0QkFJOUIsT0FBTyxFQUFFLEtBQUs7eUJBQ2pCLENBQUMsQ0FBQztxQkFDTjtvQkFDRCxVQUFVLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztvQkFDaEMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QixNQUFNO2dCQUNWLEtBQUssWUFBWTtvQkFDYixLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLENBQUM7d0JBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQzVCLE9BQU8sRUFBRSxLQUFLO3FCQUNqQixDQUFDLENBQUM7b0JBQ0gsVUFBVSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7b0JBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUMzRCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUN4QixVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNoRSxNQUFNO2dCQUNWLEtBQUssWUFBWTtvQkFDYixLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLENBQUM7d0JBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjt3QkFDaEMsT0FBTyxFQUFFLEtBQUs7cUJBQ2pCLENBQUMsQ0FBQztvQkFDSCxVQUFVLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztvQkFDaEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDeEIsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDN0QsTUFBTTthQUNiO1NBQ0o7UUFDRCxJQUFJLFVBQVUsRUFBRTtZQUNaLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7WUFFcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUN2RCxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7U0FDM0Y7S0FDSjs7SUFFRCxxQkFBcUIsRUFBRSxDQUFDLFlBQVk7UUFDaEMsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLElBQUksU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDOUIsSUFBSSxZQUFZLEdBQUcsSUFBSSxRQUFRLENBQUM7WUFDNUIsTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFO1lBQy9DLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7O1lBRXJCLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckQsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBRXhCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O1lBRTlCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDakMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BDLElBQUksZUFBZSxHQUFHO2dCQUNsQixRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUc7Z0JBQ2xDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRzthQUM5QyxDQUFDOztZQUVGLElBQUksaUJBQWlCLEdBQUc7Z0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSztnQkFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO2FBQzdCLENBQUM7O1lBRUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksVUFBVSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O2dCQUduQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxRQUFRLENBQUMsZUFBZTtvQkFDeEIsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSztpQkFDM0UsRUFBRTtvQkFDQyxTQUFTO2lCQUNaOzs7Z0JBR0QsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Z0JBRW5CLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O2dCQUU5QixPQUFPLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQzs7Z0JBRTFFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNoRSxVQUFVLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztnQkFDbkMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdEMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Z0JBRTNCLElBQUksWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDO2dCQUMzRSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlGLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQzs7O2dCQUd2RCxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ25FLFVBQVUsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2dCQUMvQixRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztnQkFFdkIsSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDOztnQkFFbEYsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRixPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQzs7Z0JBRTlELFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDNUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUM3RDs7WUFFRCxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QixDQUFDO0tBQ0wsR0FBRzs7Ozs7SUFLSixPQUFPLEVBQUUsVUFBVSxRQUFRLEVBQUU7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O1FBRWhDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O1FBRXRDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O1FBRXZDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUVuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztRQUU1QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN4QztDQUNKLENBQUM7O0FDbnFCRjs7OztBQUlBLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNOztBQUU5Qjs7OztJQUlJLEtBQUssRUFBRSxHQUFHOzs7OztJQUtWLE1BQU0sRUFBRSxDQUFDO0NBQ1osRUFBRTs7SUFFQyxJQUFJLEVBQUUsY0FBYzs7SUFFcEIsZ0JBQWdCLEVBQUU7UUFDZCxtQkFBbUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxTQUFTLFFBQVEsRUFBRTtnQkFDdEIsT0FBTyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDNUM7U0FDSjtRQUNELGdCQUFnQixFQUFFO1lBQ2QsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsU0FBUyxRQUFRLEVBQUU7Z0JBQ3RCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQzthQUN6QjtTQUNKO1FBQ0QsaUJBQWlCLEVBQUU7WUFDZixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxTQUFTLFFBQVEsRUFBRTtnQkFDdEIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO2FBQzFCO1NBQ0o7UUFDRCxnQkFBZ0IsRUFBRTtZQUNkLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLFNBQVMsUUFBUSxFQUFFO2dCQUN0QixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMzQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN2RTtTQUNKO0tBQ0o7Q0FDSixDQUFDOztBQy9DRjs7OztBQUlBLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNOztBQUU1Qjs7OztJQUlJLEtBQUssRUFBRSxHQUFHOzs7OztJQUtWLE1BQU0sRUFBRSxFQUFFO0NBQ2IsRUFBRTs7SUFFQyxJQUFJLEVBQUUsWUFBWTs7SUFFbEIsZ0JBQWdCLEVBQUU7UUFDZCxpQkFBaUIsRUFBRTtZQUNmLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLFNBQVMsUUFBUSxFQUFFO2dCQUN0QixPQUFPLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQzthQUM1QztTQUNKOztRQUVELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLENBQUMsV0FBVztnQkFDZixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixPQUFPLFNBQVMsUUFBUSxFQUFFOztvQkFFdEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO3lCQUNuQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ3JELENBQUM7YUFDTCxHQUFHO1NBQ1A7O1FBRUQsY0FBYyxFQUFFO1lBQ1osSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsU0FBUyxRQUFRLEVBQUU7Z0JBQ3RCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQzthQUN6QjtTQUNKOztRQUVELGNBQWMsRUFBRTtZQUNaLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLFNBQVMsUUFBUSxFQUFFO2dCQUN0QixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMzQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN2RTtTQUNKO0tBQ0o7Q0FDSixDQUFDOztBQ3ZERjs7OztBQUlBLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNOztBQUUxQjs7OztJQUlJLFFBQVEsRUFBRSxFQUFFOzs7O0lBSVosZUFBZSxFQUFFLEVBQUU7Ozs7SUFJbkIsY0FBYyxFQUFFLEVBQUU7Ozs7O0lBS2xCLEtBQUssRUFBRSxJQUFJOzs7OztJQUtYLE1BQU0sRUFBRSxJQUFJO0NBQ2Y7O0FBRUQ7Ozs7SUFJSSxJQUFJLEVBQUUsU0FBUyxHQUFHLEVBQUU7UUFDaEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDOztRQUVoQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0RDs7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ1IsR0FBRyxFQUFFLEdBQUc7WUFDUixVQUFVLEVBQUUsU0FBUyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNwRDtZQUNELE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDNUI7WUFDRCxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUU7Z0JBQ3BCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQy9CLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUN0RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztpQkFDcEIsQ0FBQyxDQUFDO2FBQ047U0FDSixDQUFDLENBQUM7S0FDTjtDQUNKLENBQUM7O0FDL0RGLElBQUlDLE1BQUksR0FBRzVELFFBQVEsQ0FBQyxJQUFJLENBQUM7Ozs7OztBQU16QixJQUFJLE9BQU8sR0FBRyxXQUFXOzs7Ozs7OztJQVFyQixJQUFJLENBQUMsS0FBSyxHQUFHNEQsTUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOzs7Ozs7O0lBTzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0NBQ3RCLENBQUM7O0FBRUYsT0FBTyxDQUFDLFNBQVMsR0FBRzs7SUFFaEIsV0FBVyxFQUFFLE9BQU87Ozs7OztJQU1wQixRQUFRLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7SUFLRCxLQUFLLEVBQUUsV0FBVztRQUNkLE9BQU8sQ0FBQyxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyQzs7Ozs7OztJQU9ELElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNkQSxNQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELE9BQU8sRUFBRSxXQUFXO1FBQ2hCQSxNQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELFdBQVcsRUFBRSxXQUFXO1FBQ3BCLE9BQU9BLE1BQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3ZDOzs7Ozs7SUFNRCxRQUFRLEVBQUUsV0FBVztRQUNqQkEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7O0lBTUQsTUFBTSxFQUFFLFdBQVc7UUFDZkEsTUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2JBLE1BQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2pCQSxNQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7OztJQU9ELFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNsQkEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdEJBLE1BQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsTUFBTSxFQUFFLFNBQVMsR0FBRyxFQUFFO1FBQ2xCQSxNQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2ZBLE1BQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7OztJQUtELFNBQVMsRUFBRSxXQUFXO1FBQ2xCQSxNQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7O0lBRUQsUUFBUSxFQUFFLFdBQVc7UUFDakIsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pFOztJQUVELE9BQU8sRUFBRSxZQUFZO1FBQ2pCLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNqRDtDQUNKLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUMvQkEsTUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsSUFBSSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM1QkEsTUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7OztBQU1GLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLEVBQUU7SUFDOUIsT0FBT0EsTUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDcEMsQ0FBQzs7Ozs7O0FBTUYsT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLEdBQUcsRUFBRTtJQUM3QkEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7O0FBT0YsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDOUJBLE1BQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLE9BQU8sQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM5QkEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7O0FBU0YsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDOzs7Ozs7OztBQVEvQixPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDbkNBLE1BQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDaENBLE1BQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7OztBQU1GLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDQSxNQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7QUM1UkYsSUFBSSxLQUFLLEdBQUc1RCxRQUFRLENBQUMsS0FBSyxDQUFDOzs7Ozs7QUFNM0IsSUFBSSxRQUFRLEdBQUcsV0FBVzs7Ozs7OztJQU90QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Ozs7OztJQU81QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztDQUN0QixDQUFDOztBQUVGLFFBQVEsQ0FBQyxTQUFTLEdBQUc7O0lBRWpCLFdBQVcsRUFBRSxRQUFROzs7Ozs7SUFNckIsUUFBUSxFQUFFLFVBQVUsR0FBRyxFQUFFO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7O0lBS0QsS0FBSyxFQUFFLFdBQVc7UUFDZCxPQUFPLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdEM7Ozs7Ozs7SUFPRCxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELFdBQVcsRUFBRSxXQUFXO1FBQ3BCLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEM7Ozs7OztJQU1ELFFBQVEsRUFBRSxXQUFXO1FBQ2pCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELE1BQU0sRUFBRSxXQUFXO1FBQ2YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDdEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxNQUFNLEVBQUUsU0FBUyxHQUFHLEVBQUU7UUFDbEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7OztJQU9ELEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ25CLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOztJQUVELFFBQVEsRUFBRSxXQUFXO1FBQ2pCLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztLQUNqRTs7SUFFRCxPQUFPLEVBQUUsWUFBWTtRQUNqQixPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDakQ7Q0FDSixDQUFDOzs7Ozs7O0FBT0YsUUFBUSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7OztBQU1GLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLEVBQUU7SUFDL0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUNyQyxDQUFDOzs7Ozs7QUFNRixRQUFRLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxFQUFFO0lBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQy9CLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7OztBQVFGLFFBQVEsQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7Ozs7QUFTRixRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7O0FBUWpDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtJQUNwQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7O0FBUUYsUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7O0FDMVFGLElBQUlZLE1BQUksR0FBR1osUUFBUSxDQUFDLElBQUksQ0FBQzs7Ozs7O0FBTXpCLElBQUksT0FBTyxHQUFHLFlBQVk7Ozs7Ozs7O0lBUXRCLElBQUksQ0FBQyxLQUFLLEdBQUdZLE1BQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Ozs7OztJQU8zQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztDQUN0QixDQUFDOztBQUVGLE9BQU8sQ0FBQyxTQUFTLEdBQUc7O0lBRWhCLFdBQVcsRUFBRSxPQUFPOzs7Ozs7SUFNcEIsUUFBUSxFQUFFLFVBQVUsR0FBRyxFQUFFO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7O0lBS0QsT0FBTyxFQUFFLFlBQVk7UUFDakJBLE1BQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7O0lBTUQsS0FBSyxFQUFFLFlBQVk7UUFDZixPQUFPLENBQUMsSUFBSSxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDckM7Ozs7Ozs7SUFPRCxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZkEsTUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7SUFNRCxXQUFXLEVBQUUsWUFBWTtRQUNyQixPQUFPQSxNQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN2Qzs7Ozs7OztJQU9ELFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRTtRQUNwQkEsTUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQ25CQSxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDbkJBLE1BQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7O0lBTUQsUUFBUSxFQUFFLFlBQVk7UUFDbEJBLE1BQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7OztJQU1ELE1BQU0sRUFBRSxZQUFZO1FBQ2hCQSxNQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDZEEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDbEJBLE1BQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQ25CQSxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7OztJQU9ELFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRTtRQUN2QkEsTUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxNQUFNLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDbkJBLE1BQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7Ozs7Ozs7SUFPRCxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDaEJBLE1BQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmOzs7Ozs7O0lBT0QsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQ3BCQSxNQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7SUFLRCxjQUFjLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDekJBLE1BQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7Ozs7O0lBTUQsU0FBUyxFQUFFLFlBQVk7UUFDbkJBLE1BQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZjs7SUFFRCxRQUFRLEVBQUUsWUFBWTtRQUNsQixPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDakU7O0lBRUQsT0FBTyxFQUFFLFlBQVk7UUFDakIsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2pEO0NBQ0osQ0FBQzs7Ozs7O0FBTUYsT0FBTyxDQUFDLE9BQU8sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDaENBLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7O0FBT0YsT0FBTyxDQUFDLElBQUksR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDN0JBLE1BQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOzs7Ozs7QUFNRixPQUFPLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQy9CLE9BQU9BLE1BQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQ3BDLENBQUM7Ozs7OztBQU1GLE9BQU8sQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUU7SUFDOUJBLE1BQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7OztBQU9GLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQy9CQSxNQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxDQUFDO0NBQ2QsQ0FBQzs7Ozs7Ozs7QUFRRixPQUFPLENBQUMsR0FBRyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDL0JBLE1BQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7OztBQVNGLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7Ozs7OztBQU8vQixPQUFPLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUNsQ0EsTUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUNqQ0EsTUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7Ozs7Ozs7QUFPRixPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFF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SUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQzlCLE9BQU87YUFDVjtZQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDOztZQUUxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFD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 diff --git a/dist/claygl.min.js b/dist/claygl.min.js index 34b5ba088..39549e536 100644 --- a/dist/claygl.min.js +++ b/dist/claygl.min.js @@ -1,14 +1,14 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.clay={})}(this,function(t){"use strict";function e(){}function r(t,e){return t[e]}function n(t,e,r){t[e]=r}function i(t,e,r){return(e-t)*r+t}function a(t,e,r,n,a){var o=t.length;if(1==a)for(var s=0;si)t.length=i;else for(var a=n;a=0&&!(T[S]<=e);S--);S=Math.min(S,_-2)}else{for(S=I;S<_&&!(T[S]>e);S++);S=Math.min(S-1,_-2)}I=S,O=e;var r=T[S+1]-T[S];0!==r&&(M=(e-T[S])/r,p?(L=E[S],R=E[0===S?S:S-1],P=E[S>_-2?_-1:S+1],D=E[S>_-3?_-1:S+2],f?m(t,s,f(d(t,s),R,L,P,D,M)):v?u(R,L,P,D,M,M*M,M*M*M,d(t,s),y):m(t,s,l(R,L,P,D,M,M*M,M*M*M))):f?m(t,s,f(d(t,s),E[S],E[S+1],M)):v?a(E[S],E[S+1],M,d(t,s),y):m(t,s,i(E[S],E[S+1],M)))},F=new oe({target:t._target,life:x,loop:t._loop,delay:t._delay,onframe:B,onfinish:r});return e&&"spline"!==e&&F.setEasing(e),F}}}function d(t,e,i,a,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||r,this._setter=a||n,this._interpolater=o||null,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]}function m(t){var e,r,n,i,a,o,s=Number.POSITIVE_INFINITY,u=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY;for(e=t.length;e--;)t[e][0]l&&(l=t[e][0]),t[e][1]c&&(c=t[e][1]);return r=l-s,n=c-u,i=Math.max(r,n),a=s+.5*r,o=u+.5*n,[[a-20*i,o-i],[a,o+20*i],[a+20*i,o-i]]}function p(t,e,r,n){var i,a,o,s,u,l,c,h,f,d,m=t[e][0],p=t[e][1],_=t[r][0],g=t[r][1],v=t[n][0],y=t[n][1],x=Math.abs(p-g),T=Math.abs(g-y);if(xT?o*(i-u)+c:s*(i-l)+h),f=_-i,d=g-a,{i:e,j:r,k:n,x:i,y:a,r:f*f+d*d}}function _(t){var e,r,n,i,a,o;for(r=t.length;r;)for(i=t[--r],n=t[--r],e=r;e;)if(o=t[--e],a=t[--e],n===a&&i===o||n===o&&i===a){t.splice(r,2),t.splice(e,2);break}}function g(t,e){return t.time-e.time}function v(t,e,r,n,i,a){var o=e[i],s=e[i+1],u=e[i+2];return t[0]=o+n*(r[a]-o),t[1]=s+n*(r[a+1]-s),t[2]=u+n*(r[a+2]-u),t}function y(t,e,r,n,i,a){var o,s,u,l,c,h=e[0+i],f=e[1+i],d=e[2+i],m=e[3+i],p=r[0+a],_=r[1+a],g=r[2+a],v=r[3+a];return s=h*p+f*_+d*g+m*v,s<0&&(s=-s,p=-p,_=-_,g=-g,v=-v),1-s>1e-6?(o=Math.acos(s),u=Math.sin(o),l=Math.sin((1-n)*o)/u,c=Math.sin(n*o)/u):(l=1-n,c=n),t[0]=l*h+c*p,t[1]=l*f+c*_,t[2]=l*d+c*g,t[3]=l*m+c*v,t}function x(t,e,r){"object"==typeof e&&(r=e,e=null);var n,i=this;if(!(t instanceof Function)){n=[];for(var a in t)t.hasOwnProperty(a)&&n.push(a)}var o=function(e){if(i.apply(this,arguments),t instanceof Function?T(this,t.call(this,e)):E(this,t,n),this.constructor===o)for(var r=o.__initializers__,a=0;ar?r:t}function w(t){return t=Math.round(t),t<0?0:t>255?255:t}function C(t){return t=Math.round(t),t<0?0:t>360?360:t}function N(t){return t<0?0:t>1?1:t}function M(t){return w(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function R(t){return N(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function L(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}function P(t,e,r){return t+(e-t)*r}function D(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}function I(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function O(t,e){fr&&I(fr,e),fr=hr.put(t,fr||e.slice())}function B(t,e){var r=(parseFloat(t[0])%360+360)%360/360,n=R(t[1]),i=R(t[2]),a=i<=.5?i*(n+1):i+n-i*n,o=2*i-a;return e=e||[],D(e,w(255*L(o,a,r+1/3)),w(255*L(o,a,r)),w(255*L(o,a,r-1/3)),1),4===t.length&&(e[3]=t[3]),e}function F(t){if(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),u=s-o,l=(s+o)/2;if(0===u)e=0,r=0;else{r=l<.5?u/(s+o):u/(2-s-o);var c=((s-n)/6+u/2)/u,h=((s-i)/6+u/2)/u,f=((s-a)/6+u/2)/u;n===s?e=f-h:i===s?e=1/3+c-f:a===s&&(e=2/3+h-c),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,r,l];return null!=t[3]&&d.push(t[3]),d}}function U(t,e,r){var n=Object.keys(t);n.sort();for(var i=[],a=0;a0&&n.push("#define "+i.toUpperCase()+"_COUNT "+a)}if(r)for(var o=0;o=400?t.onerror&&t.onerror():t.onload&&t.onload(e.response)},t.onerror&&(e.onerror=t.onerror),e.send(null)}function lt(t,e,r,n){var i=t.accessors[r],a=e.bufferViews[i.bufferView],o=i.byteOffset||0,s=ai[i.componentType]||He.Float32Array,u=oi[i.type];null==u&&n&&(u=1);var l=new s(a,o,u*i.count),c=i.extensions&&i.extensions.WEB3D_quantized_attributes;if(c){for(var h,f,d=new He.Float32Array(u*i.count),m=c.decodeMatrix,h=new Array(u),f=new Array(u),p=0;p0){var i=Math.pow(2,t[3]-128-8+n);e[r+0]=t[0]*i,e[r+1]=t[1]*i,e[r+2]=t[2]*i}else e[r+0]=0,e[r+1]=0,e[r+2]=0;return e[r+3]=1,e}function dt(t,e,r){for(var n="",i=e;i0;)if(t[a][0]=e[r++],t[a][1]=e[r++],t[a][2]=e[r++],t[a][3]=e[r++],1===t[a][0]&&1===t[a][1]&&1===t[a][2]){for(var s=t[a][3]<>>0;s>0;s--)mt(t[a-1],t[a]),a++,o--;i+=8}else a++,o--,i=0;return r}function _t(t,e,r,n){if(nIi)return pt(t,e,r,n);var i=e[r++];if(2!=i)return pt(t,e,r-1,n);if(t[0][1]=e[r++],t[0][2]=e[r++],i=e[r++],(t[0][2]<<8>>>0|i)>>>0!==n)return null;for(var i=0;i<4;i++)for(var a=0;a128){o=(127&o)>>>0;for(var s=e[r++];o--;)t[a++][i]=s}else for(;o--;)t[a++][i]=e[r++]}return r}function gt(t){Ne.defaultsWithPropList(t,Vi,Wi),vt(t);for(var e="",r=0;r>16,r=t-(e<<8)>>8;return[e,r,t-(e<<16)-(r<<8)]}function Qt(t,e,r){return(t<<16)+(e<<8)+r}function $t(t){var e=t[1][0]-t[0][0],r=t[1][1]-t[0][1];return Math.sqrt(e*e+r*r)}function te(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function ee(t){return Array.isArray(t)||(t=[t,t]),t}function re(t,e){return{name:t.name,type:t.type,size:t.size,semantic:t.semantic,value:ne(t.value,e)}}function ne(t,e){return e?t:new t.constructor(t)}function ie(t,e,r){return t*(1-r)+e*r}var ae={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,r=.1;return 0===t?0:1===t?1:(!r||r<1?(r=1,e=.1):e=.4*Math.asin(1/r)/(2*Math.PI),-r*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,r=.1;return 0===t?0:1===t?1:(!r||r<1?(r=1,e=.1):e=.4*Math.asin(1/r)/(2*Math.PI),r*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,r=.1;return 0===t?0:1===t?1:(!r||r<1?(r=1,e=.1):e=.4*Math.asin(1/r)/(2*Math.PI),(t*=2)<1?r*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:r*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-ae.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*ae.bounceIn(2*t):.5*ae.bounceOut(2*t-1)+.5}},oe=function(t){t=t||{},this.name=t.name||"",this.target=t.target,this.life=t.life||1e3,this.delay=t.delay||0,this.gap=t.gap||0,this.playbackRate=t.playbackRate||1,this._initialized=!1,this._elapsedTime=0,this._loop=null!=t.loop&&t.loop,this.setLoop(this._loop),null!=t.easing&&this.setEasing(t.easing),this.onframe=t.onframe||e,this.onfinish=t.onfinish||e,this.onrestart=t.onrestart||e,this._paused=!1};oe.prototype={gap:0,life:0,delay:0,setLoop:function(t){this._loop=t,t&&(this._loopRemained="number"==typeof t?t:1e8)},setEasing:function(t){"string"==typeof t&&(t=ae[t]),this.easing=t},step:function(t,e,r){if(this._initialized||(this._startTime=t+this.delay,this._initialized=!0),null!=this._currentTime&&(e=t-this._currentTime),this._currentTime=t,this._paused)return"paused";if(!(t0?(this._restartInLoop(t),this._loopRemained--,"restart"):(this._needsRemove=!0,"finish"):null}}},setTime:function(t){return this.step(t+this._startTime)},restart:function(t){var e=0;t&&(this._elapse(t),e=this._elapsedTime%this.life),t=t||Date.now(),this._startTime=t-e+this.delay,this._elapsedTime=0,this._needsRemove=!1,this._paused=!1},getElapsedTime:function(){return this._elapsedTime},_restartInLoop:function(t){this._startTime=t+this.gap,this._elapsedTime=0},_elapse:function(t,e){this._elapsedTime+=e*this.playbackRate},fire:function(t,e){var r="on"+t;this[r]&&this[r](this.target,e)},clone:function(){var t=new this.constructor;return t.name=this.name,t._loop=this._loop,t._loopRemained=this._loopRemained,t.life=this.life,t.gap=this.gap,t.delay=this.delay,t},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},oe.prototype.constructor=oe;var se=Array.prototype.slice;d.prototype={constructor:d,when:function(t,e){for(var r in e)this._tracks[r]||(this._tracks[r]=[],0!==t&&this._tracks[r].push({time:0,value:s(this._getter(this._target,r))})),this._tracks[r].push({time:parseInt(t),value:e[r]});return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,r=0;rt)this.inputs.unshift(n);else if(this.inputs[i-1].position<=t)this.inputs.push(n);else{var a=this._findKey(t);this.inputs.splice(a,n)}return n},le.prototype.step=function(t,e,r){var n=oe.prototype.step.call(this,t);return"finish"!==n&&this.setTime(this.getElapsedTime()),r||"paused"===n||this.fire("frame"),n},le.prototype.setTime=function(t){var e=this.position,r=this.inputs,n=r.length,i=r[0].position,a=r[n-1].position;if(e<=i||e>=a){var o=e<=i?r[0]:r[n-1],s=o.clip,u=o.offset;s.setTime((t+u)%s.life),s.output instanceof oe?this.output.copy(s.output):this.output.copy(s)}else{var l=this._findKey(e),c=r[l],h=r[l+1],f=c.clip,d=h.clip;f.setTime((t+c.offset)%f.life),d.setTime((t+h.offset)%d.life);var m=(this.position-c.position)/(h.position-c.position),p=f.output instanceof oe?f.output:f,_=d.output instanceof oe?d.output:d;this.output.blend1D(p,_,m)}},le.prototype.clone=function(t){var e=oe.prototype.clone.call(this);e.output=this.output.clone();for(var r=0;r=r[i].position&&t=0;i--)t>=r[i].position&&t=0&&(this._cacheKey=e,this._cachePosition=t),e};var ce=1/1048576,he={triangulate:function(t,e){var r,n,i,a,o,s,u,l,c,h,f,d,g=t.length;if(g<3)return[];if(t=t.slice(0),e)for(r=g;r--;)t[r]=t[r][e];for(i=new Array(g),r=g;r--;)i[r]=r;for(i.sort(function(e,r){var n=t[r][0]-t[e][0];return 0!==n?n:e-r}),a=m(t),t.push(a[0],a[1],a[2]),o=[p(t,g+0,g+1,g+2)],s=[],u=[],r=i.length;r--;u.length=0){for(d=i[r],n=o.length;n--;)l=t[d][0]-o[n].x,l>0&&l*l>o[n].r?(s.push(o[n]),o.splice(n,1)):(c=t[d][1]-o[n].y,l*l+c*c-o[n].r>ce||(u.push(o[n].i,o[n].j,o[n].j,o[n].k,o[n].k,o[n].i),o.splice(n,1)));for(_(u),n=u.length;n;)f=u[--n],h=u[--n],o.push(p(t,h,f,d))}for(r=o.length;r--;)s.push(o[r]);for(o.length=0,r=s.length;r--;)s[r].it[0][0]&&e[0]>t[1][0]&&e[0]>t[2][0]||e[1]t[0][1]&&e[1]>t[1][1]&&e[1]>t[2][1])return null;var r=t[1][0]-t[0][0],n=t[2][0]-t[0][0],i=t[1][1]-t[0][1],a=t[2][1]-t[0][1],o=r*a-n*i;if(0===o)return null;var s=(a*(e[0]-t[0][0])-n*(e[1]-t[0][1]))/o,u=(r*(e[1]-t[0][1])-i*(e[0]-t[0][0]))/o;return s<0||u<0||s+u>1?null:[s,u]}},fe=("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self,function(t,e){return e={exports:{}},t(e,e.exports),e.exports}(function(t,e){!function(t){var r={};r.exports=e,function(t){if(!e)var e=1e-6;if(!r)var r="undefined"!=typeof Float32Array?Float32Array:Array;if(!n)var n=Math.random;var i={};i.setMatrixArrayType=function(t){r=t},void 0!==t&&(t.glMatrix=i);var a=Math.PI/180;i.toRadian=function(t){return t*a};var o={};o.create=function(){var t=new r(2);return t[0]=0,t[1]=0,t},o.clone=function(t){var e=new r(2);return e[0]=t[0],e[1]=t[1],e},o.fromValues=function(t,e){var n=new r(2);return n[0]=t,n[1]=e,n},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},o.set=function(t,e,r){return t[0]=e,t[1]=r,t},o.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t},o.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t},o.sub=o.subtract,o.multiply=function(t,e,r){ -return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t},o.mul=o.multiply,o.divide=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t},o.div=o.divide,o.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t},o.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t},o.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t},o.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t},o.distance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1];return Math.sqrt(r*r+n*n)},o.dist=o.distance,o.squaredDistance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1];return r*r+n*n},o.sqrDist=o.squaredDistance,o.length=function(t){var e=t[0],r=t[1];return Math.sqrt(e*e+r*r)},o.len=o.length,o.squaredLength=function(t){var e=t[0],r=t[1];return e*e+r*r},o.sqrLen=o.squaredLength,o.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t},o.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t},o.normalize=function(t,e){var r=e[0],n=e[1],i=r*r+n*n;return i>0&&(i=1/Math.sqrt(i),t[0]=e[0]*i,t[1]=e[1]*i),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]},o.cross=function(t,e,r){var n=e[0]*r[1]-e[1]*r[0];return t[0]=t[1]=0,t[2]=n,t},o.lerp=function(t,e,r,n){var i=e[0],a=e[1];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t},o.random=function(t,e){e=e||1;var r=2*n()*Math.PI;return t[0]=Math.cos(r)*e,t[1]=Math.sin(r)*e,t},o.transformMat2=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i,t[1]=r[1]*n+r[3]*i,t},o.transformMat2d=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i+r[4],t[1]=r[1]*n+r[3]*i+r[5],t},o.transformMat3=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[3]*i+r[6],t[1]=r[1]*n+r[4]*i+r[7],t},o.transformMat4=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[4]*i+r[12],t[1]=r[1]*n+r[5]*i+r[13],t},o.forEach=function(){var t=o.create();return function(e,r,n,i,a,o){var s,u;for(r||(r=2),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t},s.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},s.cross=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],u=r[2];return t[0]=i*u-a*s,t[1]=a*o-n*u,t[2]=n*s-i*o,t},s.lerp=function(t,e,r,n){var i=e[0],a=e[1],o=e[2];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t},s.random=function(t,e){e=e||1;var r=2*n()*Math.PI,i=2*n()-1,a=Math.sqrt(1-i*i)*e;return t[0]=Math.cos(r)*a,t[1]=Math.sin(r)*a,t[2]=i*e,t},s.transformMat4=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[3]*n+r[7]*i+r[11]*a+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*i+r[8]*a+r[12])/o,t[1]=(r[1]*n+r[5]*i+r[9]*a+r[13])/o,t[2]=(r[2]*n+r[6]*i+r[10]*a+r[14])/o,t},s.transformMat3=function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t},s.transformQuat=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],u=r[2],l=r[3],c=l*n+s*a-u*i,h=l*i+u*n-o*a,f=l*a+o*i-s*n,d=-o*n-s*i-u*a;return t[0]=c*l+d*-o+h*-u-f*-s,t[1]=h*l+d*-s+f*-o-c*-u,t[2]=f*l+d*-u+c*-s-h*-o,t},s.rotateX=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[0],a[1]=i[1]*Math.cos(n)-i[2]*Math.sin(n),a[2]=i[1]*Math.sin(n)+i[2]*Math.cos(n),t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t},s.rotateY=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[2]*Math.sin(n)+i[0]*Math.cos(n),a[1]=i[1],a[2]=i[2]*Math.cos(n)-i[0]*Math.sin(n),t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t},s.rotateZ=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[0]*Math.cos(n)-i[1]*Math.sin(n),a[1]=i[0]*Math.sin(n)+i[1]*Math.cos(n),a[2]=i[2],t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t},s.forEach=function(){var t=s.create();return function(e,r,n,i,a,o){var s,u;for(r||(r=3),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s1?0:Math.acos(i)},s.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},void 0!==t&&(t.vec3=s);var u={};u.create=function(){var t=new r(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},u.clone=function(t){var e=new r(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},u.fromValues=function(t,e,n,i){var a=new r(4);return a[0]=t,a[1]=e,a[2]=n,a[3]=i,a},u.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},u.set=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t},u.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t},u.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t},u.sub=u.subtract,u.multiply=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t},u.mul=u.multiply,u.divide=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t},u.div=u.divide,u.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t},u.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t},u.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t},u.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t},u.distance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+a*a)},u.dist=u.distance,u.squaredDistance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return r*r+n*n+i*i+a*a},u.sqrDist=u.squaredDistance,u.length=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)},u.len=u.length,u.squaredLength=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i},u.sqrLen=u.squaredLength,u.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t},u.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t},u.normalize=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o,t[3]=e[3]*o),t},u.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},u.lerp=function(t,e,r,n){var i=e[0],a=e[1],o=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t},u.random=function(t,e){return e=e||1,t[0]=n(),t[1]=n(),t[2]=n(),t[3]=n(),u.normalize(t,t),u.scale(t,t,e),t},u.transformMat4=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t},u.transformQuat=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],u=r[2],l=r[3],c=l*n+s*a-u*i,h=l*i+u*n-o*a,f=l*a+o*i-s*n,d=-o*n-s*i-u*a;return t[0]=c*l+d*-o+h*-u-f*-s,t[1]=h*l+d*-s+f*-o-c*-u,t[2]=f*l+d*-u+c*-s-h*-o,t},u.forEach=function(){var t=u.create();return function(e,r,n,i,a,o){var s,u;for(r||(r=4),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s.999999?(n[0]=0,n[1]=0,n[2]=0,n[3]=1,n):(s.cross(t,i,a),n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=1+o,d.normalize(n,n))}}(),d.setAxes=function(){var t=h.create();return function(e,r,n,i){return t[0]=n[0],t[3]=n[1],t[6]=n[2],t[1]=i[0],t[4]=i[1],t[7]=i[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],d.normalize(e,d.fromMat3(e,t))}}(),d.clone=u.clone,d.fromValues=u.fromValues,d.copy=u.copy,d.set=u.set,d.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},d.setAxisAngle=function(t,e,r){r*=.5;var n=Math.sin(r);return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=Math.cos(r),t},d.add=u.add,d.multiply=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=r[0],u=r[1],l=r[2],c=r[3];return t[0]=n*c+o*s+i*l-a*u,t[1]=i*c+o*u+a*s-n*l,t[2]=a*c+o*l+n*u-i*s,t[3]=o*c-n*s-i*u-a*l,t},d.mul=d.multiply,d.scale=u.scale,d.rotateX=function(t,e,r){r*=.5;var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+o*s,t[1]=i*u+a*s,t[2]=a*u-i*s,t[3]=o*u-n*s,t},d.rotateY=function(t,e,r){r*=.5;var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u-a*s,t[1]=i*u+o*s,t[2]=a*u+n*s,t[3]=o*u-i*s,t},d.rotateZ=function(t,e,r){r*=.5;var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+i*s,t[1]=i*u-n*s,t[2]=a*u+o*s,t[3]=o*u-a*s,t},d.calculateW=function(t,e){var r=e[0],n=e[1],i=e[2];return t[0]=r,t[1]=n,t[2]=i,t[3]=Math.sqrt(Math.abs(1-r*r-n*n-i*i)),t},d.dot=u.dot,d.lerp=u.lerp,d.slerp=function(t,e,r,n){var i,a,o,s,u,l=e[0],c=e[1],h=e[2],f=e[3],d=r[0],m=r[1],p=r[2],_=r[3];return a=l*d+c*m+h*p+f*_,a<0&&(a=-a,d=-d,m=-m,p=-p,_=-_),1-a>1e-6?(i=Math.acos(a),o=Math.sin(i),s=Math.sin((1-n)*i)/o,u=Math.sin(n*i)/o):(s=1-n,u=n),t[0]=s*l+u*d,t[1]=s*c+u*m,t[2]=s*h+u*p,t[3]=s*f+u*_,t},d.invert=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a,s=o?1/o:0;return t[0]=-r*s,t[1]=-n*s,t[2]=-i*s,t[3]=a*s,t},d.conjugate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},d.length=u.length,d.len=d.length,d.squaredLength=u.squaredLength,d.sqrLen=d.squaredLength,d.normalize=u.normalize,d.fromMat3=function(t,e){var r,n=e[0]+e[4]+e[8];if(n>0)r=Math.sqrt(n+1),t[3]=.5*r,r=.5/r,t[0]=(e[5]-e[7])*r,t[1]=(e[6]-e[2])*r,t[2]=(e[1]-e[3])*r;else{var i=0;e[4]>e[0]&&(i=1),e[8]>e[3*i+i]&&(i=2);var a=(i+1)%3,o=(i+2)%3;r=Math.sqrt(e[3*i+i]-e[3*a+a]-e[3*o+o]+1),t[i]=.5*r,r=.5/r,t[3]=(e[3*a+o]-e[3*o+a])*r,t[a]=(e[3*a+i]+e[3*i+a])*r,t[o]=(e[3*o+i]+e[3*i+o])*r}return t},d.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},void 0!==t&&(t.quat=d)}(r.exports)}()})),de=fe.vec2,me=function(t,e){t=t||0,e=e||0,this.array=de.fromValues(t,e),this._dirty=!0};if(me.prototype={constructor:me,add:function(t){return de.add(this.array,this.array,t.array),this._dirty=!0,this},set:function(t,e){return this.array[0]=t,this.array[1]=e,this._dirty=!0,this},setArray:function(t){return this.array[0]=t[0],this.array[1]=t[1],this._dirty=!0,this},clone:function(){return new me(this.x,this.y)},copy:function(t){return de.copy(this.array,t.array),this._dirty=!0,this},cross:function(t,e){return de.cross(t.array,this.array,e.array),t._dirty=!0,this},dist:function(t){return de.dist(this.array,t.array)},distance:function(t){return de.distance(this.array,t.array)},div:function(t){return de.div(this.array,this.array,t.array),this._dirty=!0,this},divide:function(t){return de.divide(this.array,this.array,t.array),this._dirty=!0,this},dot:function(t){return de.dot(this.array,t.array)},len:function(){return de.len(this.array)},length:function(){return de.length(this.array)},lerp:function(t,e,r){return de.lerp(this.array,t.array,e.array,r),this._dirty=!0,this},min:function(t){return de.min(this.array,this.array,t.array),this._dirty=!0,this},max:function(t){return de.max(this.array,this.array,t.array),this._dirty=!0,this},mul:function(t){return de.mul(this.array,this.array,t.array),this._dirty=!0,this},multiply:function(t){return de.multiply(this.array,this.array,t.array),this._dirty=!0,this},negate:function(){return de.negate(this.array,this.array),this._dirty=!0,this},normalize:function(){return de.normalize(this.array,this.array),this._dirty=!0,this},random:function(t){return de.random(this.array,t),this._dirty=!0,this},scale:function(t){return de.scale(this.array,this.array,t),this._dirty=!0,this},scaleAndAdd:function(t,e){return de.scaleAndAdd(this.array,this.array,t.array,e),this._dirty=!0,this},sqrDist:function(t){return de.sqrDist(this.array,t.array)},squaredDistance:function(t){return de.squaredDistance(this.array,t.array)},sqrLen:function(){return de.sqrLen(this.array)},squaredLength:function(){return de.squaredLength(this.array)},sub:function(t){return de.sub(this.array,this.array,t.array),this._dirty=!0,this},subtract:function(t){return de.subtract(this.array,this.array,t.array),this._dirty=!0,this},transformMat2:function(t){return de.transformMat2(this.array,this.array,t.array),this._dirty=!0,this},transformMat2d:function(t){return de.transformMat2d(this.array,this.array,t.array),this._dirty=!0,this},transformMat3:function(t){return de.transformMat3(this.array,this.array,t.array),this._dirty=!0,this},transformMat4:function(t){return de.transformMat4(this.array,this.array,t.array),this._dirty=!0,this},toString:function(){return"["+Array.prototype.join.call(this.array,",")+"]"},toArray:function(){return Array.prototype.slice.call(this.array)}},Object.defineProperty){var pe=me.prototype;Object.defineProperty(pe,"x",{get:function(){return this.array[0]},set:function(t){this.array[0]=t,this._dirty=!0}}),Object.defineProperty(pe,"y",{get:function(){return this.array[1]},set:function(t){this.array[1]=t,this._dirty=!0}})}me.add=function(t,e,r){return de.add(t.array,e.array,r.array),t._dirty=!0,t},me.set=function(t,e,r){return de.set(t.array,e,r),t._dirty=!0,t},me.copy=function(t,e){return de.copy(t.array,e.array),t._dirty=!0,t},me.cross=function(t,e,r){return de.cross(t.array,e.array,r.array),t._dirty=!0,t},me.dist=function(t,e){return de.distance(t.array,e.array)},me.distance=me.dist,me.div=function(t,e,r){return de.divide(t.array,e.array,r.array),t._dirty=!0,t},me.divide=me.div,me.dot=function(t,e){return de.dot(t.array,e.array)},me.len=function(t){return de.length(t.array)},me.lerp=function(t,e,r,n){return de.lerp(t.array,e.array,r.array,n),t._dirty=!0,t},me.min=function(t,e,r){return de.min(t.array,e.array,r.array),t._dirty=!0,t},me.max=function(t,e,r){return de.max(t.array,e.array,r.array),t._dirty=!0,t},me.mul=function(t,e,r){return de.multiply(t.array,e.array,r.array),t._dirty=!0,t},me.multiply=me.mul,me.negate=function(t,e){return de.negate(t.array,e.array),t._dirty=!0,t},me.normalize=function(t,e){return de.normalize(t.array,e.array),t._dirty=!0,t},me.random=function(t,e){return de.random(t.array,e),t._dirty=!0,t},me.scale=function(t,e,r){return de.scale(t.array,e.array,r),t._dirty=!0,t},me.scaleAndAdd=function(t,e,r,n){return de.scaleAndAdd(t.array,e.array,r.array,n),t._dirty=!0,t},me.sqrDist=function(t,e){return de.sqrDist(t.array,e.array)},me.squaredDistance=me.sqrDist,me.sqrLen=function(t){return de.sqrLen(t.array)},me.squaredLength=me.sqrLen,me.sub=function(t,e,r){return de.subtract(t.array,e.array,r.array),t._dirty=!0,t -},me.subtract=me.sub,me.transformMat2=function(t,e,r){return de.transformMat2(t.array,e.array,r.array),t._dirty=!0,t},me.transformMat2d=function(t,e,r){return de.transformMat2d(t.array,e.array,r.array),t._dirty=!0,t},me.transformMat3=function(t,e,r){return de.transformMat3(t.array,e.array,r.array),t._dirty=!0,t},me.transformMat4=function(t,e,r){return de.transformMat4(t.array,e.array,r.array),t._dirty=!0,t};var _e=function(t){t=t||{},oe.call(this,t),this.output=t.output||null,this.inputs=t.inputs||[],this.position=new me,this._cacheTriangle=null,this._triangles=[],this._updateTriangles()};_e.prototype=new oe,_e.prototype.constructor=_e,_e.prototype.addInput=function(t,e,r){var n={position:t,clip:e,offset:r||0};return this.inputs.push(n),this.life=Math.max(e.life,this.life),this._updateTriangles(),n},_e.prototype._updateTriangles=function(){var t=this.inputs.map(function(t){return t.position});this._triangles=he.triangulate(t,"array")},_e.prototype.step=function(t,e,r){var n=oe.prototype.step.call(this,t);return"finish"!==n&&this.setTime(this.getElapsedTime()),r||"paused"===n||this.fire("frame"),n},_e.prototype.setTime=function(t){var e=this._findTriangle(this.position);if(e){var r=e[1],n=e[2],i=e[0],a=this.inputs[i.indices[0]],o=this.inputs[i.indices[1]],s=this.inputs[i.indices[2]],u=a.clip,l=o.clip,c=s.clip;u.setTime((t+a.offset)%u.life),l.setTime((t+o.offset)%l.life),c.setTime((t+s.offset)%c.life);var h=u.output instanceof oe?u.output:u,f=l.output instanceof oe?l.output:l,d=c.output instanceof oe?c.output:c;this.output.blend2D(h,f,d,r,n)}},_e.prototype.clone=function(t){var e=oe.prototype.clone.call(this);e.output=this.output.clone();for(var r=0;r=t.time)return this.keyFrames.splice(e,0,t),e}this.life=t.time,this.keyFrames.push(t)},ye.prototype.addKeyFrames=function(t){for(var e=0;ei[i.length-1].time)){if(t=a-1?a-1:this._cacheKey+1,s=o;s>=0;s--)if(i[s].time<=t&&i[s][e])r=i[s],this._cacheKey=s,this._cacheTime=t;else if(i[s][e]){n=i[s];break}}else for(var s=this._cacheKey;s=e.time[r-1])t=e.time[r-1],n=r-2;else if(t=0;a--)if(e.time[a-1]<=t&&e.time[a]>t){n=a-1;break}}else for(var a=this._cacheKey;at){n=a;break}if(n>-1){this._cacheKey=n,this._cacheTime=t;var o=n,s=n+1,u=e.time[o],l=e.time[s],c=l-u,h=0===c?0:(t-u)/c;e.rotation&&y(this.rotation,e.rotation,e.rotation,h,4*o,4*s),e.position&&v(this.position,e.position,e.position,h,3*o,3*s),e.scale&&v(this.scale,e.scale,e.scale,h,3*o,3*s)}n==r-2&&(this._cacheKey=0,this._cacheTime=0),this.updateTarget()}},Ee.prototype.updateTarget=function(){var t=this.channels;this.target&&(t.position&&this.target.position.setArray(this.position),t.rotation&&this.target.rotation.setArray(this.rotation),t.scale&&this.target.scale.setArray(this.scale))},Ee.prototype.getMaxTime=function(){return this.channels.time[this.channels.time.length-1]},Ee.prototype.getSubTrack=function(t,e){var r=new Ee({name:this.name}),n=this.channels.time[0];t=Math.min(Math.max(t,n),this.life),e=Math.min(Math.max(e,n),this.life);var i=this._findRange(t),a=this._findRange(e),o=a[0]-i[0]+1;0===i[1]&&0===a[1]&&(o-=1),this.channels.rotation&&(r.channels.rotation=new Float32Array(4*o)),this.channels.position&&(r.channels.position=new Float32Array(3*o)),this.channels.scale&&(r.channels.scale=new Float32Array(3*o)),this.channels.time&&(r.channels.time=new Float32Array(o)),this.setTime(t);for(var s=0;s<3;s++)r.channels.rotation[s]=this.rotation[s],r.channels.position[s]=this.position[s],r.channels.scale[s]=this.scale[s];r.channels.time[0]=0,r.channels.rotation[3]=this.rotation[3];for(var s=1;st&&(n=i);var a=0;if(n>=0)var o=e.time[n],s=e.time[n+1],a=(t-o)/(s-o);return[n,a]},Ee.prototype.blend1D=ye.prototype.blend1D,Ee.prototype.blend2D=ye.prototype.blend2D,Ee.prototype.additiveBlend=ye.prototype.additiveBlend,Ee.prototype.subtractiveBlend=ye.prototype.subtractiveBlend,Ee.prototype.clone=function(){var t=Ee.prototype.clone.call(this);return t.channels={time:this.channels.time||null,position:this.channels.position||null,rotation:this.channels.rotation||null,scale:this.channels.scale||null},Te.copy(t.position,this.position),xe.copy(t.rotation,this.rotation),Te.copy(t.scale,this.scale),t.target=this.target,t.updateTarget(),t};var be={extend:x,derive:x},Ae={trigger:function(t){if(this.hasOwnProperty("__handlers__")&&this.__handlers__.hasOwnProperty(t)){var e=this.__handlers__[t],r=e.length,n=-1,i=arguments;switch(i.length){case 1:for(;++n=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),r=0;r=0&&this.tracks.splice(e,1)},Ie.prototype.getSubClip=function(t,e,r){for(var n=new Ie({name:this.name}),i=0;i0){var e=this.min,r=this.max,n=e.array,i=r.array;Ke(n,t[0]),Ke(i,t[0]);for(var a=1;ai[0]&&(i[0]=o[0]),o[1]>i[1]&&(i[1]=o[1]),o[2]>i[2]&&(i[2]=o[2])}e._dirty=!0,r._dirty=!0}},union:function(t){var e=this.min,r=this.max;return Ye.min(e.array,e.array,t.min.array),Ye.max(r.array,r.array,t.max.array),e._dirty=!0,r._dirty=!0,this},intersection:function(t){var e=this.min,r=this.max;return Ye.max(e.array,e.array,t.min.array),Ye.min(r.array,r.array,t.max.array),e._dirty=!0,r._dirty=!0,this},intersectBoundingBox:function(t){var e=this.min.array,r=this.max.array,n=t.min.array,i=t.max.array;return!(e[0]>i[0]||e[1]>i[1]||e[2]>i[2]||r[0]=i[0]&&r[1]>=i[1]&&r[2]>=i[2]},containPoint:function(t){var e=this.min.array,r=this.max.array,n=t.array;return e[0]<=n[0]&&e[1]<=n[1]&&e[2]<=n[2]&&r[0]>=n[0]&&r[1]>=n[1]&&r[2]>=n[2]},isFinite:function(){var t=this.min.array,e=this.max.array;return isFinite(t[0])&&isFinite(t[1])&&isFinite(t[2])&&isFinite(e[0])&&isFinite(e[1])&&isFinite(e[2])},applyTransform:function(){var t=Ye.create(),e=Ye.create(),r=Ye.create(),n=Ye.create(),i=Ye.create(),a=Ye.create();return function(o){var s=this.min.array,u=this.max.array,l=o.array;return t[0]=l[0]*s[0],t[1]=l[1]*s[0],t[2]=l[2]*s[0],e[0]=l[0]*u[0],e[1]=l[1]*u[0],e[2]=l[2]*u[0],r[0]=l[4]*s[1],r[1]=l[5]*s[1],r[2]=l[6]*s[1],n[0]=l[4]*u[1],n[1]=l[5]*u[1],n[2]=l[6]*u[1],i[0]=l[8]*s[2],i[1]=l[9]*s[2],i[2]=l[10]*s[2],a[0]=l[8]*u[2],a[1]=l[9]*u[2],a[2]=l[10]*u[2],s[0]=Math.min(t[0],e[0])+Math.min(r[0],n[0])+Math.min(i[0],a[0])+l[12],s[1]=Math.min(t[1],e[1])+Math.min(r[1],n[1])+Math.min(i[1],a[1])+l[13],s[2]=Math.min(t[2],e[2])+Math.min(r[2],n[2])+Math.min(i[2],a[2])+l[14],u[0]=Math.max(t[0],e[0])+Math.max(r[0],n[0])+Math.max(i[0],a[0])+l[12], -u[1]=Math.max(t[1],e[1])+Math.max(r[1],n[1])+Math.max(i[1],a[1])+l[13],u[2]=Math.max(t[2],e[2])+Math.max(r[2],n[2])+Math.max(i[2],a[2])+l[14],this.min._dirty=!0,this.max._dirty=!0,this}}(),applyProjection:function(t){var e=this.min.array,r=this.max.array,n=t.array,i=e[0],a=e[1],o=e[2],s=r[0],u=r[1],l=e[2],c=r[0],h=r[1],f=r[2];if(1===n[15])e[0]=n[0]*i+n[12],e[1]=n[5]*a+n[13],r[2]=n[10]*o+n[14],r[0]=n[0]*c+n[12],r[1]=n[5]*h+n[13],e[2]=n[10]*f+n[14];else{var d=-1/o;e[0]=n[0]*i*d,e[1]=n[5]*a*d,r[2]=(n[10]*o+n[14])*d,d=-1/l,r[0]=n[0]*s*d,r[1]=n[5]*u*d,d=-1/f,e[2]=(n[10]*f+n[14])*d}return this.min._dirty=!0,this.max._dirty=!0,this},updateVertices:function(){var t=this.vertices;if(!t){for(var t=[],e=0;e<8;e++)t[e]=Ye.fromValues(0,0,0);this.vertices=t}var r=this.min.array,n=this.max.array;return Ze(t[0],r[0],r[1],r[2]),Ze(t[1],r[0],n[1],r[2]),Ze(t[2],n[0],r[1],r[2]),Ze(t[3],n[0],n[1],r[2]),Ze(t[4],r[0],r[1],n[2]),Ze(t[5],r[0],n[1],n[2]),Ze(t[6],n[0],r[1],n[2]),Ze(t[7],n[0],n[1],n[2]),this},copy:function(t){var e=this.min,r=this.max;return Ke(e.array,t.min.array),Ke(r.array,t.max.array),e._dirty=!0,r._dirty=!0,this},clone:function(){var t=new Je;return t.copy(this),t}};var Qe=fe.mat4,$e=fe.vec3,tr=fe.mat3,er=fe.quat,rr=function(){this._axisX=new Ve,this._axisY=new Ve,this._axisZ=new Ve,this.array=Qe.create(),this._dirty=!0};rr.prototype={constructor:rr,setArray:function(t){for(var e=0;e>e;return t+1},dispose:function(t){var e=this._cache;e.use(t.__uid__);var r=e.get("webgl_texture");r&&t.gl.deleteTexture(r),e.deleteContext(t.__uid__)},isRenderable:function(){},isPowerOfTwo:function(){}});Object.defineProperty(or.prototype,"width",{get:function(){return this._width},set:function(t){this._width=t}}),Object.defineProperty(or.prototype,"height",{get:function(){return this._height},set:function(t){this._height=t}}),or.BYTE=Fe.BYTE,or.UNSIGNED_BYTE=Fe.UNSIGNED_BYTE,or.SHORT=Fe.SHORT,or.UNSIGNED_SHORT=Fe.UNSIGNED_SHORT,or.INT=Fe.INT,or.UNSIGNED_INT=Fe.UNSIGNED_INT,or.FLOAT=Fe.FLOAT,or.HALF_FLOAT=36193,or.UNSIGNED_INT_24_8_WEBGL=34042,or.DEPTH_COMPONENT=Fe.DEPTH_COMPONENT,or.DEPTH_STENCIL=Fe.DEPTH_STENCIL,or.ALPHA=Fe.ALPHA,or.RGB=Fe.RGB,or.RGBA=Fe.RGBA,or.LUMINANCE=Fe.LUMINANCE,or.LUMINANCE_ALPHA=Fe.LUMINANCE_ALPHA,or.SRGB=35904,or.SRGB_ALPHA=35906,or.COMPRESSED_RGB_S3TC_DXT1_EXT=33776,or.COMPRESSED_RGBA_S3TC_DXT1_EXT=33777,or.COMPRESSED_RGBA_S3TC_DXT3_EXT=33778,or.COMPRESSED_RGBA_S3TC_DXT5_EXT=33779,or.NEAREST=Fe.NEAREST,or.LINEAR=Fe.LINEAR,or.NEAREST_MIPMAP_NEAREST=Fe.NEAREST_MIPMAP_NEAREST,or.LINEAR_MIPMAP_NEAREST=Fe.LINEAR_MIPMAP_NEAREST,or.NEAREST_MIPMAP_LINEAR=Fe.NEAREST_MIPMAP_LINEAR,or.LINEAR_MIPMAP_LINEAR=Fe.LINEAR_MIPMAP_LINEAR,or.REPEAT=Fe.REPEAT,or.CLAMP_TO_EDGE=Fe.CLAMP_TO_EDGE,or.MIRRORED_REPEAT=Fe.MIRRORED_REPEAT;var sr=function(){this.head=null,this.tail=null,this._length=0};sr.prototype.insert=function(t){var e=new sr.Entry(t);return this.insertEntry(e),e},sr.prototype.insertAt=function(t,e){if(!(t<0)){for(var r=this.head,n=0;r&&n!=t;)r=r.next,n++;if(r){var i=new sr.Entry(e),a=r.prev;a?(a.next=i,i.prev=a):this.head=i,i.next=r,r.prev=i}else this.insert(e)}},sr.prototype.insertBeforeEntry=function(t,e){var r=new sr.Entry(t),n=e.prev;n?(n.next=r,r.prev=n):this.head=r,r.next=e,e.prev=r,this._length++},sr.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._length++},sr.prototype.remove=function(t){var e=t.prev,r=t.next;e?e.next=r:this.head=r,r?r.prev=e:this.tail=e,t.next=t.prev=null,this._length--},sr.prototype.removeAt=function(t){if(!(t<0)){for(var e=this.head,r=0;e&&r!=t;)e=e.next,r++;return e?(this.remove(e),e.value):void 0}},sr.prototype.getHead=function(){if(this.head)return this.head.value},sr.prototype.getTail=function(){if(this.tail)return this.tail.value},sr.prototype.getAt=function(t){if(!(t<0)){for(var e=this.head,r=0;e&&r!=t;)e=e.next,r++;return e.value}},sr.prototype.indexOf=function(t){for(var e=this.head,r=0;e;){if(e.value===t)return r;e=e.next,r++}},sr.prototype.length=function(){return this._length},sr.prototype.isEmpty=function(){return 0===this._length},sr.prototype.forEach=function(t,e){for(var r=this.head,n=0,i=void 0!==e;r;)i?t.call(e,r.value,n):t(r.value,n),r=r.next,n++},sr.prototype.clear=function(){this.tail=this.head=null,this._length=0},sr.Entry=function(t){this.value=t,this.next=null,this.prev=null};var ur=function(t){this._list=new sr,this._map={},this._maxSize=t||10};ur.prototype.setMaxSize=function(t){this._maxSize=t},ur.prototype.put=function(t,e){if(void 0===this._map[t]){var r=this._list.length();if(r>=this._maxSize&&r>0){var n=this._list.head;this._list.remove(n),delete this._map[n.key]}var i=this._list.insert(e);i.key=t,this._map[t]=i}},ur.prototype.get=function(t){var e=this._map[t];if(void 0!==e)return e!==this._list.tail&&(this._list.remove(e),this._list.insertEntry(e)),e.value},ur.prototype.remove=function(t){var e=this._map[t];void 0!==e&&(delete this._map[t],this._list.remove(e))},ur.prototype.clear=function(){this._list.clear(),this._map={}};var lr={},cr={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]},hr=new ur(20),fr=null;lr.parse=function(t,e){if(t){e=e||[];var r=hr.get(t);if(r)return I(e,r);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in cr)return I(e,cr[n]),O(t,e),e;if("#"!==n.charAt(0)){var i=n.indexOf("("),a=n.indexOf(")");if(-1!==i&&a+1===n.length){var o=n.substr(0,i),s=n.substr(i+1,a-(i+1)).split(","),u=1;switch(o){case"rgba":if(4!==s.length)return void D(e,0,0,0,1);u=R(s.pop());case"rgb":return 3!==s.length?void D(e,0,0,0,1):(D(e,M(s[0]),M(s[1]),M(s[2]),u),O(t,e),e);case"hsla":return 4!==s.length?void D(e,0,0,0,1):(s[3]=R(s[3]),B(s,e),O(t,e),e);case"hsl":return 3!==s.length?void D(e,0,0,0,1):(B(s,e),O(t,e),e);default:return}}D(e,0,0,0,1)}else{if(4===n.length){var l=parseInt(n.substr(1),16);return l>=0&&l<=4095?(D(e,(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1),O(t,e),e):void D(e,0,0,0,1)}if(7===n.length){var l=parseInt(n.substr(1),16);return l>=0&&l<=16777215?(D(e,(16711680&l)>>16,(65280&l)>>8,255&l,1),O(t,e),e):void D(e,0,0,0,1)}}}},lr.parseToFloat=function(t,e){if(e=lr.parse(t,e))return e[0]/=255,e[1]/=255,e[2]/=255,e},lr.lift=function(t,e){var r=lr.parse(t);if(r){for(var n=0;n<3;n++)r[n]=e<0?r[n]*(1-e)|0:(255-r[n])*e+r[n]|0;return lr.stringify(r,4===r.length?"rgba":"rgb")}},lr.toHex=function(t){var e=lr.parse(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},lr.fastLerp=function(t,e,r){if(e&&e.length&&t>=0&&t<=1){r=r||[];var n=t*(e.length-1),i=Math.floor(n),a=Math.ceil(n),o=e[i],s=e[a],u=n-i;return r[0]=w(P(o[0],s[0],u)),r[1]=w(P(o[1],s[1],u)),r[2]=w(P(o[2],s[2],u)),r[3]=N(P(o[3],s[3],u)),r}},lr.fastMapToColor=lr.fastLerp,lr.lerp=function(t,e,r){if(e&&e.length&&t>=0&&t<=1){var n=t*(e.length-1),i=Math.floor(n),a=Math.ceil(n),o=lr.parse(e[i]),s=lr.parse(e[a]),u=n-i,l=lr.stringify([w(P(o[0],s[0],u)),w(P(o[1],s[1],u)),w(P(o[2],s[2],u)),N(P(o[3],s[3],u))],"rgba");return r?{color:l,leftIndex:i,rightIndex:a,value:n}:l}},lr.mapToColor=lr.lerp,lr.modifyHSL=function(t,e,r,n){if(t=lr.parse(t))return t=F(t),null!=e&&(t[0]=C(e)),null!=r&&(t[1]=R(r)),null!=n&&(t[2]=R(n)),lr.stringify(B(t),"rgba")},lr.modifyAlpha=function(t,e){if((t=lr.parse(t))&&null!=e)return t[3]=N(e),lr.stringify(t,"rgba")},lr.stringify=function(t,e){if(t&&t.length){var r=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(r+=","+t[3]),e+"("+r+")"}};var dr=lr.parseToFloat,mr={},pr=Me.extend(function(){return{name:"",depthTest:!0,depthMask:!0,transparent:!1,blend:null,autoUpdateTextureStatus:!0,uniforms:{},vertexDefines:{},fragmentDefines:{},_textureStatus:{},_enabledUniforms:null}},function(){this.name||(this.name="MATERIAL_"+this.__uid__),this.shader&&this.attachShader(this.shader,!0)},{precision:"highp",bind:function(t,e,r,n){for(var i=t.gl,a=e.currentTextureSlot(),o=0;o=0},getEnabledUniforms:function(){return this._enabledUniforms},getTextureUniforms:function(){return this._textureUniforms},set:function(t,e){if("object"==typeof t)for(var r in t){var n=t[r];this.setUniform(r,n)}else this.setUniform(t,e)},get:function(t){var e=this.uniforms[t];if(e)return e.value},attachShader:function(t,e){var r=this.uniforms;this.uniforms=t.createUniforms(),this.shader=t;var n=this.uniforms;this._enabledUniforms=Object.keys(n),this._enabledUniforms.sort(),this._textureUniforms=this._enabledUniforms.filter(function(t){var e=this.uniforms[t].type;return"t"===e||"tv"===e},this);var i=this.vertexDefines,a=this.fragmentDefines;if(this.vertexDefines=Ne.clone(t.vertexDefines),this.fragmentDefines=Ne.clone(t.fragmentDefines),e){for(var o in r)n[o]&&(n[o].value=r[o].value);Ne.defaults(this.vertexDefines,i),Ne.defaults(this.fragmentDefines,a)}var s={};for(var u in t.textures)s[u]={shaderType:t.textures[u].shaderType,type:t.textures[u].type,enabled:!(!e||!this._textureStatus[u])&&this._textureStatus[u].enabled};this._textureStatus=s,this._programKey=""},clone:function(){var t=new this.constructor({name:this.name,shader:this.shader});for(var e in this.uniforms)t.uniforms[e].value=this.uniforms[e].value;return t.depthTest=this.depthTest,t.depthMask=this.depthMask,t.transparent=this.transparent,t.blend=this.blend,t.vertexDefines=Ne.clone(this.vertexDefines),t.fragmentDefines=Ne.clone(this.fragmentDefines),t.enableTexture(this.getEnabledTextures()),t.precision=this.precision,t},define:function(t,e,r){var n=this.vertexDefines,i=this.fragmentDefines;"vertex"!==t&&"fragment"!==t&&"both"!==t&&arguments.length<3&&(r=e,e=t,t="both"),r=null!=r?r:null,"vertex"!==t&&"both"!==t||n[e]!==r&&(n[e]=r,this._programKey=""),"fragment"!==t&&"both"!==t||i[e]!==r&&(i[e]=r,"both"!==t&&(this._programKey=""))},undefine:function(t,e){"vertex"!==t&&"fragment"!==t&&"both"!==t&&arguments.length<2&&(e=t,t="both"),"vertex"!==t&&"both"!==t||this.isDefined("vertex",e)&&(delete this.vertexDefines[e],this._programKey=""),"fragment"!==t&&"both"!==t||this.isDefined("fragment",e)&&(delete this.fragmentDefines[e],"both"!==t&&(this._programKey=""))},isDefined:function(t,e){switch(t){case"vertex":return void 0!==this.vertexDefines[e];case"fragment":return void 0!==this.fragmentDefines[e]}},getDefine:function(t,e){switch(t){case"vertex":return this.vertexDefines[e];case"fragment":return this.fragmentDefines[e]}},enableTexture:function(t){if(Array.isArray(t))for(var e=0;e=0)r.attributeSemantics[u]={symbol:a,type:c},h=!1;else if(Mr.indexOf(u)>=0){var f=!1,d=u;u.match(/TRANSPOSE$/)&&(f=!0,d=u.slice(0,-9)),r.matrixSemantics[u]={symbol:a,type:c,isTranspose:f,semanticNoTranspose:d},h=!1}else if(Nr.indexOf(u)>=0)r.uniformSemantics[u]={symbol:a,type:c},h=!1;else if("unconfigurable"===u)h=!1;else{if(!(l=r._parseDefaultValue(i,u)))throw new Error('Unkown semantic "'+u+'"');u=""}h&&(e[a]={type:c,value:o?wr.array:l||wr[i],semantic:u||null})}return["uniform",i,a,o].join(" ")+";\n"}}var e={},r=this,n="vertex";this._uniformList=[],this._vertexCode=this._vertexCode.replace(Er,t),n="fragment",this._fragmentCode=this._fragmentCode.replace(Er,t),r.matrixSemanticKeys=Object.keys(this.matrixSemantics),this.uniformTemplates=e},_parseDefaultValue:function(t,e){var r=/\[\s*(.*)\s*\]/;{if("vec2"!==t&&"vec3"!==t&&"vec4"!==t)return"bool"===t?function(){return"true"===e.toLowerCase()}:"float"===t?function(){return parseFloat(e)}:"int"===t?function(){return parseInt(e)}:void 0;var n=r.exec(e)[1];if(n){var i=n.split(/\s*,\s*/);return function(){return new He.Float32Array(i)}}}},_parseAttributes:function(){function t(t,n,i,a,o){if(n&&i){var s=1;switch(n){case"vec4":s=4;break;case"vec3":s=3;break;case"vec2":s=2;break;case"float":s=1}if(e[i]={type:"float",size:s,semantic:o||null},o){if(Cr.indexOf(o)<0)throw new Error('Unkown semantic "'+o+'"');r.attributeSemantics[o]={symbol:i,type:n}}}return["attribute",n,i].join(" ")+";\n"}var e={},r=this;this._vertexCode=this._vertexCode.replace(br,t),this.attributes=e},_parseDefines:function(){function t(t,n,i){var a="vertex"===r?e.vertexDefines:e.fragmentDefines -;return a[n]||(a[n]="false"!=i&&("true"==i||(i?isNaN(parseFloat(i))?i.trim():parseFloat(i):null))),""}var e=this,r="vertex";this._vertexCode=this._vertexCode.replace(Ar,t),r="fragment",this._fragmentCode=this._fragmentCode.replace(Ar,t)},clone:function(){var t=Lr[this._shaderID];return new Y(t.vertex,t.fragment)}},Object.defineProperty&&(Object.defineProperty(Y.prototype,"shaderID",{get:function(){return this._shaderID}}),Object.defineProperty(Y.prototype,"vertex",{get:function(){return this._vertexCode}}),Object.defineProperty(Y.prototype,"fragment",{get:function(){return this._fragmentCode}}),Object.defineProperty(Y.prototype,"uniforms",{get:function(){return this._uniformList}}));var Pr=/(@import)\s*([0-9a-zA-Z_\-\.]*)/g;Y.parseImport=function(t){return t=t.replace(Pr,function(t,e,r){var t=Y.source(r);return t?Y.parseImport(t):(console.error('Shader chunk "'+r+'" not existed in library'),"")})};var Dr=/(@export)\s*([0-9a-zA-Z_\-\.]*)\s*\n([\s\S]*?)@end/g;Y.import=function(t){t.replace(Dr,function(t,e,r,n){var n=n.replace(/(^[\s\t\xa0\u3000]+)|([\u3000\xa0\s\t]+\x24)/g,"");if(n){for(var i,a=r.split("."),o=Y.codes,s=0;s0&&this.setViewport(this._viewportStack.pop())},saveClear:function(){this._clearStack.push({clearBit:this.clearBit,clearColor:this.clearColor})},restoreClear:function(){if(this._clearStack.length>0){var t=this._clearStack.pop();this.clearColor=t.clearColor,this.clearBit=t.clearBit}},bindSceneRendering:function(t){this._sceneRendering=t},render:function(t,e,r,n){var i=this.gl,a=this.clearColor;if(this.clearBit){i.colorMask(!0,!0,!0,!0),i.depthMask(!0);var o=this.viewport,s=!1,u=o.devicePixelRatio;(o.width!==this._width||o.height!==this._height||u&&u!==this.devicePixelRatio||o.x||o.y)&&(s=!0,i.enable(i.SCISSOR_TEST),i.scissor(o.x*u,o.y*u,o.width*u,o.height*u)),i.clearColor(a[0],a[1],a[2],a[3]),i.clear(this.clearBit),s&&i.disable(i.SCISSOR_TEST)}if(r||t.update(!1),!(e=e||t.getMainCamera()))return void console.error("Can't find camera in the scene.");e.getScene()||e.update(!0),this._sceneRendering=t,t.viewBoundingBoxLastFrame.min.set(1/0,1/0,1/0),t.viewBoundingBoxLastFrame.max.set(-1/0,-1/0,-1/0);var l=this.cullRenderList(t.opaqueList,t,e),c=this.cullRenderList(t.transparentList,t,e),h=t.material;t.trigger("beforerender",this,t,e),n?(this.renderPreZ(l,t,e),i.depthFunc(i.LEQUAL)):i.depthFunc(i.LESS);for(var f=kr(),d=Ur.create(),m=0;m0){var s=t[i-1],u=s.joints?s.joints.length:0;if((a.joints.length?a.joints.length:0)===u&&a.material===s.material&&a.lightGroup===s.lightGroup){a.__program=s.__program;continue}}var l=this._programMgr.getProgram(a,o,e);this.validateProgram(l),a.__program=l}},cullRenderList:function(t,e,r){for(var n=[],i=0;i0&&t.min.array[2]<0&&(t.max.array[2]=-1e-20),t.applyProjection(e);var u=t.min.array,l=t.max.array;if(l[0]<-1||u[0]>1||l[1]<-1||u[1]>1||l[2]<-1||u[2]>1)return!0}return!1}}(),disposeScene:function(t){this.disposeNode(t,!0,!0),t.dispose()},disposeNode:function(t,e,r){t.getParent()&&t.getParent().remove(t),t.traverse(function(t){t.geometry&&e&&t.geometry.dispose(this),t.dispose&&t.dispose(this)},this)},disposeGeometry:function(t){t.dispose(this)},disposeTexture:function(t){t.dispose(this)},disposeFrameBuffer:function(t){t.dispose(this)},dispose:function(){},screenToNDC:function(t,e,r){r||(r=new me),e=this._height-e;var n=this.viewport,i=r.array;return i[0]=(t-n.x)/n.width,i[0]=2*i[0]-1,i[1]=(e-n.y)/n.height,i[1]=2*i[1]-1,r}});Gr.opaqueSortCompare=Gr.prototype.opaqueSortCompare=function(t,e){return t.renderOrder===e.renderOrder?t.__program===e.__program?t.material===e.material?t.geometry.__uid__-e.geometry.__uid__:t.material.__uid__-e.material.__uid__:t.__program&&e.__program?t.__program.__uid__-e.__program.__uid__:0:t.renderOrder-e.renderOrder},Gr.transparentSortCompare=Gr.prototype.transparentSortCompare=function(t,e){return t.renderOrder===e.renderOrder?t.__depth===e.__depth?t.__program===e.__program?t.material===e.material?t.geometry.__uid__-e.geometry.__uid__:t.material.__uid__-e.material.__uid__:t.__program&&e.__program?t.__program.__uid__-e.__program.__uid__:0:t.__depth-e.__depth:t.renderOrder-e.renderOrder};var Vr={IDENTITY:kr(),WORLD:kr(),VIEW:kr(),PROJECTION:kr(),WORLDVIEW:kr(),VIEWPROJECTION:kr(),WORLDVIEWPROJECTION:kr(),WORLDINVERSE:kr(),VIEWINVERSE:kr(),PROJECTIONINVERSE:kr(),WORLDVIEWINVERSE:kr(),VIEWPROJECTIONINVERSE:kr(),WORLDVIEWPROJECTIONINVERSE:kr(),WORLDTRANSPOSE:kr(),VIEWTRANSPOSE:kr(),PROJECTIONTRANSPOSE:kr(),WORLDVIEWTRANSPOSE:kr(),VIEWPROJECTIONTRANSPOSE:kr(),WORLDVIEWPROJECTIONTRANSPOSE:kr(),WORLDINVERSETRANSPOSE:kr(),VIEWINVERSETRANSPOSE:kr(),PROJECTIONINVERSETRANSPOSE:kr(),WORLDVIEWINVERSETRANSPOSE:kr(),VIEWPROJECTIONINVERSETRANSPOSE:kr(),WORLDVIEWPROJECTIONINVERSETRANSPOSE:kr()};Gr.COLOR_BUFFER_BIT=Fe.COLOR_BUFFER_BIT,Gr.DEPTH_BUFFER_BIT=Fe.DEPTH_BUFFER_BIT,Gr.STENCIL_BUFFER_BIT=Fe.STENCIL_BUFFER_BIT;var Wr=fe.quat,zr=function(t,e,r,n){t=t||0,e=e||0,r=r||0,n=void 0===n?1:n,this.array=Wr.fromValues(t,e,r,n),this._dirty=!0};zr.prototype={constructor:zr,add:function(t){return Wr.add(this.array,this.array,t.array),this._dirty=!0,this},calculateW:function(){return Wr.calculateW(this.array,this.array),this._dirty=!0,this},set:function(t,e,r,n){return this.array[0]=t,this.array[1]=e,this.array[2]=r,this.array[3]=n,this._dirty=!0,this},setArray:function(t){return this.array[0]=t[0],this.array[1]=t[1],this.array[2]=t[2],this.array[3]=t[3],this._dirty=!0,this},clone:function(){return new zr(this.x,this.y,this.z,this.w)},conjugate:function(){return Wr.conjugate(this.array,this.array),this._dirty=!0,this},copy:function(t){return Wr.copy(this.array,t.array),this._dirty=!0,this},dot:function(t){return Wr.dot(this.array,t.array)},fromMat3:function(t){return Wr.fromMat3(this.array,t.array),this._dirty=!0,this},fromMat4:function(){var t=fe.mat3,e=t.create();return function(r){return t.fromMat4(e,r.array),t.transpose(e,e),Wr.fromMat3(this.array,e),this._dirty=!0,this}}(),identity:function(){return Wr.identity(this.array),this._dirty=!0,this},invert:function(){return Wr.invert(this.array,this.array),this._dirty=!0,this},len:function(){return Wr.len(this.array)},length:function(){return Wr.length(this.array)},lerp:function(t,e,r){return Wr.lerp(this.array,t.array,e.array,r),this._dirty=!0,this},mul:function(t){return Wr.mul(this.array,this.array,t.array),this._dirty=!0,this},mulLeft:function(t){return Wr.multiply(this.array,t.array,this.array),this._dirty=!0,this},multiply:function(t){return Wr.multiply(this.array,this.array,t.array),this._dirty=!0,this},multiplyLeft:function(t){return Wr.multiply(this.array,t.array,this.array),this._dirty=!0,this},normalize:function(){return Wr.normalize(this.array,this.array),this._dirty=!0,this},rotateX:function(t){return Wr.rotateX(this.array,this.array,t),this._dirty=!0,this},rotateY:function(t){return Wr.rotateY(this.array,this.array,t),this._dirty=!0,this},rotateZ:function(t){return Wr.rotateZ(this.array,this.array,t),this._dirty=!0,this},rotationTo:function(t,e){return Wr.rotationTo(this.array,t.array,e.array),this._dirty=!0,this},setAxes:function(t,e,r){return Wr.setAxes(this.array,t.array,e.array,r.array),this._dirty=!0,this},setAxisAngle:function(t,e){return Wr.setAxisAngle(this.array,t.array,e),this._dirty=!0,this},slerp:function(t,e,r){return Wr.slerp(this.array,t.array,e.array,r),this._dirty=!0,this},sqrLen:function(){return Wr.sqrLen(this.array)},squaredLength:function(){return Wr.squaredLength(this.array)},fromEuler:function(t,e){return zr.fromEuler(this,t,e)},toString:function(){return"["+Array.prototype.join.call(this.array,",")+"]"},toArray:function(){return Array.prototype.slice.call(this.array)}};var Xr=Object.defineProperty;if(Xr){var jr=zr.prototype;Xr(jr,"x",{get:function(){return this.array[0]},set:function(t){this.array[0]=t,this._dirty=!0}}),Xr(jr,"y",{get:function(){return this.array[1]},set:function(t){this.array[1]=t,this._dirty=!0}}),Xr(jr,"z",{get:function(){return this.array[2]},set:function(t){this.array[2]=t,this._dirty=!0}}),Xr(jr,"w",{get:function(){return this.array[3]},set:function(t){this.array[3]=t,this._dirty=!0}})}zr.add=function(t,e,r){return Wr.add(t.array,e.array,r.array),t._dirty=!0,t},zr.set=function(t,e,r,n,i){Wr.set(t.array,e,r,n,i),t._dirty=!0},zr.copy=function(t,e){return Wr.copy(t.array,e.array),t._dirty=!0,t},zr.calculateW=function(t,e){return Wr.calculateW(t.array,e.array),t._dirty=!0,t},zr.conjugate=function(t,e){return Wr.conjugate(t.array,e.array),t._dirty=!0,t},zr.identity=function(t){return Wr.identity(t.array),t._dirty=!0,t},zr.invert=function(t,e){return Wr.invert(t.array,e.array),t._dirty=!0,t},zr.dot=function(t,e){return Wr.dot(t.array,e.array)},zr.len=function(t){return Wr.length(t.array)},zr.lerp=function(t,e,r,n){return Wr.lerp(t.array,e.array,r.array,n),t._dirty=!0,t},zr.slerp=function(t,e,r,n){return Wr.slerp(t.array,e.array,r.array,n),t._dirty=!0,t},zr.mul=function(t,e,r){return Wr.multiply(t.array,e.array,r.array),t._dirty=!0,t},zr.multiply=zr.mul,zr.rotateX=function(t,e,r){return Wr.rotateX(t.array,e.array,r),t._dirty=!0,t},zr.rotateY=function(t,e,r){return Wr.rotateY(t.array,e.array,r),t._dirty=!0,t},zr.rotateZ=function(t,e,r){return Wr.rotateZ(t.array,e.array,r),t._dirty=!0,t},zr.setAxisAngle=function(t,e,r){return Wr.setAxisAngle(t.array,e.array,r),t._dirty=!0,t},zr.normalize=function(t,e){return Wr.normalize(t.array,e.array),t._dirty=!0,t},zr.sqrLen=function(t){return Wr.sqrLen(t.array)},zr.squaredLength=zr.sqrLen,zr.fromMat3=function(t,e){return Wr.fromMat3(t.array,e.array),t._dirty=!0,t},zr.setAxes=function(t,e,r,n){return Wr.setAxes(t.array,e.array,r.array,n.array),t._dirty=!0,t},zr.rotationTo=function(t,e,r){return Wr.rotationTo(t.array,e.array,r.array),t._dirty=!0,t},zr.fromEuler=function(t,e,r){t._dirty=!0,e=e.array;var n=t.array,i=Math.cos(e[0]/2),a=Math.cos(e[1]/2),o=Math.cos(e[2]/2),s=Math.sin(e[0]/2),u=Math.sin(e[1]/2),l=Math.sin(e[2]/2),r=(r||"XYZ").toUpperCase();switch(r){case"XYZ":n[0]=s*a*o+i*u*l,n[1]=i*u*o-s*a*l,n[2]=i*a*l+s*u*o,n[3]=i*a*o-s*u*l;break;case"YXZ":n[0]=s*a*o+i*u*l,n[1]=i*u*o-s*a*l,n[2]=i*a*l-s*u*o,n[3]=i*a*o+s*u*l;break;case"ZXY":n[0]=s*a*o-i*u*l,n[1]=i*u*o+s*a*l,n[2]=i*a*l+s*u*o,n[3]=i*a*o-s*u*l;break;case"ZYX":n[0]=s*a*o-i*u*l,n[1]=i*u*o+s*a*l,n[2]=i*a*l-s*u*o,n[3]=i*a*o+s*u*l;break;case"YZX":n[0]=s*a*o+i*u*l,n[1]=i*u*o+s*a*l,n[2]=i*a*l-s*u*o,n[3]=i*a*o-s*u*l;break;case"XZY":n[0]=s*a*o-i*u*l,n[1]=i*u*o-s*a*l,n[2]=i*a*l+s*u*o,n[3]=i*a*o+s*u*l}};var qr=fe.mat4,Yr=0,Kr=Me.extend({name:"",position:null,rotation:null,scale:null,worldTransform:null,localTransform:null,autoUpdateLocalTransform:!0,_parent:null,_scene:null,_needsUpdateWorldTransform:!0,_inIterating:!1,__depth:0},function(){this.name||(this.name=(this.type||"NODE")+"_"+Yr++),this.position||(this.position=new Ve),this.rotation||(this.rotation=new zr),this.scale||(this.scale=new Ve(1,1,1)),this.worldTransform=new rr,this.localTransform=new rr,this._children=[]},{target:null,invisible:!1,isSkinnedMesh:function(){return!1},isRenderable:function(){return!1},setName:function(t){var e=this._scene;if(e){var r=e._nodeRepository;delete r[this.name],r[t]=this}this.name=t},add:function(t){this._inIterating&&console.warn("Add operation can cause unpredictable error when in iterating");var e=t._parent;if(e!==this){e&&e.remove(t),t._parent=this,this._children.push(t);var r=this._scene;r&&r!==t.scene&&t.traverse(this._addSelfToScene,this),t._needsUpdateWorldTransform=!0}},remove:function(t){this._inIterating&&console.warn("Remove operation can cause unpredictable error when in iterating");var e=this._children,r=e.indexOf(t);r<0||(e.splice(r,1),t._parent=null,this._scene&&t.traverse(this._removeSelfFromScene,this))},removeAll:function(){for(var t=this._children,e=0;ethis.distance,i=1;i<8;i++)if(Jr.dot(e[i].array,r)>this.distance!=n)return!0},intersectLine:function(){var t=Jr.create();return function(e,r,n){var i=this.distanceToPoint(e),a=this.distanceToPoint(r);if(i>0&&a>0||i<0&&a<0)return null;var o=this.normal.array,s=this.distance,u=e.array;Jr.sub(t,r.array,e.array),Jr.normalize(t,t);var l=Jr.dot(o,t);if(0===l)return null;n||(n=new Ve);var c=(Jr.dot(o,u)-s)/l;return Jr.scaleAndAdd(n.array,u,t,-c),n._dirty=!0,n}}(),applyTransform:function(){var t=Qr.create(),e=$r.create(),r=$r.create();return r[3]=1,function(n){n=n.array,Jr.scale(r,this.normal.array,this.distance),$r.transformMat4(r,r,n),this.distance=Jr.dot(r,this.normal.array),Qr.invert(t,n),Qr.transpose(t,t),e[3]=0,Jr.copy(e,this.normal.array),$r.transformMat4(e,e,t),Jr.copy(this.normal.array,e)}}(),copy:function(t){Jr.copy(this.normal.array,t.normal.array),this.normal._dirty=!0,this.distance=t.distance},clone:function(){var t=new tn;return t.copy(this),t}};var en=fe.vec3,rn=en.set,nn=en.copy,an=en.transformMat4,on=Math.min,sn=Math.max,un=function(){this.planes=[];for(var t=0;t<6;t++)this.planes.push(new tn);this.boundingBox=new Je,this.vertices=[];for(var t=0;t<8;t++)this.vertices[t]=en.fromValues(0,0,0)};un.prototype={setFromProjection:function(t){var e=this.planes,r=t.array,n=r[0],i=r[1],a=r[2],o=r[3],s=r[4],u=r[5],l=r[6],c=r[7],h=r[8],f=r[9],d=r[10],m=r[11],p=r[12],_=r[13],g=r[14],v=r[15];rn(e[0].normal.array,o-n,c-s,m-h),e[0].distance=-(v-p),e[0].normalize(),rn(e[1].normal.array,o+n,c+s,m+h),e[1].distance=-(v+p),e[1].normalize(),rn(e[2].normal.array,o+i,c+u,m+f),e[2].distance=-(v+_),e[2].normalize(),rn(e[3].normal.array,o-i,c-u,m-f),e[3].distance=-(v-_),e[3].normalize(),rn(e[4].normal.array,o-a,c-l,m-d),e[4].distance=-(v-g),e[4].normalize(),rn(e[5].normal.array,o+a,c+l,m+d),e[5].distance=-(v+g),e[5].normalize();var y=this.boundingBox;if(0===v){var x=u/n,T=-g/(d-1),E=-g/(d+1),b=-E/u,A=-T/u;y.min.set(-b*x,-b,E),y.max.set(b*x,b,T);var S=this.vertices;rn(S[0],-b*x,-b,E),rn(S[1],-b*x,b,E),rn(S[2],b*x,-b,E),rn(S[3],b*x,b,E),rn(S[4],-A*x,-A,T),rn(S[5],-A*x,A,T),rn(S[6],A*x,-A,T),rn(S[7],A*x,A,T)}else{var w=(-1-p)/n,C=(1-p)/n,N=(1-_)/u,M=(-1-_)/u,R=(-1-g)/d,L=(1-g)/d;y.min.set(Math.min(w,C),Math.min(M,N),Math.min(L,R)),y.max.set(Math.max(C,w),Math.max(N,M),Math.max(R,L));var P=y.min.array,D=y.max.array,S=this.vertices;rn(S[0],P[0],P[1],P[2]),rn(S[1],P[0],D[1],P[2]),rn(S[2],D[0],P[1],P[2]),rn(S[3],D[0],D[1],P[2]),rn(S[4],P[0],P[1],D[2]),rn(S[5],P[0],D[1],D[2]),rn(S[6],D[0],P[1],D[2]),rn(S[7],D[0],D[1],D[2])}},getTransformedBoundingBox:function(){var t=en.create();return function(e,r){var n=this.vertices,i=r.array,a=e.min,o=e.max,s=a.array,u=o.array,l=n[0];an(t,l,i),nn(s,t),nn(u,t);for(var c=1;c<8;c++)l=n[c],an(t,l,i),s[0]=on(t[0],s[0]),s[1]=on(t[1],s[1]),s[2]=on(t[2],s[2]),u[0]=sn(t[0],u[0]),u[1]=sn(t[1],u[1]),u[2]=sn(t[2],u[2]);return a._dirty=!0,o._dirty=!0,e}}()};var ln=fe.vec3,cn=function(t,e){this.origin=t||new Ve,this.direction=e||new Ve};cn.prototype={constructor:cn,intersectPlane:function(t,e){var r=t.normal.array,n=t.distance,i=this.origin.array,a=this.direction.array,o=ln.dot(r,a);if(0===o)return null;e||(e=new Ve);var s=(ln.dot(r,i)-n)/o;return ln.scaleAndAdd(e.array,i,a,-s),e._dirty=!0,e},mirrorAgainstPlane:function(t){var e=ln.dot(t.normal.array,this.direction.array);ln.scaleAndAdd(this.direction.array,this.direction.array,t.normal.array,2*-e),this.direction._dirty=!0},distanceToPoint:function(){var t=ln.create();return function(e){ln.sub(t,e,this.origin.array);var r=ln.dot(t,this.direction.array);if(r<0)return ln.distance(this.origin.array,e);var n=ln.lenSquared(t);return Math.sqrt(n-r*r)}}(),intersectSphere:function(){var t=ln.create();return function(e,r,n){var i=this.origin.array,a=this.direction.array;e=e.array,ln.sub(t,e,i);var o=ln.dot(t,a),s=ln.squaredLength(t),u=s-o*o,l=r*r;if(!(u>l)){var c=Math.sqrt(l-u),h=o-c,f=o+c;return n||(n=new Ve),h<0?f<0?null:(ln.scaleAndAdd(n.array,i,a,f),n):(ln.scaleAndAdd(n.array,i,a,h),n)}}}(),intersectBoundingBox:function(t,e){var r,n,i,a,o,s,u=this.direction.array,l=this.origin.array,c=t.min.array,h=t.max.array,f=1/u[0],d=1/u[1],m=1/u[2];if(f>=0?(r=(c[0]-l[0])*f,n=(h[0]-l[0])*f):(n=(c[0]-l[0])*f,r=(h[0]-l[0])*f),d>=0?(i=(c[1]-l[1])*d,a=(h[1]-l[1])*d):(a=(c[1]-l[1])*d,i=(h[1]-l[1])*d),r>a||i>n)return null;if((i>r||r!==r)&&(r=i),(a=0?(o=(c[2]-l[2])*m,s=(h[2]-l[2])*m):(s=(c[2]-l[2])*m,o=(h[2]-l[2])*m),r>s||o>n)return null;if((o>r||r!==r)&&(r=o),(s=0?r:n;return e||(e=new Ve),ln.scaleAndAdd(e.array,l,u,p),e},intersectTriangle:function(){var t=ln.create(),e=ln.create(),r=ln.create(),n=ln.create();return function(i,a,o,s,u,l){var c=this.direction.array,h=this.origin.array;i=i.array,a=a.array,o=o.array,ln.sub(t,a,i),ln.sub(e,o,i),ln.cross(n,e,c);var f=ln.dot(t,n);if(s){if(f>-1e-5)return null}else if(f>-1e-5&&f<1e-5)return null;ln.sub(r,h,i);var d=ln.dot(n,r)/f;if(d<0||d>1)return null;ln.cross(n,t,r);var m=ln.dot(c,n)/f;if(m<0||m>1||d+m>1)return null;ln.cross(n,t,e) -;var p=-ln.dot(r,n)/f;return p<0?null:(u||(u=new Ve),l&&Ve.set(l,1-d-m,d,m),ln.scaleAndAdd(u.array,h,c,p),u)}}(),applyTransform:function(t){Ve.add(this.direction,this.direction,this.origin),Ve.transformMat4(this.origin,this.origin,t),Ve.transformMat4(this.direction,this.direction,t),Ve.sub(this.direction,this.direction,this.origin),Ve.normalize(this.direction,this.direction)},copy:function(t){Ve.copy(this.origin,t.origin),Ve.copy(this.direction,t.direction)},clone:function(){var t=new cn;return t.copy(this),t}};var hn=fe.vec3,fn=fe.vec4,dn=Kr.extend(function(){return{projectionMatrix:new rr,invProjectionMatrix:new rr,viewMatrix:new rr,frustum:new un}},function(){this.update(!0)},{update:function(t){Kr.prototype.update.call(this,t),rr.invert(this.viewMatrix,this.worldTransform),this.updateProjectionMatrix(),rr.invert(this.invProjectionMatrix,this.projectionMatrix),this.frustum.setFromProjection(this.projectionMatrix)},setViewMatrix:function(t){rr.copy(this.viewMatrix,t),rr.invert(this.worldTransform,t),this.decomposeWorldTransform()},decomposeProjectionMatrix:function(){},setProjectionMatrix:function(t){rr.copy(this.projectionMatrix,t),rr.invert(this.invProjectionMatrix,t),this.decomposeProjectionMatrix()},updateProjectionMatrix:function(){},castRay:function(){var t=fn.create();return function(e,r){var n=void 0!==r?r:new cn,i=e.array[0],a=e.array[1];return fn.set(t,i,a,-1,1),fn.transformMat4(t,t,this.invProjectionMatrix.array),fn.transformMat4(t,t,this.worldTransform.array),hn.scale(n.origin.array,t,1/t[3]),fn.set(t,i,a,1,1),fn.transformMat4(t,t,this.invProjectionMatrix.array),fn.transformMat4(t,t,this.worldTransform.array),hn.scale(t,t,1/t[3]),hn.sub(n.direction.array,t,n.origin.array),hn.normalize(n.direction.array,n.direction.array),n.direction._dirty=!0,n.origin._dirty=!0,n}}()}),mn={},pn=Kr.extend(function(){return{material:null,autoUpdate:!0,opaqueList:[],transparentList:[],lights:[],viewBoundingBoxLastFrame:new Je,shadowUniforms:{},_cameraList:[],_lightUniforms:{},_previousLightNumber:{},_lightNumber:{},_lightProgramKeys:{},_opaqueObjectCount:0,_transparentObjectCount:0,_nodeRepository:{}}},function(){this._scene=this},{addToScene:function(t){t instanceof dn&&(this._cameraList.length>0&&console.warn("Found multiple camera in one scene. Use the fist one."),this._cameraList.push(t)),t.name&&(this._nodeRepository[t.name]=t)},removeFromScene:function(t){if(t instanceof dn){var e=this._cameraList.indexOf(t);e>=0&&this._cameraList.splice(e,1)}t.name&&delete this._nodeRepository[t.name]},getNode:function(t){return this._nodeRepository[t]},cloneNode:function(t){var e=t.clone(),r={},n=function(i,a){i.skeleton&&(a.skeleton=i.skeleton.clone(t,e),a.joints=i.joints.slice()),i.material&&(r[i.material.__uid__]={oldMat:i.material});for(var o=0;o0&&this._updateRenderList(n)}},_updateLightUniforms:function(){var t=this.lights;t.sort(Q);var e=this._lightUniforms;for(var r in e)for(var n in e[r])e[r][n].value.length=0;for(var i=0;ia[0]&&(a[0]=s),u>a[1]&&(a[1]=u),l>a[2]&&(a[2]=l)}r._dirty=!0,n._dirty=!0}},dirty:function(){for(var t=this.getEnabledAttributes(),e=0;e=0){e||(e=vn());var r=this.indices;return e[0]=r[3*t],e[1]=r[3*t+1],e[2]=r[3*t+2],e}},setTriangleIndices:function(t,e){var r=this.indices;r[3*t]=e[0],r[3*t+1]=e[1],r[3*t+2]=e[2]},isUseIndices:function(){return!!this.indices},initIndicesFromArray:function(t){var e,r=this.vertexCount>65535?He.Uint32Array:He.Uint16Array;if(t[0]&&t[0].length){var n=0;e=new r(3*t.length);for(var i=0;i=0&&(e.splice(r,1),delete this.attributes[t],!0)},getAttribute:function(t){return this.attributes[t]},getEnabledAttributes:function(){var t=this._enabledAttributes,e=this._attributeList;if(t)return t;for(var r=[],n=this.vertexCount,i=0;i65535&&(this.indices=new He.Uint32Array(this.indices));for(var t=this.attributes,e=this.indices,r=this.getEnabledAttributes(),n={},i=0;i65535?Uint32Array:Uint16Array,m=this.indices=new d(e*t*6),p=this.radius,_=this.phiStart,g=this.phiLength,v=this.thetaStart,y=this.thetaLength,p=this.radius,x=[],T=[],E=0,b=1/p;for(f=0;f<=t;f++)for(h=0;h<=e;h++)l=h/e,c=f/t,o=-p*Math.cos(_+l*g)*Math.sin(v+c*y),s=p*Math.cos(v+c*y),u=p*Math.sin(_+l*g)*Math.sin(v+c*y),x[0]=o,x[1]=s,x[2]=u,T[0]=l,T[1]=c,r.set(E,x),n.set(E,T),x[0]*=b,x[1]*=b,x[2]*=b,i.set(E,x),E++;var A,S,w,C,N=e+1,M=0;for(f=0;f>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,++t},wn.nearestPowerOfTwo=function(t){return Math.pow(2,Math.round(Math.log(t)/Math.LN2))};var Cn=wn.isPowerOfTwo,Nn=or.extend(function(){return{image:null,pixels:null,mipmaps:[]}},{update:function(t){var e=t.gl;e.bindTexture(e.TEXTURE_2D,this._cache.get("webgl_texture")),this.updateCommon(t);var r=this.format,n=this.type;e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,this.getAvailableWrapS()),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,this.getAvailableWrapT()),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,this.getAvailableMagFilter()),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,this.getAvailableMinFilter());var i=t.getGLExtension("EXT_texture_filter_anisotropic");if(i&&this.anisotropic>1&&e.texParameterf(e.TEXTURE_2D,i.TEXTURE_MAX_ANISOTROPY_EXT,this.anisotropic),36193===n){t.getGLExtension("OES_texture_half_float")||(n=Fe.FLOAT)}if(this.mipmaps.length)for(var a=this.width,o=this.height,s=0;s=or.COMPRESSED_RGB_S3TC_DXT1_EXT?t.compressedTexImage2D(t.TEXTURE_2D,r,a,n,i,0,e.pixels):t.texImage2D(t.TEXTURE_2D,r,a,n,i,0,a,o,e.pixels)},generateMipmap:function(t){var e=t.gl;this.useMipmap&&!this.NPOT&&(e.bindTexture(e.TEXTURE_2D,this._cache.get("webgl_texture")),e.generateMipmap(e.TEXTURE_2D))},isPowerOfTwo:function(){var t,e;return this.image?(t=this.image.width,e=this.image.height):(t=this.width,e=this.height),Cn(t)&&Cn(e)},isRenderable:function(){return this.image?"CANVAS"===this.image.nodeName||"VIDEO"===this.image.nodeName||this.image.complete:!(!this.width||!this.height)},bind:function(t){t.gl.bindTexture(t.gl.TEXTURE_2D,this.getWebGLTexture(t))},unbind:function(t){t.gl.bindTexture(t.gl.TEXTURE_2D,null)},load:function(t,e){var r=new Image;e&&(r.crossOrigin=e);var n=this;return r.onload=function(){n.dirty(),n.trigger("success",n),r.onload=null},r.onerror=function(){n.trigger("error",n),r.onerror=null},r.src=t,this.image=r,this}});Object.defineProperty(Nn.prototype,"width",{get:function(){return this.image?this.image.width:this._width},set:function(t){this.image?console.warn("Texture from image can't set width"):(this._width!==t&&this.dirty(),this._width=t)}}),Object.defineProperty(Nn.prototype,"height",{get:function(){return this.image?this.image.height:this._height},set:function(t){this.image?console.warn("Texture from image can't set height"):(this._height!==t&&this.dirty(),this._height=t)}});var Mn={};at.prototype.get=function(t){var e=t;if(this._pool[e])return this._pool[e];var r=Mn[t];if(!r)return void console.error('Shader "'+t+'" is not in the library');var n=new Y(r.vertex,r.fragment);return this._pool[e]=n,n},at.prototype.clear=function(){this._pool={}};var Rn,Ln=new at,Pn={createLibrary:function(){return new at},get:function(){return Ln.get.apply(Ln,arguments)},template:ot,clear:function(){return Ln.clear()}},Dn=0,In=null,On=!0,Bn=function(){this.triangleCount=0,this.vertexCount=0,this.drawCallCount=0},Fn=Kr.extend({material:null,geometry:null,mode:Fe.TRIANGLES,_drawCache:null,_renderInfo:null},function(){this._drawCache={},this._renderInfo=new Bn},{__program:null,lightGroup:0,renderOrder:0,lineWidth:1,culling:!0,cullFace:Fe.BACK,frontFace:Fe.CCW,frustumCulling:!0,receiveShadow:!0,castShadow:!0,ignorePicking:!1,ignorePreZ:!1,ignoreGBuffer:!1,isRenderable:function(){return this.geometry&&this.material&&this.material.shader&&!this.invisible&&this.geometry.vertexCount>0},beforeRender:function(t){},afterRender:function(t,e){},getBoundingBox:function(t,e){return e=Kr.prototype.getBoundingBox.call(this,t,e),this.geometry&&this.geometry.boundingBox&&e.union(this.geometry.boundingBox),e},render:function(t,e,r){var n=t.gl;e=e||this.material;var i=e.shader,a=this.geometry,o=this.mode,s=a.vertexCount,u=(a.isUseIndices(),t.getGLExtension("OES_element_index_uint")),l=u&&s>65535,c=l?n.UNSIGNED_INT:n.UNSIGNED_SHORT,h=t.getGLExtension("OES_vertex_array_object"),f=!a.dynamic,d=this._renderInfo;d.vertexCount=s,d.triangleCount=0,d.drawCallCount=0;var m=!1;if(Rn=t.__uid__+"-"+a.__uid__+"-"+r.__uid__,Rn!==Dn?m=!0:(h&&f||a._cache.isDirty("any"))&&(m=!0),Dn=Rn,m){var p=this._drawCache[Rn];if(!p){var _=a.getBufferChunks(t);if(!_)return;p=[];for(var g=0;g<_.length;g++){for(var v=_[g],y=v.attributeBuffers,x=v.indicesBuffer,T=[],E=[],b=0;b0)},render:function(t,e,r){var n=t.gl;if(this.skeleton){this.skeleton.update();var i=this.skeleton.getSubSkinMatrices(this.__uid__,this.joints);r.setUniformOfSemantic(n,"SKIN_MATRIX",i)}return Fn.prototype.render.call(this,t,e,r)},getSkinMatricesTexture:function(){return this._skinMatricesTexture=this._skinMatricesTexture||new Nn({type:Fe.FLOAT,minFilter:Fe.NEAREST,magFilter:Fe.NEAREST,useMipmap:!1,flipY:!1}),this._skinMatricesTexture}});Un.POINTS=Fe.POINTS,Un.LINES=Fe.LINES,Un.LINE_LOOP=Fe.LINE_LOOP,Un.LINE_STRIP=Fe.LINE_STRIP,Un.TRIANGLES=Fe.TRIANGLES,Un.TRIANGLE_STRIP=Fe.TRIANGLE_STRIP,Un.TRIANGLE_FAN=Fe.TRIANGLE_FAN,Un.BACK=Fe.BACK,Un.FRONT=Fe.FRONT,Un.FRONT_AND_BACK=Fe.FRONT_AND_BACK,Un.CW=Fe.CW,Un.CCW=Fe.CCW;var kn=dn.extend({fov:50,aspect:1,near:.1,far:2e3},{updateProjectionMatrix:function(){var t=this.fov/180*Math.PI;this.projectionMatrix.perspective(t,this.aspect,this.near,this.far)},decomposeProjectionMatrix:function(){var t=this.projectionMatrix.array,e=2*Math.atan(1/t[5]);this.fov=e/Math.PI*180,this.aspect=t[5]/t[0],this.near=t[14]/(t[10]-1),this.far=t[14]/(t[10]+1)},clone:function(){var t=dn.prototype.clone.call(this);return t.fov=this.fov,t.aspect=this.aspect,t.near=this.near,t.far=this.far,t}}),Hn=dn.extend({left:-1,right:1,near:-1,far:1,top:1,bottom:-1},{updateProjectionMatrix:function(){this.projectionMatrix.ortho(this.left,this.right,this.bottom,this.top,this.near,this.far)},decomposeProjectionMatrix:function(){var t=this.projectionMatrix.array;this.left=(-1-t[12])/t[0],this.right=(1-t[12])/t[0],this.top=(1-t[13])/t[5],this.bottom=(-1-t[13])/t[5],this.near=-(-1-t[14])/t[10],this.far=-(1-t[14])/t[10]},clone:function(){var t=dn.prototype.clone.call(this);return t.left=this.left,t.right=this.right,t.near=this.near,t.far=this.far,t.top=this.top,t.bottom=this.bottom,t}}),Gn={get:ut -},Vn="\n@export clay.standard.vertex\n#define SHADER_NAME standard\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#if defined(AOMAP_ENABLED)\nattribute vec2 texcoord2 : TEXCOORD_1;\n#endif\nattribute vec3 normal : NORMAL;\nattribute vec4 tangent : TANGENT;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#if defined(AOMAP_ENABLED)\nvarying vec2 v_Texcoord2;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n v_Barycentric = barycentric;\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n#if defined(AOMAP_ENABLED)\n v_Texcoord2 = texcoord2;\n#endif\n}\n@end\n@export clay.standard.fragment\n#define PI 3.14159265358979\n#define GLOSSINESS_CHANNEL 0\n#define ROUGHNESS_CHANNEL 0\n#define METALNESS_CHANNEL 1\nuniform mat4 viewInverse : VIEWINVERSE;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\nuniform sampler2D diffuseMap;\n#endif\n#ifdef SPECULARMAP_ENABLED\nuniform sampler2D specularMap;\n#endif\n#ifdef USE_ROUGHNESS\nuniform float roughness : 0.5;\n #ifdef ROUGHNESSMAP_ENABLED\nuniform sampler2D roughnessMap;\n #endif\n#else\nuniform float glossiness: 0.5;\n #ifdef GLOSSINESSMAP_ENABLED\nuniform sampler2D glossinessMap;\n #endif\n#endif\n#ifdef METALNESSMAP_ENABLED\nuniform sampler2D metalnessMap;\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\nuniform samplerCube environmentMap;\n #ifdef PARALLAX_CORRECTED\nuniform vec3 environmentBoxMin;\nuniform vec3 environmentBoxMax;\n #endif\n#endif\n#ifdef BRDFLOOKUP_ENABLED\nuniform sampler2D brdfLookup;\n#endif\n#ifdef EMISSIVEMAP_ENABLED\nuniform sampler2D emissiveMap;\n#endif\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n#ifdef AOMAP_ENABLED\nuniform sampler2D aoMap;\nuniform float aoIntensity;\nvarying vec2 v_Texcoord2;\n#endif\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef USE_METALNESS\nuniform float metalness : 0.0;\n#else\nuniform vec3 specularColor : [0.1, 0.1, 0.1];\n#endif\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float emissionIntensity: 1;\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef ENVIRONMENTMAP_PREFILTER\nuniform float maxMipmapLevel: 5;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.plugin.compute_shadow_map\n@import clay.util.parallax_correct\n@import clay.util.ACES\nfloat G_Smith(float g, float ndv, float ndl)\n{\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(float g, float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (PI * tmp * tmp);\n}\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\nuniform float parallaxOcclusionScale : 0.02;\nuniform float parallaxMaxLayers : 20;\nuniform float parallaxMinLayers : 5;\nuniform sampler2D parallaxOcclusionMap;\nmat3 transpose(in mat3 inMat)\n{\n vec3 i0 = inMat[0];\n vec3 i1 = inMat[1];\n vec3 i2 = inMat[2];\n return mat3(\n vec3(i0.x, i1.x, i2.x),\n vec3(i0.y, i1.y, i2.y),\n vec3(i0.z, i1.z, i2.z)\n );\n}\nvec2 parallaxUv(vec2 uv, vec3 viewDir)\n{\n float numLayers = mix(parallaxMaxLayers, parallaxMinLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));\n float layerHeight = 1.0 / numLayers;\n float curLayerHeight = 0.0;\n vec2 deltaUv = viewDir.xy * parallaxOcclusionScale / (viewDir.z * numLayers);\n vec2 curUv = uv;\n float height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n for (int i = 0; i < 30; i++) {\n curLayerHeight += layerHeight;\n curUv -= deltaUv;\n height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n if (height < curLayerHeight) {\n break;\n }\n }\n vec2 prevUv = curUv + deltaUv;\n float next = height - curLayerHeight;\n float prev = 1.0 - texture2D(parallaxOcclusionMap, prevUv).r - curLayerHeight + layerHeight;\n return mix(curUv, prevUv, next / (next - prev));\n}\n#endif\nvoid main() {\n vec4 albedoColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n albedoColor *= v_Color;\n#endif\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n vec2 uv = v_Texcoord;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n#endif\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\n uv = parallaxUv(v_Texcoord, normalize(transpose(tbn) * -V));\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 texel = texture2D(diffuseMap, uv);\n #ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n #endif\n albedoColor.rgb *= texel.rgb;\n #ifdef DIFFUSEMAP_ALPHA_ALPHA\n albedoColor.a *= texel.a;\n #endif\n#endif\n#ifdef USE_METALNESS\n float m = metalness;\n #ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, uv)[METALNESS_CHANNEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n #endif\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 spec = mix(vec3(0.04), baseColor, m);\n#else\n vec3 spec = specularColor;\n#endif\n#ifdef USE_ROUGHNESS\n float g = 1.0 - roughness;\n #ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, uv)[ROUGHNESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#else\n float g = glossiness;\n #ifdef GLOSSINESSMAP_ENABLED\n float g2 = texture2D(glossinessMap, uv)[GLOSSINESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#endif\n#ifdef SPECULARMAP_ENABLED\n spec *= sRGBToLinear(texture2D(specularMap, uv)).rgb;\n#endif\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, uv).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n tbn[1] = -tbn[1];\n N = normalize(tbn * N);\n }\n }\n#endif\n vec3 diffuseTerm = vec3(0.0, 0.0, 0.0);\n vec3 specularTerm = vec3(0.0, 0.0, 0.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, spec);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_];\n }}\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_COUNT; _idx_++)\n {{\n vec3 lightPosition = pointLightPosition[_idx_];\n vec3 lc = pointLightColor[_idx_];\n float range = pointLightRange[_idx_];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsPoint[_idx_];\n }\n#endif\n vec3 li = lc * ndl * attenuation * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -normalize(directionalLightDirection[_idx_]);\n vec3 lc = directionalLightColor[_idx_];\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n vec3 li = lc * ndl * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = spotLightPosition[i];\n vec3 spotLightDirection = -normalize(spotLightDirection[i]);\n vec3 lc = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n float c = dot(spotLightDirection, L);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n vec3 li = lc * attenuation * (1.0 - falloff) * shadowContrib * ndl;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }\n#endif\n vec4 outColor = albedoColor;\n outColor.rgb *= diffuseTerm;\n outColor.rgb += specularTerm;\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = spec * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 51.5);\n outColor.rgb += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2;\n }}\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\n vec3 envWeight = g * fresnelTerm;\n vec3 L = reflect(-V, N);\n #ifdef PARALLAX_CORRECTED\n L = parallaxCorrect(L, v_WorldPosition, environmentBoxMin, environmentBoxMax);\n #endif\n #ifdef ENVIRONMENTMAP_PREFILTER\n float rough = clamp(1.0 - g, 0.0, 1.0);\n float bias = rough * maxMipmapLevel;\n vec3 envTexel = decodeHDR(textureCubeLodEXT(environmentMap, L, bias)).rgb;\n #ifdef BRDFLOOKUP_ENABLED\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n envWeight = spec * brdfParam.x + brdfParam.y;\n #endif\n #else\n vec3 envTexel = textureCube(environmentMap, L).xyz;\n #endif\n outColor.rgb += envTexel * envWeight;\n#endif\n float aoFactor = 1.0;\n#ifdef SSAOMAP_ENABLED\n aoFactor = min(texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r, aoFactor);\n#endif\n#ifdef AOMAP_ENABLED\n aoFactor = min(1.0 - clamp((1.0 - texture2D(aoMap, v_Texcoord2).r) * aoIntensity, 0.0, 1.0), aoFactor);\n#endif\n outColor.rgb *= aoFactor;\n vec3 lEmission = emission;\n#ifdef EMISSIVEMAP_ENABLED\n lEmission *= texture2D(emissiveMap, uv).rgb;\n#endif\n outColor.rgb += lEmission * emissionIntensity;\n#ifdef GAMMA_ENCODE\n outColor.rgb = pow(outColor.rgb, vec3(1 / 2.2));\n#endif\n if(lineWidth > 0.)\n {\n outColor.rgb = mix(outColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (outColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n outColor.rgb = ACESToneMapping(outColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n outColor = linearTosRGB(outColor);\n#endif\n gl_FragColor = encodeHDR(outColor);\n}\n@end\n@export clay.standardMR.vertex\n@import clay.standard.vertex\n@end\n@export clay.standardMR.fragment\n#define USE_METALNESS\n#define USE_ROUGHNESS\n@import clay.standard.fragment\n@end";Y.import(Vn);var Wn,zn=["diffuseMap","normalMap","roughnessMap","metalnessMap","emissiveMap","environmentMap","brdfLookup","ssaoMap","aoMap"],Xn=["color","emission","emissionIntensity","alpha","roughness","metalness","uvRepeat","uvOffset","aoIntensity","alphaCutoff"],jn=["linear","encodeRGBM","decodeRGBM","doubleSided","alphaTest","roughnessChannel","metalnessChannel","environmentMapPrefiltered"],qn={roughnessChannel:"ROUGHNESS_CHANNEL",metalnessChannel:"METALNESS_CHANNEL"},Yn={linear:"SRGB_DECODE",encodeRGBM:"RGBM_ENCODE",decodeRGBM:"RGBM_DECODE",doubleSided:"DOUBLE_SIDED",alphaTest:"ALPHA_TEST",environmentMapPrefiltered:"ENVIRONMENTMAP_PREFILTER"},Kn=pr.extend(function(){return Wn||(Wn=new Y(Y.source("clay.standard.vertex"),Y.source("clay.standard.fragment"))),{shader:Wn}},function(t){Ne.extend(this,t),Ne.defaults(this,{color:[1,1,1],emission:[0,0,0],emissionIntensity:0,roughness:.5,metalness:0,alpha:1,alphaTest:!1,alphaCutoff:.9,doubleSided:!1,uvRepeat:[1,1],uvOffset:[0,0],aoIntensity:1,environmentMapPrefiltered:!1,linear:!1,encodeRGBM:!1,decodeRGBM:!1,roughnessChannel:0,metalnessChannel:1}),this.define("fragment","USE_METALNESS"),this.define("fragment","USE_ROUGHNESS")},{clone:function(){var t=new Kn({name:this.name});return zn.forEach(function(e){this[e]&&(t[e]=this[e])},this),Xn.concat(jn).forEach(function(e){t[e]=this[e]},this),t}});Xn.forEach(function(t){Object.defineProperty(Kn.prototype,t,{get:function(){return this.get(t)},set:function(e){this.setUniform(t,e)}})}),zn.forEach(function(t){Object.defineProperty(Kn.prototype,t,{get:function(){return this.get(t)},set:function(e){this.setUniform(t,e)}})}),jn.forEach(function(t){var e="_"+t;Object.defineProperty(Kn.prototype,t,{get:function(){return this[e]},set:function(r){if(this[e]=r,t in qn){var n=qn[t];this.define("fragment",n,r)}else{var n=Yn[t];r?this.define("fragment",n):this.undefine("fragment",n)}}})}),Object.defineProperty(Kn.prototype,"environmentBox",{get:function(){var t=this._environmentBox;return t&&(t.min.setArray(this.get("environmentBoxMin")),t.max.setArray(this.get("environmentBoxMax"))),t},set:function(t){this._environmentBox=t;var e=this.uniforms=this.uniforms||{};e.environmentBoxMin=e.environmentBoxMin||{value:null},e.environmentBoxMax=e.environmentBoxMax||{value:null},t&&(this.setUniform("environmentBoxMin",t.min.array),this.setUniform("environmentBoxMax",t.max.array)),t?this.define("fragment","PARALLAX_CORRECTED"):this.undefine("fragment","PARALLAX_CORRECTED")}});var Zn=Me.extend({name:"",index:-1,node:null,rootNode:null}),Jn=fe.quat,Qn=fe.vec3,$n=fe.mat4,ti=Me.extend(function(){return{relativeRootNode:null,name:"",joints:[],_clips:[],_invBindPoseMatricesArray:null,_jointMatricesSubArrays:[],_skinMatricesArray:null,_skinMatricesSubArrays:[],_subSkinMatricesArray:{}}},{addClip:function(t,e){for(var r=0;r0&&this._clips.splice(e,1)},removeClipsAll:function(){this._clips=[]},getClip:function(t){if(this._clips[t])return this._clips[t].clip},getClipNumber:function(){return this._clips.length},updateJointMatrices:function(){var t=$n.create();return function(){this._invBindPoseMatricesArray=new Float32Array(16*this.joints.length),this._skinMatricesArray=new Float32Array(16*this.joints.length);for(var e=0;e 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"),Y.import(Vn),Y.import("@export clay.wireframe.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 world : WORLD;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec3 v_Barycentric;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0 );\n v_Barycentric = barycentric;\n}\n@end\n@export clay.wireframe.fragment\nuniform vec3 color : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\nuniform float lineWidth : 1.0;\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\nvoid main()\n{\n gl_FragColor.rgb = color;\n gl_FragColor.a = (1.0-edgeFactor(lineWidth)) * alpha;\n}\n@end"),Y.import(ni),Y.import(Br),Pn.template("clay.basic",Y.source("clay.basic.vertex"),Y.source("clay.basic.fragment")),Pn.template("clay.lambert",Y.source("clay.lambert.vertex"),Y.source("clay.lambert.fragment")),Pn.template("clay.wireframe",Y.source("clay.wireframe.vertex"),Y.source("clay.wireframe.fragment")),Pn.template("clay.skybox",Y.source("clay.skybox.vertex"),Y.source("clay.skybox.fragment")),Pn.template("clay.prez",Y.source("clay.prez.vertex"),Y.source("clay.prez.fragment")),Pn.template("clay.standard",Y.source("clay.standard.vertex"),Y.source("clay.standard.fragment")),Pn.template("clay.standardMR",Y.source("clay.standardMR.vertex"),Y.source("clay.standardMR.fragment")),Y.import("@export clay.compositor.coloradjust\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float exposure : 0.0;\nuniform float gamma : 1.0;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n color = clamp( (color-vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n color = clamp( color * pow(2.0, exposure), 0.0, 1.0);\n color = clamp( pow(color, vec3(gamma)), 0.0, 1.0);\n float luminance = dot( color, w );\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.brightness\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = tex.rgb + vec3(brightness);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.contrast\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float contrast : 1.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = (tex.rgb-vec3(0.5))*contrast+vec3(0.5);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.exposure\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float exposure : 0.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb * pow(2.0, exposure);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.gamma\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float gamma : 1.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = pow(tex.rgb, vec3(gamma));\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.saturation\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb;\n float luminance = dot(color, w);\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end"),Y.import("@export clay.compositor.kernel.gaussian_9\nfloat gaussianKernel[9];\ngaussianKernel[0] = 0.07;\ngaussianKernel[1] = 0.09;\ngaussianKernel[2] = 0.12;\ngaussianKernel[3] = 0.14;\ngaussianKernel[4] = 0.16;\ngaussianKernel[5] = 0.14;\ngaussianKernel[6] = 0.12;\ngaussianKernel[7] = 0.09;\ngaussianKernel[8] = 0.07;\n@end\n@export clay.compositor.kernel.gaussian_13\nfloat gaussianKernel[13];\ngaussianKernel[0] = 0.02;\ngaussianKernel[1] = 0.03;\ngaussianKernel[2] = 0.06;\ngaussianKernel[3] = 0.08;\ngaussianKernel[4] = 0.11;\ngaussianKernel[5] = 0.13;\ngaussianKernel[6] = 0.14;\ngaussianKernel[7] = 0.13;\ngaussianKernel[8] = 0.11;\ngaussianKernel[9] = 0.08;\ngaussianKernel[10] = 0.06;\ngaussianKernel[11] = 0.03;\ngaussianKernel[12] = 0.02;\n@end\n@export clay.compositor.gaussian_blur\n#define SHADER_NAME gaussian_blur\nuniform sampler2D texture;varying vec2 v_Texcoord;\nuniform float blurSize : 2.0;\nuniform vec2 textureSize : [512.0, 512.0];\nuniform float blurDir : 0.0;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main (void)\n{\n @import clay.compositor.kernel.gaussian_9\n vec2 off = blurSize / textureSize;\n off *= vec2(1.0 - blurDir, blurDir);\n vec4 sum = vec4(0.0);\n float weightAll = 0.0;\n for (int i = 0; i < 9; i++) {\n float w = gaussianKernel[i];\n vec4 texel = decodeHDR(clampSample(texture, v_Texcoord + float(i - 4) * off));\n sum += texel * w;\n weightAll += w;\n }\n gl_FragColor = encodeHDR(sum / max(weightAll, 0.01));\n}\n@end\n"),Y.import("@export clay.compositor.hdr.log_lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n float luminance = dot(tex.rgb, w);\n luminance = log(luminance + 0.001);\n gl_FragColor = encodeHDR(vec4(vec3(luminance), 1.0));\n}\n@end\n@export clay.compositor.hdr.lum_adaption\nvarying vec2 v_Texcoord;\nuniform sampler2D adaptedLum;\nuniform sampler2D currentLum;\nuniform float frameTime : 0.02;\n@import clay.util.rgbm\nvoid main()\n{\n float fAdaptedLum = decodeHDR(texture2D(adaptedLum, vec2(0.5, 0.5))).r;\n float fCurrentLum = exp(encodeHDR(texture2D(currentLum, vec2(0.5, 0.5))).r);\n fAdaptedLum += (fCurrentLum - fAdaptedLum) * (1.0 - pow(0.98, 30.0 * frameTime));\n gl_FragColor = encodeHDR(vec4(vec3(fAdaptedLum), 1.0));\n}\n@end\n@export clay.compositor.lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord );\n float luminance = dot(tex.rgb, w);\n gl_FragColor = vec4(vec3(luminance), 1.0);\n}\n@end"),Y.import("\n@export clay.compositor.lut\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform sampler2D lookup;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n float blueColor = tex.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec4 newColor1 = texture2D(lookup, texPos1);\n vec4 newColor2 = texture2D(lookup, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n gl_FragColor = vec4(newColor.rgb, tex.w);\n}\n@end"),Y.import("@export clay.compositor.vignette\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float darkness: 1;\nuniform float offset: 1;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = texel.rgb;\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(offset);\n gl_FragColor = encodeHDR(vec4(mix(texel.rgb, vec3(1.0 - darkness), dot(uv, uv)), texel.a));\n}\n@end"),Y.import("@export clay.compositor.output\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = tex.rgb;\n#ifdef OUTPUT_ALPHA\n gl_FragColor.a = tex.a;\n#else\n gl_FragColor.a = 1.0;\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end"),Y.import("@export clay.compositor.bright\nuniform sampler2D texture;\nuniform float threshold : 1;\nuniform float scale : 1.0;\nuniform vec2 textureSize: [512, 512];\nvarying vec2 v_Texcoord;\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvec4 median(vec4 a, vec4 b, vec4 c)\n{\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n#ifdef ANTI_FLICKER\n vec3 d = 1.0 / textureSize.xyx * vec3(1.0, 1.0, 0.0);\n vec4 s1 = decodeHDR(texture2D(texture, v_Texcoord - d.xz));\n vec4 s2 = decodeHDR(texture2D(texture, v_Texcoord + d.xz));\n vec4 s3 = decodeHDR(texture2D(texture, v_Texcoord - d.zy));\n vec4 s4 = decodeHDR(texture2D(texture, v_Texcoord + d.zy));\n texel = median(median(texel, s1, s2), s3, s4);\n#endif\n float lum = dot(texel.rgb , lumWeight);\n vec4 color;\n if (lum > threshold && texel.a > 0.0)\n {\n color = vec4(texel.rgb * scale, texel.a * scale);\n }\n else\n {\n color = vec4(0.0);\n }\n gl_FragColor = encodeHDR(color);\n}\n@end\n"),Y.import("@export clay.compositor.downsample\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nfloat brightness(vec3 c)\n{\n return max(max(c.r, c.g), c.b);\n}\n@import clay.util.clamp_sample\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n#ifdef ANTI_FLICKER\n vec3 s1 = decodeHDR(clampSample(texture, v_Texcoord + d.xy)).rgb;\n vec3 s2 = decodeHDR(clampSample(texture, v_Texcoord + d.zy)).rgb;\n vec3 s3 = decodeHDR(clampSample(texture, v_Texcoord + d.xw)).rgb;\n vec3 s4 = decodeHDR(clampSample(texture, v_Texcoord + d.zw)).rgb;\n float s1w = 1.0 / (brightness(s1) + 1.0);\n float s2w = 1.0 / (brightness(s2) + 1.0);\n float s3w = 1.0 / (brightness(s3) + 1.0);\n float s4w = 1.0 / (brightness(s4) + 1.0);\n float oneDivideSum = 1.0 / (s1w + s2w + s3w + s4w);\n vec4 color = vec4(\n (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * oneDivideSum,\n 1.0\n );\n#else\n vec4 color = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n color *= 0.25;\n#endif\n gl_FragColor = encodeHDR(color);\n}\n@end"),Y.import("\n@export clay.compositor.upsample\n#define HIGH_QUALITY\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord - d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord - d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord - d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord )) * 4.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n gl_FragColor = encodeHDR(s / 16.0);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n gl_FragColor = encodeHDR(s / 4.0);\n#endif\n}\n@end"),Y.import("@export clay.compositor.hdr.composite\nuniform sampler2D texture;\n#ifdef BLOOM_ENABLED\nuniform sampler2D bloom;\n#endif\n#ifdef LENSFLARE_ENABLED\nuniform sampler2D lensflare;\nuniform sampler2D lensdirt;\n#endif\n#ifdef LUM_ENABLED\nuniform sampler2D lum;\n#endif\n#ifdef LUT_ENABLED\nuniform sampler2D lut;\n#endif\n#ifdef COLOR_CORRECTION\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float saturation : 1.0;\n#endif\n#ifdef VIGNETTE\nuniform float vignetteDarkness: 1.0;\nuniform float vignetteOffset: 1.0;\n#endif\nuniform float exposure : 1.0;\nuniform float bloomIntensity : 0.25;\nuniform float lensflareIntensity : 1;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nfloat eyeAdaption(float fLum)\n{\n return mix(0.2, fLum, 0.5);\n}\n#ifdef LUT_ENABLED\nvec3 lutTransform(vec3 color) {\n float blueColor = color.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec4 newColor1 = texture2D(lut, texPos1);\n vec4 newColor2 = texture2D(lut, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n return newColor.rgb;\n}\n#endif\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = vec4(0.0);\n vec4 originalTexel = vec4(0.0);\n#ifdef TEXTURE_ENABLED\n texel = decodeHDR(texture2D(texture, v_Texcoord));\n originalTexel = texel;\n#endif\n#ifdef BLOOM_ENABLED\n vec4 bloomTexel = decodeHDR(texture2D(bloom, v_Texcoord));\n texel.rgb += bloomTexel.rgb * bloomIntensity;\n texel.a += bloomTexel.a * bloomIntensity;\n#endif\n#ifdef LENSFLARE_ENABLED\n texel += decodeHDR(texture2D(lensflare, v_Texcoord)) * texture2D(lensdirt, v_Texcoord) * lensflareIntensity;\n#endif\n texel.a = min(texel.a, 1.0);\n#ifdef LUM_ENABLED\n float fLum = texture2D(lum, vec2(0.5, 0.5)).r;\n float adaptedLumDest = 3.0 / (max(0.1, 1.0 + 10.0*eyeAdaption(fLum)));\n float exposureBias = adaptedLumDest * exposure;\n#else\n float exposureBias = exposure;\n#endif\n texel.rgb *= exposureBias;\n texel.rgb = ACESToneMapping(texel.rgb);\n texel = linearTosRGB(texel);\n#ifdef LUT_ENABLED\n texel.rgb = lutTransform(clamp(texel.rgb,vec3(0.0),vec3(1.0)));\n#endif\n#ifdef COLOR_CORRECTION\n texel.rgb = clamp(texel.rgb + vec3(brightness), 0.0, 1.0);\n texel.rgb = clamp((texel.rgb - vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n float lum = dot(texel.rgb, vec3(0.2125, 0.7154, 0.0721));\n texel.rgb = mix(vec3(lum), texel.rgb, saturation);\n#endif\n#ifdef VIGNETTE\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(vignetteOffset);\n texel.rgb = mix(texel.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\n#endif\n gl_FragColor = encodeHDR(texel);\n#ifdef DEBUG\n #if DEBUG == 1\n gl_FragColor = encodeHDR(decodeHDR(texture2D(texture, v_Texcoord)));\n #elif DEBUG == 2\n gl_FragColor = encodeHDR(decodeHDR(texture2D(bloom, v_Texcoord)) * bloomIntensity);\n #elif DEBUG == 3\n gl_FragColor = encodeHDR(decodeHDR(texture2D(lensflare, v_Texcoord) * lensflareIntensity));\n #endif\n#endif\n if (originalTexel.a <= 0.01 && gl_FragColor.a > 1e-5) {\n gl_FragColor.a = dot(gl_FragColor.rgb, vec3(0.2125, 0.7154, 0.0721));\n }\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end"), -Y.import("@export clay.compositor.dof.coc\nuniform sampler2D depth;\nuniform float zNear: 0.1;\nuniform float zFar: 2000;\nuniform float focalDist: 3;\nuniform float focalRange: 1;\nuniform float focalLength: 30;\nuniform float fstop: 2.8;\nvarying vec2 v_Texcoord;\n@import clay.util.encode_float\nvoid main()\n{\n float z = texture2D(depth, v_Texcoord).r * 2.0 - 1.0;\n float dist = 2.0 * zNear * zFar / (zFar + zNear - z * (zFar - zNear));\n float aperture = focalLength / fstop;\n float coc;\n float uppper = focalDist + focalRange;\n float lower = focalDist - focalRange;\n if (dist <= uppper && dist >= lower) {\n coc = 0.5;\n }\n else {\n float focalAdjusted = dist > uppper ? uppper : lower;\n coc = abs(aperture * (focalLength * (dist - focalAdjusted)) / (dist * (focalAdjusted - focalLength)));\n coc = clamp(coc, 0.0, 0.4) / 0.4000001;\n if (dist < lower) {\n coc = -coc;\n }\n coc = coc * 0.5 + 0.5;\n }\n gl_FragColor = encodeFloat(coc);\n}\n@end\n@export clay.compositor.dof.premultiply\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.decode_float\nvoid main() {\n float fCoc = max(abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0), 0.1);\n gl_FragColor = encodeHDR(\n vec4(decodeHDR(texture2D(texture, v_Texcoord)).rgb * fCoc, 1.0)\n );\n}\n@end\n@export clay.compositor.dof.min_coc\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.float\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n fCoc = min(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zy)));\n fCoc = min(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.xw)));\n fCoc = min(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zw)));\n gl_FragColor = encodeFloat(fCoc);\n}\n@end\n@export clay.compositor.dof.max_coc\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.float\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n fCoc = max(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zy)));\n fCoc = max(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.xw)));\n fCoc = max(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zw)));\n gl_FragColor = encodeFloat(fCoc);\n}\n@end\n@export clay.compositor.dof.coc_upsample\n#define HIGH_QUALITY\nuniform sampler2D coc;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.float\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n float s;\n s = decodeFloat(texture2D(coc, v_Texcoord - d.xy));\n s += decodeFloat(texture2D(coc, v_Texcoord - d.wy)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord - d.zy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zw)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord )) * 4.0;\n s += decodeFloat(texture2D(coc, v_Texcoord + d.xw)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.wy)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n gl_FragColor = encodeFloat(s / 16.0);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n float s;\n s = decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.xw));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zw));\n gl_FragColor = encodeFloat(s / 4.0);\n#endif\n}\n@end\n@export clay.compositor.dof.upsample\n#define HIGH_QUALITY\nuniform sampler2D coc;\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.decode_float\nfloat tap(vec2 uv, inout vec4 color, float baseWeight) {\n float weight = abs(decodeFloat(texture2D(coc, uv)) * 2.0 - 1.0) * baseWeight;\n color += decodeHDR(texture2D(texture, uv)) * weight;\n return weight;\n}\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n vec4 color = vec4(0.0);\n float baseWeight = 1.0 / 16.0;\n float w = tap(v_Texcoord - d.xy, color, baseWeight);\n w += tap(v_Texcoord - d.wy, color, baseWeight * 2.0);\n w += tap(v_Texcoord - d.zy, color, baseWeight);\n w += tap(v_Texcoord + d.zw, color, baseWeight * 2.0);\n w += tap(v_Texcoord , color, baseWeight * 4.0);\n w += tap(v_Texcoord + d.xw, color, baseWeight * 2.0);\n w += tap(v_Texcoord + d.zy, color, baseWeight);\n w += tap(v_Texcoord + d.wy, color, baseWeight * 2.0);\n w += tap(v_Texcoord + d.xy, color, baseWeight);\n gl_FragColor = encodeHDR(color / w);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n vec4 color = vec4(0.0);\n float baseWeight = 1.0 / 4.0;\n float w = tap(v_Texcoord + d.xy, color, baseWeight);\n w += tap(v_Texcoord + d.zy, color, baseWeight);\n w += tap(v_Texcoord + d.xw, color, baseWeight);\n w += tap(v_Texcoord + d.zw, color, baseWeight);\n gl_FragColor = encodeHDR(color / w);\n#endif\n}\n@end\n@export clay.compositor.dof.downsample\nuniform sampler2D texture;\nuniform sampler2D coc;\nuniform vec2 textureSize : [512, 512];\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.decode_float\nfloat tap(vec2 uv, inout vec4 color) {\n float weight = abs(decodeFloat(texture2D(coc, uv)) * 2.0 - 1.0) * 0.25;\n color += decodeHDR(texture2D(texture, uv)) * weight;\n return weight;\n}\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n vec4 color = vec4(0.0);\n float weight = tap(v_Texcoord + d.xy, color);\n weight += tap(v_Texcoord + d.zy, color);\n weight += tap(v_Texcoord + d.xw, color);\n weight += tap(v_Texcoord + d.zw, color);\n color /= weight;\n gl_FragColor = encodeHDR(color);\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_frag\n@import clay.util.float\nvec4 doBlur(sampler2D targetTexture, vec2 offset) {\n#ifdef BLUR_COC\n float cocSum = 0.0;\n#else\n vec4 color = vec4(0.0);\n#endif\n float weightSum = 0.0;\n float kernelWeight = 1.0 / float(KERNEL_SIZE);\n for (int i = 0; i < KERNEL_SIZE; i++) {\n vec2 coord = v_Texcoord + offset * float(i);\n float w = kernelWeight;\n#ifdef BLUR_COC\n float fCoc = decodeFloat(texture2D(targetTexture, coord)) * 2.0 - 1.0;\n cocSum += clamp(fCoc, -1.0, 0.0) * w;\n#else\n float fCoc = decodeFloat(texture2D(coc, coord)) * 2.0 - 1.0;\n vec4 texel = texture2D(targetTexture, coord);\n #if !defined(BLUR_NEARFIELD)\n w *= abs(fCoc);\n #endif\n color += decodeHDR(texel) * w;\n#endif\n weightSum += w;\n }\n#ifdef BLUR_COC\n return encodeFloat(clamp(cocSum / weightSum, -1.0, 0.0) * 0.5 + 0.5);\n#else\n return color / weightSum;\n#endif\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_1\n#define KERNEL_SIZE 5\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform float blurSize : 1.0;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.rgbm\n@import clay.compositor.dof.hexagonal_blur_frag\nvoid main()\n{\n vec2 offset = blurSize / textureSize;\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n gl_FragColor = doBlur(texture, vec2(0.0, offset.y));\n#if !defined(BLUR_COC)\n gl_FragColor = encodeHDR(gl_FragColor);\n#endif\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_2\n#define KERNEL_SIZE 5\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform float blurSize : 1.0;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.rgbm\n@import clay.compositor.dof.hexagonal_blur_frag\nvoid main()\n{\n vec2 offset = blurSize / textureSize;\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n offset.y /= 2.0;\n gl_FragColor = doBlur(texture, -offset);\n#if !defined(BLUR_COC)\n gl_FragColor = encodeHDR(gl_FragColor);\n#endif\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_3\n#define KERNEL_SIZE 5\nuniform sampler2D texture1;\nuniform sampler2D texture2;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform float blurSize : 1.0;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.rgbm\n@import clay.compositor.dof.hexagonal_blur_frag\nvoid main()\n{\n vec2 offset = blurSize / textureSize;\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n offset.y /= 2.0;\n vec2 vDownRight = vec2(offset.x, -offset.y);\n vec4 texel1 = doBlur(texture1, -offset);\n vec4 texel2 = doBlur(texture1, vDownRight);\n vec4 texel3 = doBlur(texture2, vDownRight);\n#ifdef BLUR_COC\n float coc1 = decodeFloat(texel1) * 2.0 - 1.0;\n float coc2 = decodeFloat(texel2) * 2.0 - 1.0;\n float coc3 = decodeFloat(texel3) * 2.0 - 1.0;\n gl_FragColor = encodeFloat(\n ((coc1 + coc2 + coc3) / 3.0) * 0.5 + 0.5\n );\n#else\n vec4 color = (texel1 + texel2 + texel3) / 3.0;\n gl_FragColor = encodeHDR(color);\n#endif\n}\n@end\n@export clay.compositor.dof.composite\n#define DEBUG 0\nuniform sampler2D original;\nuniform sampler2D blurred;\nuniform sampler2D nearfield;\nuniform sampler2D coc;\nuniform sampler2D nearcoc;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.float\nvoid main()\n{\n vec4 blurredColor = decodeHDR(texture2D(blurred, v_Texcoord));\n vec4 originalColor = decodeHDR(texture2D(original, v_Texcoord));\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord));\n fCoc = abs(fCoc * 2.0 - 1.0);\n float weight = smoothstep(0.0, 1.0, fCoc);\n#ifdef NEARFIELD_ENABLED\n vec4 nearfieldColor = decodeHDR(texture2D(nearfield, v_Texcoord));\n float fNearCoc = decodeFloat(texture2D(nearcoc, v_Texcoord));\n fNearCoc = abs(fNearCoc * 2.0 - 1.0);\n gl_FragColor = encodeHDR(\n mix(\n nearfieldColor, mix(originalColor, blurredColor, weight),\n pow(1.0 - fNearCoc, 4.0)\n )\n );\n#else\n gl_FragColor = encodeHDR(mix(originalColor, blurredColor, weight));\n#endif\n#if DEBUG == 1\n gl_FragColor = vec4(vec3(fCoc), 1.0);\n#elif DEBUG == 2\n gl_FragColor = vec4(vec3(fNearCoc), 1.0);\n#elif DEBUG == 3\n gl_FragColor = encodeHDR(blurredColor);\n#elif DEBUG == 4\n gl_FragColor = encodeHDR(nearfieldColor);\n#endif\n}\n@end"),Y.import("@export clay.compositor.lensflare\n#define SAMPLE_NUMBER 8\nuniform sampler2D texture;\nuniform sampler2D lenscolor;\nuniform vec2 textureSize : [512, 512];\nuniform float dispersal : 0.3;\nuniform float haloWidth : 0.4;\nuniform float distortion : 1.0;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvec4 textureDistorted(\n in vec2 texcoord,\n in vec2 direction,\n in vec3 distortion\n) {\n return vec4(\n decodeHDR(texture2D(texture, texcoord + direction * distortion.r)).r,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.g)).g,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.b)).b,\n 1.0\n );\n}\nvoid main()\n{\n vec2 texcoord = -v_Texcoord + vec2(1.0); vec2 textureOffset = 1.0 / textureSize;\n vec2 ghostVec = (vec2(0.5) - texcoord) * dispersal;\n vec2 haloVec = normalize(ghostVec) * haloWidth;\n vec3 distortion = vec3(-textureOffset.x * distortion, 0.0, textureOffset.x * distortion);\n vec4 result = vec4(0.0);\n for (int i = 0; i < SAMPLE_NUMBER; i++)\n {\n vec2 offset = fract(texcoord + ghostVec * float(i));\n float weight = length(vec2(0.5) - offset) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n }\n result *= texture2D(lenscolor, vec2(length(vec2(0.5) - texcoord)) / length(vec2(0.5)));\n float weight = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n vec2 offset = fract(texcoord + haloVec);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n gl_FragColor = result;\n}\n@end"),Y.import("@export clay.compositor.blend\n#define SHADER_NAME blend\n#ifdef TEXTURE1_ENABLED\nuniform sampler2D texture1;\nuniform float weight1 : 1.0;\n#endif\n#ifdef TEXTURE2_ENABLED\nuniform sampler2D texture2;\nuniform float weight2 : 1.0;\n#endif\n#ifdef TEXTURE3_ENABLED\nuniform sampler2D texture3;\nuniform float weight3 : 1.0;\n#endif\n#ifdef TEXTURE4_ENABLED\nuniform sampler2D texture4;\nuniform float weight4 : 1.0;\n#endif\n#ifdef TEXTURE5_ENABLED\nuniform sampler2D texture5;\nuniform float weight5 : 1.0;\n#endif\n#ifdef TEXTURE6_ENABLED\nuniform sampler2D texture6;\nuniform float weight6 : 1.0;\n#endif\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = vec4(0.0);\n#ifdef TEXTURE1_ENABLED\n tex += decodeHDR(texture2D(texture1, v_Texcoord)) * weight1;\n#endif\n#ifdef TEXTURE2_ENABLED\n tex += decodeHDR(texture2D(texture2, v_Texcoord)) * weight2;\n#endif\n#ifdef TEXTURE3_ENABLED\n tex += decodeHDR(texture2D(texture3, v_Texcoord)) * weight3;\n#endif\n#ifdef TEXTURE4_ENABLED\n tex += decodeHDR(texture2D(texture4, v_Texcoord)) * weight4;\n#endif\n#ifdef TEXTURE5_ENABLED\n tex += decodeHDR(texture2D(texture5, v_Texcoord)) * weight5;\n#endif\n#ifdef TEXTURE6_ENABLED\n tex += decodeHDR(texture2D(texture6, v_Texcoord)) * weight6;\n#endif\n gl_FragColor = encodeHDR(tex);\n}\n@end"),Y.import("@export clay.compositor.fxaa\nuniform sampler2D texture;\nuniform vec4 viewport : VIEWPORT;\nvarying vec2 v_Texcoord;\n#define FXAA_REDUCE_MIN (1.0/128.0)\n#define FXAA_REDUCE_MUL (1.0/8.0)\n#define FXAA_SPAN_MAX 8.0\n@import clay.util.rgbm\nvoid main()\n{\n vec2 resolution = 1.0 / viewport.zw;\n vec3 rgbNW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbNE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ) ).xyz;\n vec4 rgbaM = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution ) );\n vec3 rgbM = rgbaM.xyz;\n float opacity = rgbaM.w;\n vec3 luma = vec3( 0.299, 0.587, 0.114 );\n float lumaNW = dot( rgbNW, luma );\n float lumaNE = dot( rgbNE, luma );\n float lumaSW = dot( rgbSW, luma );\n float lumaSE = dot( rgbSE, luma );\n float lumaM = dot( rgbM, luma );\n float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\n float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\n vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\n float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\n dir = min( vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * resolution;\n vec3 rgbA = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA *= 0.5;\n vec3 rgbB = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * -0.5 ) ).xyz;\n rgbB += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * 0.5 ) ).xyz;\n rgbB *= 0.25;\n rgbB += rgbA * 0.5;\n float lumaB = dot( rgbB, luma );\n if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) )\n {\n gl_FragColor = vec4( rgbA, opacity );\n }\n else {\n gl_FragColor = vec4( rgbB, opacity );\n }\n}\n@end"),Y.import("@export clay.compositor.fxaa3\nuniform sampler2D texture;\nuniform vec4 viewport : VIEWPORT;\nuniform float subpixel: 0.75;\nuniform float edgeThreshold: 0.125;\nuniform float edgeThresholdMin: 0.0625;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nfloat FxaaLuma(vec4 rgba) { return rgba.y; }\nvec4 FxaaPixelShader(\n vec2 pos\n ,sampler2D tex\n ,vec2 fxaaQualityRcpFrame\n ,float fxaaQualitySubpix\n ,float fxaaQualityEdgeThreshold\n ,float fxaaQualityEdgeThresholdMin\n) {\n vec2 posM;\n posM.x = pos.x;\n posM.y = pos.y;\n vec4 rgbyM = decodeHDR(texture2D(texture, posM, 0.0));\n float lumaS = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 0.0, 1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaE = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 1.0, 0.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaN = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 0.0,-1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaW = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2(-1.0, 0.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float maxSM = max(lumaS, rgbyM.y);\n float minSM = min(lumaS, rgbyM.y);\n float maxESM = max(lumaE, maxSM);\n float minESM = min(lumaE, minSM);\n float maxWN = max(lumaN, lumaW);\n float minWN = min(lumaN, lumaW);\n float rangeMax = max(maxWN, maxESM);\n float rangeMin = min(minWN, minESM);\n float rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\n float range = rangeMax - rangeMin;\n float rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\n bool earlyExit = range < rangeMaxClamped;\n if(earlyExit) return rgbyM;\n float lumaNW = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2(-1.0,-1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaSE = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 1.0, 1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaNE = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 1.0,-1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaSW = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2(-1.0, 1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaNS = lumaN + lumaS;\n float lumaWE = lumaW + lumaE;\n float subpixRcpRange = 1.0/range;\n float subpixNSWE = lumaNS + lumaWE;\n float edgeHorz1 = (-2.0 * rgbyM.y) + lumaNS;\n float edgeVert1 = (-2.0 * rgbyM.y) + lumaWE;\n float lumaNESE = lumaNE + lumaSE;\n float lumaNWNE = lumaNW + lumaNE;\n float edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\n float edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\n float lumaNWSW = lumaNW + lumaSW;\n float lumaSWSE = lumaSW + lumaSE;\n float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\n float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\n float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\n float edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\n float edgeHorz = abs(edgeHorz3) + edgeHorz4;\n float edgeVert = abs(edgeVert3) + edgeVert4;\n float subpixNWSWNESE = lumaNWSW + lumaNESE;\n float lengthSign = fxaaQualityRcpFrame.x;\n bool horzSpan = edgeHorz >= edgeVert;\n float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\n if(!horzSpan) lumaN = lumaW;\n if(!horzSpan) lumaS = lumaE;\n if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\n float subpixB = (subpixA * (1.0/12.0)) - rgbyM.y;\n float gradientN = lumaN - rgbyM.y;\n float gradientS = lumaS - rgbyM.y;\n float lumaNN = lumaN + rgbyM.y;\n float lumaSS = lumaS + rgbyM.y;\n bool pairN = abs(gradientN) >= abs(gradientS);\n float gradient = max(abs(gradientN), abs(gradientS));\n if(pairN) lengthSign = -lengthSign;\n float subpixC = clamp(abs(subpixB) * subpixRcpRange, 0.0, 1.0);\n vec2 posB;\n posB.x = posM.x;\n posB.y = posM.y;\n vec2 offNP;\n offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n if(!horzSpan) posB.x += lengthSign * 0.5;\n if( horzSpan) posB.y += lengthSign * 0.5;\n vec2 posN;\n posN.x = posB.x - offNP.x * 1.0;\n posN.y = posB.y - offNP.y * 1.0;\n vec2 posP;\n posP.x = posB.x + offNP.x * 1.0;\n posP.y = posB.y + offNP.y * 1.0;\n float subpixD = ((-2.0)*subpixC) + 3.0;\n float lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN, 0.0)));\n float subpixE = subpixC * subpixC;\n float lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP, 0.0)));\n if(!pairN) lumaNN = lumaSS;\n float gradientScaled = gradient * 1.0/4.0;\n float lumaMM = rgbyM.y - lumaNN * 0.5;\n float subpixF = subpixD * subpixE;\n bool lumaMLTZero = lumaMM < 0.0;\n lumaEndN -= lumaNN * 0.5;\n lumaEndP -= lumaNN * 0.5;\n bool doneN = abs(lumaEndN) >= gradientScaled;\n bool doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 1.5;\n if(!doneN) posN.y -= offNP.y * 1.5;\n bool doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 1.5;\n if(!doneP) posP.y += offNP.y * 1.5;\n if(doneNP) {\n if(!doneN) lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN.xy, 0.0)));\n if(!doneP) lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP.xy, 0.0)));\n if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 2.0;\n if(!doneN) posN.y -= offNP.y * 2.0;\n doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 2.0;\n if(!doneP) posP.y += offNP.y * 2.0;\n if(doneNP) {\n if(!doneN) lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN.xy, 0.0)));\n if(!doneP) lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP.xy, 0.0)));\n if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 4.0;\n if(!doneN) posN.y -= offNP.y * 4.0;\n doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 4.0;\n if(!doneP) posP.y += offNP.y * 4.0;\n if(doneNP) {\n if(!doneN) lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN.xy, 0.0)));\n if(!doneP) lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP.xy, 0.0)));\n if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 12.0;\n if(!doneN) posN.y -= offNP.y * 12.0;\n doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 12.0;\n if(!doneP) posP.y += offNP.y * 12.0;\n }\n }\n }\n float dstN = posM.x - posN.x;\n float dstP = posP.x - posM.x;\n if(!horzSpan) dstN = posM.y - posN.y;\n if(!horzSpan) dstP = posP.y - posM.y;\n bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\n float spanLength = (dstP + dstN);\n bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\n float spanLengthRcp = 1.0/spanLength;\n bool directionN = dstN < dstP;\n float dst = min(dstN, dstP);\n bool goodSpan = directionN ? goodSpanN : goodSpanP;\n float subpixG = subpixF * subpixF;\n float pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\n float subpixH = subpixG * fxaaQualitySubpix;\n float pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\n float pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\n if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\n if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\n return vec4(decodeHDR(texture2D(texture, posM, 0.0)).xyz, rgbyM.y);\n}\nvoid main()\n{\n vec4 color = FxaaPixelShader(\n v_Texcoord,\n texture,\n vec2(1.0) / viewport.zw,\n subpixel,\n edgeThreshold,\n edgeThresholdMin\n );\n gl_FragColor = vec4(color.rgb, 1.0);\n}\n@end");var ii={NORMAL:"normal",POSITION:"position",TEXCOORD_0:"texcoord0",TEXCOORD_1:"texcoord1",WEIGHTS_0:"weight",JOINTS_0:"joint",COLOR:"color"},ai={5120:He.Int8Array,5121:He.Uint8Array,5122:He.Int16Array,5123:He.Uint16Array,5125:He.Uint32Array,5126:He.Float32Array},oi={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},si=Me.extend({rootNode:null,rootPath:null,textureRootPath:null,bufferRootPath:null,shader:"clay.standard",useStandardMaterial:!1,includeCamera:!0,includeAnimation:!0,includeMesh:!0,includeTexture:!0,crossOrigin:"",textureFlipY:!1,shaderLibrary:null},function(){this.shaderLibrary||(this.shaderLibrary=Pn.createLibrary())},{load:function(t){var e=this,r=t.endsWith(".glb");null==this.rootPath&&(this.rootPath=t.slice(0,t.lastIndexOf("/"))),Gn.get({url:t,onprogress:function(t,r,n){e.trigger("progress",t,r,n)},onerror:function(t){e.trigger("error",t)},responseType:r?"arraybuffer":"text",onload:function(t){r?e.parseBinary(t):e.parse(JSON.parse(t))}})},parseBinary:function(t){var e=new Uint32Array(t,0,4);if(1179937895!==e[0])return void this.trigger("error","Invalid glTF binary format: Invalid header");if(e[0]<2)return void this.trigger("error","Only glTF2.0 is supported.");for(var r,n=new DataView(t,12),i=[],a=0;a1&&e.texParameterf(e.TEXTURE_CUBE_MAP,i.TEXTURE_MAX_ANISOTROPY_EXT,this.anisotropic),36193===n){t.getGLExtension("OES_texture_half_float")||(n=Fe.FLOAT)}if(this.mipmaps.length)for(var a=this.width,o=this.height,s=0;s=r.COLOR_ATTACHMENT0&&a<=r.COLOR_ATTACHMENT0+8&&i.push(a);n.drawBuffersEXT(i)}}this.trigger("beforerender",this,t);var o=this.clearDepth?r.DEPTH_BUFFER_BIT:0;if(r.depthMask(!0),this.clearColor){o|=r.COLOR_BUFFER_BIT,r.colorMask(!0,!0,!0,!0);var s=this.clearColor;Array.isArray(s)&&r.clearColor(s[0],s[1],s[2],s[3])}r.clear(o),this.blendWithPrevious?(r.enable(r.BLEND),this.material.transparent=!0):(r.disable(r.BLEND),this.material.transparent=!1),this.renderQuad(t),this.trigger("afterrender",this,t),e&&this.unbind(t,e)},renderQuad:function(t){Ti.material=this.material,t.renderPass([Ti],Ei)},dispose:function(t){}});Y.import(ni);var Ai=Un.extend(function(){var t=new Y({vertex:Y.source("clay.skybox.vertex"),fragment:Y.source("clay.skybox.fragment")}),e=new pr({shader:t,depthMask:!1});return{scene:null,geometry:new An,material:e,environmentMap:null,culling:!1}},function(){var t=this.scene;t&&this.attachScene(t),this.environmentMap&&this.setEnvironmentMap(this.environmentMap)},{attachScene:function(t){this.scene&&this.detachScene(),this.scene=t,t.on("beforerender",this._beforeRenderScene,this)},detachScene:function(){this.scene&&this.scene.off("beforerender",this._beforeRenderScene),this.scene=null},dispose:function(t){this.detachScene(),this.geometry.dispose(t)},setEnvironmentMap:function(t){this.material.set("environmentMap",t)},getEnvironmentMap:function(){return this.material.get("environmentMap")},_beforeRenderScene:function(t,e,r){this.renderSkybox(t,r)},renderSkybox:function(t,e){this.position.copy(e.getWorldPosition()),this.update(),t.gl.disable(t.gl.BLEND),t.renderPass([this],e)}}),Si=["px","nx","py","ny","pz","nz"],wi=Me.extend(function(){var t={position:new Ve,far:1e3,near:.1,texture:null,shadowMapPass:null},e=t._cameras={px:new kn({fov:90}),nx:new kn({fov:90}),py:new kn({fov:90}),ny:new kn({fov:90}),pz:new kn({fov:90}),nz:new kn({fov:90})};return e.px.lookAt(Ve.POSITIVE_X,Ve.NEGATIVE_Y),e.nx.lookAt(Ve.NEGATIVE_X,Ve.NEGATIVE_Y),e.py.lookAt(Ve.POSITIVE_Y,Ve.POSITIVE_Z),e.ny.lookAt(Ve.NEGATIVE_Y,Ve.NEGATIVE_Z),e.pz.lookAt(Ve.POSITIVE_Z,Ve.NEGATIVE_Y),e.nz.lookAt(Ve.NEGATIVE_Z,Ve.NEGATIVE_Y),t._frameBuffer=new yi,t},{getCamera:function(t){return this._cameras[t]},render:function(t,e,r){var n=t.gl;r||e.update();for(var i=this.texture.width,a=2*Math.atan(i/(i-.5))/Math.PI*180,o=0;o<6;o++){var s=Si[o],u=this._cameras[s];if(Ve.copy(u.position,this.position),u.far=this.far,u.near=this.near,u.fov=a,this.shadowMapPass){u.update();var l=e.getBoundingBox();l.applyTransform(u.viewMatrix),e.viewBoundingBoxLastFrame.copy(l),this.shadowMapPass.render(t,e,u,!0)}this._frameBuffer.attach(this.texture,n.COLOR_ATTACHMENT0,n.TEXTURE_CUBE_MAP_POSITIVE_X+o),this._frameBuffer.bind(t),t.render(e,u,!0),this._frameBuffer.unbind(t)}},dispose:function(t){this._frameBuffer.dispose(t)}});Y.import(ri);var Ci=Un.extend(function(){var t=new Y(Y.source("clay.basic.vertex"),Y.source("clay.basic.fragment")),e=new pr({shader:t,depthMask:!1});return e.enableTexture("diffuseMap"),{scene:null,geometry:new Sn({widthSegments:30,heightSegments:30}),material:e,environmentMap:null,culling:!1}},function(){var t=this.scene;t&&this.attachScene(t),this.environmentMap&&this.setEnvironmentMap(this.environmentMap)},{attachScene:function(t){this.scene&&this.detachScene(),this.scene=t,t.on("beforerender",this._beforeRenderScene,this)},detachScene:function(){this.scene&&this.scene.off("beforerender",this._beforeRenderScene),this.scene=null},_beforeRenderScene:function(t,e,r){this.position.copy(r.getWorldPosition()),this.update(),t.renderPass([this],r)},setEnvironmentMap:function(t){this.material.set("diffuseMap",t)},getEnvironmentMap:function(){return this.material.get("diffuseMap")},dispose:function(t){this.detachScene(),this.geometry.dispose(t)}}),Ni=ht("DXT1"),Mi=ht("DXT3"),Ri=ht("DXT5"),Li={parse:function(t,e){var r=new Int32Array(t,0,31);if(542327876!==r[0])return null;if(4&!r(20))return null;var n,i,a=r(21),o=r[4],s=r[3],u=512&r[28],l=131072&r[2];switch(a){case Ni:n=8,i=or.COMPRESSED_RGB_S3TC_DXT1_EXT;break;case Mi:n=16,i=or.COMPRESSED_RGBA_S3TC_DXT3_EXT;break;case Ri:n=16,i=or.COMPRESSED_RGBA_S3TC_DXT5_EXT;break;default:return null}var c=r[1]+4,h=u?6:1,f=1;l&&(f=Math.max(1,r[7]));for(var d=[],m=0;m=i)){a+=2;for(var o="";a20)return console.warn("Given image is not a height map"),t}var f,d,m,p;u%(4*n)==0?(f=o.data[u],m=o.data[u+4]):u%(4*n)==4*(n-1)?(f=o.data[u-4],m=o.data[u]):(f=o.data[u-4],m=o.data[u+4]),u<4*n?(d=o.data[u],p=o.data[u+4*n]):u>n*(i-1)*4?(d=o.data[u-4*n],p=o.data[u]):(d=o.data[u-4*n],p=o.data[u+4*n]),s.data[u]=f-m+127,s.data[u+1]=d-p+127,s.data[u+2]=255,s.data[u+3]=255}return a.putImageData(s,0,0),r},isHeightImage:function(t,e,r){if(!t||!t.width||!t.height)return!1;var n=document.createElement("canvas"),i=n.getContext("2d"),a=e||32;r=r||20,n.width=n.height=a,i.drawImage(t,0,0,a,a);for(var o=i.getImageData(0,0,a,a),s=0;sr)return!1}return!0},_fetchTexture:function(t,e,r){Gn.get({url:t,responseType:"arraybuffer",onload:e,onerror:r})},createChessboard:function(t,e,r,n){t=t||512,e=e||64,r=r||"black",n=n||"white";var i=Math.ceil(t/e),a=document.createElement("canvas");a.width=t,a.height=t;var o=a.getContext("2d");o.fillStyle=n,o.fillRect(0,0,t,t),o.fillStyle=r;for(var s=0;s 0.0) {\n prefilteredColor += decodeHDR(textureCube(environmentMap, L)).rgb * NoL;\n totalWeight += NoL;\n }\n }\n gl_FragColor = encodeHDR(vec4(prefilteredColor / totalWeight, 1.0));\n}\n"})});h.set("normalDistribution",n),r.encodeRGBM&&h.define("fragment","RGBM_ENCODE"),r.decodeRGBM&&h.define("fragment","RGBM_DECODE");var f,d=new pn;if(e instanceof Nn){var m=new mi({width:a,height:o,type:s===or.FLOAT?or.HALF_FLOAT:s});Bi.panoramaToCubeMap(t,e,m,{encodeRGBM:r.decodeRGBM}),e=m}f=new Ai({scene:d,material:h}),f.material.set("environmentMap",e);var p=new wi({texture:u});r.encodeRGBM&&(s=u.type=or.UNSIGNED_BYTE);for(var _=new Nn({width:a,height:o,type:s}),g=new yi({depthBuffer:!1}),v=He[s===or.UNSIGNED_BYTE?"Uint8Array":"Float32Array"],y=0;y 0.0) {\n float G = G_Smith(roughness, NoV, NoL);\n float G_Vis = G * VoH / (NoH * NoV);\n float Fc = pow(1.0 - VoH, 5.0);\n A += (1.0 - Fc) * G_Vis;\n B += Fc * G_Vis;\n }\n }\n gl_FragColor = vec4(vec2(A, B) / fSampleNumber, 0.0, 1.0);\n}\n"}),i=new Nn({width:512,height:256,type:or.HALF_FLOAT,minFilter:or.NEAREST,magFilter:or.NEAREST,useMipmap:!1});return n.setUniform("normalDistribution",e),n.setUniform("viewportSize",[512,256]),n.attachOutput(i),n.render(t,r),r.dispose(t),i},Fi.generateNormalDistribution=function(t,e){for(var t=t||256,e=e||1024,r=new Nn({width:t,height:e,type:or.FLOAT,minFilter:or.NEAREST,magFilter:or.NEAREST,useMipmap:!1}),n=new Float32Array(e*t*4),i=0;i>>16)>>>0;o=((1431655765&o)<<1|(2863311530&o)>>>1)>>>0,o=((858993459&o)<<2|(3435973836&o)>>>2)>>>0,o=((252645135&o)<<4|(4042322160&o)>>>4)>>>0,o=(((16711935&o)<<8|(4278255360&o)>>>8)>>>0)/4294967296;for(var s=0;s= shadowCascadeClipsNear[_idx_] &&\n depth <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[0], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[0],\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n shadowContribs[0] = shadowContrib;\n }\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#else\nvoid computeShadowOfDirectionalLights(vec3 position, inout float shadowContribs[DIRECTIONAL_LIGHT_COUNT]){\n float shadowContrib;\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[_idx_], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[_idx_]\n );\n shadowContribs[_idx_] = shadowContrib;\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\nvoid computeShadowOfPointLights(vec3 position, inout float shadowContribs[POINT_LIGHT_COUNT] ){\n vec3 lightPosition;\n vec3 direction;\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n lightPosition = pointLightPosition[_idx_];\n direction = position - lightPosition;\n shadowContribs[_idx_] = computeShadowContribOmni(pointLightShadowMaps[_idx_], direction, pointLightRange[_idx_]);\n }}\n for(int _idx_ = POINT_LIGHT_SHADOWMAP_COUNT; _idx_ < POINT_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n@end");var ji=Me.extend(function(){return{softShadow:ji.PCF,shadowBlur:1,lightFrustumBias:"auto",kernelPCF:new Float32Array([1,0,1,1,-1,1,0,1,-1,0,-1,-1,1,-1,0,-1]),precision:"mediump",_lastRenderNotCastShadow:!1,_frameBuffer:new yi,_textures:{},_shadowMapNumber:{POINT_LIGHT:0,DIRECTIONAL_LIGHT:0,SPOT_LIGHT:0},_depthMaterials:{},_distanceMaterials:{},_opaqueCasters:[],_receivers:[],_lightsCastShadow:[],_lightCameras:{},_lightMaterials:{},_texturePool:new Gi}},function(){this._gaussianPassH=new bi({fragment:Y.source("clay.compositor.gaussian_blur")}),this._gaussianPassV=new bi({fragment:Y.source("clay.compositor.gaussian_blur")}),this._gaussianPassH.setUniform("blurSize",this.shadowBlur),this._gaussianPassH.setUniform("blurDir",0),this._gaussianPassV.setUniform("blurSize",this.shadowBlur),this._gaussianPassV.setUniform("blurDir",1),this._outputDepthPass=new bi({fragment:Y.source("clay.sm.debug_depth")})},{render:function(t,e,r,n){r||(r=e.getMainCamera()),this.trigger("beforerender",this,t,e,r),this._renderShadowPass(t,e,r,n),this.trigger("afterrender",this,t,e,r)},renderDebug:function(t,e){t.saveClear();var r=t.viewport,n=0,i=e||r.width/4,a=i;this.softShadow===ji.VSM?this._outputDepthPass.material.define("fragment","USE_VSM"):this._outputDepthPass.material.undefine("fragment","USE_VSM");for(var o in this._textures){var s=this._textures[o];t.setViewport(n,0,i*s.width/s.height,a),this._outputDepthPass.setUniform("depthMap",s),this._outputDepthPass.render(t),n+=i*s.width/s.height}t.setViewport(r),t.restoreClear()},_updateCasterAndReceiver:function(t,e){if(e.castShadow&&this._opaqueCasters.push(e),e.receiveShadow?(this._receivers.push(e),e.material.set("shadowEnabled",1),e.material.set("pcfKernel",this.kernelPCF)):e.material.set("shadowEnabled",0),!e.material.shader&&e.material.updateShader&&e.material.updateShader(t),this.softShadow===ji.VSM)e.material.define("fragment","USE_VSM"),e.material.undefine("fragment","PCF_KERNEL_SIZE");else{e.material.undefine("fragment","USE_VSM");var r=this.kernelPCF;r&&r.length?e.material.define("fragment","PCF_KERNEL_SIZE",r.length/2):e.material.undefine("fragment","PCF_KERNEL_SIZE")}},_update:function(t,e){for(var r=0;r4){console.warn("Support at most 4 cascade");continue}p.shadowCascade>1&&(s=p.shadowCascade),this.renderDirectionalLightShadow(t,e,r,p,this._opaqueCasters,f,h,c)}else p instanceof ci?this.renderSpotLightShadow(t,e,p,this._opaqueCasters,l,u):p instanceof li&&this.renderPointLightShadow(t,e,p,this._opaqueCasters,d);this._shadowMapNumber[p.type]++}for(var _ in this._shadowMapNumber)for(var g=this._shadowMapNumber[_],v=_+"_SHADOWMAP_COUNT",m=0;m0?x.define("fragment",v,g):x.isDefined("fragment",v)&&x.undefine("fragment",v))}for(var m=0;m0){var E=c.map(i);if(T.directionalLightShadowMaps={value:c,type:"tv"},T.directionalLightMatrices={value:h,type:"m4v"},T.directionalLightShadowMapSizes={value:E,type:"1fv"},s){var b=f.slice(),A=f.slice();b.pop(),A.shift(),b.reverse(),A.reverse(),h.reverse(),T.shadowCascadeClipsNear={value:b,type:"1fv"},T.shadowCascadeClipsFar={value:A,type:"1fv"}}}if(u.length>0){var S=u.map(i),T=e.shadowUniforms;T.spotLightShadowMaps={value:u,type:"tv"},T.spotLightMatrices={value:l,type:"m4v"},T.spotLightShadowMapSizes={value:S,type:"1fv"}}d.length>0&&(T.pointLightShadowMaps={value:d,type:"tv"})}},renderDirectionalLightShadow:function(){var t=new un,e=new rr,r=new Je,n=new rr,i=new rr,a=new rr,o=new rr;return function(s,u,l,c,h,f,d,m){var p=this._getDepthMaterial(c),_={getMaterial:function(t){return t.shadowDepthMaterial||p},sortCompare:Gr.opaqueSortCompare};if(!u.viewBoundingBoxLastFrame.isFinite()){var g=u.getBoundingBox();u.viewBoundingBoxLastFrame.copy(g).applyTransform(l.viewMatrix)}var v=Math.min(-u.viewBoundingBoxLastFrame.min.z,l.far),y=Math.max(-u.viewBoundingBoxLastFrame.max.z,l.near),x=this._getDirectionalLightCamera(c,u,l),T=a.array;o.copy(x.projectionMatrix),zi.invert(i.array,x.worldTransform.array),zi.multiply(i.array,i.array,l.worldTransform.array),zi.multiply(T,o.array,i.array);for(var E=[],b=l instanceof kn,A=(l.near+l.far)/(l.near-l.far),S=2*l.near*l.far/(l.near-l.far),w=0;w<=c.shadowCascade;w++){var C=y*Math.pow(v/y,w/c.shadowCascade),N=y+(v-y)*w/c.shadowCascade,M=C*c.cascadeSplitLogFactor+N*(1-c.cascadeSplitLogFactor);E.push(M),f.push(-(-M*A+S)/-M)}var R=this._getTexture(c,c.shadowCascade);m.push(R);var L=s.viewport,P=s.gl;this._frameBuffer.attach(R),this._frameBuffer.bind(s),P.clear(P.COLOR_BUFFER_BIT|P.DEPTH_BUFFER_BIT);for(var w=0;w=0&&x[v]>1e-4&&(qi.transformMat4(b,y,_[T[v]]),qi.scaleAndAdd(E,E,b,x[v]));A.set(g,E)}}for(var g=0;g0,l=e.color;e.depth=0,u&&sa.set(l,0,0,0,0);for(var c=!0,h=1/n,f=0;f-g&&m-g&&p-g&&_0){var _=f[0],b=(_[0]+1)*u,A=(1-_[1])*l;e.fillStyle=p,"rectangle"===T?e.fillRect(b-E,A-E,x,x):"circle"===T&&(e.beginPath(),e.arc(b,A,E,0,2*Math.PI),e.fill())}}}e.restore()},dispose:function(){this._triangles.clear(),this._lines.clear(),this._points.clear(),this._primitives=[],this.ctx=null,this.canvas=null}}),ha=Me.extend(function(){return{name:"",inputLinks:{},outputLinks:{},_prevOutputTextures:{},_outputTextures:{},_outputReferences:{},_rendering:!1,_rendered:!1,_compositor:null}},{updateParameter:function(t,e){var r=this.outputs[t],n=r.parameters,i=r._parametersCopy;if(i||(i=r._parametersCopy={}),n)for(var a in n)"width"!==a&&"height"!==a&&(i[a]=n[a]);var o,s;return o=n.width instanceof Function?n.width.call(this,e):n.width,s=n.height instanceof Function?n.height.call(this,e):n.height,i.width===o&&i.height===s||this._outputTextures[t]&&this._outputTextures[t].dispose(e.gl),i.width=o,i.height=s,i},setParameter:function(t,e){},getParameter:function(t){},setParameters:function(t){for(var e in t)this.setParameter(e,t[e])},render:function(){},getOutput:function(t,e){if(null==e)return e=t,this._outputTextures[e];var r=this.outputs[e];if(r)return this._rendered?r.outputLastFrame?this._prevOutputTextures[e]:this._outputTextures[e]:this._rendering?(this._prevOutputTextures[e]||(this._prevOutputTextures[e]=this._compositor.allocateTexture(r.parameters||{})),this._prevOutputTextures[e]):(this.render(t),this._outputTextures[e])},removeReference:function(t){if(0===--this._outputReferences[t]){this.outputs[t].keepLastFrame?(this._prevOutputTextures[t]&&this._compositor.releaseTexture(this._prevOutputTextures[t]),this._prevOutputTextures[t]=this._outputTextures[t]):this._compositor.releaseTexture(this._outputTextures[t])}},link:function(t,e,r){this.inputLinks[t]={node:e,pin:r},e.outputLinks[r]||(e.outputLinks[r]=[]),e.outputLinks[r].push({node:this,pin:t}),this.pass.material.enableTexture(t)},clear:function(){this.inputLinks={},this.outputLinks={}},updateReference:function(t){if(!this._rendering){this._rendering=!0;for(var e in this.inputLinks){var r=this.inputLinks[e];r.node.updateReference(r.pin)}this._rendering=!1}t&&this._outputReferences[t]++},beforeFrame:function(){this._rendered=!1;for(var t in this.outputLinks)this._outputReferences[t]=0},afterFrame:function(){for(var t in this.outputLinks)if(this._outputReferences[t]>0){var e=this.outputs[t];e.keepLastFrame?(this._prevOutputTextures[t]&&this._compositor.releaseTexture(this._prevOutputTextures[t]),this._prevOutputTextures[t]=this._outputTextures[t]):this._compositor.releaseTexture(this._outputTextures[t])}}}),fa=Me.extend(function(){return{nodes:[]}},{dirty:function(){this._dirty=!0},addNode:function(t){this.nodes.indexOf(t)>=0||(this.nodes.push(t),this._dirty=!0)},removeNode:function(t){"string"==typeof t&&(t=this.getNodeByName(t));var e=this.nodes.indexOf(t);e>=0&&(this.nodes.splice(e,1),this._dirty=!0)},getNodeByName:function(t){for(var e=0;e=e.COLOR_ATTACHMENT0&&u<=e.COLOR_ATTACHMENT0+8&&c.push(u);l.drawBuffersEXT(c)}t.saveClear(),t.clearBit=Fe.DEPTH_BUFFER_BIT|Fe.COLOR_BUFFER_BIT,r=t.render(this.scene,this.camera,!this.autoUpdateScene,this.preZ),t.restoreClear(),n.unbind(t)}else r=t.render(this.scene,this.camera,!this.autoUpdateScene,this.preZ);this.trigger("afterrender",r),this._rendering=!1,this._rendered=!0}}),pa=ha.extend(function(){return{texture:null,outputs:{color:{}}}},function(){},{getOutput:function(t,e){return this.texture},beforeFrame:function(){},afterFrame:function(){}}),_a=ha.extend(function(){return{name:"",inputs:{},outputs:null,shader:"",inputLinks:{},outputLinks:{},pass:null,_prevOutputTextures:{},_outputTextures:{},_outputReferences:{},_rendering:!1,_rendered:!1,_compositor:null}},function(){var t=new bi({fragment:this.shader});this.pass=t},{render:function(t,e){this.trigger("beforerender",t),this._rendering=!0;var r=t.gl;for(var n in this.inputLinks){var i=this.inputLinks[n],a=i.node.getOutput(t,i.pin);this.pass.setUniform(n,a)}if(this.outputs){this.pass.outputs={};var o={};for(var s in this.outputs){var u=this.updateParameter(s,t);isNaN(u.width)&&this.updateParameter(s,t);var l=this.outputs[s],c=this._compositor.allocateTexture(u);this._outputTextures[s]=c;var h=l.attachment||r.COLOR_ATTACHMENT0;"string"==typeof h&&(h=r[h]),o[h]=c}this._compositor.getFrameBuffer().bind(t);for(var h in o)this._compositor.getFrameBuffer().attach(o[h],h);this.pass.render(t),this._compositor.getFrameBuffer().updateMipmap(t.gl)}else this.pass.outputs=null,this._compositor.getFrameBuffer().unbind(t),this.pass.render(t,e);for(var n in this.inputLinks){var i=this.inputLinks[n];i.node.removeReference(i.pin)}this._rendering=!1,this._rendered=!0,this.trigger("afterrender",t)},updateParameter:function(t,e){var r=this.outputs[t],n=r.parameters,i=r._parametersCopy;if(i||(i=r._parametersCopy={}),n)for(var a in n)"width"!==a&&"height"!==a&&(i[a]=n[a]);var o,s;return o=n.width instanceof Function?n.width.call(this,e):n.width,s=n.height instanceof Function?n.height.call(this,e):n.height,i.width===o&&i.height===s||this._outputTextures[t]&&this._outputTextures[t].dispose(e),i.width=o,i.height=s,i},setParameter:function(t,e){this.pass.setUniform(t,e)},getParameter:function(t){return this.pass.getUniform(t)},setParameters:function(t){for(var e in t)this.setParameter(e,t[e])},define:function(t,e){this.pass.material.define("fragment",t,e)},undefine:function(t){this.pass.material.undefine("fragment",t)},removeReference:function(t){if(0===--this._outputReferences[t]){this.outputs[t].keepLastFrame?(this._prevOutputTextures[t]&&this._compositor.releaseTexture(this._prevOutputTextures[t]),this._prevOutputTextures[t]=this._outputTextures[t]):this._compositor.releaseTexture(this._outputTextures[t])}},clear:function(){ha.prototype.clear.call(this),this.pass.material.disableTexturesAll()}}),ga=/^#source\((.*?)\)/;Y.import("@export clay.deferred.gbuffer.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat;\nuniform vec2 uvOffset;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#ifdef FIRST_PASS\nattribute vec3 normal : NORMAL;\n#endif\n@import clay.chunk.skinning_header\n#ifdef FIRST_PASS\nvarying vec3 v_Normal;\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nvarying vec3 v_WorldPosition;\n#endif\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef FIRST_PASS\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n bool hasTangent = dot(tangent, tangent) > 0.0;\n#endif\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n #ifdef FIRST_PASS\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n if (hasTangent) {\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n }\n #endif\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n#ifdef FIRST_PASS\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n if (hasTangent) {\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n#endif\n}\n@end\n@export clay.deferred.gbuffer1.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform float glossiness;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nuniform sampler2D roughGlossMap;\nuniform bool useRoughGlossMap;\nuniform bool useRoughness;\nuniform bool doubleSided;\nuniform int roughGlossChannel: 0;\nfloat indexingTexel(in vec4 texel, in int idx) {\n if (idx == 3) return texel.a;\n else if (idx == 1) return texel.g;\n else if (idx == 2) return texel.b;\n else return texel.r;\n}\nvoid main()\n{\n vec3 N = v_Normal;\n if (doubleSided) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = eyePos - v_WorldPosition;\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n }\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_Texcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n gl_FragColor.rgb = (N + 1.0) * 0.5;\n float g = glossiness;\n if (useRoughGlossMap) {\n float g2 = indexingTexel(texture2D(roughGlossMap, v_Texcoord), roughGlossChannel);\n if (useRoughness) {\n g2 = 1.0 - g2;\n }\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n gl_FragColor.a = g + 0.005;\n}\n@end\n@export clay.deferred.gbuffer2.fragment\nuniform sampler2D diffuseMap;\nuniform sampler2D metalnessMap;\nuniform vec3 color;\nuniform float metalness;\nuniform bool useMetalnessMap;\nuniform bool linear;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvoid main ()\n{\n float m = metalness;\n if (useMetalnessMap) {\n vec4 metalnessTexel = texture2D(metalnessMap, v_Texcoord);\n m = clamp(metalnessTexel.r + (m * 2.0 - 1.0), 0.0, 1.0);\n }\n vec4 texel = texture2D(diffuseMap, v_Texcoord);\n if (linear) {\n texel = sRGBToLinear(texel);\n }\n gl_FragColor.rgb = texel.rgb * color;\n gl_FragColor.a = m + 0.005;\n}\n@end\n@export clay.deferred.gbuffer.debug\n@import clay.deferred.chunk.light_head\nuniform int debug: 0;\nvoid main ()\n{\n @import clay.deferred.chunk.gbuffer_read\n if (debug == 0) {\n gl_FragColor = vec4(N, 1.0);\n }\n else if (debug == 1) {\n gl_FragColor = vec4(vec3(z), 1.0);\n }\n else if (debug == 2) {\n gl_FragColor = vec4(position, 1.0);\n }\n else if (debug == 3) {\n gl_FragColor = vec4(vec3(glossiness), 1.0);\n }\n else if (debug == 4) {\n gl_FragColor = vec4(vec3(metalness), 1.0);\n }\n else {\n gl_FragColor = vec4(albedo, 1.0);\n }\n}\n@end"),Y.import("@export clay.deferred.chunk.light_head\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform vec2 windowSize: WINDOW_SIZE;\nuniform vec4 viewport: VIEWPORT;\nuniform mat4 viewProjectionInv;\n#ifdef DEPTH_ENCODED\n@import clay.util.decode_float\n#endif\n@end\n@export clay.deferred.chunk.gbuffer_read\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec2 uv2 = (gl_FragCoord.xy - viewport.xy) / viewport.zw;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n vec4 texel3 = texture2D(gBufferTexture3, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n float glossiness = texel1.a;\n float metalness = texel3.a;\n vec3 N = texel1.rgb * 2.0 - 1.0;\n float z = texture2D(gBufferTexture2, uv).r * 2.0 - 1.0;\n vec2 xy = uv2 * 2.0 - 1.0;\n vec4 projectedPos = vec4(xy, z, 1.0);\n vec4 p4 = viewProjectionInv * projectedPos;\n vec3 position = p4.xyz / p4.w;\n vec3 albedo = texel3.rgb;\n vec3 diffuseColor = albedo * (1.0 - metalness);\n vec3 specularColor = mix(vec3(0.04), albedo, metalness);\n@end\n@export clay.deferred.chunk.light_equation\nfloat D_Phong(in float g, in float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(in float g, in float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (3.1415926 * tmp * tmp);\n}\nvec3 F_Schlick(in float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nvec3 lightEquation(\n in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n in float ndl, in float ndh, in float ndv, in float g\n)\n{\n return ndl * lightColor\n * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n}\n@end");var va=Me.extend(function(){return{enableTargetTexture1:!0,enableTargetTexture2:!0,enableTargetTexture3:!0,renderTransparent:!1,_renderList:[],_gBufferTex1:new Nn({minFilter:or.NEAREST,magFilter:or.NEAREST,type:or.HALF_FLOAT}),_gBufferTex2:new Nn({minFilter:or.NEAREST,magFilter:or.NEAREST,format:or.DEPTH_STENCIL,type:or.UNSIGNED_INT_24_8_WEBGL}),_gBufferTex3:new Nn({minFilter:or.NEAREST,magFilter:or.NEAREST}),_defaultNormalMap:new Nn({image:qt("#000")}),_defaultRoughnessMap:new Nn({image:qt("#fff")}),_defaultMetalnessMap:new Nn({image:qt("#fff")}),_defaultDiffuseMap:new Nn({image:qt("#fff")}),_frameBuffer:new yi,_gBufferMaterial1:new pr({shader:new Y(Y.source("clay.deferred.gbuffer.vertex"),Y.source("clay.deferred.gbuffer1.fragment")),vertexDefines:{FIRST_PASS:null},fragmentDefines:{FIRST_PASS:null}}),_gBufferMaterial2:new pr({shader:new Y(Y.source("clay.deferred.gbuffer.vertex"),Y.source("clay.deferred.gbuffer2.fragment"))}),_debugPass:new bi({fragment:Y.source("clay.deferred.gbuffer.debug")})}},{resize:function(t,e){this._gBufferTex1.width===t&&this._gBufferTex1.height===e||(this._gBufferTex1.width=t,this._gBufferTex1.height=e,this._gBufferTex2.width=t,this._gBufferTex2.height=e,this._gBufferTex3.width=t,this._gBufferTex3.height=e)},setViewport:function(t,e,r,n,i){var a;a="object"==typeof t?t:{x:t,y:e,width:r,height:n,devicePixelRatio:i||1},this._frameBuffer.viewport=a},getViewport:function(){return this._frameBuffer.viewport?this._frameBuffer.viewport:{x:0,y:0,width:this._gBufferTex1.width,height:this._gBufferTex1.height,devicePixelRatio:1}},update:function(t,e,r){for(var n=t.gl,i=this._frameBuffer,a=i.viewport,o=e.opaqueList,s=e.transparentList,u=0,l=this._renderList,c=0;c= shadowCascadeClipsNear[_idx_] &&\n z <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrices[_idx_], position, lightShadowMapSize,\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n }\n }}\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"),Y.import("@export clay.deferred.ambient_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec2 windowSize: WINDOW_SIZE;\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo;\n gl_FragColor.a = 1.0;\n}\n@end"),Y.import("@export clay.deferred.ambient_sh_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec3 lightCoefficients[9];\nuniform vec2 windowSize: WINDOW_SIZE;\nvec3 calcAmbientSHLight(vec3 N) {\n return lightCoefficients[0]\n + lightCoefficients[1] * N.x\n + lightCoefficients[2] * N.y\n + lightCoefficients[3] * N.z\n + lightCoefficients[4] * N.x * N.z\n + lightCoefficients[5] * N.z * N.y\n + lightCoefficients[6] * N.y * N.x\n + lightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + lightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 N = texel1.rgb * 2.0 - 1.0;\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo * calcAmbientSHLight(N);\n gl_FragColor.a = 1.0;\n}\n@end"), -Y.import("@export clay.deferred.ambient_cubemap_light\n@import clay.deferred.chunk.light_head\nuniform vec3 lightColor;\nuniform samplerCube lightCubemap;\nuniform sampler2D brdfLookup;\nuniform vec3 eyePosition;\n@import clay.util.rgbm\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 V = normalize(eyePosition - position);\n vec3 L = reflect(-V, N);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float rough = clamp(1.0 - glossiness, 0.0, 1.0);\n float bias = rough * 5.0;\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n vec3 envWeight = specularColor * brdfParam.x + brdfParam.y;\n vec3 envTexel = RGBMDecode(textureCubeLodEXT(lightCubemap, L, bias), 51.5);\n gl_FragColor.rgb = lightColor * envTexel * envWeight;\n gl_FragColor.a = 1.0;\n}\n@end"),Y.import("@export clay.deferred.point_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform samplerCube lightShadowMap;\nuniform float lightShadowMapSize;\n#endif\nvarying vec3 v_Position;\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContribOmni(\n lightShadowMap, -L * dist, lightRange\n );\n gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n#endif\n gl_FragColor.a = 1.0;\n}\n@end"),Y.import("@export clay.deferred.sphere_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform float lightRadius;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n vec3 R = reflect(V, N);\n float tmp = dot(L, R);\n vec3 cToR = tmp * R - L;\n float d = length(cToR);\n L = L + cToR * clamp(lightRadius / d, 0.0, 1.0);\n L = normalize(L);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = lightColor * ndl * attenuation;\n glossiness = clamp(glossiness - lightRadius / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n gl_FragColor.a = 1.0;\n}\n@end"),Y.import("@export clay.deferred.tube_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 lightExtend;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n vec3 R = reflect(V, N);\n vec3 L0 = lightPosition - lightExtend - position;\n vec3 L1 = lightPosition + lightExtend - position;\n vec3 LD = L1 - L0;\n float len0 = length(L0);\n float len1 = length(L1);\n float irra = 2.0 * clamp(dot(N, L0) / (2.0 * len0) + dot(N, L1) / (2.0 * len1), 0.0, 1.0);\n float LDDotR = dot(R, LD);\n float t = (LDDotR * dot(R, L0) - dot(L0, LD)) / (dot(LD, LD) - LDDotR * LDDotR);\n t = clamp(t, 0.0, 1.0);\n L = L0 + t * LD;\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n glossiness = clamp(glossiness - 0.0 / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = lightColor * irra * lightAttenuation(dist, lightRange)\n * (diffuseColor + D_Phong(glossiness, ndh) * F_Schlick(ndv, specularColor));\n gl_FragColor.a = 1.0;\n}\n@end"),Y.import(Br);var ba=Me.extend(function(){var t=Y.source("clay.compositor.vertex"),e=Y.source("clay.deferred.light_volume.vertex"),r=new Y(t,Y.source("clay.deferred.directional_light")),n=function(t){t.blendEquation(t.FUNC_ADD),t.blendFunc(t.ONE,t.ONE)},i=function(t){return new pr({shader:t,blend:n,transparent:!0,depthMask:!1})},a=function(t){return new Y(e,Y.source("clay.deferred."+t))},o=new Ta({capSegments:10}),s=new rr;s.rotateX(Math.PI/2).translate(new Ve(0,-1,0)),o.applyTransform(s);var u=new Ea({capSegments:10});return s.identity().rotateZ(Math.PI/2),u.applyTransform(s),{shadowMapPass:null,autoResize:!0,_createLightPassMat:i,_gBuffer:new va,_lightAccumFrameBuffer:new yi({depthBuffer:!1}),_lightAccumTex:new Nn({type:or.HALF_FLOAT,minFilter:or.NEAREST,magFilter:or.NEAREST}),_fullQuadPass:new bi({blendWithPrevious:!0}),_directionalLightMat:i(r),_ambientMat:i(new Y(t,Y.source("clay.deferred.ambient_light"))),_ambientSHMat:i(new Y(t,Y.source("clay.deferred.ambient_sh_light"))),_ambientCubemapMat:i(new Y(t,Y.source("clay.deferred.ambient_cubemap_light"))),_spotLightShader:a("spot_light"),_pointLightShader:a("point_light"),_sphereLightShader:a("sphere_light"),_tubeLightShader:a("tube_light"),_lightSphereGeo:new Sn({widthSegments:10,heightSegements:10}),_lightConeGeo:o,_lightCylinderGeo:u,_outputPass:new bi({fragment:Y.source("clay.compositor.output")})}},{render:function(t,e,r,n){n=n||{},n.renderToTarget=n.renderToTarget||!1,n.notUpdateShadow=n.notUpdateShadow||!1,n.notUpdateScene=n.notUpdateScene||!1,n.notUpdateScene||e.update(!1,!0),r.update(!0);var i=t.getDevicePixelRatio();!this.autoResize||t.getWidth()*i===this._lightAccumTex.width&&t.getHeight()*i===this._lightAccumTex.height||this.resize(t.getWidth()*i,t.getHeight()*i),this._gBuffer.update(t,e,r),this._accumulateLightBuffer(t,e,r,!n.notUpdateShadow),n.renderToTarget||(this._outputPass.setUniform("texture",this._lightAccumTex),this._outputPass.render(t))},getTargetTexture:function(){return this._lightAccumTex},getTargetFrameBuffer:function(){return this._lightAccumFrameBuffer},getGBuffer:function(){return this._gBuffer},setViewport:function(t,e,r,n,i){this._gBuffer.setViewport(t,e,r,n,i),this._lightAccumFrameBuffer.viewport=this._gBuffer.getViewport()},resize:function(t,e){this._lightAccumTex.width=t,this._lightAccumTex.height=e,this._gBuffer.resize(t,e)},_accumulateLightBuffer:function(t,e,r,n){for(var i=t.gl,a=this._lightAccumTex,o=this._lightAccumFrameBuffer,s=r.getWorldPosition().array,u=0;u0&&qa.scaleAndAdd(t.array,t.array,this.force.array,n/r)}}) -;Y.import("@export clay.particle.vertex\nuniform mat4 worldView : WORLDVIEW;\nuniform mat4 projection : PROJECTION;\nattribute vec3 position : POSITION;\nattribute vec3 normal : NORMAL;\n#ifdef UV_ANIMATION\nattribute vec2 texcoord0 : TEXCOORD_0;\nattribute vec2 texcoord1 : TEXCOORD_1;\nvarying vec2 v_Uv0;\nvarying vec2 v_Uv1;\n#endif\nvarying float v_Age;\nvoid main() {\n v_Age = normal.x;\n float rotation = normal.y;\n vec4 worldViewPosition = worldView * vec4(position, 1.0);\n gl_Position = projection * worldViewPosition;\n float w = gl_Position.w;\n gl_PointSize = normal.z * projection[0].x / w;\n #ifdef UV_ANIMATION\n v_Uv0 = texcoord0;\n v_Uv1 = texcoord1;\n #endif\n}\n@end\n@export clay.particle.fragment\nuniform sampler2D sprite;\nuniform sampler2D gradient;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\nvarying float v_Age;\n#ifdef UV_ANIMATION\nvarying vec2 v_Uv0;\nvarying vec2 v_Uv1;\n#endif\nvoid main() {\n vec4 color = vec4(color, alpha);\n #ifdef SPRITE_ENABLED\n #ifdef UV_ANIMATION\n color *= texture2D(sprite, mix(v_Uv0, v_Uv1, gl_PointCoord));\n #else\n color *= texture2D(sprite, gl_PointCoord);\n #endif\n #endif\n #ifdef GRADIENT_ENABLED\n color *= texture2D(gradient, vec2(v_Age, 0.5));\n #endif\n gl_FragColor = color;\n}\n@end");var Ka=new Y(Y.source("clay.particle.vertex"),Y.source("clay.particle.fragment")),Za=Fn.extend({loop:!0,oneshot:!1,duration:1,spriteAnimationTileX:1,spriteAnimationTileY:1,spriteAnimationRepeat:0,mode:Fn.POINTS,ignorePicking:!0,_elapsedTime:0,_emitting:!0},function(){this.geometry=new Tn({dynamic:!0}),this.material||(this.material=new pr({shader:Ka,transparent:!0,depthMask:!1}),this.material.enableTexture("sprite")),this._particles=[],this._fields=[],this._emitters=[]},{culling:!1,frustumCulling:!1,castShadow:!1,receiveShadow:!1,addEmitter:function(t){this._emitters.push(t)},removeEmitter:function(t){this._emitters.splice(this._emitters.indexOf(t),1)},addField:function(t){this._fields.push(t)},removeField:function(t){this._fields.splice(this._fields.indexOf(t),1)},reset:function(){for(var t=0;t=i.life?(i.emitter.kill(i),e[r]=e[n-1],e.pop(),n--):r++}for(var r=0;r0)for(var a=0;a1,o=t.attributes.position.value,s=t.attributes.normal.value,u=t.attributes.texcoord0.value,l=t.attributes.texcoord1.value,c=this._particles.length;o&&o.length===3*c||(o=t.attributes.position.value=new Float32Array(3*c),s=t.attributes.normal.value=new Float32Array(3*c),a&&(u=t.attributes.texcoord0.value=new Float32Array(2*c),l=t.attributes.texcoord1.value=new Float32Array(2*c)));for(var h=1/e,f=0;fthis.duration&&!this.loop},dispose:function(t){for(var e=0;e1&&n&&n.length>1){var a=$t(n)/$t(i);!isFinite(a)&&(a=1),e.pinchScale=a;var o=te(n);return e.pinchX=o[0],e.pinchY=o[1],{type:"pinch",target:t[0].target,event:e}}}}},eo=[[0,0],[0,1],[1,1],[1,0]],ro=[0,1,2,2,3,0],no=Un.extend({camera:null,plane:null,maxGrid:0,frustumCulling:!1},function(){var t=this.geometry=new Tn({dynamic:!0});t.attributes.position.init(6),t.attributes.normal.init(6),t.attributes.texcoord0.init(6),t.indices=new Uint16Array(6),this.plane=new tn},{updateGeometry:function(){var t=this._unProjectGrid();if(t){for(var e=this.geometry.attributes.position,r=this.geometry.attributes.normal,n=this.geometry.attributes.texcoord0,i=this.geometry.indices,a=0;a<6;a++){var o=ro[a];e.set(a,t[o].array),r.set(a,this.plane.normal.array),n.set(a,eo[o]),i[a]=a}this.geometry.dirty()}},_unProjectGrid:function(){for(var t=new tn,e=[0,1,0,2,1,3,2,3,4,5,4,6,5,7,6,7,0,4,1,5,2,6,3,7],r=new Ve,n=new Ve,i=[],a=[],o=0;o<4;o++)a[o]=new Ve(0,0);var s=new cn;return function(){t.copy(this.plane),t.applyTransform(this.camera.viewMatrix);for(var o=this.camera.frustum.vertices,u=0,l=0;l<12;l++){r.array=o[e[2*l]],n.array=o[e[2*l+1]];var c=t.intersectLine(r,n,i[u]);c&&(i[u]||(i[u]=c),u++)}if(0!==u){for(var l=0;l0},update:function(t){if(t=t||16,this._rotating){var e=("cw"===this.autoRotateDirection?1:-1)*this.autoRotateSpeed/180*Math.PI;this._phi-=e*t/1e3,this._needsUpdate=!0}else this._rotateVelocity.len()>0&&(this._needsUpdate=!0);(Math.abs(this._zoomSpeed)>.01||this._panVelocity.len()>0)&&(this._needsUpdate=!0),this._needsUpdate&&(this._updateDistance(Math.min(t,50)),this._updatePan(Math.min(t,50)),this._updateRotate(Math.min(t,50)),this._updateTransform(),this.target.update(),this.trigger("update"),this._needsUpdate=!1)},_updateRotate:function(t){var e=this._rotateVelocity;this._phi=e.y*t/20+this._phi,this._theta=e.x*t/20+this._theta,this.setAlpha(this.getAlpha()),this.setBeta(this.getBeta()),this._vectorDamping(e,this.damping)},_updateDistance:function(t){this._setDistance(this._distance+this._zoomSpeed*t/20),this._zoomSpeed*=this.damping},_setDistance:function(t){this._distance=Math.max(Math.min(t,this.maxDistance),this.minDistance)},_updatePan:function(t){var e=this._panVelocity,r=this._distance,n=this.target,i=n.worldTransform.y,a=n.worldTransform.x;this._center.scaleAndAdd(a,-e.x*r/200).scaleAndAdd(i,-e.y*r/200),this._vectorDamping(e,0)},_updateTransform:function(){var t=this.target,e=new Ve,r=this._theta+Math.PI/2,n=this._phi+Math.PI/2,i=Math.sin(r);e.x=i*Math.cos(n),e.y=-Math.cos(r),e.z=i*Math.sin(n),t.position.copy(this._center).scaleAndAdd(e,this._distance),t.rotation.identity().rotateY(-this._phi).rotateX(-this._theta)},_startCountingStill:function(){clearTimeout(this._stillTimeout);var t=this.autoRotateAfterStill,e=this;!isNaN(t)&&t>0&&(this._stillTimeout=setTimeout(function(){e._rotating=!0},1e3*t))},_vectorDamping:function(t,e){var r=t.len();r*=e,r<1e-4&&(r=0),t.normalize().scale(r)},decomposeTransform:function(){if(this.target){this.target.updateWorldTransform();var t=this.target.worldTransform.z,e=Math.asin(t.y),r=Math.atan2(t.x,t.z);this._theta=e,this._phi=-r,this.setBeta(this.getBeta()),this.setAlpha(this.getAlpha()),this._setDistance(this.target.position.dist(this._center))}},_mouseDownHandler:function(t){if(!this._isAnimating()){var e=t.clientX,r=t.clientY;if(t.targetTouches){var n=t.targetTouches[0];e=n.clientX,r=n.clientY,this._mode="rotate",this._processGesture(t,"start")}var i=this.domElement;i.addEventListener("touchmove",this._mouseMoveHandler),i.addEventListener("touchend",this._mouseUpHandler),i.addEventListener("mousemove",this._mouseMoveHandler),i.addEventListener("mouseup",this._mouseUpHandler),0===t.button?this._mode="rotate":1===t.button&&(this._mode="pan"),this._rotateVelocity.set(0,0),this._rotating=!1,this.autoRotate&&this._startCountingStill(),this._mouseX=e,this._mouseY=r}},_mouseMoveHandler:function(t){if(!this._isAnimating()){var e,r=t.clientX,n=t.clientY;if(t.targetTouches){var i=t.targetTouches[0];r=i.clientX,n=i.clientY,e=this._processGesture(t,"change")}var a=ee(this.panSensitivity),o=ee(this.rotateSensitivity);e||("rotate"===this._mode?(this._rotateVelocity.y=(r-this._mouseX)/this.domElement.clientHeight*2*o[0],this._rotateVelocity.x=(n-this._mouseY)/this.domElement.clientWidth*2*o[1]):"pan"===this._mode&&(this._panVelocity.x=(r-this._mouseX)/this.domElement.clientWidth*a[0]*400,this._panVelocity.y=(-n+this._mouseY)/this.domElement.clientHeight*a[1]*400)),this._mouseX=r,this._mouseY=n,t.preventDefault()}},_mouseWheelHandler:function(t){if(!this._isAnimating()){var e=t.wheelDelta||-t.detail;0!==e&&this._zoomHandler(t,e>0?-1:1)}},_pinchHandler:function(t){this._isAnimating()||this._zoomHandler(t,t.pinchScale>1?-.4:.4)},_zoomHandler:function(t,e){var r=Math.max(Math.min(this._distance-this.minDistance,this.maxDistance-this._distance));this._zoomSpeed=e*Math.max(r/40*this.zoomSensitivity,.2),this._rotating=!1,this.autoRotate&&"rotate"===this._mode&&this._startCountingStill(),t.preventDefault()},_mouseUpHandler:function(t){var e=this.domElement;e.removeEventListener("touchmove",this._mouseMoveHandler),e.removeEventListener("touchend",this._mouseUpHandler),e.removeEventListener("mousemove",this._mouseMoveHandler),e.removeEventListener("mouseup",this._mouseUpHandler),this._processGesture(t,"end")},_addAnimator:function(t){var e=this._animators;return e.push(t),t.done(function(){var r=e.indexOf(t);r>=0&&e.splice(r,1)}),t},_processGesture:function(t,e){var r=this._gestureMgr;"start"===e&&r.clear();var n=r.recognize(t,null,this.domElement);if("end"===e&&r.clear(),n){var i=n.type;t.gestureEvent=i,this._pinchHandler(n.event)}return n}});Object.defineProperty(io.prototype,"autoRotate",{get:function(){return this._autoRotate},set:function(t){this._autoRotate=t,this._rotating=t}}),Object.defineProperty(io.prototype,"target",{get:function(){return this._target},set:function(t){t&&t.target&&this.setCenter(t.target.toArray()),this._target=t,this.decomposeTransform()}});var ao=Tn.extend({dynamic:!1}),oo=fe.mat4,so=fe.vec3,uo={merge:function(t,e){if(t.length){var r=t[0],n=r.geometry,i=r.material,a=new Tn({dynamic:!1});a.boundingBox=new Je;for(var o=n.getEnabledAttributes(),s=0;s=65535?new Uint32Array(3*f):new Uint16Array(3*f);for(var _=0,g=0,v=n.isUseIndices(),y=0;y0;){for(var _=[],g=[],v=[],y=0,f=0;f=0&&-1===g[S]&&(y65535?new Uint32Array(3*R.triangles.length):new Uint16Array(3*R.triangles.length);var G=0;O=0;for(var f=0;f=0?L[S]:-1}O++}D.indices[G++]=N[b]}D.updateBoundingBox(),w.add(I)}for(var j=t.children(),f=0;f0&&(r.indices=ne(t.indices,e),n.push(r.indices.buffer)),r.attributes={};for(var i in t.attributes)if(t.attributes.hasOwnProperty(i)){var a=t.attributes[i];a&&a.value&&a.value.length>0&&(a=r.attributes[i]=re(a,e),n.push(a.value.buffer))}return{data:r,buffers:n}},toGeometry:function(t){if(!t)return null;if(t.data&&t.buffers)return co.toGeometry(t.data);if(!t.metadata||t.metadata.generator!==lo.generator)throw new Error("[util.transferable.toGeometry] the object is not generated by util.transferable.");var e={dynamic:t.dynamic,indices:t.indices};if(t.boundingBox){var r=(new Ve).setArray(t.boundingBox.min),n=(new Ve).setArray(t.boundingBox.max);e.boundingBox=new Je(r,n)}var i={};for(var a in t.attributes)if(t.attributes.hasOwnProperty(a)){var o=t.attributes[a];i[a]=new Tn.Attribute(o.name,o.type,o.size,o.semantic),i[a].value=o.value}return e.attributes=i,new Tn(e)}};Y.import("@export clay.vr.disorter.output.vertex\nattribute vec2 texcoord: TEXCOORD_0;\nattribute vec3 position: POSITION;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n v_Texcoord = texcoord;\n gl_Position = vec4(position.xy, 0.5, 1.0);\n}\n@end\n@export clay.vr.disorter.output.fragment\nuniform sampler2D texture;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n gl_FragColor = texture2D(texture, v_Texcoord);\n}\n@end");var ho=Me.extend(function(){return{clearColor:[0,0,0,1],_mesh:new Un({geometry:new Tn({dynamic:!0}),culling:!1,material:new pr({depthTest:!1,shader:new Y({vertex:Y.source("clay.vr.disorter.output.vertex"),fragment:Y.source("clay.vr.disorter.output.fragment")})})}),_fakeCamera:new kn}},{render:function(t,e){var r=this.clearColor,n=t.gl;n.clearColor(r[0],r[1],r[2],r[3]),n.clear(n.COLOR_BUFFER_BIT),n.disable(n.BLEND),this._mesh.material.set("texture",e),t.saveViewport(),t.setViewport(0,0,t.getWidth(),t.getHeight()),t.renderPass([this._mesh],this._fakeCamera),t.restoreViewport()},updateFromVRDisplay:function(t){t.deviceInfo_?this._updateMesh(20,20,t.deviceInfo_):console.warn("Cant get vrDisplay.deviceInfo_, seems code changed")},_updateMesh:function(t,e,r){var n=this._mesh.geometry.attributes.position,i=this._mesh.geometry.attributes.texcoord0;n.init(2*t*e),i.init(2*t*e);for(var a=r.getLeftEyeVisibleTanAngles(),o=r.getLeftEyeNoLensTanAngles(),s=r.getLeftEyeVisibleScreenRect(o),u=0,l=[],c=[],h=0;h<2;h++){for(var f=0;fi)t.length=i;else for(var a=n;a=0&&!(T[w]<=e);w--);w=Math.min(w,g-2)}else{for(w=O;we);w++);w=Math.min(w-1,g-2)}O=w,B=e;var r=T[w+1]-T[w];0!==r&&(R=(e-T[w])/r,R=Math.max(Math.min(1,R),0),R=b[w+1](R),_?(P=E[w],L=E[0===w?w:w-1],D=E[w>g-2?g-1:w+1],I=E[w>g-3?g-1:w+2],f?p(t,s,f(m(t,s),L,P,D,I,R)):y?u(L,P,D,I,R,R*R,R*R*R,m(t,s),x):p(t,s,l(L,P,D,I,R,R*R,R*R*R))):f?p(t,s,f(m(t,s),E[w],E[w+1],R)):y?a(E[w],E[w+1],R,m(t,s),x):p(t,s,i(E[w],E[w+1],R)))},U=new le({target:t._target,life:d,loop:t._loop,delay:t._delay,onframe:F,onfinish:r});return e&&"spline"!==e&&U.setEasing(e),U}}}function d(t,e,i,a,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||r,this._setter=a||n,this._interpolater=o||null,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[],this._maxTime=0,this._lastKFTime=0}function m(t){return t}function p(t){var e,r,n,i,a,o,s=Number.POSITIVE_INFINITY,u=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY;for(e=t.length;e--;)t[e][0]l&&(l=t[e][0]),t[e][1]c&&(c=t[e][1]);return r=l-s,n=c-u,i=Math.max(r,n),a=s+.5*r,o=u+.5*n,[[a-20*i,o-i],[a,o+20*i],[a+20*i,o-i]]}function _(t,e,r,n){var i,a,o,s,u,l,c,h,f,d,m=t[e][0],p=t[e][1],_=t[r][0],g=t[r][1],v=t[n][0],y=t[n][1],x=Math.abs(p-g),T=Math.abs(g-y);if(xT?o*(i-u)+c:s*(i-l)+h),f=_-i,d=g-a,{i:e,j:r,k:n,x:i,y:a,r:f*f+d*d}}function g(t){var e,r,n,i,a,o;for(r=t.length;r;)for(i=t[--r],n=t[--r],e=r;e;)if(o=t[--e],a=t[--e],n===a&&i===o||n===o&&i===a){t.splice(r,2),t.splice(e,2);break}}function v(t,e){return t.time-e.time}function y(t,e,r,n,i,a){var o=e[i],s=e[i+1],u=e[i+2];return t[0]=o+n*(r[a]-o),t[1]=s+n*(r[a+1]-s),t[2]=u+n*(r[a+2]-u),t}function x(t,e,r,n,i,a){var o,s,u,l,c,h=e[0+i],f=e[1+i],d=e[2+i],m=e[3+i],p=r[0+a],_=r[1+a],g=r[2+a],v=r[3+a];return s=h*p+f*_+d*g+m*v,s<0&&(s=-s,p=-p,_=-_,g=-g,v=-v),1-s>1e-6?(o=Math.acos(s),u=Math.sin(o),l=Math.sin((1-n)*o)/u,c=Math.sin(n*o)/u):(l=1-n,c=n),t[0]=l*h+c*p,t[1]=l*f+c*_,t[2]=l*d+c*g,t[3]=l*m+c*v,t}function T(t,e,r){"object"==typeof e&&(r=e,e=null);var n,i=this;if(!(t instanceof Function)){n=[];for(var a in t)t.hasOwnProperty(a)&&n.push(a)}var o=function(e){if(i.apply(this,arguments),t instanceof Function?E(this,t.call(this,e)):b(this,t,n),this.constructor===o)for(var r=o.__initializers__,a=0;ar?r:t}function M(t){return t=Math.round(t),t<0?0:t>255?255:t}function C(t){return t=Math.round(t),t<0?0:t>360?360:t}function N(t){return t<0?0:t>1?1:t}function R(t){return M(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function L(t){return N(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function P(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}function D(t,e,r){return t+(e-t)*r}function I(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}function O(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function B(t,e){pr&&O(pr,e),pr=mr.put(t,pr||e.slice())}function F(t,e){var r=(parseFloat(t[0])%360+360)%360/360,n=L(t[1]),i=L(t[2]),a=i<=.5?i*(n+1):i+n-i*n,o=2*i-a;return e=e||[],I(e,M(255*P(o,a,r+1/3)),M(255*P(o,a,r)),M(255*P(o,a,r-1/3)),1),4===t.length&&(e[3]=t[3]),e}function U(t){if(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),u=s-o,l=(s+o)/2;if(0===u)e=0,r=0;else{r=l<.5?u/(s+o):u/(2-s-o);var c=((s-n)/6+u/2)/u,h=((s-i)/6+u/2)/u,f=((s-a)/6+u/2)/u;n===s?e=f-h:i===s?e=1/3+c-f:a===s&&(e=2/3+h-c),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,r,l];return null!=t[3]&&d.push(t[3]),d}}function k(t,e,r){var n=Object.keys(t);n.sort();for(var i=[],a=0;a0&&n.push("#define "+i.toUpperCase()+"_COUNT "+a)}if(r)for(var o=0;o=400?t.onerror&&t.onerror():t.onload&&t.onload(e.response)},t.onerror&&(e.onerror=t.onerror),e.send(null)}function ht(t,e,r,n){var i=t.accessors[r],a=e.bufferViews[i.bufferView],o=i.byteOffset||0,s=fi[i.componentType]||We.Float32Array,u=di[i.type];null==u&&n&&(u=1);var l=new s(a,o,u*i.count),c=i.extensions&&i.extensions.WEB3D_quantized_attributes;if(c){for(var h,f,d=new We.Float32Array(u*i.count),m=c.decodeMatrix,h=new Array(u),f=new Array(u),p=0;p0){var i=Math.pow(2,t[3]-128-8+n);e[r+0]=t[0]*i,e[r+1]=t[1]*i,e[r+2]=t[2]*i}else e[r+0]=0,e[r+1]=0,e[r+2]=0;return e[r+3]=1,e}function mt(t,e,r){for(var n="",i=e;i0;)if(t[a][0]=e[r++],t[a][1]=e[r++],t[a][2]=e[r++],t[a][3]=e[r++],1===t[a][0]&&1===t[a][1]&&1===t[a][2]){for(var s=t[a][3]<>>0;s>0;s--)pt(t[a-1],t[a]),a++,o--;i+=8}else a++,o--,i=0;return r}function gt(t,e,r,n){if(nUi)return _t(t,e,r,n);var i=e[r++];if(2!=i)return _t(t,e,r-1,n);if(t[0][1]=e[r++],t[0][2]=e[r++],i=e[r++],(t[0][2]<<8>>>0|i)>>>0!==n)return null;for(var i=0;i<4;i++)for(var a=0;a128){o=(127&o)>>>0;for(var s=e[r++];o--;)t[a++][i]=s}else for(;o--;)t[a++][i]=e[r++]}return r}function vt(t){Le.defaultsWithPropList(t,ji,qi),yt(t);for(var e="",r=0;r>16,r=t-(e<<8)>>8;return[e,r,t-(e<<16)-(r<<8)]}function ee(t,e,r){return(t<<16)+(e<<8)+r}function re(t){var e=t[1][0]-t[0][0],r=t[1][1]-t[0][1];return Math.sqrt(e*e+r*r)}function ne(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function ie(t){return Array.isArray(t)||(t=[t,t]),t}function ae(t,e){return{name:t.name,type:t.type,size:t.size,semantic:t.semantic,value:oe(t.value,e)}}function oe(t,e){return e?t:new t.constructor(t)}function se(t,e,r){return t*(1-r)+e*r}var ue={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,r=.1;return 0===t?0:1===t?1:(!r||r<1?(r=1,e=.1):e=.4*Math.asin(1/r)/(2*Math.PI),-r*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,r=.1;return 0===t?0:1===t?1:(!r||r<1?(r=1,e=.1):e=.4*Math.asin(1/r)/(2*Math.PI),r*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,r=.1;return 0===t?0:1===t?1:(!r||r<1?(r=1,e=.1):e=.4*Math.asin(1/r)/(2*Math.PI),(t*=2)<1?r*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:r*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-ue.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*ue.bounceIn(2*t):.5*ue.bounceOut(2*t-1)+.5}},le=function(t){t=t||{},this.name=t.name||"",this.target=t.target,this.life=t.life||1e3,this.delay=t.delay||0,this.gap=t.gap||0,this.playbackRate=t.playbackRate||1,this._initialized=!1,this._elapsedTime=0,this._loop=null!=t.loop&&t.loop,this.setLoop(this._loop),null!=t.easing&&this.setEasing(t.easing),this.onframe=t.onframe||e,this.onfinish=t.onfinish||e,this.onrestart=t.onrestart||e,this._paused=!1};le.prototype={gap:0,life:0,delay:0,setLoop:function(t){this._loop=t,t&&(this._loopRemained="number"==typeof t?t:1e8)},setEasing:function(t){"string"==typeof t&&(t=ue[t]),this.easing=t},step:function(t,e,r){if(this._initialized||(this._startTime=t+this.delay,this._initialized=!0),null!=this._currentTime&&(e=t-this._currentTime),this._currentTime=t,this._paused)return"paused";if(!(t0?(this._restartInLoop(t),this._loopRemained--,"restart"):(this._needsRemove=!0,"finish"):null}}},setTime:function(t){return this.step(t+this._startTime)},restart:function(t){var e=0;t&&(this._elapse(t),e=this._elapsedTime%this.life),t=t||Date.now(),this._startTime=t-e+this.delay,this._elapsedTime=0,this._needsRemove=!1,this._paused=!1},getElapsedTime:function(){return this._elapsedTime},_restartInLoop:function(t){this._startTime=t+this.gap,this._elapsedTime=0},_elapse:function(t,e){this._elapsedTime+=e*this.playbackRate},fire:function(t,e){var r="on"+t;this[r]&&this[r](this.target,e)},clone:function(){var t=new this.constructor;return t.name=this.name,t._loop=this._loop,t._loopRemained=this._loopRemained,t.life=this.life,t.gap=this.gap,t.delay=this.delay,t},pause:function(){this._paused=!0},resume:function(){this._paused=!1}},le.prototype.constructor=le;var ce=Array.prototype.slice;d.prototype={constructor:d,when:function(t,e,r){this._maxTime=Math.max(t,this._maxTime),r=("function"==typeof r?r:ue[r])||m;for(var n in e)this._tracks[n]||(this._tracks[n]=[],0!==t&&this._tracks[n].push({time:0,value:s(this._getter(this._target,n)),easing:r})),this._tracks[n].push({time:parseInt(t),value:e[n],easing:r});return this},then:function(t,e,r){return this.when(t+this._lastKFTime,e,r),this._lastKFTime+=t,this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,r=0;rt)this.inputs.unshift(n);else if(this.inputs[i-1].position<=t)this.inputs.push(n);else{var a=this._findKey(t);this.inputs.splice(a,n)}return n},fe.prototype.step=function(t,e,r){var n=le.prototype.step.call(this,t);return"finish"!==n&&this.setTime(this.getElapsedTime()),r||"paused"===n||this.fire("frame"),n},fe.prototype.setTime=function(t){var e=this.position,r=this.inputs,n=r.length,i=r[0].position,a=r[n-1].position;if(e<=i||e>=a){var o=e<=i?r[0]:r[n-1],s=o.clip,u=o.offset;s.setTime((t+u)%s.life),s.output instanceof le?this.output.copy(s.output):this.output.copy(s)}else{var l=this._findKey(e),c=r[l],h=r[l+1],f=c.clip,d=h.clip;f.setTime((t+c.offset)%f.life),d.setTime((t+h.offset)%d.life);var m=(this.position-c.position)/(h.position-c.position),p=f.output instanceof le?f.output:f,_=d.output instanceof le?d.output:d;this.output.blend1D(p,_,m)}},fe.prototype.clone=function(t){var e=le.prototype.clone.call(this);e.output=this.output.clone();for(var r=0;r=r[i].position&&t=0;i--)t>=r[i].position&&t=0&&(this._cacheKey=e,this._cachePosition=t),e};var de=1/1048576,me={triangulate:function(t,e){var r,n,i,a,o,s,u,l,c,h,f,d,m=t.length;if(m<3)return[];if(t=t.slice(0),e)for(r=m;r--;)t[r]=t[r][e];for(i=new Array(m),r=m;r--;)i[r]=r;for(i.sort(function(e,r){var n=t[r][0]-t[e][0];return 0!==n?n:e-r}),a=p(t),t.push(a[0],a[1],a[2]),o=[_(t,m+0,m+1,m+2)],s=[],u=[],r=i.length;r--;u.length=0){for(d=i[r],n=o.length;n--;)l=t[d][0]-o[n].x,l>0&&l*l>o[n].r?(s.push(o[n]),o.splice(n,1)):(c=t[d][1]-o[n].y,l*l+c*c-o[n].r>de||(u.push(o[n].i,o[n].j,o[n].j,o[n].k,o[n].k,o[n].i),o.splice(n,1)));for(g(u),n=u.length;n;)f=u[--n],h=u[--n],o.push(_(t,h,f,d))}for(r=o.length;r--;)s.push(o[r]);for(o.length=0,r=s.length;r--;)s[r].it[0][0]&&e[0]>t[1][0]&&e[0]>t[2][0]||e[1]t[0][1]&&e[1]>t[1][1]&&e[1]>t[2][1])return null;var r=t[1][0]-t[0][0],n=t[2][0]-t[0][0],i=t[1][1]-t[0][1],a=t[2][1]-t[0][1],o=r*a-n*i;if(0===o)return null;var s=(a*(e[0]-t[0][0])-n*(e[1]-t[0][1]))/o,u=(r*(e[1]-t[0][1])-i*(e[0]-t[0][0]))/o;return s<0||u<0||s+u>1?null:[s,u]}},pe=("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self,function(t,e){return e={exports:{}},t(e,e.exports),e.exports}(function(t,e){!function(t){ +var r={};r.exports=e,function(t){if(!e)var e=1e-6;if(!r)var r="undefined"!=typeof Float32Array?Float32Array:Array;if(!n)var n=Math.random;var i={};i.setMatrixArrayType=function(t){r=t},void 0!==t&&(t.glMatrix=i);var a=Math.PI/180;i.toRadian=function(t){return t*a};var o={};o.create=function(){var t=new r(2);return t[0]=0,t[1]=0,t},o.clone=function(t){var e=new r(2);return e[0]=t[0],e[1]=t[1],e},o.fromValues=function(t,e){var n=new r(2);return n[0]=t,n[1]=e,n},o.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t},o.set=function(t,e,r){return t[0]=e,t[1]=r,t},o.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t},o.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t},o.sub=o.subtract,o.multiply=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t},o.mul=o.multiply,o.divide=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t},o.div=o.divide,o.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t},o.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t},o.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t},o.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t},o.distance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1];return Math.sqrt(r*r+n*n)},o.dist=o.distance,o.squaredDistance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1];return r*r+n*n},o.sqrDist=o.squaredDistance,o.length=function(t){var e=t[0],r=t[1];return Math.sqrt(e*e+r*r)},o.len=o.length,o.squaredLength=function(t){var e=t[0],r=t[1];return e*e+r*r},o.sqrLen=o.squaredLength,o.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t},o.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t},o.normalize=function(t,e){var r=e[0],n=e[1],i=r*r+n*n;return i>0&&(i=1/Math.sqrt(i),t[0]=e[0]*i,t[1]=e[1]*i),t},o.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]},o.cross=function(t,e,r){var n=e[0]*r[1]-e[1]*r[0];return t[0]=t[1]=0,t[2]=n,t},o.lerp=function(t,e,r,n){var i=e[0],a=e[1];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t},o.random=function(t,e){e=e||1;var r=2*n()*Math.PI;return t[0]=Math.cos(r)*e,t[1]=Math.sin(r)*e,t},o.transformMat2=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i,t[1]=r[1]*n+r[3]*i,t},o.transformMat2d=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i+r[4],t[1]=r[1]*n+r[3]*i+r[5],t},o.transformMat3=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[3]*i+r[6],t[1]=r[1]*n+r[4]*i+r[7],t},o.transformMat4=function(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[4]*i+r[12],t[1]=r[1]*n+r[5]*i+r[13],t},o.forEach=function(){var t=o.create();return function(e,r,n,i,a,o){var s,u;for(r||(r=2),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t},s.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]},s.cross=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],u=r[2];return t[0]=i*u-a*s,t[1]=a*o-n*u,t[2]=n*s-i*o,t},s.lerp=function(t,e,r,n){var i=e[0],a=e[1],o=e[2];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t},s.random=function(t,e){e=e||1;var r=2*n()*Math.PI,i=2*n()-1,a=Math.sqrt(1-i*i)*e;return t[0]=Math.cos(r)*a,t[1]=Math.sin(r)*a,t[2]=i*e,t},s.transformMat4=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[3]*n+r[7]*i+r[11]*a+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*i+r[8]*a+r[12])/o,t[1]=(r[1]*n+r[5]*i+r[9]*a+r[13])/o,t[2]=(r[2]*n+r[6]*i+r[10]*a+r[14])/o,t},s.transformMat3=function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t},s.transformQuat=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],u=r[2],l=r[3],c=l*n+s*a-u*i,h=l*i+u*n-o*a,f=l*a+o*i-s*n,d=-o*n-s*i-u*a;return t[0]=c*l+d*-o+h*-u-f*-s,t[1]=h*l+d*-s+f*-o-c*-u,t[2]=f*l+d*-u+c*-s-h*-o,t},s.rotateX=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[0],a[1]=i[1]*Math.cos(n)-i[2]*Math.sin(n),a[2]=i[1]*Math.sin(n)+i[2]*Math.cos(n),t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t},s.rotateY=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[2]*Math.sin(n)+i[0]*Math.cos(n),a[1]=i[1],a[2]=i[2]*Math.cos(n)-i[0]*Math.sin(n),t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t},s.rotateZ=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[0]*Math.cos(n)-i[1]*Math.sin(n),a[1]=i[0]*Math.sin(n)+i[1]*Math.cos(n),a[2]=i[2],t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t},s.forEach=function(){var t=s.create();return function(e,r,n,i,a,o){var s,u;for(r||(r=3),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s1?0:Math.acos(i)},s.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},void 0!==t&&(t.vec3=s);var u={};u.create=function(){var t=new r(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},u.clone=function(t){var e=new r(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},u.fromValues=function(t,e,n,i){var a=new r(4);return a[0]=t,a[1]=e,a[2]=n,a[3]=i,a},u.copy=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},u.set=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t},u.add=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t},u.subtract=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t},u.sub=u.subtract,u.multiply=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t},u.mul=u.multiply,u.divide=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t},u.div=u.divide,u.min=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t},u.max=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t},u.scale=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t},u.scaleAndAdd=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t},u.distance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+a*a)},u.dist=u.distance,u.squaredDistance=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return r*r+n*n+i*i+a*a},u.sqrDist=u.squaredDistance,u.length=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)},u.len=u.length,u.squaredLength=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i},u.sqrLen=u.squaredLength,u.negate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t},u.inverse=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t},u.normalize=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a;return o>0&&(o=1/Math.sqrt(o),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o,t[3]=e[3]*o),t},u.dot=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},u.lerp=function(t,e,r,n){var i=e[0],a=e[1],o=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t},u.random=function(t,e){return e=e||1,t[0]=n(),t[1]=n(),t[2]=n(),t[3]=n(),u.normalize(t,t),u.scale(t,t,e),t},u.transformMat4=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t},u.transformQuat=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],u=r[2],l=r[3],c=l*n+s*a-u*i,h=l*i+u*n-o*a,f=l*a+o*i-s*n,d=-o*n-s*i-u*a;return t[0]=c*l+d*-o+h*-u-f*-s,t[1]=h*l+d*-s+f*-o-c*-u,t[2]=f*l+d*-u+c*-s-h*-o,t},u.forEach=function(){var t=u.create();return function(e,r,n,i,a,o){var s,u;for(r||(r=4),n||(n=0),u=i?Math.min(i*r+n,e.length):e.length,s=n;s.999999?(n[0]=0,n[1]=0,n[2]=0,n[3]=1,n):(s.cross(t,i,a),n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=1+o,d.normalize(n,n))}}(),d.setAxes=function(){var t=h.create();return function(e,r,n,i){return t[0]=n[0],t[3]=n[1],t[6]=n[2],t[1]=i[0],t[4]=i[1],t[7]=i[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],d.normalize(e,d.fromMat3(e,t))}}(),d.clone=u.clone,d.fromValues=u.fromValues,d.copy=u.copy,d.set=u.set,d.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},d.setAxisAngle=function(t,e,r){r*=.5;var n=Math.sin(r);return t[0]=n*e[0],t[1]=n*e[1],t[2]=n*e[2],t[3]=Math.cos(r),t},d.add=u.add,d.multiply=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=r[0],u=r[1],l=r[2],c=r[3];return t[0]=n*c+o*s+i*l-a*u,t[1]=i*c+o*u+a*s-n*l,t[2]=a*c+o*l+n*u-i*s,t[3]=o*c-n*s-i*u-a*l,t},d.mul=d.multiply,d.scale=u.scale,d.rotateX=function(t,e,r){r*=.5;var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+o*s,t[1]=i*u+a*s,t[2]=a*u-i*s,t[3]=o*u-n*s,t},d.rotateY=function(t,e,r){r*=.5;var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u-a*s,t[1]=i*u+o*s,t[2]=a*u+n*s,t[3]=o*u-i*s,t},d.rotateZ=function(t,e,r){r*=.5;var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),u=Math.cos(r);return t[0]=n*u+i*s,t[1]=i*u-n*s,t[2]=a*u+o*s,t[3]=o*u-a*s,t},d.calculateW=function(t,e){var r=e[0],n=e[1],i=e[2];return t[0]=r,t[1]=n,t[2]=i,t[3]=Math.sqrt(Math.abs(1-r*r-n*n-i*i)),t},d.dot=u.dot,d.lerp=u.lerp,d.slerp=function(t,e,r,n){var i,a,o,s,u,l=e[0],c=e[1],h=e[2],f=e[3],d=r[0],m=r[1],p=r[2],_=r[3];return a=l*d+c*m+h*p+f*_,a<0&&(a=-a,d=-d,m=-m,p=-p,_=-_),1-a>1e-6?(i=Math.acos(a),o=Math.sin(i),s=Math.sin((1-n)*i)/o,u=Math.sin(n*i)/o):(s=1-n,u=n),t[0]=s*l+u*d,t[1]=s*c+u*m,t[2]=s*h+u*p,t[3]=s*f+u*_,t},d.invert=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a,s=o?1/o:0;return t[0]=-r*s,t[1]=-n*s,t[2]=-i*s,t[3]=a*s,t},d.conjugate=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],t},d.length=u.length,d.len=d.length,d.squaredLength=u.squaredLength,d.sqrLen=d.squaredLength,d.normalize=u.normalize,d.fromMat3=function(t,e){var r,n=e[0]+e[4]+e[8];if(n>0)r=Math.sqrt(n+1),t[3]=.5*r,r=.5/r,t[0]=(e[5]-e[7])*r,t[1]=(e[6]-e[2])*r,t[2]=(e[1]-e[3])*r;else{var i=0;e[4]>e[0]&&(i=1),e[8]>e[3*i+i]&&(i=2);var a=(i+1)%3,o=(i+2)%3;r=Math.sqrt(e[3*i+i]-e[3*a+a]-e[3*o+o]+1),t[i]=.5*r,r=.5/r,t[3]=(e[3*a+o]-e[3*o+a])*r,t[a]=(e[3*a+i]+e[3*i+a])*r,t[o]=(e[3*o+i]+e[3*i+o])*r}return t},d.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},void 0!==t&&(t.quat=d)}(r.exports)}()})),_e=pe.vec2,ge=function(t,e){t=t||0,e=e||0,this.array=_e.fromValues(t,e),this._dirty=!0};if(ge.prototype={constructor:ge,add:function(t){return _e.add(this.array,this.array,t.array),this._dirty=!0,this},set:function(t,e){return this.array[0]=t,this.array[1]=e,this._dirty=!0,this},setArray:function(t){return this.array[0]=t[0],this.array[1]=t[1],this._dirty=!0,this},clone:function(){return new ge(this.x,this.y)},copy:function(t){return _e.copy(this.array,t.array),this._dirty=!0,this},cross:function(t,e){return _e.cross(t.array,this.array,e.array),t._dirty=!0,this},dist:function(t){return _e.dist(this.array,t.array)},distance:function(t){return _e.distance(this.array,t.array)},div:function(t){return _e.div(this.array,this.array,t.array),this._dirty=!0,this},divide:function(t){return _e.divide(this.array,this.array,t.array),this._dirty=!0,this},dot:function(t){return _e.dot(this.array,t.array)},len:function(){return _e.len(this.array)},length:function(){return _e.length(this.array)},lerp:function(t,e,r){return _e.lerp(this.array,t.array,e.array,r),this._dirty=!0,this},min:function(t){return _e.min(this.array,this.array,t.array),this._dirty=!0,this},max:function(t){return _e.max(this.array,this.array,t.array),this._dirty=!0,this},mul:function(t){return _e.mul(this.array,this.array,t.array),this._dirty=!0,this},multiply:function(t){return _e.multiply(this.array,this.array,t.array),this._dirty=!0,this},negate:function(){return _e.negate(this.array,this.array),this._dirty=!0,this},normalize:function(){return _e.normalize(this.array,this.array),this._dirty=!0,this},random:function(t){return _e.random(this.array,t),this._dirty=!0,this},scale:function(t){return _e.scale(this.array,this.array,t),this._dirty=!0,this},scaleAndAdd:function(t,e){return _e.scaleAndAdd(this.array,this.array,t.array,e),this._dirty=!0,this},sqrDist:function(t){return _e.sqrDist(this.array,t.array)},squaredDistance:function(t){return _e.squaredDistance(this.array,t.array)},sqrLen:function(){return _e.sqrLen(this.array)},squaredLength:function(){return _e.squaredLength(this.array)},sub:function(t){return _e.sub(this.array,this.array,t.array),this._dirty=!0,this},subtract:function(t){return _e.subtract(this.array,this.array,t.array),this._dirty=!0,this},transformMat2:function(t){return _e.transformMat2(this.array,this.array,t.array),this._dirty=!0,this},transformMat2d:function(t){return _e.transformMat2d(this.array,this.array,t.array),this._dirty=!0,this},transformMat3:function(t){return _e.transformMat3(this.array,this.array,t.array),this._dirty=!0,this},transformMat4:function(t){return _e.transformMat4(this.array,this.array,t.array),this._dirty=!0,this},toString:function(){return"["+Array.prototype.join.call(this.array,",")+"]"},toArray:function(){return Array.prototype.slice.call(this.array)}},Object.defineProperty){var ve=ge.prototype;Object.defineProperty(ve,"x",{get:function(){return this.array[0]},set:function(t){this.array[0]=t,this._dirty=!0}}),Object.defineProperty(ve,"y",{get:function(){return this.array[1]},set:function(t){this.array[1]=t,this._dirty=!0}})}ge.add=function(t,e,r){return _e.add(t.array,e.array,r.array),t._dirty=!0,t},ge.set=function(t,e,r){return _e.set(t.array,e,r),t._dirty=!0,t},ge.copy=function(t,e){return _e.copy(t.array,e.array),t._dirty=!0,t},ge.cross=function(t,e,r){return _e.cross(t.array,e.array,r.array),t._dirty=!0,t},ge.dist=function(t,e){return _e.distance(t.array,e.array)},ge.distance=ge.dist,ge.div=function(t,e,r){return _e.divide(t.array,e.array,r.array),t._dirty=!0,t},ge.divide=ge.div,ge.dot=function(t,e){return _e.dot(t.array,e.array)},ge.len=function(t){return _e.length(t.array)},ge.lerp=function(t,e,r,n){return _e.lerp(t.array,e.array,r.array,n),t._dirty=!0,t},ge.min=function(t,e,r){return _e.min(t.array,e.array,r.array),t._dirty=!0,t},ge.max=function(t,e,r){return _e.max(t.array,e.array,r.array),t._dirty=!0,t}, +ge.mul=function(t,e,r){return _e.multiply(t.array,e.array,r.array),t._dirty=!0,t},ge.multiply=ge.mul,ge.negate=function(t,e){return _e.negate(t.array,e.array),t._dirty=!0,t},ge.normalize=function(t,e){return _e.normalize(t.array,e.array),t._dirty=!0,t},ge.random=function(t,e){return _e.random(t.array,e),t._dirty=!0,t},ge.scale=function(t,e,r){return _e.scale(t.array,e.array,r),t._dirty=!0,t},ge.scaleAndAdd=function(t,e,r,n){return _e.scaleAndAdd(t.array,e.array,r.array,n),t._dirty=!0,t},ge.sqrDist=function(t,e){return _e.sqrDist(t.array,e.array)},ge.squaredDistance=ge.sqrDist,ge.sqrLen=function(t){return _e.sqrLen(t.array)},ge.squaredLength=ge.sqrLen,ge.sub=function(t,e,r){return _e.subtract(t.array,e.array,r.array),t._dirty=!0,t},ge.subtract=ge.sub,ge.transformMat2=function(t,e,r){return _e.transformMat2(t.array,e.array,r.array),t._dirty=!0,t},ge.transformMat2d=function(t,e,r){return _e.transformMat2d(t.array,e.array,r.array),t._dirty=!0,t},ge.transformMat3=function(t,e,r){return _e.transformMat3(t.array,e.array,r.array),t._dirty=!0,t},ge.transformMat4=function(t,e,r){return _e.transformMat4(t.array,e.array,r.array),t._dirty=!0,t};var ye=function(t){t=t||{},le.call(this,t),this.output=t.output||null,this.inputs=t.inputs||[],this.position=new ge,this._cacheTriangle=null,this._triangles=[],this._updateTriangles()};ye.prototype=new le,ye.prototype.constructor=ye,ye.prototype.addInput=function(t,e,r){var n={position:t,clip:e,offset:r||0};return this.inputs.push(n),this.life=Math.max(e.life,this.life),this._updateTriangles(),n},ye.prototype._updateTriangles=function(){var t=this.inputs.map(function(t){return t.position});this._triangles=me.triangulate(t,"array")},ye.prototype.step=function(t,e,r){var n=le.prototype.step.call(this,t);return"finish"!==n&&this.setTime(this.getElapsedTime()),r||"paused"===n||this.fire("frame"),n},ye.prototype.setTime=function(t){var e=this._findTriangle(this.position);if(e){var r=e[1],n=e[2],i=e[0],a=this.inputs[i.indices[0]],o=this.inputs[i.indices[1]],s=this.inputs[i.indices[2]],u=a.clip,l=o.clip,c=s.clip;u.setTime((t+a.offset)%u.life),l.setTime((t+o.offset)%l.life),c.setTime((t+s.offset)%c.life);var h=u.output instanceof le?u.output:u,f=l.output instanceof le?l.output:l,d=c.output instanceof le?c.output:c;this.output.blend2D(h,f,d,r,n)}},ye.prototype.clone=function(t){var e=le.prototype.clone.call(this);e.output=this.output.clone();for(var r=0;r=t.time)return this.keyFrames.splice(e,0,t),e}this.life=t.time,this.keyFrames.push(t)},Ee.prototype.addKeyFrames=function(t){for(var e=0;ei[i.length-1].time)){if(t=a-1?a-1:this._cacheKey+1,s=o;s>=0;s--)if(i[s].time<=t&&i[s][e])r=i[s],this._cacheKey=s,this._cacheTime=t;else if(i[s][e]){n=i[s];break}}else for(var s=this._cacheKey;s=e.time[r-1])t=e.time[r-1],n=r-2;else if(t=0;a--)if(e.time[a-1]<=t&&e.time[a]>t){n=a-1;break}}else for(var a=this._cacheKey;at){n=a;break}if(n>-1){this._cacheKey=n,this._cacheTime=t;var o=n,s=n+1,u=e.time[o],l=e.time[s],c=l-u,h=0===c?0:(t-u)/c;e.rotation&&x(this.rotation,e.rotation,e.rotation,h,4*o,4*s),e.position&&y(this.position,e.position,e.position,h,3*o,3*s),e.scale&&y(this.scale,e.scale,e.scale,h,3*o,3*s)}n==r-2&&(this._cacheKey=0,this._cacheTime=0),this.updateTarget()}},Se.prototype.updateTarget=function(){var t=this.channels;this.target&&(t.position&&this.target.position.setArray(this.position),t.rotation&&this.target.rotation.setArray(this.rotation),t.scale&&this.target.scale.setArray(this.scale))},Se.prototype.getMaxTime=function(){return this.channels.time[this.channels.time.length-1]},Se.prototype.getSubTrack=function(t,e){var r=new Se({name:this.name}),n=this.channels.time[0];t=Math.min(Math.max(t,n),this.life),e=Math.min(Math.max(e,n),this.life);var i=this._findRange(t),a=this._findRange(e),o=a[0]-i[0]+1;0===i[1]&&0===a[1]&&(o-=1),this.channels.rotation&&(r.channels.rotation=new Float32Array(4*o)),this.channels.position&&(r.channels.position=new Float32Array(3*o)),this.channels.scale&&(r.channels.scale=new Float32Array(3*o)),this.channels.time&&(r.channels.time=new Float32Array(o)),this.setTime(t);for(var s=0;s<3;s++)r.channels.rotation[s]=this.rotation[s],r.channels.position[s]=this.position[s],r.channels.scale[s]=this.scale[s];r.channels.time[0]=0,r.channels.rotation[3]=this.rotation[3];for(var s=1;st&&(n=i);var a=0;if(n>=0)var o=e.time[n],s=e.time[n+1],a=(t-o)/(s-o);return[n,a]},Se.prototype.blend1D=Ee.prototype.blend1D,Se.prototype.blend2D=Ee.prototype.blend2D,Se.prototype.additiveBlend=Ee.prototype.additiveBlend,Se.prototype.subtractiveBlend=Ee.prototype.subtractiveBlend,Se.prototype.clone=function(){var t=Se.prototype.clone.call(this);return t.channels={time:this.channels.time||null,position:this.channels.position||null,rotation:this.channels.rotation||null,scale:this.channels.scale||null},Ae.copy(t.position,this.position),be.copy(t.rotation,this.rotation),Ae.copy(t.scale,this.scale),t.target=this.target,t.updateTarget(),t};var we={extend:T,derive:T},Me={trigger:function(t){if(this.hasOwnProperty("__handlers__")&&this.__handlers__.hasOwnProperty(t)){var e=this.__handlers__[t],r=e.length,n=-1,i=arguments;switch(i.length){case 1:for(;++n=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),r=0;r=0&&this.tracks.splice(e,1)},Fe.prototype.getSubClip=function(t,e,r){for(var n=new Fe({name:this.name}),i=0;i0){var e=this.min,r=this.max,n=e.array,i=r.array;Qe(n,t[0]),Qe(i,t[0]);for(var a=1;ai[0]&&(i[0]=o[0]),o[1]>i[1]&&(i[1]=o[1]),o[2]>i[2]&&(i[2]=o[2])}e._dirty=!0,r._dirty=!0}},union:function(t){var e=this.min,r=this.max;return Je.min(e.array,e.array,t.min.array),Je.max(r.array,r.array,t.max.array),e._dirty=!0,r._dirty=!0,this},intersection:function(t){var e=this.min,r=this.max;return Je.max(e.array,e.array,t.min.array),Je.min(r.array,r.array,t.max.array),e._dirty=!0,r._dirty=!0,this},intersectBoundingBox:function(t){var e=this.min.array,r=this.max.array,n=t.min.array,i=t.max.array;return!(e[0]>i[0]||e[1]>i[1]||e[2]>i[2]||r[0]=i[0]&&r[1]>=i[1]&&r[2]>=i[2]},containPoint:function(t){var e=this.min.array,r=this.max.array,n=t.array;return e[0]<=n[0]&&e[1]<=n[1]&&e[2]<=n[2]&&r[0]>=n[0]&&r[1]>=n[1]&&r[2]>=n[2]},isFinite:function(){var t=this.min.array,e=this.max.array;return isFinite(t[0])&&isFinite(t[1])&&isFinite(t[2])&&isFinite(e[0])&&isFinite(e[1])&&isFinite(e[2])}, +applyTransform:function(){var t=Je.create(),e=Je.create(),r=Je.create(),n=Je.create(),i=Je.create(),a=Je.create();return function(o){var s=this.min.array,u=this.max.array,l=o.array;return t[0]=l[0]*s[0],t[1]=l[1]*s[0],t[2]=l[2]*s[0],e[0]=l[0]*u[0],e[1]=l[1]*u[0],e[2]=l[2]*u[0],r[0]=l[4]*s[1],r[1]=l[5]*s[1],r[2]=l[6]*s[1],n[0]=l[4]*u[1],n[1]=l[5]*u[1],n[2]=l[6]*u[1],i[0]=l[8]*s[2],i[1]=l[9]*s[2],i[2]=l[10]*s[2],a[0]=l[8]*u[2],a[1]=l[9]*u[2],a[2]=l[10]*u[2],s[0]=Math.min(t[0],e[0])+Math.min(r[0],n[0])+Math.min(i[0],a[0])+l[12],s[1]=Math.min(t[1],e[1])+Math.min(r[1],n[1])+Math.min(i[1],a[1])+l[13],s[2]=Math.min(t[2],e[2])+Math.min(r[2],n[2])+Math.min(i[2],a[2])+l[14],u[0]=Math.max(t[0],e[0])+Math.max(r[0],n[0])+Math.max(i[0],a[0])+l[12],u[1]=Math.max(t[1],e[1])+Math.max(r[1],n[1])+Math.max(i[1],a[1])+l[13],u[2]=Math.max(t[2],e[2])+Math.max(r[2],n[2])+Math.max(i[2],a[2])+l[14],this.min._dirty=!0,this.max._dirty=!0,this}}(),applyProjection:function(t){var e=this.min.array,r=this.max.array,n=t.array,i=e[0],a=e[1],o=e[2],s=r[0],u=r[1],l=e[2],c=r[0],h=r[1],f=r[2];if(1===n[15])e[0]=n[0]*i+n[12],e[1]=n[5]*a+n[13],r[2]=n[10]*o+n[14],r[0]=n[0]*c+n[12],r[1]=n[5]*h+n[13],e[2]=n[10]*f+n[14];else{var d=-1/o;e[0]=n[0]*i*d,e[1]=n[5]*a*d,r[2]=(n[10]*o+n[14])*d,d=-1/l,r[0]=n[0]*s*d,r[1]=n[5]*u*d,d=-1/f,e[2]=(n[10]*f+n[14])*d}return this.min._dirty=!0,this.max._dirty=!0,this},updateVertices:function(){var t=this.vertices;if(!t){for(var t=[],e=0;e<8;e++)t[e]=Je.fromValues(0,0,0);this.vertices=t}var r=this.min.array,n=this.max.array;return $e(t[0],r[0],r[1],r[2]),$e(t[1],r[0],n[1],r[2]),$e(t[2],n[0],r[1],r[2]),$e(t[3],n[0],n[1],r[2]),$e(t[4],r[0],r[1],n[2]),$e(t[5],r[0],n[1],n[2]),$e(t[6],n[0],r[1],n[2]),$e(t[7],n[0],n[1],n[2]),this},copy:function(t){var e=this.min,r=this.max;return Qe(e.array,t.min.array),Qe(r.array,t.max.array),e._dirty=!0,r._dirty=!0,this},clone:function(){var t=new tr;return t.copy(this),t}};var er=pe.mat4,rr=pe.vec3,nr=pe.mat3,ir=pe.quat,ar=function(){this._axisX=new Xe,this._axisY=new Xe,this._axisZ=new Xe,this.array=er.create(),this._dirty=!0};ar.prototype={constructor:ar,setArray:function(t){for(var e=0;e>e;return t+1},dispose:function(t){var e=this._cache;e.use(t.__uid__);var r=e.get("webgl_texture");r&&t.gl.deleteTexture(r),e.deleteContext(t.__uid__)},isRenderable:function(){},isPowerOfTwo:function(){}});Object.defineProperty(lr.prototype,"width",{get:function(){return this._width},set:function(t){this._width=t}}),Object.defineProperty(lr.prototype,"height",{get:function(){return this._height},set:function(t){this._height=t}}),lr.BYTE=He.BYTE,lr.UNSIGNED_BYTE=He.UNSIGNED_BYTE,lr.SHORT=He.SHORT,lr.UNSIGNED_SHORT=He.UNSIGNED_SHORT,lr.INT=He.INT,lr.UNSIGNED_INT=He.UNSIGNED_INT,lr.FLOAT=He.FLOAT,lr.HALF_FLOAT=36193,lr.UNSIGNED_INT_24_8_WEBGL=34042,lr.DEPTH_COMPONENT=He.DEPTH_COMPONENT,lr.DEPTH_STENCIL=He.DEPTH_STENCIL,lr.ALPHA=He.ALPHA,lr.RGB=He.RGB,lr.RGBA=He.RGBA,lr.LUMINANCE=He.LUMINANCE,lr.LUMINANCE_ALPHA=He.LUMINANCE_ALPHA,lr.SRGB=35904,lr.SRGB_ALPHA=35906,lr.COMPRESSED_RGB_S3TC_DXT1_EXT=33776,lr.COMPRESSED_RGBA_S3TC_DXT1_EXT=33777,lr.COMPRESSED_RGBA_S3TC_DXT3_EXT=33778,lr.COMPRESSED_RGBA_S3TC_DXT5_EXT=33779,lr.NEAREST=He.NEAREST,lr.LINEAR=He.LINEAR,lr.NEAREST_MIPMAP_NEAREST=He.NEAREST_MIPMAP_NEAREST,lr.LINEAR_MIPMAP_NEAREST=He.LINEAR_MIPMAP_NEAREST,lr.NEAREST_MIPMAP_LINEAR=He.NEAREST_MIPMAP_LINEAR,lr.LINEAR_MIPMAP_LINEAR=He.LINEAR_MIPMAP_LINEAR,lr.REPEAT=He.REPEAT,lr.CLAMP_TO_EDGE=He.CLAMP_TO_EDGE,lr.MIRRORED_REPEAT=He.MIRRORED_REPEAT;var cr=function(){this.head=null,this.tail=null,this._length=0};cr.prototype.insert=function(t){var e=new cr.Entry(t);return this.insertEntry(e),e},cr.prototype.insertAt=function(t,e){if(!(t<0)){for(var r=this.head,n=0;r&&n!=t;)r=r.next,n++;if(r){var i=new cr.Entry(e),a=r.prev;a?(a.next=i,i.prev=a):this.head=i,i.next=r,r.prev=i}else this.insert(e)}},cr.prototype.insertBeforeEntry=function(t,e){var r=new cr.Entry(t),n=e.prev;n?(n.next=r,r.prev=n):this.head=r,r.next=e,e.prev=r,this._length++},cr.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._length++},cr.prototype.remove=function(t){var e=t.prev,r=t.next;e?e.next=r:this.head=r,r?r.prev=e:this.tail=e,t.next=t.prev=null,this._length--},cr.prototype.removeAt=function(t){if(!(t<0)){for(var e=this.head,r=0;e&&r!=t;)e=e.next,r++;return e?(this.remove(e),e.value):void 0}},cr.prototype.getHead=function(){if(this.head)return this.head.value},cr.prototype.getTail=function(){if(this.tail)return this.tail.value},cr.prototype.getAt=function(t){if(!(t<0)){for(var e=this.head,r=0;e&&r!=t;)e=e.next,r++;return e.value}},cr.prototype.indexOf=function(t){for(var e=this.head,r=0;e;){if(e.value===t)return r;e=e.next,r++}},cr.prototype.length=function(){return this._length},cr.prototype.isEmpty=function(){return 0===this._length},cr.prototype.forEach=function(t,e){for(var r=this.head,n=0,i=void 0!==e;r;)i?t.call(e,r.value,n):t(r.value,n),r=r.next,n++},cr.prototype.clear=function(){this.tail=this.head=null,this._length=0},cr.Entry=function(t){this.value=t,this.next=null,this.prev=null};var hr=function(t){this._list=new cr,this._map={},this._maxSize=t||10};hr.prototype.setMaxSize=function(t){this._maxSize=t},hr.prototype.put=function(t,e){if(void 0===this._map[t]){var r=this._list.length();if(r>=this._maxSize&&r>0){var n=this._list.head;this._list.remove(n),delete this._map[n.key]}var i=this._list.insert(e);i.key=t,this._map[t]=i}},hr.prototype.get=function(t){var e=this._map[t];if(void 0!==e)return e!==this._list.tail&&(this._list.remove(e),this._list.insertEntry(e)),e.value},hr.prototype.remove=function(t){var e=this._map[t];void 0!==e&&(delete this._map[t],this._list.remove(e))},hr.prototype.clear=function(){this._list.clear(),this._map={}};var fr={},dr={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]},mr=new hr(20),pr=null;fr.parse=function(t,e){if(t){e=e||[];var r=mr.get(t);if(r)return O(e,r);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in dr)return O(e,dr[n]),B(t,e),e;if("#"!==n.charAt(0)){var i=n.indexOf("("),a=n.indexOf(")");if(-1!==i&&a+1===n.length){var o=n.substr(0,i),s=n.substr(i+1,a-(i+1)).split(","),u=1;switch(o){case"rgba":if(4!==s.length)return void I(e,0,0,0,1);u=L(s.pop());case"rgb":return 3!==s.length?void I(e,0,0,0,1):(I(e,R(s[0]),R(s[1]),R(s[2]),u),B(t,e),e);case"hsla":return 4!==s.length?void I(e,0,0,0,1):(s[3]=L(s[3]),F(s,e),B(t,e),e);case"hsl":return 3!==s.length?void I(e,0,0,0,1):(F(s,e),B(t,e),e);default:return}}I(e,0,0,0,1)}else{if(4===n.length){var l=parseInt(n.substr(1),16);return l>=0&&l<=4095?(I(e,(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1),B(t,e),e):void I(e,0,0,0,1)}if(7===n.length){var l=parseInt(n.substr(1),16);return l>=0&&l<=16777215?(I(e,(16711680&l)>>16,(65280&l)>>8,255&l,1),B(t,e),e):void I(e,0,0,0,1)}}}},fr.parseToFloat=function(t,e){if(e=fr.parse(t,e))return e[0]/=255,e[1]/=255,e[2]/=255,e},fr.lift=function(t,e){var r=fr.parse(t);if(r){for(var n=0;n<3;n++)r[n]=e<0?r[n]*(1-e)|0:(255-r[n])*e+r[n]|0;return fr.stringify(r,4===r.length?"rgba":"rgb")}},fr.toHex=function(t){var e=fr.parse(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fr.fastLerp=function(t,e,r){if(e&&e.length&&t>=0&&t<=1){r=r||[];var n=t*(e.length-1),i=Math.floor(n),a=Math.ceil(n),o=e[i],s=e[a],u=n-i;return r[0]=M(D(o[0],s[0],u)),r[1]=M(D(o[1],s[1],u)),r[2]=M(D(o[2],s[2],u)),r[3]=N(D(o[3],s[3],u)),r}},fr.fastMapToColor=fr.fastLerp,fr.lerp=function(t,e,r){if(e&&e.length&&t>=0&&t<=1){var n=t*(e.length-1),i=Math.floor(n),a=Math.ceil(n),o=fr.parse(e[i]),s=fr.parse(e[a]),u=n-i,l=fr.stringify([M(D(o[0],s[0],u)),M(D(o[1],s[1],u)),M(D(o[2],s[2],u)),N(D(o[3],s[3],u))],"rgba");return r?{color:l,leftIndex:i,rightIndex:a,value:n}:l}},fr.mapToColor=fr.lerp,fr.modifyHSL=function(t,e,r,n){if(t=fr.parse(t))return t=U(t),null!=e&&(t[0]=C(e)),null!=r&&(t[1]=L(r)),null!=n&&(t[2]=L(n)),fr.stringify(F(t),"rgba")},fr.modifyAlpha=function(t,e){if((t=fr.parse(t))&&null!=e)return t[3]=N(e),fr.stringify(t,"rgba")},fr.stringify=function(t,e){if(t&&t.length){var r=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(r+=","+t[3]),e+"("+r+")"}};var _r=fr.parseToFloat,gr={},vr=Pe.extend(function(){return{name:"",depthTest:!0,depthMask:!0,transparent:!1,blend:null,autoUpdateTextureStatus:!0,uniforms:{},vertexDefines:{},fragmentDefines:{},_textureStatus:{},_enabledUniforms:null}},function(){this.name||(this.name="MATERIAL_"+this.__uid__),this.shader&&this.attachShader(this.shader,!0)},{precision:"highp",bind:function(t,e,r,n){for(var i=t.gl,a=e.currentTextureSlot(),o=0;o=0},getEnabledUniforms:function(){return this._enabledUniforms},getTextureUniforms:function(){return this._textureUniforms},set:function(t,e){if("object"==typeof t)for(var r in t){var n=t[r];this.setUniform(r,n)}else this.setUniform(t,e)},get:function(t){var e=this.uniforms[t];if(e)return e.value},attachShader:function(t,e){var r=this.uniforms;this.uniforms=t.createUniforms(),this.shader=t;var n=this.uniforms;this._enabledUniforms=Object.keys(n),this._enabledUniforms.sort(),this._textureUniforms=this._enabledUniforms.filter(function(t){var e=this.uniforms[t].type;return"t"===e||"tv"===e},this);var i=this.vertexDefines,a=this.fragmentDefines;if(this.vertexDefines=Le.clone(t.vertexDefines),this.fragmentDefines=Le.clone(t.fragmentDefines),e){for(var o in r)n[o]&&(n[o].value=r[o].value);Le.defaults(this.vertexDefines,i),Le.defaults(this.fragmentDefines,a)}var s={};for(var u in t.textures)s[u]={shaderType:t.textures[u].shaderType,type:t.textures[u].type,enabled:!(!e||!this._textureStatus[u])&&this._textureStatus[u].enabled};this._textureStatus=s,this._programKey=""},clone:function(){var t=new this.constructor({name:this.name,shader:this.shader});for(var e in this.uniforms)t.uniforms[e].value=this.uniforms[e].value;return t.depthTest=this.depthTest,t.depthMask=this.depthMask,t.transparent=this.transparent,t.blend=this.blend,t.vertexDefines=Le.clone(this.vertexDefines),t.fragmentDefines=Le.clone(this.fragmentDefines),t.enableTexture(this.getEnabledTextures()),t.precision=this.precision,t},define:function(t,e,r){var n=this.vertexDefines,i=this.fragmentDefines;"vertex"!==t&&"fragment"!==t&&"both"!==t&&arguments.length<3&&(r=e,e=t,t="both"),r=null!=r?r:null,"vertex"!==t&&"both"!==t||n[e]!==r&&(n[e]=r,this._programKey=""),"fragment"!==t&&"both"!==t||i[e]!==r&&(i[e]=r,"both"!==t&&(this._programKey=""))},undefine:function(t,e){"vertex"!==t&&"fragment"!==t&&"both"!==t&&arguments.length<2&&(e=t,t="both"),"vertex"!==t&&"both"!==t||this.isDefined("vertex",e)&&(delete this.vertexDefines[e],this._programKey=""),"fragment"!==t&&"both"!==t||this.isDefined("fragment",e)&&(delete this.fragmentDefines[e],"both"!==t&&(this._programKey=""))},isDefined:function(t,e){switch(t){case"vertex":return void 0!==this.vertexDefines[e];case"fragment":return void 0!==this.fragmentDefines[e]}},getDefine:function(t,e){switch(t){case"vertex":return this.vertexDefines[e];case"fragment":return this.fragmentDefines[e]}},enableTexture:function(t){if(Array.isArray(t))for(var e=0;e=0)r.attributeSemantics[u]={symbol:a,type:c},h=!1;else if(Pr.indexOf(u)>=0){var f=!1,d=u;u.match(/TRANSPOSE$/)&&(f=!0,d=u.slice(0,-9)),r.matrixSemantics[u]={symbol:a,type:c,isTranspose:f,semanticNoTranspose:d},h=!1}else if(Lr.indexOf(u)>=0)r.uniformSemantics[u]={symbol:a,type:c},h=!1;else if("unconfigurable"===u)h=!1;else{if(!(l=r._parseDefaultValue(i,u)))throw new Error('Unkown semantic "'+u+'"');u=""}h&&(e[a]={type:c,value:o?Nr.array:l||Nr[i],semantic:u||null})}return["uniform",i,a,o].join(" ")+";\n"}}var e={},r=this,n="vertex";this._uniformList=[],this._vertexCode=this._vertexCode.replace(Sr,t),n="fragment",this._fragmentCode=this._fragmentCode.replace(Sr,t),r.matrixSemanticKeys=Object.keys(this.matrixSemantics),this.uniformTemplates=e},_parseDefaultValue:function(t,e){var r=/\[\s*(.*)\s*\]/;{if("vec2"!==t&&"vec3"!==t&&"vec4"!==t)return"bool"===t?function(){return"true"===e.toLowerCase() +}:"float"===t?function(){return parseFloat(e)}:"int"===t?function(){return parseInt(e)}:void 0;var n=r.exec(e)[1];if(n){var i=n.split(/\s*,\s*/);return function(){return new We.Float32Array(i)}}}},_parseAttributes:function(){function t(t,n,i,a,o){if(n&&i){var s=1;switch(n){case"vec4":s=4;break;case"vec3":s=3;break;case"vec2":s=2;break;case"float":s=1}if(e[i]={type:"float",size:s,semantic:o||null},o){if(Rr.indexOf(o)<0)throw new Error('Unkown semantic "'+o+'"');r.attributeSemantics[o]={symbol:i,type:n}}}return["attribute",n,i].join(" ")+";\n"}var e={},r=this;this._vertexCode=this._vertexCode.replace(wr,t),this.attributes=e},_parseDefines:function(){function t(t,n,i){var a="vertex"===r?e.vertexDefines:e.fragmentDefines;return a[n]||(a[n]="false"!=i&&("true"==i||(i?isNaN(parseFloat(i))?i.trim():parseFloat(i):null))),""}var e=this,r="vertex";this._vertexCode=this._vertexCode.replace(Mr,t),r="fragment",this._fragmentCode=this._fragmentCode.replace(Mr,t)},clone:function(){var t=Ir[this._shaderID];return new K(t.vertex,t.fragment)}},Object.defineProperty&&(Object.defineProperty(K.prototype,"shaderID",{get:function(){return this._shaderID}}),Object.defineProperty(K.prototype,"vertex",{get:function(){return this._vertexCode}}),Object.defineProperty(K.prototype,"fragment",{get:function(){return this._fragmentCode}}),Object.defineProperty(K.prototype,"uniforms",{get:function(){return this._uniformList}}));var Or=/(@import)\s*([0-9a-zA-Z_\-\.]*)/g;K.parseImport=function(t){return t=t.replace(Or,function(t,e,r){var t=K.source(r);return t?K.parseImport(t):(console.error('Shader chunk "'+r+'" not existed in library'),"")})};var Br=/(@export)\s*([0-9a-zA-Z_\-\.]*)\s*\n([\s\S]*?)@end/g;K.import=function(t){t.replace(Br,function(t,e,r,n){var n=n.replace(/(^[\s\t\xa0\u3000]+)|([\u3000\xa0\s\t]+\x24)/g,"");if(n){for(var i,a=r.split("."),o=K.codes,s=0;s0&&this.setViewport(this._viewportStack.pop())},saveClear:function(){this._clearStack.push({clearBit:this.clearBit,clearColor:this.clearColor})},restoreClear:function(){if(this._clearStack.length>0){var t=this._clearStack.pop();this.clearColor=t.clearColor,this.clearBit=t.clearBit}},bindSceneRendering:function(t){this._sceneRendering=t},render:function(t,e,r,n){var i=this.gl,a=this.clearColor;if(this.clearBit){i.colorMask(!0,!0,!0,!0),i.depthMask(!0);var o=this.viewport,s=!1,u=o.devicePixelRatio;(o.width!==this._width||o.height!==this._height||u&&u!==this.devicePixelRatio||o.x||o.y)&&(s=!0,i.enable(i.SCISSOR_TEST),i.scissor(o.x*u,o.y*u,o.width*u,o.height*u)),i.clearColor(a[0],a[1],a[2],a[3]),i.clear(this.clearBit),s&&i.disable(i.SCISSOR_TEST)}if(r||t.update(!1),!(e=e||t.getMainCamera()))return void console.error("Can't find camera in the scene.");e.getScene()||e.update(!0),this._sceneRendering=t,t.viewBoundingBoxLastFrame.min.set(1/0,1/0,1/0),t.viewBoundingBoxLastFrame.max.set(-1/0,-1/0,-1/0);var l=this.cullRenderList(t.opaqueList,t,e),c=this.cullRenderList(t.transparentList,t,e),h=t.material;t.trigger("beforerender",this,t,e),n?(this.renderPreZ(l,t,e),i.depthFunc(i.LEQUAL)):i.depthFunc(i.LESS);for(var f=Vr(),d=Gr.create(),m=0;m0){var s=t[i-1],u=s.joints?s.joints.length:0;if((a.joints.length?a.joints.length:0)===u&&a.material===s.material&&a.lightGroup===s.lightGroup){a.__program=s.__program;continue}}var l=this._programMgr.getProgram(a,o,e);this.validateProgram(l),a.__program=l}},cullRenderList:function(t,e,r){for(var n=[],i=0;i0&&t.min.array[2]<0&&(t.max.array[2]=-1e-20),t.applyProjection(e);var u=t.min.array,l=t.max.array;if(l[0]<-1||u[0]>1||l[1]<-1||u[1]>1||l[2]<-1||u[2]>1)return!0}return!1}}(),disposeScene:function(t){this.disposeNode(t,!0,!0),t.dispose()},disposeNode:function(t,e,r){t.getParent()&&t.getParent().remove(t),t.traverse(function(t){t.geometry&&e&&t.geometry.dispose(this),t.dispose&&t.dispose(this)},this)},disposeGeometry:function(t){t.dispose(this)},disposeTexture:function(t){t.dispose(this)},disposeFrameBuffer:function(t){t.dispose(this)},dispose:function(){},screenToNDC:function(t,e,r){r||(r=new ge),e=this._height-e;var n=this.viewport,i=r.array;return i[0]=(t-n.x)/n.width,i[0]=2*i[0]-1,i[1]=(e-n.y)/n.height,i[1]=2*i[1]-1,r}});zr.opaqueSortCompare=zr.prototype.opaqueSortCompare=function(t,e){return t.renderOrder===e.renderOrder?t.__program===e.__program?t.material===e.material?t.geometry.__uid__-e.geometry.__uid__:t.material.__uid__-e.material.__uid__:t.__program&&e.__program?t.__program.__uid__-e.__program.__uid__:0:t.renderOrder-e.renderOrder},zr.transparentSortCompare=zr.prototype.transparentSortCompare=function(t,e){return t.renderOrder===e.renderOrder?t.__depth===e.__depth?t.__program===e.__program?t.material===e.material?t.geometry.__uid__-e.geometry.__uid__:t.material.__uid__-e.material.__uid__:t.__program&&e.__program?t.__program.__uid__-e.__program.__uid__:0:t.__depth-e.__depth:t.renderOrder-e.renderOrder};var Xr={IDENTITY:Vr(),WORLD:Vr(),VIEW:Vr(),PROJECTION:Vr(),WORLDVIEW:Vr(),VIEWPROJECTION:Vr(),WORLDVIEWPROJECTION:Vr(),WORLDINVERSE:Vr(),VIEWINVERSE:Vr(),PROJECTIONINVERSE:Vr(),WORLDVIEWINVERSE:Vr(),VIEWPROJECTIONINVERSE:Vr(),WORLDVIEWPROJECTIONINVERSE:Vr(),WORLDTRANSPOSE:Vr(),VIEWTRANSPOSE:Vr(),PROJECTIONTRANSPOSE:Vr(),WORLDVIEWTRANSPOSE:Vr(),VIEWPROJECTIONTRANSPOSE:Vr(),WORLDVIEWPROJECTIONTRANSPOSE:Vr(),WORLDINVERSETRANSPOSE:Vr(),VIEWINVERSETRANSPOSE:Vr(),PROJECTIONINVERSETRANSPOSE:Vr(),WORLDVIEWINVERSETRANSPOSE:Vr(),VIEWPROJECTIONINVERSETRANSPOSE:Vr(),WORLDVIEWPROJECTIONINVERSETRANSPOSE:Vr()};zr.COLOR_BUFFER_BIT=He.COLOR_BUFFER_BIT,zr.DEPTH_BUFFER_BIT=He.DEPTH_BUFFER_BIT,zr.STENCIL_BUFFER_BIT=He.STENCIL_BUFFER_BIT;var jr=pe.quat,qr=function(t,e,r,n){t=t||0,e=e||0,r=r||0,n=void 0===n?1:n,this.array=jr.fromValues(t,e,r,n),this._dirty=!0};qr.prototype={constructor:qr,add:function(t){return jr.add(this.array,this.array,t.array),this._dirty=!0,this},calculateW:function(){return jr.calculateW(this.array,this.array),this._dirty=!0,this},set:function(t,e,r,n){return this.array[0]=t,this.array[1]=e,this.array[2]=r,this.array[3]=n,this._dirty=!0,this},setArray:function(t){return this.array[0]=t[0],this.array[1]=t[1],this.array[2]=t[2],this.array[3]=t[3],this._dirty=!0,this},clone:function(){return new qr(this.x,this.y,this.z,this.w)},conjugate:function(){return jr.conjugate(this.array,this.array),this._dirty=!0,this},copy:function(t){return jr.copy(this.array,t.array),this._dirty=!0,this},dot:function(t){return jr.dot(this.array,t.array)},fromMat3:function(t){return jr.fromMat3(this.array,t.array),this._dirty=!0,this},fromMat4:function(){var t=pe.mat3,e=t.create();return function(r){return t.fromMat4(e,r.array),t.transpose(e,e),jr.fromMat3(this.array,e),this._dirty=!0,this}}(),identity:function(){return jr.identity(this.array),this._dirty=!0,this},invert:function(){return jr.invert(this.array,this.array),this._dirty=!0,this},len:function(){return jr.len(this.array)},length:function(){return jr.length(this.array)},lerp:function(t,e,r){return jr.lerp(this.array,t.array,e.array,r),this._dirty=!0,this},mul:function(t){return jr.mul(this.array,this.array,t.array),this._dirty=!0,this},mulLeft:function(t){return jr.multiply(this.array,t.array,this.array),this._dirty=!0,this},multiply:function(t){return jr.multiply(this.array,this.array,t.array),this._dirty=!0,this},multiplyLeft:function(t){return jr.multiply(this.array,t.array,this.array),this._dirty=!0,this},normalize:function(){return jr.normalize(this.array,this.array),this._dirty=!0,this},rotateX:function(t){return jr.rotateX(this.array,this.array,t),this._dirty=!0,this},rotateY:function(t){return jr.rotateY(this.array,this.array,t),this._dirty=!0,this},rotateZ:function(t){return jr.rotateZ(this.array,this.array,t),this._dirty=!0,this},rotationTo:function(t,e){return jr.rotationTo(this.array,t.array,e.array),this._dirty=!0,this},setAxes:function(t,e,r){return jr.setAxes(this.array,t.array,e.array,r.array),this._dirty=!0,this},setAxisAngle:function(t,e){return jr.setAxisAngle(this.array,t.array,e),this._dirty=!0,this},slerp:function(t,e,r){return jr.slerp(this.array,t.array,e.array,r),this._dirty=!0,this},sqrLen:function(){return jr.sqrLen(this.array)},squaredLength:function(){return jr.squaredLength(this.array)},fromEuler:function(t,e){return qr.fromEuler(this,t,e)},toString:function(){return"["+Array.prototype.join.call(this.array,",")+"]"},toArray:function(){return Array.prototype.slice.call(this.array)}};var Yr=Object.defineProperty;if(Yr){var Kr=qr.prototype;Yr(Kr,"x",{get:function(){return this.array[0]},set:function(t){this.array[0]=t,this._dirty=!0}}),Yr(Kr,"y",{get:function(){return this.array[1]},set:function(t){this.array[1]=t,this._dirty=!0}}),Yr(Kr,"z",{get:function(){return this.array[2]},set:function(t){this.array[2]=t,this._dirty=!0}}),Yr(Kr,"w",{get:function(){return this.array[3]},set:function(t){this.array[3]=t,this._dirty=!0}})}qr.add=function(t,e,r){return jr.add(t.array,e.array,r.array),t._dirty=!0,t},qr.set=function(t,e,r,n,i){jr.set(t.array,e,r,n,i),t._dirty=!0},qr.copy=function(t,e){return jr.copy(t.array,e.array),t._dirty=!0,t},qr.calculateW=function(t,e){return jr.calculateW(t.array,e.array),t._dirty=!0,t},qr.conjugate=function(t,e){return jr.conjugate(t.array,e.array),t._dirty=!0,t},qr.identity=function(t){return jr.identity(t.array),t._dirty=!0,t},qr.invert=function(t,e){return jr.invert(t.array,e.array),t._dirty=!0,t},qr.dot=function(t,e){return jr.dot(t.array,e.array)},qr.len=function(t){return jr.length(t.array)},qr.lerp=function(t,e,r,n){return jr.lerp(t.array,e.array,r.array,n),t._dirty=!0,t},qr.slerp=function(t,e,r,n){return jr.slerp(t.array,e.array,r.array,n),t._dirty=!0,t},qr.mul=function(t,e,r){return jr.multiply(t.array,e.array,r.array),t._dirty=!0,t},qr.multiply=qr.mul,qr.rotateX=function(t,e,r){return jr.rotateX(t.array,e.array,r),t._dirty=!0,t},qr.rotateY=function(t,e,r){return jr.rotateY(t.array,e.array,r),t._dirty=!0,t},qr.rotateZ=function(t,e,r){return jr.rotateZ(t.array,e.array,r),t._dirty=!0,t},qr.setAxisAngle=function(t,e,r){return jr.setAxisAngle(t.array,e.array,r),t._dirty=!0,t},qr.normalize=function(t,e){return jr.normalize(t.array,e.array),t._dirty=!0,t},qr.sqrLen=function(t){return jr.sqrLen(t.array)},qr.squaredLength=qr.sqrLen,qr.fromMat3=function(t,e){return jr.fromMat3(t.array,e.array),t._dirty=!0,t},qr.setAxes=function(t,e,r,n){return jr.setAxes(t.array,e.array,r.array,n.array),t._dirty=!0,t},qr.rotationTo=function(t,e,r){return jr.rotationTo(t.array,e.array,r.array),t._dirty=!0,t},qr.fromEuler=function(t,e,r){t._dirty=!0,e=e.array;var n=t.array,i=Math.cos(e[0]/2),a=Math.cos(e[1]/2),o=Math.cos(e[2]/2),s=Math.sin(e[0]/2),u=Math.sin(e[1]/2),l=Math.sin(e[2]/2),r=(r||"XYZ").toUpperCase();switch(r){case"XYZ":n[0]=s*a*o+i*u*l,n[1]=i*u*o-s*a*l,n[2]=i*a*l+s*u*o,n[3]=i*a*o-s*u*l;break;case"YXZ":n[0]=s*a*o+i*u*l,n[1]=i*u*o-s*a*l,n[2]=i*a*l-s*u*o,n[3]=i*a*o+s*u*l;break;case"ZXY":n[0]=s*a*o-i*u*l,n[1]=i*u*o+s*a*l,n[2]=i*a*l+s*u*o,n[3]=i*a*o-s*u*l;break;case"ZYX":n[0]=s*a*o-i*u*l,n[1]=i*u*o+s*a*l,n[2]=i*a*l-s*u*o,n[3]=i*a*o+s*u*l;break;case"YZX":n[0]=s*a*o+i*u*l,n[1]=i*u*o+s*a*l,n[2]=i*a*l-s*u*o,n[3]=i*a*o-s*u*l;break;case"XZY":n[0]=s*a*o-i*u*l,n[1]=i*u*o-s*a*l,n[2]=i*a*l+s*u*o,n[3]=i*a*o+s*u*l}};var Zr=pe.mat4,Jr=0,Qr=Pe.extend({name:"",position:null,rotation:null,scale:null,worldTransform:null,localTransform:null,autoUpdateLocalTransform:!0,_parent:null,_scene:null,_needsUpdateWorldTransform:!0,_inIterating:!1,__depth:0},function(){this.name||(this.name=(this.type||"NODE")+"_"+Jr++),this.position||(this.position=new Xe),this.rotation||(this.rotation=new qr),this.scale||(this.scale=new Xe(1,1,1)),this.worldTransform=new ar,this.localTransform=new ar,this._children=[]},{target:null,invisible:!1,isSkinnedMesh:function(){return!1},isRenderable:function(){return!1},setName:function(t){var e=this._scene;if(e){var r=e._nodeRepository;delete r[this.name],r[t]=this}this.name=t},add:function(t){this._inIterating&&console.warn("Add operation can cause unpredictable error when in iterating");var e=t._parent;if(e!==this){e&&e.remove(t),t._parent=this,this._children.push(t);var r=this._scene;r&&r!==t.scene&&t.traverse(this._addSelfToScene,this),t._needsUpdateWorldTransform=!0}},remove:function(t){this._inIterating&&console.warn("Remove operation can cause unpredictable error when in iterating");var e=this._children,r=e.indexOf(t);r<0||(e.splice(r,1),t._parent=null,this._scene&&t.traverse(this._removeSelfFromScene,this))},removeAll:function(){for(var t=this._children,e=0;ethis.distance,i=1;i<8;i++)if(tn.dot(e[i].array,r)>this.distance!=n)return!0},intersectLine:function(){var t=tn.create();return function(e,r,n){var i=this.distanceToPoint(e),a=this.distanceToPoint(r);if(i>0&&a>0||i<0&&a<0)return null;var o=this.normal.array,s=this.distance,u=e.array;tn.sub(t,r.array,e.array),tn.normalize(t,t);var l=tn.dot(o,t);if(0===l)return null;n||(n=new Xe);var c=(tn.dot(o,u)-s)/l;return tn.scaleAndAdd(n.array,u,t,-c),n._dirty=!0,n}}(),applyTransform:function(){var t=en.create(),e=rn.create(),r=rn.create();return r[3]=1,function(n){n=n.array,tn.scale(r,this.normal.array,this.distance),rn.transformMat4(r,r,n),this.distance=tn.dot(r,this.normal.array),en.invert(t,n),en.transpose(t,t),e[3]=0,tn.copy(e,this.normal.array),rn.transformMat4(e,e,t),tn.copy(this.normal.array,e)}}(),copy:function(t){tn.copy(this.normal.array,t.normal.array),this.normal._dirty=!0,this.distance=t.distance},clone:function(){var t=new nn;return t.copy(this),t}};var an=pe.vec3,on=an.set,sn=an.copy,un=an.transformMat4,ln=Math.min,cn=Math.max,hn=function(){this.planes=[];for(var t=0;t<6;t++)this.planes.push(new nn);this.boundingBox=new tr,this.vertices=[];for(var t=0;t<8;t++)this.vertices[t]=an.fromValues(0,0,0)};hn.prototype={setFromProjection:function(t){var e=this.planes,r=t.array,n=r[0],i=r[1],a=r[2],o=r[3],s=r[4],u=r[5],l=r[6],c=r[7],h=r[8],f=r[9],d=r[10],m=r[11],p=r[12],_=r[13],g=r[14],v=r[15];on(e[0].normal.array,o-n,c-s,m-h),e[0].distance=-(v-p),e[0].normalize(),on(e[1].normal.array,o+n,c+s,m+h),e[1].distance=-(v+p),e[1].normalize(),on(e[2].normal.array,o+i,c+u,m+f),e[2].distance=-(v+_),e[2].normalize(),on(e[3].normal.array,o-i,c-u,m-f),e[3].distance=-(v-_),e[3].normalize(),on(e[4].normal.array,o-a,c-l,m-d),e[4].distance=-(v-g),e[4].normalize(),on(e[5].normal.array,o+a,c+l,m+d),e[5].distance=-(v+g),e[5].normalize();var y=this.boundingBox;if(0===v){var x=u/n,T=-g/(d-1),E=-g/(d+1),b=-E/u,A=-T/u;y.min.set(-b*x,-b,E),y.max.set(b*x,b,T);var S=this.vertices;on(S[0],-b*x,-b,E),on(S[1],-b*x,b,E),on(S[2],b*x,-b,E),on(S[3],b*x,b,E),on(S[4],-A*x,-A,T),on(S[5],-A*x,A,T),on(S[6],A*x,-A,T),on(S[7],A*x,A,T)}else{var w=(-1-p)/n,M=(1-p)/n,C=(1-_)/u,N=(-1-_)/u,R=(-1-g)/d,L=(1-g)/d;y.min.set(Math.min(w,M),Math.min(N,C),Math.min(L,R)),y.max.set(Math.max(M,w),Math.max(C,N),Math.max(R,L));var P=y.min.array,D=y.max.array,S=this.vertices;on(S[0],P[0],P[1],P[2]),on(S[1],P[0],D[1],P[2]),on(S[2],D[0],P[1],P[2]),on(S[3],D[0],D[1],P[2]),on(S[4],P[0],P[1],D[2]),on(S[5],P[0],D[1],D[2]),on(S[6],D[0],P[1],D[2]),on(S[7],D[0],D[1],D[2])}},getTransformedBoundingBox:function(){var t=an.create();return function(e,r){var n=this.vertices,i=r.array,a=e.min,o=e.max,s=a.array,u=o.array,l=n[0];un(t,l,i),sn(s,t),sn(u,t);for(var c=1;c<8;c++)l=n[c],un(t,l,i),s[0]=ln(t[0],s[0]),s[1]=ln(t[1],s[1]),s[2]=ln(t[2],s[2]),u[0]=cn(t[0],u[0]),u[1]=cn(t[1],u[1]),u[2]=cn(t[2],u[2]);return a._dirty=!0,o._dirty=!0,e}}()};var fn=pe.vec3,dn=function(t,e){this.origin=t||new Xe,this.direction=e||new Xe};dn.prototype={constructor:dn,intersectPlane:function(t,e){var r=t.normal.array,n=t.distance,i=this.origin.array,a=this.direction.array,o=fn.dot(r,a);if(0===o)return null;e||(e=new Xe);var s=(fn.dot(r,i)-n)/o;return fn.scaleAndAdd(e.array,i,a,-s),e._dirty=!0,e},mirrorAgainstPlane:function(t){var e=fn.dot(t.normal.array,this.direction.array);fn.scaleAndAdd(this.direction.array,this.direction.array,t.normal.array,2*-e),this.direction._dirty=!0},distanceToPoint:function(){var t=fn.create();return function(e){fn.sub(t,e,this.origin.array);var r=fn.dot(t,this.direction.array);if(r<0)return fn.distance(this.origin.array,e);var n=fn.lenSquared(t);return Math.sqrt(n-r*r)}}(),intersectSphere:function(){var t=fn.create();return function(e,r,n){var i=this.origin.array,a=this.direction.array;e=e.array,fn.sub(t,e,i);var o=fn.dot(t,a),s=fn.squaredLength(t),u=s-o*o,l=r*r;if(!(u>l)){var c=Math.sqrt(l-u),h=o-c,f=o+c;return n||(n=new Xe),h<0?f<0?null:(fn.scaleAndAdd(n.array,i,a,f),n):(fn.scaleAndAdd(n.array,i,a,h),n)}}}(),intersectBoundingBox:function(t,e){var r,n,i,a,o,s,u=this.direction.array,l=this.origin.array,c=t.min.array,h=t.max.array,f=1/u[0],d=1/u[1],m=1/u[2];if(f>=0?(r=(c[0]-l[0])*f,n=(h[0]-l[0])*f):(n=(c[0]-l[0])*f,r=(h[0]-l[0])*f),d>=0?(i=(c[1]-l[1])*d,a=(h[1]-l[1])*d):(a=(c[1]-l[1])*d,i=(h[1]-l[1])*d),r>a||i>n)return null;if((i>r||r!==r)&&(r=i),(a=0?(o=(c[2]-l[2])*m,s=(h[2]-l[2])*m):(s=(c[2]-l[2])*m, +o=(h[2]-l[2])*m),r>s||o>n)return null;if((o>r||r!==r)&&(r=o),(s=0?r:n;return e||(e=new Xe),fn.scaleAndAdd(e.array,l,u,p),e},intersectTriangle:function(){var t=fn.create(),e=fn.create(),r=fn.create(),n=fn.create();return function(i,a,o,s,u,l){var c=this.direction.array,h=this.origin.array;i=i.array,a=a.array,o=o.array,fn.sub(t,a,i),fn.sub(e,o,i),fn.cross(n,e,c);var f=fn.dot(t,n);if(s){if(f>-1e-5)return null}else if(f>-1e-5&&f<1e-5)return null;fn.sub(r,h,i);var d=fn.dot(n,r)/f;if(d<0||d>1)return null;fn.cross(n,t,r);var m=fn.dot(c,n)/f;if(m<0||m>1||d+m>1)return null;fn.cross(n,t,e);var p=-fn.dot(r,n)/f;return p<0?null:(u||(u=new Xe),l&&Xe.set(l,1-d-m,d,m),fn.scaleAndAdd(u.array,h,c,p),u)}}(),applyTransform:function(t){Xe.add(this.direction,this.direction,this.origin),Xe.transformMat4(this.origin,this.origin,t),Xe.transformMat4(this.direction,this.direction,t),Xe.sub(this.direction,this.direction,this.origin),Xe.normalize(this.direction,this.direction)},copy:function(t){Xe.copy(this.origin,t.origin),Xe.copy(this.direction,t.direction)},clone:function(){var t=new dn;return t.copy(this),t}};var mn=pe.vec3,pn=pe.vec4,_n=Qr.extend(function(){return{projectionMatrix:new ar,invProjectionMatrix:new ar,viewMatrix:new ar,frustum:new hn}},function(){this.update(!0)},{update:function(t){Qr.prototype.update.call(this,t),ar.invert(this.viewMatrix,this.worldTransform),this.updateProjectionMatrix(),ar.invert(this.invProjectionMatrix,this.projectionMatrix),this.frustum.setFromProjection(this.projectionMatrix)},setViewMatrix:function(t){ar.copy(this.viewMatrix,t),ar.invert(this.worldTransform,t),this.decomposeWorldTransform()},decomposeProjectionMatrix:function(){},setProjectionMatrix:function(t){ar.copy(this.projectionMatrix,t),ar.invert(this.invProjectionMatrix,t),this.decomposeProjectionMatrix()},updateProjectionMatrix:function(){},castRay:function(){var t=pn.create();return function(e,r){var n=void 0!==r?r:new dn,i=e.array[0],a=e.array[1];return pn.set(t,i,a,-1,1),pn.transformMat4(t,t,this.invProjectionMatrix.array),pn.transformMat4(t,t,this.worldTransform.array),mn.scale(n.origin.array,t,1/t[3]),pn.set(t,i,a,1,1),pn.transformMat4(t,t,this.invProjectionMatrix.array),pn.transformMat4(t,t,this.worldTransform.array),mn.scale(t,t,1/t[3]),mn.sub(n.direction.array,t,n.origin.array),mn.normalize(n.direction.array,n.direction.array),n.direction._dirty=!0,n.origin._dirty=!0,n}}()}),gn={},vn=Qr.extend(function(){return{material:null,autoUpdate:!0,opaqueList:[],transparentList:[],lights:[],viewBoundingBoxLastFrame:new tr,shadowUniforms:{},_cameraList:[],_lightUniforms:{},_previousLightNumber:{},_lightNumber:{},_lightProgramKeys:{},_opaqueObjectCount:0,_transparentObjectCount:0,_nodeRepository:{}}},function(){this._scene=this},{addToScene:function(t){t instanceof _n&&(this._cameraList.length>0&&console.warn("Found multiple camera in one scene. Use the fist one."),this._cameraList.push(t)),t.name&&(this._nodeRepository[t.name]=t)},removeFromScene:function(t){if(t instanceof _n){var e=this._cameraList.indexOf(t);e>=0&&this._cameraList.splice(e,1)}t.name&&delete this._nodeRepository[t.name]},getNode:function(t){return this._nodeRepository[t]},cloneNode:function(t){var e=t.clone(),r={},n=function(i,a){i.skeleton&&(a.skeleton=i.skeleton.clone(t,e),a.joints=i.joints.slice()),i.material&&(r[i.material.__uid__]={oldMat:i.material});for(var o=0;o0&&this._updateRenderList(n)}},_updateLightUniforms:function(){var t=this.lights;t.sort($);var e=this._lightUniforms;for(var r in e)for(var n in e[r])e[r][n].value.length=0;for(var i=0;ia[0]&&(a[0]=s),u>a[1]&&(a[1]=u),l>a[2]&&(a[2]=l)}r._dirty=!0,n._dirty=!0}},dirty:function(){for(var t=this.getEnabledAttributes(),e=0;e=0){e||(e=Tn());var r=this.indices;return e[0]=r[3*t],e[1]=r[3*t+1],e[2]=r[3*t+2],e}},setTriangleIndices:function(t,e){var r=this.indices;r[3*t]=e[0],r[3*t+1]=e[1],r[3*t+2]=e[2]},isUseIndices:function(){return!!this.indices},initIndicesFromArray:function(t){var e,r=this.vertexCount>65535?We.Uint32Array:We.Uint16Array;if(t[0]&&t[0].length){var n=0;e=new r(3*t.length);for(var i=0;i=0&&(e.splice(r,1),delete this.attributes[t],!0)},getAttribute:function(t){return this.attributes[t]},getEnabledAttributes:function(){var t=this._enabledAttributes,e=this._attributeList;if(t)return t;for(var r=[],n=this.vertexCount,i=0;i65535&&(this.indices=new We.Uint32Array(this.indices));for(var t=this.attributes,e=this.indices,r=this.getEnabledAttributes(),n={},i=0;i65535?Uint32Array:Uint16Array,m=this.indices=new d(e*t*6),p=this.radius,_=this.phiStart,g=this.phiLength,v=this.thetaStart,y=this.thetaLength,p=this.radius,x=[],T=[],E=0,b=1/p;for(f=0;f<=t;f++)for(h=0;h<=e;h++)l=h/e,c=f/t,o=-p*Math.cos(_+l*g)*Math.sin(v+c*y),s=p*Math.cos(v+c*y),u=p*Math.sin(_+l*g)*Math.sin(v+c*y),x[0]=o,x[1]=s,x[2]=u,T[0]=l,T[1]=c,r.set(E,x),n.set(E,T),x[0]*=b,x[1]*=b,x[2]*=b,i.set(E,x),E++;var A,S,w,M,C=e+1,N=0;for(f=0;f65535?Uint32Array:Uint16Array,g=(o-1)*(s-1)*6,v=this.indices=new _(g),y=0,f=0;f>1,t|=t>>2,t|=t>>4,t|=t>>8,t|=t>>16,++t},Rn.nearestPowerOfTwo=function(t){return Math.pow(2,Math.round(Math.log(t)/Math.LN2))};var Ln=Rn.isPowerOfTwo,Pn=lr.extend(function(){return{image:null,pixels:null,mipmaps:[]}},{update:function(t){var e=t.gl;e.bindTexture(e.TEXTURE_2D,this._cache.get("webgl_texture")),this.updateCommon(t);var r=this.format,n=this.type;e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,this.getAvailableWrapS()),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,this.getAvailableWrapT()),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,this.getAvailableMagFilter()),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,this.getAvailableMinFilter());var i=t.getGLExtension("EXT_texture_filter_anisotropic");if(i&&this.anisotropic>1&&e.texParameterf(e.TEXTURE_2D,i.TEXTURE_MAX_ANISOTROPY_EXT,this.anisotropic),36193===n){t.getGLExtension("OES_texture_half_float")||(n=He.FLOAT)}if(this.mipmaps.length)for(var a=this.width,o=this.height,s=0;s=lr.COMPRESSED_RGB_S3TC_DXT1_EXT?t.compressedTexImage2D(t.TEXTURE_2D,r,a,n,i,0,e.pixels):t.texImage2D(t.TEXTURE_2D,r,a,n,i,0,a,o,e.pixels)},generateMipmap:function(t){var e=t.gl;this.useMipmap&&!this.NPOT&&(e.bindTexture(e.TEXTURE_2D,this._cache.get("webgl_texture")),e.generateMipmap(e.TEXTURE_2D))},isPowerOfTwo:function(){var t,e;return this.image?(t=this.image.width,e=this.image.height):(t=this.width,e=this.height),Ln(t)&&Ln(e)},isRenderable:function(){return this.image?"CANVAS"===this.image.nodeName||"VIDEO"===this.image.nodeName||this.image.complete:!(!this.width||!this.height)},bind:function(t){t.gl.bindTexture(t.gl.TEXTURE_2D,this.getWebGLTexture(t))},unbind:function(t){t.gl.bindTexture(t.gl.TEXTURE_2D,null)},load:function(t,e){var r=new Image;e&&(r.crossOrigin=e);var n=this;return r.onload=function(){n.dirty(),n.trigger("success",n),r.onload=null},r.onerror=function(){n.trigger("error",n),r.onerror=null},r.src=t,this.image=r,this}});Object.defineProperty(Pn.prototype,"width",{get:function(){return this.image?this.image.width:this._width},set:function(t){this.image?console.warn("Texture from image can't set width"):(this._width!==t&&this.dirty(),this._width=t)}}),Object.defineProperty(Pn.prototype,"height",{get:function(){return this.image?this.image.height:this._height},set:function(t){this.image?console.warn("Texture from image can't set height"):(this._height!==t&&this.dirty(),this._height=t)}});var Dn=Rn.isPowerOfTwo,In=["px","nx","py","ny","pz","nz"],On=lr.extend(function(){return{image:{px:null,nx:null,py:null,ny:null,pz:null,nz:null},pixels:{px:null,nx:null,py:null,ny:null,pz:null,nz:null},mipmaps:[]}},{update:function(t){var e=t.gl;e.bindTexture(e.TEXTURE_CUBE_MAP,this._cache.get("webgl_texture")),this.updateCommon(t);var r=this.format,n=this.type;e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_S,this.getAvailableWrapS()),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_T,this.getAvailableWrapT()),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MAG_FILTER,this.getAvailableMagFilter()),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MIN_FILTER,this.getAvailableMinFilter());var i=t.getGLExtension("EXT_texture_filter_anisotropic");if(i&&this.anisotropic>1&&e.texParameterf(e.TEXTURE_CUBE_MAP,i.TEXTURE_MAX_ANISOTROPY_EXT,this.anisotropic),36193===n){t.getGLExtension("OES_texture_half_float")||(n=He.FLOAT)}if(this.mipmaps.length)for(var a=this.width,o=this.height,s=0;s0},beforeRender:function(t){},afterRender:function(t,e){},getBoundingBox:function(t,e){return e=Qr.prototype.getBoundingBox.call(this,t,e),this.geometry&&this.geometry.boundingBox&&e.union(this.geometry.boundingBox),e},render:function(t,e,r){var n=t.gl;e=e||this.material;var i=e.shader,a=this.geometry,o=this.mode,s=a.vertexCount,u=(a.isUseIndices(),t.getGLExtension("OES_element_index_uint")),l=u&&s>65535,c=l?n.UNSIGNED_INT:n.UNSIGNED_SHORT,h=t.getGLExtension("OES_vertex_array_object"),f=!a.dynamic,d=this._renderInfo;d.vertexCount=s,d.triangleCount=0,d.drawCallCount=0;var m=!1;if(Fn=t.__uid__+"-"+a.__uid__+"-"+r.__uid__,Fn!==Hn?m=!0:(h&&f||a._cache.isDirty("any"))&&(m=!0),Hn=Fn,m){var p=this._drawCache[Fn];if(!p){var _=a.getBufferChunks(t);if(!_)return;p=[];for(var g=0;g<_.length;g++){for(var v=_[g],y=v.attributeBuffers,x=v.indicesBuffer,T=[],E=[],b=0;b0)},render:function(t,e,r){var n=t.gl;if(this.skeleton){this.skeleton.update();var i=this.skeleton.getSubSkinMatrices(this.__uid__,this.joints);r.setUniformOfSemantic(n,"SKIN_MATRIX",i)}return zn.prototype.render.call(this,t,e,r)},getSkinMatricesTexture:function(){return this._skinMatricesTexture=this._skinMatricesTexture||new Pn({type:He.FLOAT,minFilter:He.NEAREST,magFilter:He.NEAREST,useMipmap:!1,flipY:!1}),this._skinMatricesTexture}});Xn.POINTS=He.POINTS,Xn.LINES=He.LINES,Xn.LINE_LOOP=He.LINE_LOOP,Xn.LINE_STRIP=He.LINE_STRIP,Xn.TRIANGLES=He.TRIANGLES,Xn.TRIANGLE_STRIP=He.TRIANGLE_STRIP,Xn.TRIANGLE_FAN=He.TRIANGLE_FAN,Xn.BACK=He.BACK,Xn.FRONT=He.FRONT,Xn.FRONT_AND_BACK=He.FRONT_AND_BACK,Xn.CW=He.CW,Xn.CCW=He.CCW;var jn=_n.extend({fov:50,aspect:1,near:.1,far:2e3},{updateProjectionMatrix:function(){var t=this.fov/180*Math.PI;this.projectionMatrix.perspective(t,this.aspect,this.near,this.far)},decomposeProjectionMatrix:function(){var t=this.projectionMatrix.array,e=2*Math.atan(1/t[5]);this.fov=e/Math.PI*180,this.aspect=t[5]/t[0],this.near=t[14]/(t[10]-1),this.far=t[14]/(t[10]+1)},clone:function(){var t=_n.prototype.clone.call(this);return t.fov=this.fov,t.aspect=this.aspect,t.near=this.near,t.far=this.far,t}}),qn=_n.extend({left:-1,right:1,near:-1,far:1,top:1,bottom:-1},{updateProjectionMatrix:function(){this.projectionMatrix.ortho(this.left,this.right,this.bottom,this.top,this.near,this.far)},decomposeProjectionMatrix:function(){var t=this.projectionMatrix.array;this.left=(-1-t[12])/t[0],this.right=(1-t[12])/t[0],this.top=(1-t[13])/t[5],this.bottom=(-1-t[13])/t[5],this.near=-(-1-t[14])/t[10],this.far=-(1-t[14])/t[10]},clone:function(){var t=_n.prototype.clone.call(this);return t.left=this.left,t.right=this.right,t.near=this.near,t.far=this.far,t.top=this.top,t.bottom=this.bottom,t}}),Yn={get:ct +},Kn="\n@export clay.standard.vertex\n#define SHADER_NAME standard\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n#if defined(AOMAP_ENABLED)\nattribute vec2 texcoord2 : TEXCOORD_1;\n#endif\nattribute vec3 normal : NORMAL;\nattribute vec4 tangent : TANGENT;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nvarying vec3 v_Barycentric;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#if defined(AOMAP_ENABLED)\nvarying vec2 v_Texcoord2;\n#endif\nvoid main()\n{\n vec3 skinnedPosition = position;\n vec3 skinnedNormal = normal;\n vec3 skinnedTangent = tangent.xyz;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n v_Barycentric = barycentric;\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n#if defined(AOMAP_ENABLED)\n v_Texcoord2 = texcoord2;\n#endif\n}\n@end\n@export clay.standard.fragment\n#define PI 3.14159265358979\n#define GLOSSINESS_CHANNEL 0\n#define ROUGHNESS_CHANNEL 0\n#define METALNESS_CHANNEL 1\nuniform mat4 viewInverse : VIEWINVERSE;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\n#endif\n#ifdef DIFFUSEMAP_ENABLED\nuniform sampler2D diffuseMap;\n#endif\n#ifdef SPECULARMAP_ENABLED\nuniform sampler2D specularMap;\n#endif\n#ifdef USE_ROUGHNESS\nuniform float roughness : 0.5;\n #ifdef ROUGHNESSMAP_ENABLED\nuniform sampler2D roughnessMap;\n #endif\n#else\nuniform float glossiness: 0.5;\n #ifdef GLOSSINESSMAP_ENABLED\nuniform sampler2D glossinessMap;\n #endif\n#endif\n#ifdef METALNESSMAP_ENABLED\nuniform sampler2D metalnessMap;\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\nuniform samplerCube environmentMap;\n #ifdef PARALLAX_CORRECTED\nuniform vec3 environmentBoxMin;\nuniform vec3 environmentBoxMax;\n #endif\n#endif\n#ifdef BRDFLOOKUP_ENABLED\nuniform sampler2D brdfLookup;\n#endif\n#ifdef EMISSIVEMAP_ENABLED\nuniform sampler2D emissiveMap;\n#endif\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n#ifdef AOMAP_ENABLED\nuniform sampler2D aoMap;\nuniform float aoIntensity;\nvarying vec2 v_Texcoord2;\n#endif\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\n#ifdef ALPHA_TEST\nuniform float alphaCutoff: 0.9;\n#endif\n#ifdef USE_METALNESS\nuniform float metalness : 0.0;\n#else\nuniform vec3 specularColor : [0.1, 0.1, 0.1];\n#endif\nuniform vec3 emission : [0.0, 0.0, 0.0];\nuniform float emissionIntensity: 1;\nuniform float lineWidth : 0.0;\nuniform vec4 lineColor : [0.0, 0.0, 0.0, 0.6];\nvarying vec3 v_Barycentric;\n#ifdef ENVIRONMENTMAP_PREFILTER\nuniform float maxMipmapLevel: 5;\n#endif\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n#ifdef POINT_LIGHT_COUNT\n@import clay.header.point_light\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n#ifdef SPOT_LIGHT_COUNT\n@import clay.header.spot_light\n#endif\n@import clay.util.calculate_attenuation\n@import clay.util.edge_factor\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.plugin.compute_shadow_map\n@import clay.util.parallax_correct\n@import clay.util.ACES\nfloat G_Smith(float g, float ndv, float ndl)\n{\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(float g, float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (PI * tmp * tmp);\n}\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\nuniform float parallaxOcclusionScale : 0.02;\nuniform float parallaxMaxLayers : 20;\nuniform float parallaxMinLayers : 5;\nuniform sampler2D parallaxOcclusionMap;\nmat3 transpose(in mat3 inMat)\n{\n vec3 i0 = inMat[0];\n vec3 i1 = inMat[1];\n vec3 i2 = inMat[2];\n return mat3(\n vec3(i0.x, i1.x, i2.x),\n vec3(i0.y, i1.y, i2.y),\n vec3(i0.z, i1.z, i2.z)\n );\n}\nvec2 parallaxUv(vec2 uv, vec3 viewDir)\n{\n float numLayers = mix(parallaxMaxLayers, parallaxMinLayers, abs(dot(vec3(0.0, 0.0, 1.0), viewDir)));\n float layerHeight = 1.0 / numLayers;\n float curLayerHeight = 0.0;\n vec2 deltaUv = viewDir.xy * parallaxOcclusionScale / (viewDir.z * numLayers);\n vec2 curUv = uv;\n float height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n for (int i = 0; i < 30; i++) {\n curLayerHeight += layerHeight;\n curUv -= deltaUv;\n height = 1.0 - texture2D(parallaxOcclusionMap, curUv).r;\n if (height < curLayerHeight) {\n break;\n }\n }\n vec2 prevUv = curUv + deltaUv;\n float next = height - curLayerHeight;\n float prev = 1.0 - texture2D(parallaxOcclusionMap, prevUv).r - curLayerHeight + layerHeight;\n return mix(curUv, prevUv, next / (next - prev));\n}\n#endif\nvoid main() {\n vec4 albedoColor = vec4(color, alpha);\n#ifdef VERTEX_COLOR\n albedoColor *= v_Color;\n#endif\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n vec2 uv = v_Texcoord;\n#if defined(PARALLAXOCCLUSIONMAP_ENABLED) || defined(NORMALMAP_ENABLED)\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n#endif\n#ifdef PARALLAXOCCLUSIONMAP_ENABLED\n uv = parallaxUv(v_Texcoord, normalize(transpose(tbn) * -V));\n#endif\n#ifdef DIFFUSEMAP_ENABLED\n vec4 texel = texture2D(diffuseMap, uv);\n #ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n #endif\n albedoColor.rgb *= texel.rgb;\n #ifdef DIFFUSEMAP_ALPHA_ALPHA\n albedoColor.a *= texel.a;\n #endif\n#endif\n#ifdef USE_METALNESS\n float m = metalness;\n #ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, uv)[METALNESS_CHANNEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n #endif\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 spec = mix(vec3(0.04), baseColor, m);\n#else\n vec3 spec = specularColor;\n#endif\n#ifdef USE_ROUGHNESS\n float g = 1.0 - roughness;\n #ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, uv)[ROUGHNESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#else\n float g = glossiness;\n #ifdef GLOSSINESSMAP_ENABLED\n float g2 = texture2D(glossinessMap, uv)[GLOSSINESS_CHANNEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n #endif\n#endif\n#ifdef SPECULARMAP_ENABLED\n spec *= sRGBToLinear(texture2D(specularMap, uv)).rgb;\n#endif\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, uv).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n tbn[1] = -tbn[1];\n N = normalize(tbn * N);\n }\n }\n#endif\n vec3 diffuseTerm = vec3(0.0, 0.0, 0.0);\n vec3 specularTerm = vec3(0.0, 0.0, 0.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, spec);\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_];\n }}\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N) * ambientSHLightColor[_idx_];\n }}\n#endif\n#ifdef POINT_LIGHT_COUNT\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsPoint[POINT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfPointLights(v_WorldPosition, shadowContribsPoint);\n }\n#endif\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_COUNT; _idx_++)\n {{\n vec3 lightPosition = pointLightPosition[_idx_];\n vec3 lc = pointLightColor[_idx_];\n float range = pointLightRange[_idx_];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsPoint[_idx_];\n }\n#endif\n vec3 li = lc * ndl * attenuation * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -normalize(directionalLightDirection[_idx_]);\n vec3 lc = directionalLightColor[_idx_];\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if(shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n vec3 li = lc * ndl * shadowContrib;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n#ifdef SPOT_LIGHT_COUNT\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsSpot[SPOT_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfSpotLights(v_WorldPosition, shadowContribsSpot);\n }\n#endif\n for(int i = 0; i < SPOT_LIGHT_COUNT; i++)\n {\n vec3 lightPosition = spotLightPosition[i];\n vec3 spotLightDirection = -normalize(spotLightDirection[i]);\n vec3 lc = spotLightColor[i];\n float range = spotLightRange[i];\n float a = spotLightUmbraAngleCosine[i];\n float b = spotLightPenumbraAngleCosine[i];\n float falloffFactor = spotLightFalloffFactor[i];\n vec3 L = lightPosition - v_WorldPosition;\n float dist = length(L);\n float attenuation = lightAttenuation(dist, range);\n L /= dist;\n float c = dot(spotLightDirection, L);\n float falloff;\n falloff = clamp((c - a) /( b - a), 0.0, 1.0);\n falloff = pow(falloff, falloffFactor);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float shadowContrib = 1.0;\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsSpot[i];\n }\n#endif\n vec3 li = lc * attenuation * (1.0 - falloff) * shadowContrib * ndl;\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }\n#endif\n vec4 outColor = albedoColor;\n outColor.rgb *= diffuseTerm;\n outColor.rgb += specularTerm;\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = spec * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 51.5);\n outColor.rgb += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2;\n }}\n#endif\n#ifdef ENVIRONMENTMAP_ENABLED\n vec3 envWeight = g * fresnelTerm;\n vec3 L = reflect(-V, N);\n #ifdef PARALLAX_CORRECTED\n L = parallaxCorrect(L, v_WorldPosition, environmentBoxMin, environmentBoxMax);\n #endif\n #ifdef ENVIRONMENTMAP_PREFILTER\n float rough = clamp(1.0 - g, 0.0, 1.0);\n float bias = rough * maxMipmapLevel;\n vec3 envTexel = decodeHDR(textureCubeLodEXT(environmentMap, L, bias)).rgb;\n #ifdef BRDFLOOKUP_ENABLED\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n envWeight = spec * brdfParam.x + brdfParam.y;\n #endif\n #else\n vec3 envTexel = textureCube(environmentMap, L).xyz;\n #endif\n outColor.rgb += envTexel * envWeight;\n#endif\n float aoFactor = 1.0;\n#ifdef SSAOMAP_ENABLED\n aoFactor = min(texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r, aoFactor);\n#endif\n#ifdef AOMAP_ENABLED\n aoFactor = min(1.0 - clamp((1.0 - texture2D(aoMap, v_Texcoord2).r) * aoIntensity, 0.0, 1.0), aoFactor);\n#endif\n outColor.rgb *= aoFactor;\n vec3 lEmission = emission;\n#ifdef EMISSIVEMAP_ENABLED\n lEmission *= texture2D(emissiveMap, uv).rgb;\n#endif\n outColor.rgb += lEmission * emissionIntensity;\n if(lineWidth > 0.)\n {\n outColor.rgb = mix(outColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (outColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n outColor.rgb = ACESToneMapping(outColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n outColor = linearTosRGB(outColor);\n#endif\n gl_FragColor = encodeHDR(outColor);\n}\n@end\n@export clay.standardMR.vertex\n@import clay.standard.vertex\n@end\n@export clay.standardMR.fragment\n#define USE_METALNESS\n#define USE_ROUGHNESS\n@import clay.standard.fragment\n@end";K.import(Kn);var Zn,Jn=["diffuseMap","normalMap","roughnessMap","metalnessMap","emissiveMap","environmentMap","brdfLookup","ssaoMap","aoMap"],Qn=["color","emission","emissionIntensity","alpha","roughness","metalness","uvRepeat","uvOffset","aoIntensity","alphaCutoff"],$n=["linear","encodeRGBM","decodeRGBM","doubleSided","alphaTest","roughnessChannel","metalnessChannel","environmentMapPrefiltered"],ti={roughnessChannel:"ROUGHNESS_CHANNEL",metalnessChannel:"METALNESS_CHANNEL"},ei={linear:"SRGB_DECODE",encodeRGBM:"RGBM_ENCODE",decodeRGBM:"RGBM_DECODE",doubleSided:"DOUBLE_SIDED",alphaTest:"ALPHA_TEST",environmentMapPrefiltered:"ENVIRONMENTMAP_PREFILTER"},ri=vr.extend(function(){return Zn||(Zn=new K(K.source("clay.standard.vertex"),K.source("clay.standard.fragment"))),{shader:Zn}},function(t){Le.extend(this,t),Le.defaults(this,{color:[1,1,1],emission:[0,0,0],emissionIntensity:0,roughness:.5,metalness:0,alpha:1,alphaTest:!1,alphaCutoff:.9,doubleSided:!1,uvRepeat:[1,1],uvOffset:[0,0],aoIntensity:1,environmentMapPrefiltered:!1,linear:!1,encodeRGBM:!1,decodeRGBM:!1,roughnessChannel:0,metalnessChannel:1}),this.define("fragment","USE_METALNESS"),this.define("fragment","USE_ROUGHNESS")},{clone:function(){var t=new ri({name:this.name});return Jn.forEach(function(e){this[e]&&(t[e]=this[e])},this),Qn.concat($n).forEach(function(e){t[e]=this[e]},this),t}});Qn.forEach(function(t){Object.defineProperty(ri.prototype,t,{get:function(){return this.get(t)},set:function(e){this.setUniform(t,e)}})}),Jn.forEach(function(t){Object.defineProperty(ri.prototype,t,{get:function(){return this.get(t)},set:function(e){this.setUniform(t,e)}})}),$n.forEach(function(t){var e="_"+t;Object.defineProperty(ri.prototype,t,{get:function(){return this[e]},set:function(r){if(this[e]=r,t in ti){var n=ti[t];this.define("fragment",n,r)}else{var n=ei[t];r?this.define("fragment",n):this.undefine("fragment",n)}}})}),Object.defineProperty(ri.prototype,"environmentBox",{get:function(){var t=this._environmentBox;return t&&(t.min.setArray(this.get("environmentBoxMin")),t.max.setArray(this.get("environmentBoxMax"))),t},set:function(t){this._environmentBox=t;var e=this.uniforms=this.uniforms||{};e.environmentBoxMin=e.environmentBoxMin||{value:null},e.environmentBoxMax=e.environmentBoxMax||{value:null},t&&(this.setUniform("environmentBoxMin",t.min.array),this.setUniform("environmentBoxMax",t.max.array)),t?this.define("fragment","PARALLAX_CORRECTED"):this.undefine("fragment","PARALLAX_CORRECTED")}});var ni=Pe.extend({name:"",index:-1,node:null,rootNode:null}),ii=pe.quat,ai=pe.vec3,oi=pe.mat4,si=Pe.extend(function(){return{relativeRootNode:null,name:"",joints:[],_clips:[],_invBindPoseMatricesArray:null,_jointMatricesSubArrays:[],_skinMatricesArray:null,_skinMatricesSubArrays:[],_subSkinMatricesArray:{}}},{addClip:function(t,e){for(var r=0;r0&&this._clips.splice(e,1)},removeClipsAll:function(){this._clips=[]},getClip:function(t){if(this._clips[t])return this._clips[t].clip},getClipNumber:function(){return this._clips.length},updateJointMatrices:function(){var t=oi.create();return function(){this._invBindPoseMatricesArray=new Float32Array(16*this.joints.length),this._skinMatricesArray=new Float32Array(16*this.joints.length);for(var e=0;e 0.)\n {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor(lineWidth)) * lineColor.a);\n }\n#ifdef ALPHA_TEST\n if (gl_FragColor.a < alphaCutoff) {\n discard;\n }\n#endif\n#ifdef TONEMAPPING\n gl_FragColor.rgb = ACESToneMapping(gl_FragColor.rgb);\n#endif\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n}\n@end"),K.import(Kn),K.import("@export clay.wireframe.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 world : WORLD;\nattribute vec3 position : POSITION;\nattribute vec3 barycentric;\n@import clay.chunk.skinning_header\nvarying vec3 v_Barycentric;\nvoid main()\n{\n vec3 skinnedPosition = position;\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0 );\n v_Barycentric = barycentric;\n}\n@end\n@export clay.wireframe.fragment\nuniform vec3 color : [0.0, 0.0, 0.0];\nuniform float alpha : 1.0;\nuniform float lineWidth : 1.0;\nvarying vec3 v_Barycentric;\n@import clay.util.edge_factor\nvoid main()\n{\n gl_FragColor.rgb = color;\n gl_FragColor.a = (1.0-edgeFactor(lineWidth)) * alpha;\n}\n@end"),K.import(ci),K.import(kr),kn.template("clay.basic",K.source("clay.basic.vertex"),K.source("clay.basic.fragment")),kn.template("clay.lambert",K.source("clay.lambert.vertex"),K.source("clay.lambert.fragment")),kn.template("clay.wireframe",K.source("clay.wireframe.vertex"),K.source("clay.wireframe.fragment")),kn.template("clay.skybox",K.source("clay.skybox.vertex"),K.source("clay.skybox.fragment")),kn.template("clay.prez",K.source("clay.prez.vertex"),K.source("clay.prez.fragment")),kn.template("clay.standard",K.source("clay.standard.vertex"),K.source("clay.standard.fragment")),kn.template("clay.standardMR",K.source("clay.standardMR.vertex"),K.source("clay.standardMR.fragment")),K.import("@export clay.compositor.coloradjust\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float exposure : 0.0;\nuniform float gamma : 1.0;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n color = clamp( (color-vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n color = clamp( color * pow(2.0, exposure), 0.0, 1.0);\n color = clamp( pow(color, vec3(gamma)), 0.0, 1.0);\n float luminance = dot( color, w );\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.brightness\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = tex.rgb + vec3(brightness);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.contrast\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float contrast : 1.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = (tex.rgb-vec3(0.5))*contrast+vec3(0.5);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.exposure\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float exposure : 0.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb * pow(2.0, exposure);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.gamma\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float gamma : 1.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = pow(tex.rgb, vec3(gamma));\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.saturation\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb;\n float luminance = dot(color, w);\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end"),K.import("@export clay.compositor.kernel.gaussian_9\nfloat gaussianKernel[9];\ngaussianKernel[0] = 0.07;\ngaussianKernel[1] = 0.09;\ngaussianKernel[2] = 0.12;\ngaussianKernel[3] = 0.14;\ngaussianKernel[4] = 0.16;\ngaussianKernel[5] = 0.14;\ngaussianKernel[6] = 0.12;\ngaussianKernel[7] = 0.09;\ngaussianKernel[8] = 0.07;\n@end\n@export clay.compositor.kernel.gaussian_13\nfloat gaussianKernel[13];\ngaussianKernel[0] = 0.02;\ngaussianKernel[1] = 0.03;\ngaussianKernel[2] = 0.06;\ngaussianKernel[3] = 0.08;\ngaussianKernel[4] = 0.11;\ngaussianKernel[5] = 0.13;\ngaussianKernel[6] = 0.14;\ngaussianKernel[7] = 0.13;\ngaussianKernel[8] = 0.11;\ngaussianKernel[9] = 0.08;\ngaussianKernel[10] = 0.06;\ngaussianKernel[11] = 0.03;\ngaussianKernel[12] = 0.02;\n@end\n@export clay.compositor.gaussian_blur\n#define SHADER_NAME gaussian_blur\nuniform sampler2D texture;varying vec2 v_Texcoord;\nuniform float blurSize : 2.0;\nuniform vec2 textureSize : [512.0, 512.0];\nuniform float blurDir : 0.0;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main (void)\n{\n @import clay.compositor.kernel.gaussian_9\n vec2 off = blurSize / textureSize;\n off *= vec2(1.0 - blurDir, blurDir);\n vec4 sum = vec4(0.0);\n float weightAll = 0.0;\n for (int i = 0; i < 9; i++) {\n float w = gaussianKernel[i];\n vec4 texel = decodeHDR(clampSample(texture, v_Texcoord + float(i - 4) * off));\n sum += texel * w;\n weightAll += w;\n }\n gl_FragColor = encodeHDR(sum / max(weightAll, 0.01));\n}\n@end\n"),K.import("@export clay.compositor.hdr.log_lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n float luminance = dot(tex.rgb, w);\n luminance = log(luminance + 0.001);\n gl_FragColor = encodeHDR(vec4(vec3(luminance), 1.0));\n}\n@end\n@export clay.compositor.hdr.lum_adaption\nvarying vec2 v_Texcoord;\nuniform sampler2D adaptedLum;\nuniform sampler2D currentLum;\nuniform float frameTime : 0.02;\n@import clay.util.rgbm\nvoid main()\n{\n float fAdaptedLum = decodeHDR(texture2D(adaptedLum, vec2(0.5, 0.5))).r;\n float fCurrentLum = exp(encodeHDR(texture2D(currentLum, vec2(0.5, 0.5))).r);\n fAdaptedLum += (fCurrentLum - fAdaptedLum) * (1.0 - pow(0.98, 30.0 * frameTime));\n gl_FragColor = encodeHDR(vec4(vec3(fAdaptedLum), 1.0));\n}\n@end\n@export clay.compositor.lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord );\n float luminance = dot(tex.rgb, w);\n gl_FragColor = vec4(vec3(luminance), 1.0);\n}\n@end"),K.import("\n@export clay.compositor.lut\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform sampler2D lookup;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n float blueColor = tex.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec4 newColor1 = texture2D(lookup, texPos1);\n vec4 newColor2 = texture2D(lookup, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n gl_FragColor = vec4(newColor.rgb, tex.w);\n}\n@end"),K.import("@export clay.compositor.vignette\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float darkness: 1;\nuniform float offset: 1;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = texel.rgb;\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(offset);\n gl_FragColor = encodeHDR(vec4(mix(texel.rgb, vec3(1.0 - darkness), dot(uv, uv)), texel.a));\n}\n@end"),K.import("@export clay.compositor.output\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = tex.rgb;\n#ifdef OUTPUT_ALPHA\n gl_FragColor.a = tex.a;\n#else\n gl_FragColor.a = 1.0;\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end"),K.import("@export clay.compositor.bright\nuniform sampler2D texture;\nuniform float threshold : 1;\nuniform float scale : 1.0;\nuniform vec2 textureSize: [512, 512];\nvarying vec2 v_Texcoord;\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvec4 median(vec4 a, vec4 b, vec4 c)\n{\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n#ifdef ANTI_FLICKER\n vec3 d = 1.0 / textureSize.xyx * vec3(1.0, 1.0, 0.0);\n vec4 s1 = decodeHDR(texture2D(texture, v_Texcoord - d.xz));\n vec4 s2 = decodeHDR(texture2D(texture, v_Texcoord + d.xz));\n vec4 s3 = decodeHDR(texture2D(texture, v_Texcoord - d.zy));\n vec4 s4 = decodeHDR(texture2D(texture, v_Texcoord + d.zy));\n texel = median(median(texel, s1, s2), s3, s4);\n#endif\n float lum = dot(texel.rgb , lumWeight);\n vec4 color;\n if (lum > threshold && texel.a > 0.0)\n {\n color = vec4(texel.rgb * scale, texel.a * scale);\n }\n else\n {\n color = vec4(0.0);\n }\n gl_FragColor = encodeHDR(color);\n}\n@end\n"),K.import("@export clay.compositor.downsample\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nfloat brightness(vec3 c)\n{\n return max(max(c.r, c.g), c.b);\n}\n@import clay.util.clamp_sample\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n#ifdef ANTI_FLICKER\n vec3 s1 = decodeHDR(clampSample(texture, v_Texcoord + d.xy)).rgb;\n vec3 s2 = decodeHDR(clampSample(texture, v_Texcoord + d.zy)).rgb;\n vec3 s3 = decodeHDR(clampSample(texture, v_Texcoord + d.xw)).rgb;\n vec3 s4 = decodeHDR(clampSample(texture, v_Texcoord + d.zw)).rgb;\n float s1w = 1.0 / (brightness(s1) + 1.0);\n float s2w = 1.0 / (brightness(s2) + 1.0);\n float s3w = 1.0 / (brightness(s3) + 1.0);\n float s4w = 1.0 / (brightness(s4) + 1.0);\n float oneDivideSum = 1.0 / (s1w + s2w + s3w + s4w);\n vec4 color = vec4(\n (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * oneDivideSum,\n 1.0\n );\n#else\n vec4 color = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n color *= 0.25;\n#endif\n gl_FragColor = encodeHDR(color);\n}\n@end"),K.import("\n@export clay.compositor.upsample\n#define HIGH_QUALITY\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord - d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord - d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord - d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord )) * 4.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n gl_FragColor = encodeHDR(s / 16.0);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n gl_FragColor = encodeHDR(s / 4.0);\n#endif\n}\n@end"),K.import("@export clay.compositor.hdr.composite\nuniform sampler2D texture;\n#ifdef BLOOM_ENABLED\nuniform sampler2D bloom;\n#endif\n#ifdef LENSFLARE_ENABLED\nuniform sampler2D lensflare;\nuniform sampler2D lensdirt;\n#endif\n#ifdef LUM_ENABLED\nuniform sampler2D lum;\n#endif\n#ifdef LUT_ENABLED\nuniform sampler2D lut;\n#endif\n#ifdef COLOR_CORRECTION\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float saturation : 1.0;\n#endif\n#ifdef VIGNETTE\nuniform float vignetteDarkness: 1.0;\nuniform float vignetteOffset: 1.0;\n#endif\nuniform float exposure : 1.0;\nuniform float bloomIntensity : 0.25;\nuniform float lensflareIntensity : 1;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nfloat eyeAdaption(float fLum)\n{\n return mix(0.2, fLum, 0.5);\n}\n#ifdef LUT_ENABLED\nvec3 lutTransform(vec3 color) {\n float blueColor = color.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec4 newColor1 = texture2D(lut, texPos1);\n vec4 newColor2 = texture2D(lut, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n return newColor.rgb;\n}\n#endif\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = vec4(0.0);\n vec4 originalTexel = vec4(0.0);\n#ifdef TEXTURE_ENABLED\n texel = decodeHDR(texture2D(texture, v_Texcoord));\n originalTexel = texel;\n#endif\n#ifdef BLOOM_ENABLED\n vec4 bloomTexel = decodeHDR(texture2D(bloom, v_Texcoord));\n texel.rgb += bloomTexel.rgb * bloomIntensity;\n texel.a += bloomTexel.a * bloomIntensity;\n#endif\n#ifdef LENSFLARE_ENABLED\n texel += decodeHDR(texture2D(lensflare, v_Texcoord)) * texture2D(lensdirt, v_Texcoord) * lensflareIntensity;\n#endif\n texel.a = min(texel.a, 1.0);\n#ifdef LUM_ENABLED\n float fLum = texture2D(lum, vec2(0.5, 0.5)).r;\n float adaptedLumDest = 3.0 / (max(0.1, 1.0 + 10.0*eyeAdaption(fLum)));\n float exposureBias = adaptedLumDest * exposure;\n#else\n float exposureBias = exposure;\n#endif\n texel.rgb *= exposureBias;\n texel.rgb = ACESToneMapping(texel.rgb);\n texel = linearTosRGB(texel);\n#ifdef LUT_ENABLED\n texel.rgb = lutTransform(clamp(texel.rgb,vec3(0.0),vec3(1.0)));\n#endif\n#ifdef COLOR_CORRECTION\n texel.rgb = clamp(texel.rgb + vec3(brightness), 0.0, 1.0);\n texel.rgb = clamp((texel.rgb - vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n float lum = dot(texel.rgb, vec3(0.2125, 0.7154, 0.0721));\n texel.rgb = mix(vec3(lum), texel.rgb, saturation);\n#endif\n#ifdef VIGNETTE\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(vignetteOffset);\n texel.rgb = mix(texel.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\n#endif\n gl_FragColor = encodeHDR(texel);\n#ifdef DEBUG\n #if DEBUG == 1\n gl_FragColor = encodeHDR(decodeHDR(texture2D(texture, v_Texcoord)));\n #elif DEBUG == 2\n gl_FragColor = encodeHDR(decodeHDR(texture2D(bloom, v_Texcoord)) * bloomIntensity);\n #elif DEBUG == 3\n gl_FragColor = encodeHDR(decodeHDR(texture2D(lensflare, v_Texcoord) * lensflareIntensity));\n #endif\n#endif\n if (originalTexel.a <= 0.01 && gl_FragColor.a > 1e-5) {\n gl_FragColor.a = dot(gl_FragColor.rgb, vec3(0.2125, 0.7154, 0.0721));\n }\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end"), +K.import("@export clay.compositor.dof.coc\nuniform sampler2D depth;\nuniform float zNear: 0.1;\nuniform float zFar: 2000;\nuniform float focalDist: 3;\nuniform float focalRange: 1;\nuniform float focalLength: 30;\nuniform float fstop: 2.8;\nvarying vec2 v_Texcoord;\n@import clay.util.encode_float\nvoid main()\n{\n float z = texture2D(depth, v_Texcoord).r * 2.0 - 1.0;\n float dist = 2.0 * zNear * zFar / (zFar + zNear - z * (zFar - zNear));\n float aperture = focalLength / fstop;\n float coc;\n float uppper = focalDist + focalRange;\n float lower = focalDist - focalRange;\n if (dist <= uppper && dist >= lower) {\n coc = 0.5;\n }\n else {\n float focalAdjusted = dist > uppper ? uppper : lower;\n coc = abs(aperture * (focalLength * (dist - focalAdjusted)) / (dist * (focalAdjusted - focalLength)));\n coc = clamp(coc, 0.0, 0.4) / 0.4000001;\n if (dist < lower) {\n coc = -coc;\n }\n coc = coc * 0.5 + 0.5;\n }\n gl_FragColor = encodeFloat(coc);\n}\n@end\n@export clay.compositor.dof.premultiply\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.decode_float\nvoid main() {\n float fCoc = max(abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0), 0.1);\n gl_FragColor = encodeHDR(\n vec4(decodeHDR(texture2D(texture, v_Texcoord)).rgb * fCoc, 1.0)\n );\n}\n@end\n@export clay.compositor.dof.min_coc\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.float\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n fCoc = min(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zy)));\n fCoc = min(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.xw)));\n fCoc = min(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zw)));\n gl_FragColor = encodeFloat(fCoc);\n}\n@end\n@export clay.compositor.dof.max_coc\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.float\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n fCoc = max(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zy)));\n fCoc = max(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.xw)));\n fCoc = max(fCoc, decodeFloat(texture2D(coc, v_Texcoord + d.zw)));\n gl_FragColor = encodeFloat(fCoc);\n}\n@end\n@export clay.compositor.dof.coc_upsample\n#define HIGH_QUALITY\nuniform sampler2D coc;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.float\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n float s;\n s = decodeFloat(texture2D(coc, v_Texcoord - d.xy));\n s += decodeFloat(texture2D(coc, v_Texcoord - d.wy)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord - d.zy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zw)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord )) * 4.0;\n s += decodeFloat(texture2D(coc, v_Texcoord + d.xw)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.wy)) * 2.0;\n s += decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n gl_FragColor = encodeFloat(s / 16.0);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n float s;\n s = decodeFloat(texture2D(coc, v_Texcoord + d.xy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zy));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.xw));\n s += decodeFloat(texture2D(coc, v_Texcoord + d.zw));\n gl_FragColor = encodeFloat(s / 4.0);\n#endif\n}\n@end\n@export clay.compositor.dof.upsample\n#define HIGH_QUALITY\nuniform sampler2D coc;\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.decode_float\nfloat tap(vec2 uv, inout vec4 color, float baseWeight) {\n float weight = abs(decodeFloat(texture2D(coc, uv)) * 2.0 - 1.0) * baseWeight;\n color += decodeHDR(texture2D(texture, uv)) * weight;\n return weight;\n}\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n vec4 color = vec4(0.0);\n float baseWeight = 1.0 / 16.0;\n float w = tap(v_Texcoord - d.xy, color, baseWeight);\n w += tap(v_Texcoord - d.wy, color, baseWeight * 2.0);\n w += tap(v_Texcoord - d.zy, color, baseWeight);\n w += tap(v_Texcoord + d.zw, color, baseWeight * 2.0);\n w += tap(v_Texcoord , color, baseWeight * 4.0);\n w += tap(v_Texcoord + d.xw, color, baseWeight * 2.0);\n w += tap(v_Texcoord + d.zy, color, baseWeight);\n w += tap(v_Texcoord + d.wy, color, baseWeight * 2.0);\n w += tap(v_Texcoord + d.xy, color, baseWeight);\n gl_FragColor = encodeHDR(color / w);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n vec4 color = vec4(0.0);\n float baseWeight = 1.0 / 4.0;\n float w = tap(v_Texcoord + d.xy, color, baseWeight);\n w += tap(v_Texcoord + d.zy, color, baseWeight);\n w += tap(v_Texcoord + d.xw, color, baseWeight);\n w += tap(v_Texcoord + d.zw, color, baseWeight);\n gl_FragColor = encodeHDR(color / w);\n#endif\n}\n@end\n@export clay.compositor.dof.downsample\nuniform sampler2D texture;\nuniform sampler2D coc;\nuniform vec2 textureSize : [512, 512];\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.decode_float\nfloat tap(vec2 uv, inout vec4 color) {\n float weight = abs(decodeFloat(texture2D(coc, uv)) * 2.0 - 1.0) * 0.25;\n color += decodeHDR(texture2D(texture, uv)) * weight;\n return weight;\n}\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n vec4 color = vec4(0.0);\n float weight = tap(v_Texcoord + d.xy, color);\n weight += tap(v_Texcoord + d.zy, color);\n weight += tap(v_Texcoord + d.xw, color);\n weight += tap(v_Texcoord + d.zw, color);\n color /= weight;\n gl_FragColor = encodeHDR(color);\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_frag\n@import clay.util.float\nvec4 doBlur(sampler2D targetTexture, vec2 offset) {\n#ifdef BLUR_COC\n float cocSum = 0.0;\n#else\n vec4 color = vec4(0.0);\n#endif\n float weightSum = 0.0;\n float kernelWeight = 1.0 / float(KERNEL_SIZE);\n for (int i = 0; i < KERNEL_SIZE; i++) {\n vec2 coord = v_Texcoord + offset * float(i);\n float w = kernelWeight;\n#ifdef BLUR_COC\n float fCoc = decodeFloat(texture2D(targetTexture, coord)) * 2.0 - 1.0;\n cocSum += clamp(fCoc, -1.0, 0.0) * w;\n#else\n float fCoc = decodeFloat(texture2D(coc, coord)) * 2.0 - 1.0;\n vec4 texel = texture2D(targetTexture, coord);\n #if !defined(BLUR_NEARFIELD)\n w *= abs(fCoc);\n #endif\n color += decodeHDR(texel) * w;\n#endif\n weightSum += w;\n }\n#ifdef BLUR_COC\n return encodeFloat(clamp(cocSum / weightSum, -1.0, 0.0) * 0.5 + 0.5);\n#else\n return color / weightSum;\n#endif\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_1\n#define KERNEL_SIZE 5\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform float blurSize : 1.0;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.rgbm\n@import clay.compositor.dof.hexagonal_blur_frag\nvoid main()\n{\n vec2 offset = blurSize / textureSize;\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n gl_FragColor = doBlur(texture, vec2(0.0, offset.y));\n#if !defined(BLUR_COC)\n gl_FragColor = encodeHDR(gl_FragColor);\n#endif\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_2\n#define KERNEL_SIZE 5\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform float blurSize : 1.0;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.rgbm\n@import clay.compositor.dof.hexagonal_blur_frag\nvoid main()\n{\n vec2 offset = blurSize / textureSize;\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n offset.y /= 2.0;\n gl_FragColor = doBlur(texture, -offset);\n#if !defined(BLUR_COC)\n gl_FragColor = encodeHDR(gl_FragColor);\n#endif\n}\n@end\n@export clay.compositor.dof.hexagonal_blur_3\n#define KERNEL_SIZE 5\nuniform sampler2D texture1;\nuniform sampler2D texture2;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\nuniform float blurSize : 1.0;\nuniform vec2 textureSize : [512.0, 512.0];\n@import clay.util.rgbm\n@import clay.compositor.dof.hexagonal_blur_frag\nvoid main()\n{\n vec2 offset = blurSize / textureSize;\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n offset.y /= 2.0;\n vec2 vDownRight = vec2(offset.x, -offset.y);\n vec4 texel1 = doBlur(texture1, -offset);\n vec4 texel2 = doBlur(texture1, vDownRight);\n vec4 texel3 = doBlur(texture2, vDownRight);\n#ifdef BLUR_COC\n float coc1 = decodeFloat(texel1) * 2.0 - 1.0;\n float coc2 = decodeFloat(texel2) * 2.0 - 1.0;\n float coc3 = decodeFloat(texel3) * 2.0 - 1.0;\n gl_FragColor = encodeFloat(\n ((coc1 + coc2 + coc3) / 3.0) * 0.5 + 0.5\n );\n#else\n vec4 color = (texel1 + texel2 + texel3) / 3.0;\n gl_FragColor = encodeHDR(color);\n#endif\n}\n@end\n@export clay.compositor.dof.composite\n#define DEBUG 0\nuniform sampler2D original;\nuniform sampler2D blurred;\nuniform sampler2D nearfield;\nuniform sampler2D coc;\nuniform sampler2D nearcoc;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.float\nvoid main()\n{\n vec4 blurredColor = decodeHDR(texture2D(blurred, v_Texcoord));\n vec4 originalColor = decodeHDR(texture2D(original, v_Texcoord));\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord));\n fCoc = abs(fCoc * 2.0 - 1.0);\n float weight = smoothstep(0.0, 1.0, fCoc);\n#ifdef NEARFIELD_ENABLED\n vec4 nearfieldColor = decodeHDR(texture2D(nearfield, v_Texcoord));\n float fNearCoc = decodeFloat(texture2D(nearcoc, v_Texcoord));\n fNearCoc = abs(fNearCoc * 2.0 - 1.0);\n gl_FragColor = encodeHDR(\n mix(\n nearfieldColor, mix(originalColor, blurredColor, weight),\n pow(1.0 - fNearCoc, 4.0)\n )\n );\n#else\n gl_FragColor = encodeHDR(mix(originalColor, blurredColor, weight));\n#endif\n#if DEBUG == 1\n gl_FragColor = vec4(vec3(fCoc), 1.0);\n#elif DEBUG == 2\n gl_FragColor = vec4(vec3(fNearCoc), 1.0);\n#elif DEBUG == 3\n gl_FragColor = encodeHDR(blurredColor);\n#elif DEBUG == 4\n gl_FragColor = encodeHDR(nearfieldColor);\n#endif\n}\n@end"),K.import("@export clay.compositor.lensflare\n#define SAMPLE_NUMBER 8\nuniform sampler2D texture;\nuniform sampler2D lenscolor;\nuniform vec2 textureSize : [512, 512];\nuniform float dispersal : 0.3;\nuniform float haloWidth : 0.4;\nuniform float distortion : 1.0;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvec4 textureDistorted(\n in vec2 texcoord,\n in vec2 direction,\n in vec3 distortion\n) {\n return vec4(\n decodeHDR(texture2D(texture, texcoord + direction * distortion.r)).r,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.g)).g,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.b)).b,\n 1.0\n );\n}\nvoid main()\n{\n vec2 texcoord = -v_Texcoord + vec2(1.0); vec2 textureOffset = 1.0 / textureSize;\n vec2 ghostVec = (vec2(0.5) - texcoord) * dispersal;\n vec2 haloVec = normalize(ghostVec) * haloWidth;\n vec3 distortion = vec3(-textureOffset.x * distortion, 0.0, textureOffset.x * distortion);\n vec4 result = vec4(0.0);\n for (int i = 0; i < SAMPLE_NUMBER; i++)\n {\n vec2 offset = fract(texcoord + ghostVec * float(i));\n float weight = length(vec2(0.5) - offset) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n }\n result *= texture2D(lenscolor, vec2(length(vec2(0.5) - texcoord)) / length(vec2(0.5)));\n float weight = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n vec2 offset = fract(texcoord + haloVec);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n gl_FragColor = result;\n}\n@end"),K.import("@export clay.compositor.blend\n#define SHADER_NAME blend\n#ifdef TEXTURE1_ENABLED\nuniform sampler2D texture1;\nuniform float weight1 : 1.0;\n#endif\n#ifdef TEXTURE2_ENABLED\nuniform sampler2D texture2;\nuniform float weight2 : 1.0;\n#endif\n#ifdef TEXTURE3_ENABLED\nuniform sampler2D texture3;\nuniform float weight3 : 1.0;\n#endif\n#ifdef TEXTURE4_ENABLED\nuniform sampler2D texture4;\nuniform float weight4 : 1.0;\n#endif\n#ifdef TEXTURE5_ENABLED\nuniform sampler2D texture5;\nuniform float weight5 : 1.0;\n#endif\n#ifdef TEXTURE6_ENABLED\nuniform sampler2D texture6;\nuniform float weight6 : 1.0;\n#endif\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = vec4(0.0);\n#ifdef TEXTURE1_ENABLED\n tex += decodeHDR(texture2D(texture1, v_Texcoord)) * weight1;\n#endif\n#ifdef TEXTURE2_ENABLED\n tex += decodeHDR(texture2D(texture2, v_Texcoord)) * weight2;\n#endif\n#ifdef TEXTURE3_ENABLED\n tex += decodeHDR(texture2D(texture3, v_Texcoord)) * weight3;\n#endif\n#ifdef TEXTURE4_ENABLED\n tex += decodeHDR(texture2D(texture4, v_Texcoord)) * weight4;\n#endif\n#ifdef TEXTURE5_ENABLED\n tex += decodeHDR(texture2D(texture5, v_Texcoord)) * weight5;\n#endif\n#ifdef TEXTURE6_ENABLED\n tex += decodeHDR(texture2D(texture6, v_Texcoord)) * weight6;\n#endif\n gl_FragColor = encodeHDR(tex);\n}\n@end"),K.import("@export clay.compositor.fxaa\nuniform sampler2D texture;\nuniform vec4 viewport : VIEWPORT;\nvarying vec2 v_Texcoord;\n#define FXAA_REDUCE_MIN (1.0/128.0)\n#define FXAA_REDUCE_MUL (1.0/8.0)\n#define FXAA_SPAN_MAX 8.0\n@import clay.util.rgbm\nvoid main()\n{\n vec2 resolution = 1.0 / viewport.zw;\n vec3 rgbNW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbNE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ) ).xyz;\n vec4 rgbaM = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution ) );\n vec3 rgbM = rgbaM.xyz;\n float opacity = rgbaM.w;\n vec3 luma = vec3( 0.299, 0.587, 0.114 );\n float lumaNW = dot( rgbNW, luma );\n float lumaNE = dot( rgbNE, luma );\n float lumaSW = dot( rgbSW, luma );\n float lumaSE = dot( rgbSE, luma );\n float lumaM = dot( rgbM, luma );\n float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\n float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\n vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\n float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\n dir = min( vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * resolution;\n vec3 rgbA = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA *= 0.5;\n vec3 rgbB = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * -0.5 ) ).xyz;\n rgbB += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * 0.5 ) ).xyz;\n rgbB *= 0.25;\n rgbB += rgbA * 0.5;\n float lumaB = dot( rgbB, luma );\n if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) )\n {\n gl_FragColor = vec4( rgbA, opacity );\n }\n else {\n gl_FragColor = vec4( rgbB, opacity );\n }\n}\n@end"),K.import("@export clay.compositor.fxaa3\nuniform sampler2D texture;\nuniform vec4 viewport : VIEWPORT;\nuniform float subpixel: 0.75;\nuniform float edgeThreshold: 0.125;\nuniform float edgeThresholdMin: 0.0625;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nfloat FxaaLuma(vec4 rgba) { return rgba.y; }\nvec4 FxaaPixelShader(\n vec2 pos\n ,sampler2D tex\n ,vec2 fxaaQualityRcpFrame\n ,float fxaaQualitySubpix\n ,float fxaaQualityEdgeThreshold\n ,float fxaaQualityEdgeThresholdMin\n) {\n vec2 posM;\n posM.x = pos.x;\n posM.y = pos.y;\n vec4 rgbyM = decodeHDR(texture2D(texture, posM, 0.0));\n float lumaS = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 0.0, 1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaE = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 1.0, 0.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaN = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 0.0,-1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaW = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2(-1.0, 0.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float maxSM = max(lumaS, rgbyM.y);\n float minSM = min(lumaS, rgbyM.y);\n float maxESM = max(lumaE, maxSM);\n float minESM = min(lumaE, minSM);\n float maxWN = max(lumaN, lumaW);\n float minWN = min(lumaN, lumaW);\n float rangeMax = max(maxWN, maxESM);\n float rangeMin = min(minWN, minESM);\n float rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\n float range = rangeMax - rangeMin;\n float rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\n bool earlyExit = range < rangeMaxClamped;\n if(earlyExit) return rgbyM;\n float lumaNW = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2(-1.0,-1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaSE = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 1.0, 1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaNE = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2( 1.0,-1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaSW = FxaaLuma(decodeHDR(texture2D(texture, posM + (vec2(-1.0, 1.0) * fxaaQualityRcpFrame.xy), 0.0)));\n float lumaNS = lumaN + lumaS;\n float lumaWE = lumaW + lumaE;\n float subpixRcpRange = 1.0/range;\n float subpixNSWE = lumaNS + lumaWE;\n float edgeHorz1 = (-2.0 * rgbyM.y) + lumaNS;\n float edgeVert1 = (-2.0 * rgbyM.y) + lumaWE;\n float lumaNESE = lumaNE + lumaSE;\n float lumaNWNE = lumaNW + lumaNE;\n float edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\n float edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\n float lumaNWSW = lumaNW + lumaSW;\n float lumaSWSE = lumaSW + lumaSE;\n float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\n float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\n float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\n float edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\n float edgeHorz = abs(edgeHorz3) + edgeHorz4;\n float edgeVert = abs(edgeVert3) + edgeVert4;\n float subpixNWSWNESE = lumaNWSW + lumaNESE;\n float lengthSign = fxaaQualityRcpFrame.x;\n bool horzSpan = edgeHorz >= edgeVert;\n float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\n if(!horzSpan) lumaN = lumaW;\n if(!horzSpan) lumaS = lumaE;\n if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\n float subpixB = (subpixA * (1.0/12.0)) - rgbyM.y;\n float gradientN = lumaN - rgbyM.y;\n float gradientS = lumaS - rgbyM.y;\n float lumaNN = lumaN + rgbyM.y;\n float lumaSS = lumaS + rgbyM.y;\n bool pairN = abs(gradientN) >= abs(gradientS);\n float gradient = max(abs(gradientN), abs(gradientS));\n if(pairN) lengthSign = -lengthSign;\n float subpixC = clamp(abs(subpixB) * subpixRcpRange, 0.0, 1.0);\n vec2 posB;\n posB.x = posM.x;\n posB.y = posM.y;\n vec2 offNP;\n offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n if(!horzSpan) posB.x += lengthSign * 0.5;\n if( horzSpan) posB.y += lengthSign * 0.5;\n vec2 posN;\n posN.x = posB.x - offNP.x * 1.0;\n posN.y = posB.y - offNP.y * 1.0;\n vec2 posP;\n posP.x = posB.x + offNP.x * 1.0;\n posP.y = posB.y + offNP.y * 1.0;\n float subpixD = ((-2.0)*subpixC) + 3.0;\n float lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN, 0.0)));\n float subpixE = subpixC * subpixC;\n float lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP, 0.0)));\n if(!pairN) lumaNN = lumaSS;\n float gradientScaled = gradient * 1.0/4.0;\n float lumaMM = rgbyM.y - lumaNN * 0.5;\n float subpixF = subpixD * subpixE;\n bool lumaMLTZero = lumaMM < 0.0;\n lumaEndN -= lumaNN * 0.5;\n lumaEndP -= lumaNN * 0.5;\n bool doneN = abs(lumaEndN) >= gradientScaled;\n bool doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 1.5;\n if(!doneN) posN.y -= offNP.y * 1.5;\n bool doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 1.5;\n if(!doneP) posP.y += offNP.y * 1.5;\n if(doneNP) {\n if(!doneN) lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN.xy, 0.0)));\n if(!doneP) lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP.xy, 0.0)));\n if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 2.0;\n if(!doneN) posN.y -= offNP.y * 2.0;\n doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 2.0;\n if(!doneP) posP.y += offNP.y * 2.0;\n if(doneNP) {\n if(!doneN) lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN.xy, 0.0)));\n if(!doneP) lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP.xy, 0.0)));\n if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 4.0;\n if(!doneN) posN.y -= offNP.y * 4.0;\n doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 4.0;\n if(!doneP) posP.y += offNP.y * 4.0;\n if(doneNP) {\n if(!doneN) lumaEndN = FxaaLuma(decodeHDR(texture2D(texture, posN.xy, 0.0)));\n if(!doneP) lumaEndP = FxaaLuma(decodeHDR(texture2D(texture, posP.xy, 0.0)));\n if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n doneN = abs(lumaEndN) >= gradientScaled;\n doneP = abs(lumaEndP) >= gradientScaled;\n if(!doneN) posN.x -= offNP.x * 12.0;\n if(!doneN) posN.y -= offNP.y * 12.0;\n doneNP = (!doneN) || (!doneP);\n if(!doneP) posP.x += offNP.x * 12.0;\n if(!doneP) posP.y += offNP.y * 12.0;\n }\n }\n }\n float dstN = posM.x - posN.x;\n float dstP = posP.x - posM.x;\n if(!horzSpan) dstN = posM.y - posN.y;\n if(!horzSpan) dstP = posP.y - posM.y;\n bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\n float spanLength = (dstP + dstN);\n bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\n float spanLengthRcp = 1.0/spanLength;\n bool directionN = dstN < dstP;\n float dst = min(dstN, dstP);\n bool goodSpan = directionN ? goodSpanN : goodSpanP;\n float subpixG = subpixF * subpixF;\n float pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\n float subpixH = subpixG * fxaaQualitySubpix;\n float pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\n float pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\n if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\n if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\n return vec4(decodeHDR(texture2D(texture, posM, 0.0)).xyz, rgbyM.y);\n}\nvoid main()\n{\n vec4 color = FxaaPixelShader(\n v_Texcoord,\n texture,\n vec2(1.0) / viewport.zw,\n subpixel,\n edgeThreshold,\n edgeThresholdMin\n );\n gl_FragColor = vec4(color.rgb, 1.0);\n}\n@end");var hi={NORMAL:"normal",POSITION:"position",TEXCOORD_0:"texcoord0",TEXCOORD_1:"texcoord1",WEIGHTS_0:"weight",JOINTS_0:"joint",COLOR:"color"},fi={5120:We.Int8Array,5121:We.Uint8Array,5122:We.Int16Array,5123:We.Uint16Array,5125:We.Uint32Array,5126:We.Float32Array},di={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},mi=Pe.extend({rootNode:null,rootPath:null,textureRootPath:null,bufferRootPath:null,shader:"clay.standard",useStandardMaterial:!1,includeCamera:!0,includeAnimation:!0,includeMesh:!0,includeTexture:!0,crossOrigin:"",textureFlipY:!1,shaderLibrary:null},function(){this.shaderLibrary||(this.shaderLibrary=kn.createLibrary())},{load:function(t){var e=this,r=t.endsWith(".glb");null==this.rootPath&&(this.rootPath=t.slice(0,t.lastIndexOf("/"))),Yn.get({url:t,onprogress:function(t,r,n){e.trigger("progress",t,r,n)},onerror:function(t){e.trigger("error",t)},responseType:r?"arraybuffer":"text",onload:function(t){r?e.parseBinary(t):e.parse(JSON.parse(t))}})},parseBinary:function(t){var e=new Uint32Array(t,0,4);if(1179937895!==e[0])return void this.trigger("error","Invalid glTF binary format: Invalid header");if(e[0]<2)return void this.trigger("error","Only glTF2.0 is supported.");for(var r,n=new DataView(t,12),i=[],a=0;a=r.COLOR_ATTACHMENT0&&a<=r.COLOR_ATTACHMENT0+8&&i.push(a);n.drawBuffersEXT(i)}}this.trigger("beforerender",this,t);var o=this.clearDepth?r.DEPTH_BUFFER_BIT:0;if(r.depthMask(!0),this.clearColor){o|=r.COLOR_BUFFER_BIT,r.colorMask(!0,!0,!0,!0);var s=this.clearColor;Array.isArray(s)&&r.clearColor(s[0],s[1],s[2],s[3])}r.clear(o),this.blendWithPrevious?(r.enable(r.BLEND),this.material.transparent=!0):(r.disable(r.BLEND),this.material.transparent=!1),this.renderQuad(t),this.trigger("afterrender",this,t),e&&this.unbind(t,e)},renderQuad:function(t){Si.material=this.material,t.renderPass([Si],wi)},dispose:function(t){}});K.import(ci);var Ci=Xn.extend(function(){var t=new K({vertex:K.source("clay.skybox.vertex"),fragment:K.source("clay.skybox.fragment")}),e=new vr({shader:t,depthMask:!1});return{scene:null,geometry:new Mn,material:e,environmentMap:null,culling:!1}},function(){var t=this.scene;t&&this.attachScene(t),this.environmentMap&&this.setEnvironmentMap(this.environmentMap)},{attachScene:function(t){this.scene&&this.detachScene(),t.skybox=this,this.scene=t,t.on("beforerender",this._beforeRenderScene,this)},detachScene:function(){this.scene&&(this.scene.off("beforerender",this._beforeRenderScene),this.scene.skybox=null),this.scene=null},dispose:function(t){this.detachScene(),this.geometry.dispose(t)},setEnvironmentMap:function(t){this.material.set("environmentMap",t)},getEnvironmentMap:function(){return this.material.get("environmentMap")},_beforeRenderScene:function(t,e,r){this.renderSkybox(t,r)},renderSkybox:function(t,e){this.position.copy(e.getWorldPosition()),this.update(),t.gl.disable(t.gl.BLEND),this.material.get("lod")>0?this.material.define("fragment","LOD"):this.material.undefine("fragment","LOD"),t.renderPass([this],e)}}),Ni=["px","nx","py","ny","pz","nz"],Ri=Pe.extend(function(){var t={position:new Xe,far:1e3,near:.1,texture:null,shadowMapPass:null},e=t._cameras={px:new jn({fov:90}),nx:new jn({fov:90}),py:new jn({fov:90}),ny:new jn({fov:90}),pz:new jn({fov:90}),nz:new jn({fov:90})};return e.px.lookAt(Xe.POSITIVE_X,Xe.NEGATIVE_Y),e.nx.lookAt(Xe.NEGATIVE_X,Xe.NEGATIVE_Y),e.py.lookAt(Xe.POSITIVE_Y,Xe.POSITIVE_Z),e.ny.lookAt(Xe.NEGATIVE_Y,Xe.NEGATIVE_Z),e.pz.lookAt(Xe.POSITIVE_Z,Xe.NEGATIVE_Y),e.nz.lookAt(Xe.NEGATIVE_Z,Xe.NEGATIVE_Y),t._frameBuffer=new bi,t},{getCamera:function(t){return this._cameras[t]},render:function(t,e,r){var n=t.gl;r||e.update();for(var i=this.texture.width,a=2*Math.atan(i/(i-.5))/Math.PI*180,o=0;o<6;o++){var s=Ni[o],u=this._cameras[s];if(Xe.copy(u.position,this.position),u.far=this.far,u.near=this.near,u.fov=a,this.shadowMapPass){u.update();var l=e.getBoundingBox();l.applyTransform(u.viewMatrix),e.viewBoundingBoxLastFrame.copy(l),this.shadowMapPass.render(t,e,u,!0)}this._frameBuffer.attach(this.texture,n.COLOR_ATTACHMENT0,n.TEXTURE_CUBE_MAP_POSITIVE_X+o),this._frameBuffer.bind(t),t.render(e,u,!0),this._frameBuffer.unbind(t)}},dispose:function(t){this._frameBuffer.dispose(t)}});K.import(li);var Li=Xn.extend(function(){var t=new K(K.source("clay.basic.vertex"),K.source("clay.basic.fragment")),e=new vr({shader:t,depthMask:!1});return e.enableTexture("diffuseMap"),{scene:null,geometry:new Cn({widthSegments:30,heightSegments:30}),material:e,environmentMap:null,culling:!1}},function(){var t=this.scene;t&&this.attachScene(t),this.environmentMap&&this.setEnvironmentMap(this.environmentMap)},{attachScene:function(t){this.scene&&this.detachScene(),t.skydome=this,this.scene=t,t.on("beforerender",this._beforeRenderScene,this)},detachScene:function(){this.scene&&(this.scene.off("beforerender",this._beforeRenderScene),this.scene.skydome=null),this.scene=null},_beforeRenderScene:function(t,e,r){this.position.copy(r.getWorldPosition()),this.update(),t.renderPass([this],r)},setEnvironmentMap:function(t){this.material.set("diffuseMap",t)},getEnvironmentMap:function(){return this.material.get("diffuseMap")},dispose:function(t){this.detachScene(),this.geometry.dispose(t)}}),Pi=ft("DXT1"),Di=ft("DXT3"),Ii=ft("DXT5"),Oi={parse:function(t,e){var r=new Int32Array(t,0,31);if(542327876!==r[0])return null;if(4&!r(20))return null;var n,i,a=r(21),o=r[4],s=r[3],u=512&r[28],l=131072&r[2];switch(a){case Pi:n=8,i=lr.COMPRESSED_RGB_S3TC_DXT1_EXT;break;case Di:n=16,i=lr.COMPRESSED_RGBA_S3TC_DXT3_EXT;break;case Ii:n=16,i=lr.COMPRESSED_RGBA_S3TC_DXT5_EXT;break;default:return null}var c=r[1]+4,h=u?6:1,f=1;l&&(f=Math.max(1,r[7]));for(var d=[],m=0;m=i)){a+=2;for(var o="";a20)return console.warn("Given image is not a height map"),t}var f,d,m,p;u%(4*n)==0?(f=o.data[u],m=o.data[u+4]):u%(4*n)==4*(n-1)?(f=o.data[u-4],m=o.data[u]):(f=o.data[u-4],m=o.data[u+4]),u<4*n?(d=o.data[u],p=o.data[u+4*n]):u>n*(i-1)*4?(d=o.data[u-4*n],p=o.data[u]):(d=o.data[u-4*n],p=o.data[u+4*n]),s.data[u]=f-m+127,s.data[u+1]=d-p+127,s.data[u+2]=255,s.data[u+3]=255}return a.putImageData(s,0,0),r},isHeightImage:function(t,e,r){if(!t||!t.width||!t.height)return!1;var n=document.createElement("canvas"),i=n.getContext("2d"),a=e||32;r=r||20,n.width=n.height=a,i.drawImage(t,0,0,a,a);for(var o=i.getImageData(0,0,a,a),s=0;sr)return!1}return!0},_fetchTexture:function(t,e,r){Yn.get({url:t,responseType:"arraybuffer",onload:e,onerror:r})},createChessboard:function(t,e,r,n){t=t||512,e=e||64,r=r||"black",n=n||"white";var i=Math.ceil(t/e),a=document.createElement("canvas");a.width=t,a.height=t;var o=a.getContext("2d");o.fillStyle=n,o.fillRect(0,0,t,t),o.fillStyle=r;for(var s=0;s 0.0) {\n prefilteredColor += decodeHDR(textureCube(environmentMap, L)).rgb * NoL;\n totalWeight += NoL;\n }\n }\n gl_FragColor = encodeHDR(vec4(prefilteredColor / totalWeight, 1.0));\n}\n"})});h.set("normalDistribution",n),r.encodeRGBM&&h.define("fragment","RGBM_ENCODE"),r.decodeRGBM&&h.define("fragment","RGBM_DECODE");var f,d=new vn;if(e instanceof Pn){var m=new On({width:a,height:o,type:s===lr.FLOAT?lr.HALF_FLOAT:s});Hi.panoramaToCubeMap(t,e,m,{encodeRGBM:r.decodeRGBM}),e=m}f=new Ci({scene:d,material:h}),f.material.set("environmentMap",e);var p=new Ri({texture:u});r.encodeRGBM&&(s=u.type=lr.UNSIGNED_BYTE);for(var _=new Pn({width:a,height:o,type:s}),g=new bi({depthBuffer:!1}),v=We[s===lr.UNSIGNED_BYTE?"Uint8Array":"Float32Array"],y=0;y 0.0) {\n float G = G_Smith(roughness, NoV, NoL);\n float G_Vis = G * VoH / (NoH * NoV);\n float Fc = pow(1.0 - VoH, 5.0);\n A += (1.0 - Fc) * G_Vis;\n B += Fc * G_Vis;\n }\n }\n gl_FragColor = vec4(vec2(A, B) / fSampleNumber, 0.0, 1.0);\n}\n"}),i=new Pn({width:512,height:256,type:lr.HALF_FLOAT,minFilter:lr.NEAREST,magFilter:lr.NEAREST,useMipmap:!1});return n.setUniform("normalDistribution",e),n.setUniform("viewportSize",[512,256]),n.attachOutput(i),n.render(t,r),r.dispose(t),i},Gi.generateNormalDistribution=function(t,e){for(var t=t||256,e=e||1024,r=new Pn({width:t,height:e,type:lr.FLOAT,minFilter:lr.NEAREST,magFilter:lr.NEAREST,useMipmap:!1}),n=new Float32Array(e*t*4),i=0;i>>16)>>>0;o=((1431655765&o)<<1|(2863311530&o)>>>1)>>>0,o=((858993459&o)<<2|(3435973836&o)>>>2)>>>0,o=((252645135&o)<<4|(4042322160&o)>>>4)>>>0,o=(((16711935&o)<<8|(4278255360&o)>>>8)>>>0)/4294967296;for(var s=0;s= shadowCascadeClipsNear[_idx_] &&\n depth <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[0], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[0],\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n shadowContribs[0] = shadowContrib;\n }\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#else\nvoid computeShadowOfDirectionalLights(vec3 position, inout float shadowContribs[DIRECTIONAL_LIGHT_COUNT]){\n float shadowContrib;\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[_idx_], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[_idx_]\n );\n shadowContribs[_idx_] = shadowContrib;\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\nvoid computeShadowOfPointLights(vec3 position, inout float shadowContribs[POINT_LIGHT_COUNT] ){\n vec3 lightPosition;\n vec3 direction;\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n lightPosition = pointLightPosition[_idx_];\n direction = position - lightPosition;\n shadowContribs[_idx_] = computeShadowContribOmni(pointLightShadowMaps[_idx_], direction, pointLightRange[_idx_]);\n }}\n for(int _idx_ = POINT_LIGHT_SHADOWMAP_COUNT; _idx_ < POINT_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n@end");var Zi=Pe.extend(function(){return{softShadow:Zi.PCF,shadowBlur:1,lightFrustumBias:"auto",kernelPCF:new Float32Array([1,0,1,1,-1,1,0,1,-1,0,-1,-1,1,-1,0,-1]),precision:"mediump",_lastRenderNotCastShadow:!1,_frameBuffer:new bi,_textures:{},_shadowMapNumber:{POINT_LIGHT:0,DIRECTIONAL_LIGHT:0,SPOT_LIGHT:0},_depthMaterials:{},_distanceMaterials:{},_opaqueCasters:[],_receivers:[],_lightsCastShadow:[],_lightCameras:{},_lightMaterials:{},_texturePool:new Xi}},function(){this._gaussianPassH=new Mi({fragment:K.source("clay.compositor.gaussian_blur")}),this._gaussianPassV=new Mi({fragment:K.source("clay.compositor.gaussian_blur")}),this._gaussianPassH.setUniform("blurSize",this.shadowBlur),this._gaussianPassH.setUniform("blurDir",0),this._gaussianPassV.setUniform("blurSize",this.shadowBlur),this._gaussianPassV.setUniform("blurDir",1),this._outputDepthPass=new Mi({fragment:K.source("clay.sm.debug_depth")})},{render:function(t,e,r,n){r||(r=e.getMainCamera()),this.trigger("beforerender",this,t,e,r),this._renderShadowPass(t,e,r,n),this.trigger("afterrender",this,t,e,r)},renderDebug:function(t,e){t.saveClear();var r=t.viewport,n=0,i=e||r.width/4,a=i;this.softShadow===Zi.VSM?this._outputDepthPass.material.define("fragment","USE_VSM"):this._outputDepthPass.material.undefine("fragment","USE_VSM");for(var o in this._textures){var s=this._textures[o];t.setViewport(n,0,i*s.width/s.height,a),this._outputDepthPass.setUniform("depthMap",s),this._outputDepthPass.render(t),n+=i*s.width/s.height}t.setViewport(r),t.restoreClear()},_updateCasterAndReceiver:function(t,e){if(e.castShadow&&this._opaqueCasters.push(e),e.receiveShadow?(this._receivers.push(e),e.material.set("shadowEnabled",1),e.material.set("pcfKernel",this.kernelPCF)):e.material.set("shadowEnabled",0),!e.material.shader&&e.material.updateShader&&e.material.updateShader(t),this.softShadow===Zi.VSM)e.material.define("fragment","USE_VSM"),e.material.undefine("fragment","PCF_KERNEL_SIZE");else{e.material.undefine("fragment","USE_VSM");var r=this.kernelPCF;r&&r.length?e.material.define("fragment","PCF_KERNEL_SIZE",r.length/2):e.material.undefine("fragment","PCF_KERNEL_SIZE")}},_update:function(t,e){for(var r=0;r4){console.warn("Support at most 4 cascade");continue}p.shadowCascade>1&&(s=p.shadowCascade),this.renderDirectionalLightShadow(t,e,r,p,this._opaqueCasters,f,h,c)}else p instanceof gi?this.renderSpotLightShadow(t,e,p,this._opaqueCasters,l,u):p instanceof _i&&this.renderPointLightShadow(t,e,p,this._opaqueCasters,d);this._shadowMapNumber[p.type]++}for(var _ in this._shadowMapNumber)for(var g=this._shadowMapNumber[_],v=_+"_SHADOWMAP_COUNT",m=0;m0?x.define("fragment",v,g):x.isDefined("fragment",v)&&x.undefine("fragment",v))}for(var m=0;m0){var E=c.map(i);if(T.directionalLightShadowMaps={value:c,type:"tv"},T.directionalLightMatrices={value:h,type:"m4v"},T.directionalLightShadowMapSizes={value:E,type:"1fv"},s){var b=f.slice(),A=f.slice();b.pop(),A.shift(),b.reverse(),A.reverse(),h.reverse(),T.shadowCascadeClipsNear={value:b,type:"1fv"},T.shadowCascadeClipsFar={value:A,type:"1fv"}}}if(u.length>0){var S=u.map(i),T=e.shadowUniforms;T.spotLightShadowMaps={value:u,type:"tv"},T.spotLightMatrices={value:l,type:"m4v"},T.spotLightShadowMapSizes={value:S,type:"1fv"}}d.length>0&&(T.pointLightShadowMaps={value:d,type:"tv"})}},renderDirectionalLightShadow:function(){var t=new hn,e=new ar,r=new tr,n=new ar,i=new ar,a=new ar,o=new ar;return function(s,u,l,c,h,f,d,m){var p=this._getDepthMaterial(c),_={getMaterial:function(t){return t.shadowDepthMaterial||p},sortCompare:zr.opaqueSortCompare};if(!u.viewBoundingBoxLastFrame.isFinite()){var g=u.getBoundingBox();u.viewBoundingBoxLastFrame.copy(g).applyTransform(l.viewMatrix)}var v=Math.min(-u.viewBoundingBoxLastFrame.min.z,l.far),y=Math.max(-u.viewBoundingBoxLastFrame.max.z,l.near),x=this._getDirectionalLightCamera(c,u,l),T=a.array;o.copy(x.projectionMatrix),Yi.invert(i.array,x.worldTransform.array),Yi.multiply(i.array,i.array,l.worldTransform.array),Yi.multiply(T,o.array,i.array);for(var E=[],b=l instanceof jn,A=(l.near+l.far)/(l.near-l.far),S=2*l.near*l.far/(l.near-l.far),w=0;w<=c.shadowCascade;w++){var M=y*Math.pow(v/y,w/c.shadowCascade),C=y+(v-y)*w/c.shadowCascade,N=M*c.cascadeSplitLogFactor+C*(1-c.cascadeSplitLogFactor);E.push(N),f.push(-(-N*A+S)/-N)}var R=this._getTexture(c,c.shadowCascade);m.push(R);var L=s.viewport,P=s.gl;this._frameBuffer.attach(R),this._frameBuffer.bind(s),P.clear(P.COLOR_BUFFER_BIT|P.DEPTH_BUFFER_BIT);for(var w=0;w=0&&x[v]>1e-4&&(Ji.transformMat4(b,y,_[T[v]]),Ji.scaleAndAdd(E,E,b,x[v]));A.set(g,E)}}for(var g=0;g 0.0;\n#endif\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n skinnedPosition = (skinMatrixWS * vec4(position, 1.0)).xyz;\n #ifdef FIRST_PASS\n skinnedNormal = (skinMatrixWS * vec4(normal, 0.0)).xyz;\n if (hasTangent) {\n skinnedTangent = (skinMatrixWS * vec4(tangent.xyz, 0.0)).xyz;\n }\n #endif\n#endif\n gl_Position = worldViewProjection * vec4(skinnedPosition, 1.0);\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n#ifdef FIRST_PASS\n v_Normal = normalize((worldInverseTranspose * vec4(skinnedNormal, 0.0)).xyz);\n if (hasTangent) {\n v_Tangent = normalize((worldInverseTranspose * vec4(skinnedTangent, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n v_WorldPosition = (world * vec4(skinnedPosition, 1.0)).xyz;\n#endif\n}\n@end\n@export clay.deferred.gbuffer1.fragment\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform float glossiness;\nvarying vec2 v_Texcoord;\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\nuniform sampler2D roughGlossMap;\nuniform bool useRoughGlossMap;\nuniform bool useRoughness;\nuniform bool doubleSided;\nuniform int roughGlossChannel: 0;\nfloat indexingTexel(in vec4 texel, in int idx) {\n if (idx == 3) return texel.a;\n else if (idx == 1) return texel.g;\n else if (idx == 2) return texel.b;\n else return texel.r;\n}\nvoid main()\n{\n vec3 N = v_Normal;\n if (doubleSided) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = eyePos - v_WorldPosition;\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n }\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_Texcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n gl_FragColor.rgb = (N + 1.0) * 0.5;\n float g = glossiness;\n if (useRoughGlossMap) {\n float g2 = indexingTexel(texture2D(roughGlossMap, v_Texcoord), roughGlossChannel);\n if (useRoughness) {\n g2 = 1.0 - g2;\n }\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n gl_FragColor.a = g + 0.005;\n}\n@end\n@export clay.deferred.gbuffer2.fragment\nuniform sampler2D diffuseMap;\nuniform sampler2D metalnessMap;\nuniform vec3 color;\nuniform float metalness;\nuniform bool useMetalnessMap;\nuniform bool linear;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvoid main ()\n{\n float m = metalness;\n if (useMetalnessMap) {\n vec4 metalnessTexel = texture2D(metalnessMap, v_Texcoord);\n m = clamp(metalnessTexel.r + (m * 2.0 - 1.0), 0.0, 1.0);\n }\n vec4 texel = texture2D(diffuseMap, v_Texcoord);\n if (linear) {\n texel = sRGBToLinear(texel);\n }\n gl_FragColor.rgb = texel.rgb * color;\n gl_FragColor.a = m + 0.005;\n}\n@end\n@export clay.deferred.gbuffer.debug\n@import clay.deferred.chunk.light_head\nuniform int debug: 0;\nvoid main ()\n{\n @import clay.deferred.chunk.gbuffer_read\n if (debug == 0) {\n gl_FragColor = vec4(N, 1.0);\n }\n else if (debug == 1) {\n gl_FragColor = vec4(vec3(z), 1.0);\n }\n else if (debug == 2) {\n gl_FragColor = vec4(position, 1.0);\n }\n else if (debug == 3) {\n gl_FragColor = vec4(vec3(glossiness), 1.0);\n }\n else if (debug == 4) {\n gl_FragColor = vec4(vec3(metalness), 1.0);\n }\n else {\n gl_FragColor = vec4(albedo, 1.0);\n }\n}\n@end"), +K.import("@export clay.deferred.chunk.light_head\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform vec2 windowSize: WINDOW_SIZE;\nuniform vec4 viewport: VIEWPORT;\nuniform mat4 viewProjectionInv;\n#ifdef DEPTH_ENCODED\n@import clay.util.decode_float\n#endif\n@end\n@export clay.deferred.chunk.gbuffer_read\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec2 uv2 = (gl_FragCoord.xy - viewport.xy) / viewport.zw;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n vec4 texel3 = texture2D(gBufferTexture3, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n float glossiness = texel1.a;\n float metalness = texel3.a;\n vec3 N = texel1.rgb * 2.0 - 1.0;\n float z = texture2D(gBufferTexture2, uv).r * 2.0 - 1.0;\n vec2 xy = uv2 * 2.0 - 1.0;\n vec4 projectedPos = vec4(xy, z, 1.0);\n vec4 p4 = viewProjectionInv * projectedPos;\n vec3 position = p4.xyz / p4.w;\n vec3 albedo = texel3.rgb;\n vec3 diffuseColor = albedo * (1.0 - metalness);\n vec3 specularColor = mix(vec3(0.04), albedo, metalness);\n@end\n@export clay.deferred.chunk.light_equation\nfloat D_Phong(in float g, in float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\nfloat D_GGX(in float g, in float ndh) {\n float r = 1.0 - g;\n float a = r * r;\n float tmp = ndh * ndh * (a - 1.0) + 1.0;\n return a / (3.1415926 * tmp * tmp);\n}\nvec3 F_Schlick(in float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\nvec3 lightEquation(\n in vec3 lightColor, in vec3 diffuseColor, in vec3 specularColor,\n in float ndl, in float ndh, in float ndv, in float g\n)\n{\n return ndl * lightColor\n * (diffuseColor + D_Phong(g, ndh) * F_Schlick(ndv, specularColor));\n}\n@end");var na=Pe.extend(function(){return{enableTargetTexture1:!0,enableTargetTexture2:!0,enableTargetTexture3:!0,renderTransparent:!1,_renderList:[],_gBufferTex1:new Pn({minFilter:lr.NEAREST,magFilter:lr.NEAREST,type:lr.HALF_FLOAT}),_gBufferTex2:new Pn({minFilter:lr.NEAREST,magFilter:lr.NEAREST,format:lr.DEPTH_STENCIL,type:lr.UNSIGNED_INT_24_8_WEBGL}),_gBufferTex3:new Pn({minFilter:lr.NEAREST,magFilter:lr.NEAREST}),_defaultNormalMap:new Pn({image:Tt("#000")}),_defaultRoughnessMap:new Pn({image:Tt("#fff")}),_defaultMetalnessMap:new Pn({image:Tt("#fff")}),_defaultDiffuseMap:new Pn({image:Tt("#fff")}),_frameBuffer:new bi,_gBufferMaterial1:new vr({shader:new K(K.source("clay.deferred.gbuffer.vertex"),K.source("clay.deferred.gbuffer1.fragment")),vertexDefines:{FIRST_PASS:null},fragmentDefines:{FIRST_PASS:null}}),_gBufferMaterial2:new vr({shader:new K(K.source("clay.deferred.gbuffer.vertex"),K.source("clay.deferred.gbuffer2.fragment"))}),_debugPass:new Mi({fragment:K.source("clay.deferred.gbuffer.debug")})}},{resize:function(t,e){this._gBufferTex1.width===t&&this._gBufferTex1.height===e||(this._gBufferTex1.width=t,this._gBufferTex1.height=e,this._gBufferTex2.width=t,this._gBufferTex2.height=e,this._gBufferTex3.width=t,this._gBufferTex3.height=e)},setViewport:function(t,e,r,n,i){var a;a="object"==typeof t?t:{x:t,y:e,width:r,height:n,devicePixelRatio:i||1},this._frameBuffer.viewport=a},getViewport:function(){return this._frameBuffer.viewport?this._frameBuffer.viewport:{x:0,y:0,width:this._gBufferTex1.width,height:this._gBufferTex1.height,devicePixelRatio:1}},update:function(t,e,r){for(var n=t.gl,i=this._frameBuffer,a=i.viewport,o=e.opaqueList,s=e.transparentList,u=0,l=this._renderList,c=0;c= shadowCascadeClipsNear[_idx_] &&\n z <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n lightShadowMap, lightMatrices[_idx_], position, lightShadowMapSize,\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n }\n }}\n gl_FragColor.rgb *= shadowContrib;\n#endif\n gl_FragColor.a = 1.0;\n}\n@end\n"),K.import("@export clay.deferred.ambient_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec2 windowSize: WINDOW_SIZE;\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo;\n gl_FragColor.a = 1.0;\n}\n@end"),K.import("@export clay.deferred.ambient_sh_light\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture3;\nuniform vec3 lightColor;\nuniform vec3 lightCoefficients[9];\nuniform vec2 windowSize: WINDOW_SIZE;\nvec3 calcAmbientSHLight(vec3 N) {\n return lightCoefficients[0]\n + lightCoefficients[1] * N.x\n + lightCoefficients[2] * N.y\n + lightCoefficients[3] * N.z\n + lightCoefficients[4] * N.x * N.z\n + lightCoefficients[5] * N.z * N.y\n + lightCoefficients[6] * N.y * N.x\n + lightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + lightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}\nvoid main()\n{\n vec2 uv = gl_FragCoord.xy / windowSize;\n vec4 texel1 = texture2D(gBufferTexture1, uv);\n if (dot(texel1.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n vec3 N = texel1.rgb * 2.0 - 1.0;\n vec3 albedo = texture2D(gBufferTexture3, uv).rgb;\n gl_FragColor.rgb = lightColor * albedo * calcAmbientSHLight(N);\n gl_FragColor.a = 1.0;\n}\n@end"),K.import("@export clay.deferred.ambient_cubemap_light\n@import clay.deferred.chunk.light_head\nuniform vec3 lightColor;\nuniform samplerCube lightCubemap;\nuniform sampler2D brdfLookup;\nuniform vec3 eyePosition;\n@import clay.util.rgbm\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 V = normalize(eyePosition - position);\n vec3 L = reflect(-V, N);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float rough = clamp(1.0 - glossiness, 0.0, 1.0);\n float bias = rough * 5.0;\n vec2 brdfParam = texture2D(brdfLookup, vec2(rough, ndv)).xy;\n vec3 envWeight = specularColor * brdfParam.x + brdfParam.y;\n vec3 envTexel = RGBMDecode(textureCubeLodEXT(lightCubemap, L, bias), 51.5);\n gl_FragColor.rgb = lightColor * envTexel * envWeight;\n gl_FragColor.a = 1.0;\n}\n@end"),K.import("@export clay.deferred.point_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 eyePosition;\n#ifdef SHADOWMAP_ENABLED\nuniform samplerCube lightShadowMap;\nuniform float lightShadowMapSize;\n#endif\nvarying vec3 v_Position;\n@import clay.plugin.shadow_map_common\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n#ifdef SHADOWMAP_ENABLED\n float shadowContrib = computeShadowContribOmni(\n lightShadowMap, -L * dist, lightRange\n );\n gl_FragColor.rgb *= clamp(shadowContrib, 0.0, 1.0);\n#endif\n gl_FragColor.a = 1.0;\n}\n@end"),K.import("@export clay.deferred.sphere_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform float lightRadius;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n float dist = length(L);\n vec3 R = reflect(V, N);\n float tmp = dot(L, R);\n vec3 cToR = tmp * R - L;\n float d = length(cToR);\n L = L + cToR * clamp(lightRadius / d, 0.0, 1.0);\n L = normalize(L);\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, L), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float attenuation = lightAttenuation(dist, lightRange);\n gl_FragColor.rgb = lightColor * ndl * attenuation;\n glossiness = clamp(glossiness - lightRadius / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = attenuation * lightEquation(\n lightColor, diffuseColor, specularColor, ndl, ndh, ndv, glossiness\n );\n gl_FragColor.a = 1.0;\n}\n@end"),K.import("@export clay.deferred.tube_light\n@import clay.deferred.chunk.light_head\n@import clay.util.calculate_attenuation\n@import clay.deferred.chunk.light_equation\nuniform vec3 lightPosition;\nuniform vec3 lightColor;\nuniform float lightRange;\nuniform vec3 lightExtend;\nuniform vec3 eyePosition;\nvarying vec3 v_Position;\nvoid main()\n{\n @import clay.deferred.chunk.gbuffer_read\n vec3 L = lightPosition - position;\n vec3 V = normalize(eyePosition - position);\n vec3 R = reflect(V, N);\n vec3 L0 = lightPosition - lightExtend - position;\n vec3 L1 = lightPosition + lightExtend - position;\n vec3 LD = L1 - L0;\n float len0 = length(L0);\n float len1 = length(L1);\n float irra = 2.0 * clamp(dot(N, L0) / (2.0 * len0) + dot(N, L1) / (2.0 * len1), 0.0, 1.0);\n float LDDotR = dot(R, LD);\n float t = (LDDotR * dot(R, L0) - dot(L0, LD)) / (dot(LD, LD) - LDDotR * LDDotR);\n t = clamp(t, 0.0, 1.0);\n L = L0 + t * LD;\n float dist = length(L);\n L /= dist;\n vec3 H = normalize(L + V);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n glossiness = clamp(glossiness - 0.0 / 2.0 / dist, 0.0, 1.0);\n gl_FragColor.rgb = lightColor * irra * lightAttenuation(dist, lightRange)\n * (diffuseColor + D_Phong(glossiness, ndh) * F_Schlick(ndv, specularColor));\n gl_FragColor.a = 1.0;\n}\n@end"),K.import(kr);var ia=Pe.extend(function(){var t=K.source("clay.compositor.vertex"),e=K.source("clay.deferred.light_volume.vertex"),r=new K(t,K.source("clay.deferred.directional_light")),n=function(t){t.blendEquation(t.FUNC_ADD),t.blendFunc(t.ONE,t.ONE)},i=function(t){return new vr({shader:t,blend:n,transparent:!0,depthMask:!1})},a=function(t){return new K(e,K.source("clay.deferred."+t))},o=new ea({capSegments:10}),s=new ar;s.rotateX(Math.PI/2).translate(new Xe(0,-1,0)),o.applyTransform(s);var u=new ra({capSegments:10});return s.identity().rotateZ(Math.PI/2),u.applyTransform(s),{shadowMapPass:null,autoResize:!0,_createLightPassMat:i,_gBuffer:new na,_lightAccumFrameBuffer:new bi({depthBuffer:!1}),_lightAccumTex:new Pn({type:lr.HALF_FLOAT,minFilter:lr.NEAREST,magFilter:lr.NEAREST}),_fullQuadPass:new Mi({blendWithPrevious:!0}),_directionalLightMat:i(r),_ambientMat:i(new K(t,K.source("clay.deferred.ambient_light"))),_ambientSHMat:i(new K(t,K.source("clay.deferred.ambient_sh_light"))),_ambientCubemapMat:i(new K(t,K.source("clay.deferred.ambient_cubemap_light"))),_spotLightShader:a("spot_light"),_pointLightShader:a("point_light"),_sphereLightShader:a("sphere_light"),_tubeLightShader:a("tube_light"),_lightSphereGeo:new Cn({widthSegments:10,heightSegements:10}),_lightConeGeo:o,_lightCylinderGeo:u,_outputPass:new Mi({fragment:K.source("clay.compositor.output")})}},{render:function(t,e,r,n){n=n||{},n.renderToTarget=n.renderToTarget||!1,n.notUpdateShadow=n.notUpdateShadow||!1,n.notUpdateScene=n.notUpdateScene||!1,n.notUpdateScene||e.update(!1,!0),r.update(!0);var i=t.getDevicePixelRatio();!this.autoResize||t.getWidth()*i===this._lightAccumTex.width&&t.getHeight()*i===this._lightAccumTex.height||this.resize(t.getWidth()*i,t.getHeight()*i),this._gBuffer.update(t,e,r),this._accumulateLightBuffer(t,e,r,!n.notUpdateShadow),n.renderToTarget||(this._outputPass.setUniform("texture",this._lightAccumTex),this._outputPass.render(t))},getTargetTexture:function(){return this._lightAccumTex},getTargetFrameBuffer:function(){return this._lightAccumFrameBuffer},getGBuffer:function(){return this._gBuffer},setViewport:function(t,e,r,n,i){this._gBuffer.setViewport(t,e,r,n,i),this._lightAccumFrameBuffer.viewport=this._gBuffer.getViewport()},resize:function(t,e){this._lightAccumTex.width=t,this._lightAccumTex.height=e,this._gBuffer.resize(t,e)},_accumulateLightBuffer:function(t,e,r,n){for(var i=t.gl,a=this._lightAccumTex,o=this._lightAccumFrameBuffer,s=r.getWorldPosition().array,u=0;u=0){var l="touchend"!=u?i.targetTouches[0]:i.changedTouches[0];"touchstart"===u?u="mousedown":"touchend"===u?u="mouseup":"touchmove"===u&&(u="mousemove"),a=l.clientX-s.left,o=l.clientY-s.top}else a=i.clientX-s.left,o=i.clientY-s.top;var c,h=t.pick(a,o);if("DOMMouseScroll"!==u&&"mousewheel"!==u||(c=i.wheelDelta?i.wheelDelta/120:-(i.detail||0)/3),h){if(h.target.silent)return;if("mousemove"===u){var f=h.target!==r;f&&r&&Pt(r,Lt("mouseout",{target:r},a,o)),Pt(h.target,Lt("mousemove",h,a,o)),f&&Pt(h.target,Lt("mouseover",h,a,o))}else Pt(h.target,Lt(u,h,a,o,c));r=h.target}else r&&(Pt(r,Lt("mouseout",{target:r},a,o)),r=null)}})},this)},Mt.prototype._updateGraphicOptions=function(t,e,r){for(var n,i=!!t.tonemapping,a=!!t.linear,o=0;o0,l=e.color;e.depth=0,u&&va.set(l,0,0,0,0);for(var c=!0,h=1/n,f=0;f-g&&m-g&&p-g&&_0){var _=f[0],b=(_[0]+1)*u,A=(1-_[1])*l;e.fillStyle=p,"rectangle"===T?e.fillRect(b-E,A-E,x,x):"circle"===T&&(e.beginPath(),e.arc(b,A,E,0,2*Math.PI),e.fill())}}}e.restore()},dispose:function(){this._triangles.clear(),this._lines.clear(),this._points.clear(),this._primitives=[],this.ctx=null,this.canvas=null}}),Ea=Pe.extend(function(){return{name:"",inputLinks:{},outputLinks:{},_prevOutputTextures:{},_outputTextures:{},_outputReferences:{},_rendering:!1,_rendered:!1,_compositor:null}},{updateParameter:function(t,e){var r=this.outputs[t],n=r.parameters,i=r._parametersCopy;if(i||(i=r._parametersCopy={}),n)for(var a in n)"width"!==a&&"height"!==a&&(i[a]=n[a]);var o,s;return o=n.width instanceof Function?n.width.call(this,e):n.width,s=n.height instanceof Function?n.height.call(this,e):n.height,i.width===o&&i.height===s||this._outputTextures[t]&&this._outputTextures[t].dispose(e.gl),i.width=o,i.height=s,i},setParameter:function(t,e){},getParameter:function(t){},setParameters:function(t){for(var e in t)this.setParameter(e,t[e])},render:function(){},getOutput:function(t,e){if(null==e)return e=t,this._outputTextures[e];var r=this.outputs[e];if(r)return this._rendered?r.outputLastFrame?this._prevOutputTextures[e]:this._outputTextures[e]:this._rendering?(this._prevOutputTextures[e]||(this._prevOutputTextures[e]=this._compositor.allocateTexture(r.parameters||{})),this._prevOutputTextures[e]):(this.render(t),this._outputTextures[e])},removeReference:function(t){if(0===--this._outputReferences[t]){this.outputs[t].keepLastFrame?(this._prevOutputTextures[t]&&this._compositor.releaseTexture(this._prevOutputTextures[t]),this._prevOutputTextures[t]=this._outputTextures[t]):this._compositor.releaseTexture(this._outputTextures[t])}},link:function(t,e,r){this.inputLinks[t]={node:e,pin:r},e.outputLinks[r]||(e.outputLinks[r]=[]),e.outputLinks[r].push({node:this,pin:t}),this.pass.material.enableTexture(t)},clear:function(){this.inputLinks={},this.outputLinks={}},updateReference:function(t){if(!this._rendering){this._rendering=!0;for(var e in this.inputLinks){var r=this.inputLinks[e];r.node.updateReference(r.pin)}this._rendering=!1}t&&this._outputReferences[t]++},beforeFrame:function(){this._rendered=!1;for(var t in this.outputLinks)this._outputReferences[t]=0},afterFrame:function(){for(var t in this.outputLinks)if(this._outputReferences[t]>0){var e=this.outputs[t];e.keepLastFrame?(this._prevOutputTextures[t]&&this._compositor.releaseTexture(this._prevOutputTextures[t]),this._prevOutputTextures[t]=this._outputTextures[t]):this._compositor.releaseTexture(this._outputTextures[t])}}}),ba=Pe.extend(function(){return{nodes:[]}},{dirty:function(){this._dirty=!0},addNode:function(t){this.nodes.indexOf(t)>=0||(this.nodes.push(t),this._dirty=!0)},removeNode:function(t){"string"==typeof t&&(t=this.getNodeByName(t));var e=this.nodes.indexOf(t);e>=0&&(this.nodes.splice(e,1),this._dirty=!0)},getNodeByName:function(t){for(var e=0;e=e.COLOR_ATTACHMENT0&&u<=e.COLOR_ATTACHMENT0+8&&c.push(u);l.drawBuffersEXT(c)}t.saveClear(),t.clearBit=He.DEPTH_BUFFER_BIT|He.COLOR_BUFFER_BIT,r=t.render(this.scene,this.camera,!this.autoUpdateScene,this.preZ),t.restoreClear(),n.unbind(t)}else r=t.render(this.scene,this.camera,!this.autoUpdateScene,this.preZ);this.trigger("afterrender",r),this._rendering=!1,this._rendered=!0}}),wa=Ea.extend(function(){return{texture:null,outputs:{color:{}}}},function(){},{getOutput:function(t,e){return this.texture},beforeFrame:function(){},afterFrame:function(){}}),Ma=Ea.extend(function(){return{name:"",inputs:{},outputs:null,shader:"",inputLinks:{},outputLinks:{},pass:null,_prevOutputTextures:{},_outputTextures:{},_outputReferences:{},_rendering:!1,_rendered:!1,_compositor:null}},function(){var t=new Mi({fragment:this.shader});this.pass=t},{render:function(t,e){this.trigger("beforerender",t),this._rendering=!0;var r=t.gl;for(var n in this.inputLinks){var i=this.inputLinks[n],a=i.node.getOutput(t,i.pin);this.pass.setUniform(n,a)}if(this.outputs){this.pass.outputs={};var o={};for(var s in this.outputs){var u=this.updateParameter(s,t);isNaN(u.width)&&this.updateParameter(s,t);var l=this.outputs[s],c=this._compositor.allocateTexture(u);this._outputTextures[s]=c;var h=l.attachment||r.COLOR_ATTACHMENT0;"string"==typeof h&&(h=r[h]),o[h]=c}this._compositor.getFrameBuffer().bind(t);for(var h in o)this._compositor.getFrameBuffer().attach(o[h],h);this.pass.render(t),this._compositor.getFrameBuffer().updateMipmap(t.gl)}else this.pass.outputs=null,this._compositor.getFrameBuffer().unbind(t),this.pass.render(t,e);for(var n in this.inputLinks){var i=this.inputLinks[n];i.node.removeReference(i.pin)}this._rendering=!1,this._rendered=!0,this.trigger("afterrender",t)},updateParameter:function(t,e){var r=this.outputs[t],n=r.parameters,i=r._parametersCopy;if(i||(i=r._parametersCopy={}),n)for(var a in n)"width"!==a&&"height"!==a&&(i[a]=n[a]);var o,s;return o=n.width instanceof Function?n.width.call(this,e):n.width,s=n.height instanceof Function?n.height.call(this,e):n.height,i.width===o&&i.height===s||this._outputTextures[t]&&this._outputTextures[t].dispose(e),i.width=o,i.height=s,i},setParameter:function(t,e){this.pass.setUniform(t,e)},getParameter:function(t){return this.pass.getUniform(t)},setParameters:function(t){for(var e in t)this.setParameter(e,t[e])},define:function(t,e){this.pass.material.define("fragment",t,e)},undefine:function(t){this.pass.material.undefine("fragment",t)},removeReference:function(t){if(0===--this._outputReferences[t]){this.outputs[t].keepLastFrame?(this._prevOutputTextures[t]&&this._compositor.releaseTexture(this._prevOutputTextures[t]),this._prevOutputTextures[t]=this._outputTextures[t]):this._compositor.releaseTexture(this._outputTextures[t])}},clear:function(){Ea.prototype.clear.call(this),this.pass.material.disableTexturesAll()}}),Ca=/^#source\((.*?)\)/,Na=$r.extend({range:100,radius:5},{type:"SPHERE_LIGHT",uniformTemplates:{sphereLightPosition:{type:"3f",value:function(t){return t.getWorldPosition().array}},sphereLightRange:{type:"1f",value:function(t){return t.range}},sphereLightRadius:{type:"1f",value:function(t){return t.radius}},sphereLightColor:{type:"3f",value:function(t){var e=t.color,r=t.intensity;return[e[0]*r,e[1]*r,e[2]*r]}}}}),Ra=$r.extend({range:100,length:10},{type:"TUBE_LIGHT",uniformTemplates:{tubeLightPosition:{type:"3f",value:function(t){return t.getWorldPosition().array}},tubeLightExtend:{type:"3f",value:function(){var t=new Xe;return function(e){return t.copy(e.worldTransform.x).normalize().scale(e.length/2).array}}()},tubeLightRange:{type:"1f",value:function(t){return t.range}},tubeLightColor:{type:"3f",value:function(t){var e=t.color,r=t.intensity;return[e[0]*r,e[1]*r,e[2]*r]}}}}),La=Pe.extend({rootPath:"",textureRootPath:"",shaderRootPath:"",scene:null,camera:null},{load:function(t){var e=this;this.rootPath||(this.rootPath=t.slice(0,t.lastIndexOf("/"))),Yn.get({url:t,onprogress:function(t,r,n){e.trigger("progress",t,r,n)},onerror:function(t){e.trigger("error",t)},responseType:"text",onload:function(t){qt(JSON.parse(t),{textureRootPath:this.textureRootPath||this.rootPath,camera:this.camera,scene:this.scene})}})}}),Pa=pe.mat2,Da=function(){this.array=Pa.create(),this._dirty=!0};Da.prototype={constructor:Da,setArray:function(t){for(var e=0;e0&&Qa.scaleAndAdd(t.array,t.array,this.force.array,n/r)}});K.import("@export clay.particle.vertex\nuniform mat4 worldView : WORLDVIEW;\nuniform mat4 projection : PROJECTION;\nattribute vec3 position : POSITION;\nattribute vec3 normal : NORMAL;\n#ifdef UV_ANIMATION\nattribute vec2 texcoord0 : TEXCOORD_0;\nattribute vec2 texcoord1 : TEXCOORD_1;\nvarying vec2 v_Uv0;\nvarying vec2 v_Uv1;\n#endif\nvarying float v_Age;\nvoid main() {\n v_Age = normal.x;\n float rotation = normal.y;\n vec4 worldViewPosition = worldView * vec4(position, 1.0);\n gl_Position = projection * worldViewPosition;\n float w = gl_Position.w;\n gl_PointSize = normal.z * projection[0].x / w;\n #ifdef UV_ANIMATION\n v_Uv0 = texcoord0;\n v_Uv1 = texcoord1;\n #endif\n}\n@end\n@export clay.particle.fragment\nuniform sampler2D sprite;\nuniform sampler2D gradient;\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\nvarying float v_Age;\n#ifdef UV_ANIMATION\nvarying vec2 v_Uv0;\nvarying vec2 v_Uv1;\n#endif\nvoid main() {\n vec4 color = vec4(color, alpha);\n #ifdef SPRITE_ENABLED\n #ifdef UV_ANIMATION\n color *= texture2D(sprite, mix(v_Uv0, v_Uv1, gl_PointCoord));\n #else\n color *= texture2D(sprite, gl_PointCoord);\n #endif\n #endif\n #ifdef GRADIENT_ENABLED\n color *= texture2D(gradient, vec2(v_Age, 0.5));\n #endif\n gl_FragColor = color;\n}\n@end");var to=new K(K.source("clay.particle.vertex"),K.source("clay.particle.fragment")),eo=zn.extend({loop:!0,oneshot:!1,duration:1,spriteAnimationTileX:1,spriteAnimationTileY:1,spriteAnimationRepeat:0,mode:zn.POINTS,ignorePicking:!0,_elapsedTime:0,_emitting:!0},function(){this.geometry=new An({dynamic:!0}),this.material||(this.material=new vr({shader:to,transparent:!0,depthMask:!1}),this.material.enableTexture("sprite")),this._particles=[],this._fields=[],this._emitters=[]},{culling:!1,frustumCulling:!1,castShadow:!1,receiveShadow:!1,addEmitter:function(t){this._emitters.push(t)},removeEmitter:function(t){this._emitters.splice(this._emitters.indexOf(t),1)},addField:function(t){this._fields.push(t)},removeField:function(t){this._fields.splice(this._fields.indexOf(t),1)},reset:function(){for(var t=0;t=i.life?(i.emitter.kill(i),e[r]=e[n-1],e.pop(),n--):r++}for(var r=0;r0)for(var a=0;a1,o=t.attributes.position.value,s=t.attributes.normal.value,u=t.attributes.texcoord0.value,l=t.attributes.texcoord1.value,c=this._particles.length;o&&o.length===3*c||(o=t.attributes.position.value=new Float32Array(3*c),s=t.attributes.normal.value=new Float32Array(3*c),a&&(u=t.attributes.texcoord0.value=new Float32Array(2*c),l=t.attributes.texcoord1.value=new Float32Array(2*c)));for(var h=1/e,f=0;fthis.duration&&!this.loop},dispose:function(t){for(var e=0;e1&&n&&n.length>1){var a=re(n)/re(i);!isFinite(a)&&(a=1),e.pinchScale=a;var o=ne(n);return e.pinchX=o[0],e.pinchY=o[1],{type:"pinch",target:t[0].target,event:e}}}}},oo=[[0,0],[0,1],[1,1],[1,0]],so=[0,1,2,2,3,0],uo=Xn.extend({camera:null,plane:null,maxGrid:0,frustumCulling:!1},function(){var t=this.geometry=new An({dynamic:!0});t.attributes.position.init(6),t.attributes.normal.init(6),t.attributes.texcoord0.init(6),t.indices=new Uint16Array(6),this.plane=new nn},{updateGeometry:function(){var t=this._unProjectGrid();if(t){for(var e=this.geometry.attributes.position,r=this.geometry.attributes.normal,n=this.geometry.attributes.texcoord0,i=this.geometry.indices,a=0;a<6;a++){var o=so[a];e.set(a,t[o].array),r.set(a,this.plane.normal.array),n.set(a,oo[o]),i[a]=a}this.geometry.dirty()}},_unProjectGrid:function(){for(var t=new nn,e=[0,1,0,2,1,3,2,3,4,5,4,6,5,7,6,7,0,4,1,5,2,6,3,7],r=new Xe,n=new Xe,i=[],a=[],o=0;o<4;o++)a[o]=new Xe(0,0);var s=new dn;return function(){t.copy(this.plane),t.applyTransform(this.camera.viewMatrix);for(var o=this.camera.frustum.vertices,u=0,l=0;l<12;l++){r.array=o[e[2*l]],n.array=o[e[2*l+1]];var c=t.intersectLine(r,n,i[u]);c&&(i[u]||(i[u]=c),u++)}if(0!==u){for(var l=0;l0},update:function(t){if(t=t||16,this._rotating){var e=("cw"===this.autoRotateDirection?1:-1)*this.autoRotateSpeed/180*Math.PI;this._phi-=e*t/1e3,this._needsUpdate=!0}else this._rotateVelocity.len()>0&&(this._needsUpdate=!0);(Math.abs(this._zoomSpeed)>.01||this._panVelocity.len()>0)&&(this._needsUpdate=!0),this._needsUpdate&&(this._updateDistance(Math.min(t,50)),this._updatePan(Math.min(t,50)),this._updateRotate(Math.min(t,50)),this._updateTransform(),this.target.update(),this.trigger("update"),this._needsUpdate=!1)},_updateRotate:function(t){var e=this._rotateVelocity;this._phi=e.y*t/20+this._phi,this._theta=e.x*t/20+this._theta,this.setAlpha(this.getAlpha()),this.setBeta(this.getBeta()),this._vectorDamping(e,this.damping)},_updateDistance:function(t){this._setDistance(this._distance+this._zoomSpeed*t/20),this._zoomSpeed*=this.damping},_setDistance:function(t){this._distance=Math.max(Math.min(t,this.maxDistance),this.minDistance)},_updatePan:function(t){var e=this._panVelocity,r=this._distance,n=this.target,i=n.worldTransform.y,a=n.worldTransform.x;this._center.scaleAndAdd(a,-e.x*r/200).scaleAndAdd(i,-e.y*r/200),this._vectorDamping(e,0)},_updateTransform:function(){var t=this.target,e=new Xe,r=this._theta+Math.PI/2,n=this._phi+Math.PI/2,i=Math.sin(r);e.x=i*Math.cos(n),e.y=-Math.cos(r),e.z=i*Math.sin(n),t.position.copy(this._center).scaleAndAdd(e,this._distance),t.rotation.identity().rotateY(-this._phi).rotateX(-this._theta)},_startCountingStill:function(){clearTimeout(this._stillTimeout);var t=this.autoRotateAfterStill,e=this;!isNaN(t)&&t>0&&(this._stillTimeout=setTimeout(function(){e._rotating=!0},1e3*t))},_vectorDamping:function(t,e){var r=t.len();r*=e,r<1e-4&&(r=0),t.normalize().scale(r)},decomposeTransform:function(){if(this.target){this.target.updateWorldTransform();var t=this.target.worldTransform.z,e=Math.asin(t.y),r=Math.atan2(t.x,t.z);this._theta=e,this._phi=-r,this.setBeta(this.getBeta()),this.setAlpha(this.getAlpha()),this._setDistance(this.target.position.dist(this._center))}},_mouseDownHandler:function(t){if(!this._isAnimating()){var e=t.clientX,r=t.clientY;if(t.targetTouches){var n=t.targetTouches[0];e=n.clientX,r=n.clientY,this._mode="rotate",this._processGesture(t,"start")}var i=this.domElement;i.addEventListener("touchmove",this._mouseMoveHandler),i.addEventListener("touchend",this._mouseUpHandler),i.addEventListener("mousemove",this._mouseMoveHandler),i.addEventListener("mouseup",this._mouseUpHandler),0===t.button?this._mode="rotate":1===t.button&&(this._mode="pan"),this._rotateVelocity.set(0,0),this._rotating=!1,this.autoRotate&&this._startCountingStill(),this._mouseX=e,this._mouseY=r}},_mouseMoveHandler:function(t){if(!this._isAnimating()){var e,r=t.clientX,n=t.clientY;if(t.targetTouches){var i=t.targetTouches[0];r=i.clientX,n=i.clientY,e=this._processGesture(t,"change")}var a=ie(this.panSensitivity),o=ie(this.rotateSensitivity);e||("rotate"===this._mode?(this._rotateVelocity.y=(r-this._mouseX)/this.domElement.clientHeight*2*o[0],this._rotateVelocity.x=(n-this._mouseY)/this.domElement.clientWidth*2*o[1]):"pan"===this._mode&&(this._panVelocity.x=(r-this._mouseX)/this.domElement.clientWidth*a[0]*400,this._panVelocity.y=(-n+this._mouseY)/this.domElement.clientHeight*a[1]*400)),this._mouseX=r,this._mouseY=n,t.preventDefault()}},_mouseWheelHandler:function(t){if(!this._isAnimating()){var e=t.wheelDelta||-t.detail;0!==e&&this._zoomHandler(t,e>0?-1:1)}},_pinchHandler:function(t){this._isAnimating()||this._zoomHandler(t,t.pinchScale>1?-.4:.4)},_zoomHandler:function(t,e){var r=Math.max(Math.min(this._distance-this.minDistance,this.maxDistance-this._distance));this._zoomSpeed=e*Math.max(r/40*this.zoomSensitivity,.2),this._rotating=!1,this.autoRotate&&"rotate"===this._mode&&this._startCountingStill(),t.preventDefault()},_mouseUpHandler:function(t){var e=this.domElement;e.removeEventListener("touchmove",this._mouseMoveHandler),e.removeEventListener("touchend",this._mouseUpHandler),e.removeEventListener("mousemove",this._mouseMoveHandler),e.removeEventListener("mouseup",this._mouseUpHandler),this._processGesture(t,"end")},_addAnimator:function(t){var e=this._animators;return e.push(t),t.done(function(){var r=e.indexOf(t);r>=0&&e.splice(r,1)}),t},_processGesture:function(t,e){var r=this._gestureMgr;"start"===e&&r.clear();var n=r.recognize(t,null,this.domElement);if("end"===e&&r.clear(),n){var i=n.type;t.gestureEvent=i,this._pinchHandler(n.event)}return n}});Object.defineProperty(lo.prototype,"autoRotate",{get:function(){return this._autoRotate},set:function(t){this._autoRotate=t,this._rotating=t}}),Object.defineProperty(lo.prototype,"target",{get:function(){return this._target},set:function(t){t&&t.target&&this.setCenter(t.target.toArray()),this._target=t,this.decomposeTransform()}});var co=An.extend({dynamic:!1}),ho=pe.mat4,fo=pe.vec3,mo={merge:function(t,e){if(t.length){var r=t[0],n=r.geometry,i=r.material,a=new An({dynamic:!1});a.boundingBox=new tr;for(var o=n.getEnabledAttributes(),s=0;s=65535?new Uint32Array(3*f):new Uint16Array(3*f);for(var _=0,g=0,v=n.isUseIndices(),y=0;y0;){for(var _=[],g=[],v=[],y=0,f=0;f=0&&-1===g[S]&&(y65535?new Uint32Array(3*R.triangles.length):new Uint16Array(3*R.triangles.length);var G=0;O=0;for(var f=0;f=0?L[S]:-1}O++}D.indices[G++]=C[b]}D.updateBoundingBox(),w.add(I)}for(var j=t.children(),f=0;f0&&(r.indices=oe(t.indices,e),n.push(r.indices.buffer)),r.attributes={};for(var i in t.attributes)if(t.attributes.hasOwnProperty(i)){var a=t.attributes[i];a&&a.value&&a.value.length>0&&(a=r.attributes[i]=ae(a,e),n.push(a.value.buffer))}return{data:r,buffers:n}},toGeometry:function(t){if(!t)return null;if(t.data&&t.buffers)return _o.toGeometry(t.data);if(!t.metadata||t.metadata.generator!==po.generator)throw new Error("[util.transferable.toGeometry] the object is not generated by util.transferable.");var e={dynamic:t.dynamic,indices:t.indices};if(t.boundingBox){var r=(new Xe).setArray(t.boundingBox.min),n=(new Xe).setArray(t.boundingBox.max);e.boundingBox=new tr(r,n)}var i={};for(var a in t.attributes)if(t.attributes.hasOwnProperty(a)){var o=t.attributes[a];i[a]=new An.Attribute(o.name,o.type,o.size,o.semantic),i[a].value=o.value}return e.attributes=i,new An(e)}};K.import("@export clay.vr.disorter.output.vertex\nattribute vec2 texcoord: TEXCOORD_0;\nattribute vec3 position: POSITION;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n v_Texcoord = texcoord;\n gl_Position = vec4(position.xy, 0.5, 1.0);\n}\n@end\n@export clay.vr.disorter.output.fragment\nuniform sampler2D texture;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n gl_FragColor = texture2D(texture, v_Texcoord);\n}\n@end");var go=Pe.extend(function(){return{clearColor:[0,0,0,1],_mesh:new Xn({geometry:new An({dynamic:!0}),culling:!1,material:new vr({depthTest:!1,shader:new K({vertex:K.source("clay.vr.disorter.output.vertex"),fragment:K.source("clay.vr.disorter.output.fragment")})})}),_fakeCamera:new jn}},{render:function(t,e){var r=this.clearColor,n=t.gl;n.clearColor(r[0],r[1],r[2],r[3]),n.clear(n.COLOR_BUFFER_BIT),n.disable(n.BLEND),this._mesh.material.set("texture",e),t.saveViewport(),t.setViewport(0,0,t.getWidth(),t.getHeight()),t.renderPass([this._mesh],this._fakeCamera),t.restoreViewport()},updateFromVRDisplay:function(t){t.deviceInfo_?this._updateMesh(20,20,t.deviceInfo_):console.warn("Cant get vrDisplay.deviceInfo_, seems code changed")},_updateMesh:function(t,e,r){var n=this._mesh.geometry.attributes.position,i=this._mesh.geometry.attributes.texcoord0;n.init(2*t*e),i.init(2*t*e);for(var a=r.getLeftEyeVisibleTanAngles(),o=r.getLeftEyeNoLensTanAngles(),s=r.getLeftEyeVisibleScreenRect(o),u=0,l=[],c=[],h=0;h<2;h++){for(var f=0;f