/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Color, Matrix, Program, Shader, Texture, TextureMatrix } from "@pixi/core"; const vertex = ` attribute vec2 aVertexPosition; attribute vec2 aTextureCoord; uniform mat3 projectionMatrix; uniform mat3 translationMatrix; uniform mat3 uTextureMatrix; varying vec2 vTextureCoord; void main(void) { gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy; } `; const fragment = ` varying vec2 vTextureCoord; uniform vec4 uColor; uniform vec4 uDarkColor; uniform sampler2D uSampler; void main(void) { vec4 texColor = texture2D(uSampler, vTextureCoord); gl_FragColor.a = texColor.a * uColor.a; gl_FragColor.rgb = ((texColor.a - 1.0) * uDarkColor.a + 1.0 - texColor.rgb) * uDarkColor.rgb + texColor.rgb * uColor.rgb; } `; export class DarkTintMaterial extends Shader { uvMatrix; batchable; pluginName; // eslint-disable-next-line @typescript-eslint/naming-convention _tintRGB; // eslint-disable-next-line @typescript-eslint/naming-convention _darkTintRGB; /** * Only do update if tint or alpha changes. * @private * @default false */ _colorDirty; _alpha; _tintColor; _darkTintColor; constructor(texture) { const uniforms = { uSampler: texture ?? Texture.EMPTY, alpha: 1, uTextureMatrix: Matrix.IDENTITY, uColor: new Float32Array([1, 1, 1, 1]), uDarkColor: new Float32Array([0, 0, 0, 0]), }; // Set defaults const options = { tint: 0xffffff, darkTint: 0x0, alpha: 1, pluginName: "darkTintBatch", }; super(Program.from(vertex, fragment), uniforms); this._colorDirty = false; this.uvMatrix = new TextureMatrix(uniforms.uSampler); this.batchable = true; this.pluginName = options.pluginName; this._tintColor = new Color(options.tint); this._darkTintColor = new Color(options.darkTint); this._tintRGB = this._tintColor.toLittleEndianNumber(); this._darkTintRGB = this._darkTintColor.toLittleEndianNumber(); this._alpha = options.alpha; this._colorDirty = true; } get texture() { return this.uniforms.uSampler; } set texture(value) { if (this.uniforms.uSampler !== value) { if (!this.uniforms.uSampler.baseTexture.alphaMode !== !value.baseTexture.alphaMode) { this._colorDirty = true; } this.uniforms.uSampler = value; this.uvMatrix.texture = value; } } set alpha(value) { if (value === this._alpha) { return; } this._alpha = value; this._colorDirty = true; } get alpha() { return this._alpha; } set tint(value) { if (value === this.tint) { return; } this._tintColor.setValue(value); this._tintRGB = this._tintColor.toLittleEndianNumber(); this._colorDirty = true; } get tint() { return this._tintColor.value; } set darkTint(value) { if (value === this.darkTint) { return; } this._darkTintColor.setValue(value); this._darkTintRGB = this._darkTintColor.toLittleEndianNumber(); this._colorDirty = true; } get darkTint() { return this._darkTintColor.value; } get tintValue() { return this._tintColor.toNumber(); } get darkTintValue() { return this._darkTintColor.toNumber(); } /** Gets called automatically by the Mesh. Intended to be overridden for custom {@link PIXI.MeshMaterial} objects. */ update() { if (this._colorDirty) { this._colorDirty = false; Color.shared.setValue(this._tintColor).premultiply(this._alpha, true).toArray(this.uniforms.uColor); Color.shared.setValue(this._darkTintColor).premultiply(this._alpha, true).premultiply(1, false).toArray(this.uniforms.uDarkColor); } if (this.uvMatrix.update()) { this.uniforms.uTextureMatrix = this.uvMatrix.mapCoord; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRNYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXJrVGludE1lc2gvRGFya1RpbnRNYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBGLE1BQU0sTUFBTSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JkLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7OztDQWFoQixDQUFDO0FBVUYsTUFBTSxPQUFPLGdCQUFpQixTQUFRLE1BQU07SUFDM0IsUUFBUSxDQUFnQjtJQUVqQyxTQUFTLENBQVU7SUFFbkIsVUFBVSxDQUFTO0lBRTFCLGdFQUFnRTtJQUN6RCxRQUFRLENBQVM7SUFDeEIsZ0VBQWdFO0lBQ3pELFlBQVksQ0FBUztJQUU1Qjs7OztPQUlHO0lBQ0ssV0FBVyxDQUFVO0lBQ3JCLE1BQU0sQ0FBUztJQUVmLFVBQVUsQ0FBUTtJQUNsQixjQUFjLENBQVE7SUFFOUIsWUFBYSxPQUFpQjtRQUM3QixNQUFNLFFBQVEsR0FBRztZQUNoQixRQUFRLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLO1lBQ2xDLEtBQUssRUFBRSxDQUFDO1lBQ1IsY0FBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQy9CLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFVBQVUsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFDLENBQUM7UUFFRixlQUFlO1FBQ2YsTUFBTSxPQUFP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Q0FBQztJQUNGLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBDb2xvclNvdXJjZSB9IGZyb20gXCJAcGl4aS9jb3JlXCI7XG5pbXBvcnQgeyBDb2xvciwgTWF0cml4LCBQcm9ncmFtLCBTaGFkZXIsIFRleHR1cmUsIFRleHR1cmVNYXRyaXggfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuXG5jb25zdCB2ZXJ0ZXggPSBgXG5hdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1xuXG51bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDtcbnVuaWZvcm0gbWF0MyB0cmFuc2xhdGlvbk1hdHJpeDtcbnVuaWZvcm0gbWF0MyB1VGV4dHVyZU1hdHJpeDtcblxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG5cbnZvaWQgbWFpbih2b2lkKVxue1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHRyYW5zbGF0aW9uTWF0cml4ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XG5cbiAgICB2VGV4dHVyZUNvb3JkID0gKHVUZXh0dXJlTWF0cml4ICogdmVjMyhhVGV4dHVyZUNvb3JkLCAxLjApKS54eTtcbn1cbmA7XG5cbmNvbnN0IGZyYWdtZW50ID0gYFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG51bmlmb3JtIHZlYzQgdUNvbG9yO1xudW5pZm9ybSB2ZWM0IHVEYXJrQ29sb3I7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xuXG52b2lkIG1haW4odm9pZClcbntcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XG4gICAgZ2xfRnJhZ0NvbG9yLmEgPSB0ZXhDb2xvci5hICogdUNvbG9yLmE7XG4gICAgZ2xfRnJhZ0NvbG9yLnJnYiA9ICgodGV4Q29sb3IuYSAtIDEuMCkgKiB1RGFya0NvbG9yLmEgKyAxLjAgLSB0ZXhDb2xvci5yZ2IpICogdURhcmtDb2xvci5yZ2IgKyB0ZXhDb2xvci5yZ2IgKiB1Q29sb3IucmdiO1xufVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBJRGFya1RpbnRNYXRlcmlhbE9wdGlvbnMge1xuXHRhbHBoYT86IG51bWJlcjtcblx0dGludD86IENvbG9yU291cmNlO1xuXHRkYXJrVGludD86IENvbG9yU291cmNlO1xuXHRwbHVnaW5OYW1lPzogc3RyaW5nO1xuXHR1bmlmb3Jtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgY2xhc3MgRGFya1RpbnRNYXRlcmlhbCBleHRlbmRzIFNoYWRlciB7XG5cdHB1YmxpYyByZWFkb25seSB1dk1hdHJpeDogVGV4dHVyZU1hdHJpeDtcblxuXHRwdWJsaWMgYmF0Y2hhYmxlOiBib29sZWFuO1xuXG5cdHB1YmxpYyBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXHRwdWJsaWMgX3RpbnRSR0I6IG51bWJlcjtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXHRwdWJsaWMgX2RhcmtUaW50UkdCOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIE9ubHkgZG8gdXBkYXRlIGlmIHRpbnQgb3IgYWxwaGEgY2hhbmdlcy5cblx0ICogQHByaXZhdGVcblx0ICogQGRlZmF1bHQgZmFsc2Vcblx0ICovXG5cdHByaXZhdGUgX2NvbG9yRGlydHk6IGJvb2xlYW47XG5cdHByaXZhdGUgX2FscGhhOiBudW1iZXI7XG5cblx0cHJpdmF0ZSBfdGludENvbG9yOiBDb2xvcjtcblx0cHJpdmF0ZSBfZGFya1RpbnRDb2xvcjogQ29sb3I7XG5cblx0Y29uc3RydWN0b3IgKHRleHR1cmU/OiBUZXh0dXJlKSB7XG5cdFx0Y29uc3QgdW5pZm9ybXMgPSB7XG5cdFx0XHR1U2FtcGxlcjogdGV4dHVyZSA/PyBUZXh0dXJlLkVNUFRZLFxuXHRcdFx0YWxwaGE6IDEsXG5cdFx0XHR1VGV4dHVyZU1hdHJpeDogTWF0cml4LklERU5USVRZLFxuXHRcdFx0dUNvbG9yOiBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxLCAxXSksXG5cdFx0XHR1RGFya0NvbG9yOiBuZXcgRmxvYXQzMkFycmF5KFswLCAwLCAwLCAwXSksXG5cdFx0fTtcblxuXHRcdC8vIFNldCBkZWZhdWx0c1xuXHRcdGNvbnN0IG9wdGlvbnMgPSB7XG5cdFx0XHR0aW50OiAweGZmZmZmZixcblx0XHRcdGRhcmtUaW50OiAweDAsXG5cdFx0XHRhbHBoYTogMSxcblx0XHRcdHBsdWdpbk5hbWU6IFwiZGFya1RpbnRCYXRjaFwiLFxuXHRcdH07XG5cblx0XHRzdXBlcihQcm9ncmFtLmZyb20odmVydGV4LCBmcmFnbWVudCksIHVuaWZvcm1zKTtcblxuXHRcdHRoaXMuX2NvbG9yRGlydHkgPSBmYWxzZTtcblxuXHRcdHRoaXMudXZNYXRyaXggPSBuZXcgVGV4dHVyZU1hdHJpeCh1bmlmb3Jtcy51U2FtcGxlcik7XG5cdFx0dGhpcy5iYXRjaGFibGUgPSB0cnVlO1xuXHRcdHRoaXMucGx1Z2luTmFtZSA9IG9wdGlvbnMucGx1Z2luTmFtZTtcblxuXHRcdHRoaXMuX3RpbnRDb2xvciA9IG5ldyBDb2xvcihvcHRpb25zLnRpbnQpO1xuXHRcdHRoaXMuX2RhcmtUaW50Q29sb3IgPSBuZXcgQ29sb3Iob3B0aW9ucy5kYXJrVGludCk7XG5cdFx0dGhpcy5fdGludFJHQiA9IHRoaXMuX3RpbnRDb2xvci50b0xpdHRsZUVuZGlhbk51bWJlcigpO1xuXHRcdHRoaXMuX2RhcmtUaW50UkdCID0gdGhpcy5fZGFya1RpbnRDb2xvci50b0xpdHRsZUVuZGlhbk51bWJlcigpO1xuXHRcdHRoaXMuX2FscGhhID0gb3B0aW9ucy5hbHBoYTtcblx0XHR0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgdGV4dHVyZSAoKTogVGV4dHVyZSB7XG5cdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMudVNhbXBsZXI7XG5cdH1cblx0cHVibGljIHNldCB0ZXh0dXJlICh2YWx1ZTogVGV4dHVyZSkge1xuXHRcdGlmICh0aGlzLnVuaWZvcm1zLnVTYW1wbGVyICE9PSB2YWx1ZSkge1xuXHRcdFx0aWYgKCF0aGlzLnVuaWZvcm1zLnVTYW1wbGVyLmJhc2VUZXh0dXJlLmFscGhhTW9kZSAhPT0gIXZhbHVlLmJhc2VUZXh0dXJlLmFscGhhTW9kZSkge1xuXHRcdFx0XHR0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy51bmlmb3Jtcy51U2FtcGxlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy51dk1hdHJpeC50ZXh0dXJlID0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldCBhbHBoYSAodmFsdWU6IG51bWJlcikge1xuXHRcdGlmICh2YWx1ZSA9PT0gdGhpcy5fYWxwaGEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9hbHBoYSA9IHZhbHVlO1xuXHRcdHRoaXMuX2NvbG9yRGlydHkgPSB0cnVlO1xuXHR9XG5cdHB1YmxpYyBnZXQgYWxwaGEgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX2FscGhhO1xuXHR9XG5cblx0cHVibGljIHNldCB0aW50ICh2YWx1ZTogQ29sb3JTb3VyY2UpIHtcblx0XHRpZiAodmFsdWUgPT09IHRoaXMudGludCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3RpbnRDb2xvci5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0dGhpcy5fdGludFJHQiA9IHRoaXMuX3RpbnRDb2xvci50b0xpdHRsZUVuZGlhbk51bWJlcigpO1xuXHRcdHRoaXMuX2NvbG9yRGlydHkgPSB0cnVlO1xuXHR9XG5cdHB1YmxpYyBnZXQgdGludCAoKTogQ29sb3JTb3VyY2Uge1xuXHRcdHJldHVybiB0aGlzLl90aW50Q29sb3IudmFsdWUgYXMgQ29sb3JTb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGRhcmtUaW50ICh2YWx1ZTogQ29sb3JTb3VyY2UpIHtcblx0XHRpZiAodmFsdWUgPT09IHRoaXMuZGFya1RpbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9kYXJrVGludENvbG9yLnNldFZhbHVlKHZhbHVlKTtcblx0XHR0aGlzLl9kYXJrVGludFJHQiA9IHRoaXMuX2RhcmtUaW50Q29sb3IudG9MaXR0bGVFbmRpYW5OdW1iZXIoKTtcblx0XHR0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcblx0fVxuXHRwdWJsaWMgZ2V0IGRhcmtUaW50ICgpOiBDb2xvclNvdXJjZSB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhcmtUaW50Q29sb3IudmFsdWUgYXMgQ29sb3JTb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHRpbnRWYWx1ZSAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fdGludENvbG9yLnRvTnVtYmVyKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRhcmtUaW50VmFsdWUgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhcmtUaW50Q29sb3IudG9OdW1iZXIoKTtcblx0fVxuXG5cdC8qKiBHZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNZXNoLiBJbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGZvciBjdXN0b20ge0BsaW5rIFBJWEkuTWVzaE1hdGVyaWFsfSBvYmplY3RzLiAqL1xuXHRwdWJsaWMgdXBkYXRlICgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fY29sb3JEaXJ0eSkge1xuXHRcdFx0dGhpcy5fY29sb3JEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0Q29sb3Iuc2hhcmVkLnNldFZhbHVlKHRoaXMuX3RpbnRDb2xvcikucHJlbXVsdGlwbHkodGhpcy5fYWxwaGEsIHRydWUpLnRvQXJyYXkodGhpcy51bmlmb3Jtcy51Q29sb3IpO1xuXHRcdFx0Q29sb3Iuc2hhcmVkLnNldFZhbHVlKHRoaXMuX2RhcmtUaW50Q29sb3IpLnByZW11bHRpcGx5KHRoaXMuX2FscGhhLCB0cnVlKS5wcmVtdWx0aXBseSgxLCBmYWxzZSkudG9BcnJheSh0aGlzLnVuaWZvcm1zLnVEYXJrQ29sb3IpO1xuXHRcdH1cblx0XHRpZiAodGhpcy51dk1hdHJpeC51cGRhdGUoKSkge1xuXHRcdFx0dGhpcy51bmlmb3Jtcy51VGV4dHVyZU1hdHJpeCA9IHRoaXMudXZNYXRyaXgubWFwQ29vcmQ7XG5cdFx0fVxuXHR9XG59XG4iXX0=