Full Code of Zubnix/skia-wasm-port for AI

master 99d88b3f5d29 cached
283 files
2.0 MB
550.2k tokens
2022 symbols
1 requests
Download .txt
Showing preview only (2,198K chars total). Download the full file or copy to clipboard to get everything.
Repository: Zubnix/skia-wasm-port
Branch: master
Commit: 99d88b3f5d29
Files: 283
Total size: 2.0 MB

Directory structure:
gitextract_zz72p1x2/

├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── build_bindings.sh
├── build_skia_wasm_bitcode.sh
├── docs/
│   ├── LiberationMono-Regular-ttf
│   ├── index.html
│   ├── skia.js
│   ├── skia.wasm
│   └── webgl.js
├── example_gradient.js
├── example_star.js
├── example_text.js
├── include/
│   ├── android/
│   │   ├── SkAndroidFrameworkUtils.h
│   │   ├── SkAnimatedImage.h
│   │   ├── SkBRDAllocator.h
│   │   └── SkBitmapRegionDecoder.h
│   ├── atlastext/
│   │   ├── SkAtlasTextContext.h
│   │   ├── SkAtlasTextFont.h
│   │   ├── SkAtlasTextRenderer.h
│   │   └── SkAtlasTextTarget.h
│   ├── c/
│   │   ├── sk_canvas.h
│   │   ├── sk_data.h
│   │   ├── sk_image.h
│   │   ├── sk_maskfilter.h
│   │   ├── sk_matrix.h
│   │   ├── sk_paint.h
│   │   ├── sk_path.h
│   │   ├── sk_picture.h
│   │   ├── sk_shader.h
│   │   ├── sk_surface.h
│   │   └── sk_types.h
│   ├── codec/
│   │   ├── SkAndroidCodec.h
│   │   ├── SkCodec.h
│   │   ├── SkCodecAnimation.h
│   │   └── SkEncodedOrigin.h
│   ├── config/
│   │   └── SkUserConfig.h
│   ├── core/
│   │   ├── SkAnnotation.h
│   │   ├── SkBBHFactory.h
│   │   ├── SkBitmap.h
│   │   ├── SkBlendMode.h
│   │   ├── SkBlurTypes.h
│   │   ├── SkCanvas.h
│   │   ├── SkCanvasVirtualEnforcer.h
│   │   ├── SkClipOp.h
│   │   ├── SkColor.h
│   │   ├── SkColorFilter.h
│   │   ├── SkColorPriv.h
│   │   ├── SkColorSpace.h
│   │   ├── SkColorSpaceXform.h
│   │   ├── SkColorSpaceXformCanvas.h
│   │   ├── SkCoverageMode.h
│   │   ├── SkData.h
│   │   ├── SkDataTable.h
│   │   ├── SkDeferredDisplayListRecorder.h
│   │   ├── SkDeque.h
│   │   ├── SkDocument.h
│   │   ├── SkDrawFilter.h
│   │   ├── SkDrawLooper.h
│   │   ├── SkDrawable.h
│   │   ├── SkEncodedImageFormat.h
│   │   ├── SkExecutor.h
│   │   ├── SkFilterQuality.h
│   │   ├── SkFlattenable.h
│   │   ├── SkFont.h
│   │   ├── SkFontArguments.h
│   │   ├── SkFontLCDConfig.h
│   │   ├── SkFontStyle.h
│   │   ├── SkGraphics.h
│   │   ├── SkICC.h
│   │   ├── SkImage.h
│   │   ├── SkImageEncoder.h
│   │   ├── SkImageFilter.h
│   │   ├── SkImageGenerator.h
│   │   ├── SkImageInfo.h
│   │   ├── SkMallocPixelRef.h
│   │   ├── SkMaskFilter.h
│   │   ├── SkMath.h
│   │   ├── SkMatrix.h
│   │   ├── SkMatrix44.h
│   │   ├── SkMetaData.h
│   │   ├── SkMilestone.h
│   │   ├── SkMultiPictureDraw.h
│   │   ├── SkOverdrawCanvas.h
│   │   ├── SkPaint.h
│   │   ├── SkPath.h
│   │   ├── SkPathEffect.h
│   │   ├── SkPathMeasure.h
│   │   ├── SkPicture.h
│   │   ├── SkPictureRecorder.h
│   │   ├── SkPixelRef.h
│   │   ├── SkPixmap.h
│   │   ├── SkPngChunkReader.h
│   │   ├── SkPoint.h
│   │   ├── SkPoint3.h
│   │   ├── SkPostConfig.h
│   │   ├── SkPreConfig.h
│   │   ├── SkRRect.h
│   │   ├── SkRSXform.h
│   │   ├── SkRWBuffer.h
│   │   ├── SkRasterHandleAllocator.h
│   │   ├── SkRect.h
│   │   ├── SkRefCnt.h
│   │   ├── SkRegion.h
│   │   ├── SkScalar.h
│   │   ├── SkSerialProcs.h
│   │   ├── SkShader.h
│   │   ├── SkSize.h
│   │   ├── SkStream.h
│   │   ├── SkString.h
│   │   ├── SkStrokeRec.h
│   │   ├── SkSurface.h
│   │   ├── SkSurfaceCharacterization.h
│   │   ├── SkSurfaceProps.h
│   │   ├── SkSwizzle.h
│   │   ├── SkTLazy.h
│   │   ├── SkTextBlob.h
│   │   ├── SkTime.h
│   │   ├── SkTraceMemoryDump.h
│   │   ├── SkTypeface.h
│   │   ├── SkTypes.h
│   │   ├── SkUnPreMultiply.h
│   │   ├── SkVertices.h
│   │   └── SkYUVSizeInfo.h
│   ├── effects/
│   │   ├── Sk1DPathEffect.h
│   │   ├── Sk2DPathEffect.h
│   │   ├── SkAlphaThresholdFilter.h
│   │   ├── SkArithmeticImageFilter.h
│   │   ├── SkBlurDrawLooper.h
│   │   ├── SkBlurImageFilter.h
│   │   ├── SkBlurMaskFilter.h
│   │   ├── SkColorFilterImageFilter.h
│   │   ├── SkColorMatrix.h
│   │   ├── SkColorMatrixFilter.h
│   │   ├── SkComposeImageFilter.h
│   │   ├── SkCornerPathEffect.h
│   │   ├── SkDashPathEffect.h
│   │   ├── SkDiscretePathEffect.h
│   │   ├── SkDisplacementMapEffect.h
│   │   ├── SkDropShadowImageFilter.h
│   │   ├── SkGradientShader.h
│   │   ├── SkHighContrastFilter.h
│   │   ├── SkImageSource.h
│   │   ├── SkLayerDrawLooper.h
│   │   ├── SkLightingImageFilter.h
│   │   ├── SkLumaColorFilter.h
│   │   ├── SkMagnifierImageFilter.h
│   │   ├── SkMatrixConvolutionImageFilter.h
│   │   ├── SkMergeImageFilter.h
│   │   ├── SkMorphologyImageFilter.h
│   │   ├── SkOffsetImageFilter.h
│   │   ├── SkOverdrawColorFilter.h
│   │   ├── SkPaintFlagsDrawFilter.h
│   │   ├── SkPaintImageFilter.h
│   │   ├── SkPerlinNoiseShader.h
│   │   ├── SkPictureImageFilter.h
│   │   ├── SkShaderMaskFilter.h
│   │   ├── SkTableColorFilter.h
│   │   ├── SkTableMaskFilter.h
│   │   ├── SkTileImageFilter.h
│   │   ├── SkToSRGBColorFilter.h
│   │   ├── SkTrimPathEffect.h
│   │   └── SkXfermodeImageFilter.h
│   ├── encode/
│   │   ├── SkEncoder.h
│   │   ├── SkJpegEncoder.h
│   │   ├── SkPngEncoder.h
│   │   └── SkWebpEncoder.h
│   ├── gpu/
│   │   ├── GrBackendSemaphore.h
│   │   ├── GrBackendSurface.h
│   │   ├── GrBlend.h
│   │   ├── GrConfig.h
│   │   ├── GrContext.h
│   │   ├── GrContextOptions.h
│   │   ├── GrDriverBugWorkarounds.h
│   │   ├── GrDriverBugWorkaroundsAutogen.h
│   │   ├── GrGpuResource.h
│   │   ├── GrRenderTarget.h
│   │   ├── GrResourceKey.h
│   │   ├── GrSamplerState.h
│   │   ├── GrSurface.h
│   │   ├── GrTexture.h
│   │   ├── GrTypes.h
│   │   ├── gl/
│   │   │   ├── GrGLAssembleInterface.h
│   │   │   ├── GrGLConfig.h
│   │   │   ├── GrGLConfig_chrome.h
│   │   │   ├── GrGLExtensions.h
│   │   │   ├── GrGLFunctions.h
│   │   │   ├── GrGLInterface.h
│   │   │   └── GrGLTypes.h
│   │   ├── mock/
│   │   │   └── GrMockTypes.h
│   │   ├── mtl/
│   │   │   └── GrMtlTypes.h
│   │   └── vk/
│   │       ├── GrVkBackendContext.h
│   │       ├── GrVkDefines.h
│   │       ├── GrVkInterface.h
│   │       ├── GrVkMemoryAllocator.h
│   │       └── GrVkTypes.h
│   ├── pathops/
│   │   └── SkPathOps.h
│   ├── ports/
│   │   ├── SkFontConfigInterface.h
│   │   ├── SkFontMgr.h
│   │   ├── SkFontMgr_FontConfigInterface.h
│   │   ├── SkFontMgr_android.h
│   │   ├── SkFontMgr_directory.h
│   │   ├── SkFontMgr_empty.h
│   │   ├── SkFontMgr_fontconfig.h
│   │   ├── SkFontMgr_indirect.h
│   │   ├── SkRemotableFontMgr.h
│   │   ├── SkTypeface_mac.h
│   │   └── SkTypeface_win.h
│   ├── private/
│   │   ├── GrAuditTrail.h
│   │   ├── GrCCClipPath.h
│   │   ├── GrCCPerOpListPaths.h
│   │   ├── GrColor.h
│   │   ├── GrGLSL.h
│   │   ├── GrOpList.h
│   │   ├── GrRenderTargetProxy.h
│   │   ├── GrSharedEnums.h
│   │   ├── GrSingleOwner.h
│   │   ├── GrSurfaceProxy.h
│   │   ├── GrSurfaceProxyRef.h
│   │   ├── GrSwizzle.h
│   │   ├── GrTextureProxy.h
│   │   ├── GrTypesPriv.h
│   │   ├── GrVkTypesPriv.h
│   │   ├── SkArenaAlloc.h
│   │   ├── SkAtomics.h
│   │   ├── SkBitmaskEnum.h
│   │   ├── SkChecksum.h
│   │   ├── SkDeferredDisplayList.h
│   │   ├── SkEncodedInfo.h
│   │   ├── SkFixed.h
│   │   ├── SkFloatBits.h
│   │   ├── SkFloatingPoint.h
│   │   ├── SkFloatingPoint.h.orig
│   │   ├── SkFloatingPoint.h.rej
│   │   ├── SkImageInfoPriv.h
│   │   ├── SkLeanWindows.h
│   │   ├── SkMalloc.h
│   │   ├── SkMessageBus.h
│   │   ├── SkMutex.h
│   │   ├── SkOnce.h
│   │   ├── SkPathRef.h
│   │   ├── SkSafe32.h
│   │   ├── SkSafe_math.h
│   │   ├── SkSemaphore.h
│   │   ├── SkShadowFlags.h
│   │   ├── SkSpinlock.h
│   │   ├── SkTArray.h
│   │   ├── SkTDArray.h
│   │   ├── SkTFitsIn.h
│   │   ├── SkTHash.h
│   │   ├── SkTInternalLList.h
│   │   ├── SkTLogic.h
│   │   ├── SkTSearch.h
│   │   ├── SkTemplates.h
│   │   ├── SkThreadID.h
│   │   └── SkWeakRefCnt.h
│   ├── svg/
│   │   └── SkSVGCanvas.h
│   ├── utils/
│   │   ├── SkCamera.h
│   │   ├── SkCanvasStateUtils.h
│   │   ├── SkEventTracer.h
│   │   ├── SkFrontBufferedStream.h
│   │   ├── SkInterpolator.h
│   │   ├── SkLua.h
│   │   ├── SkLuaCanvas.h
│   │   ├── SkNWayCanvas.h
│   │   ├── SkNoDrawCanvas.h
│   │   ├── SkNullCanvas.h
│   │   ├── SkPaintFilterCanvas.h
│   │   ├── SkParse.h
│   │   ├── SkParsePath.h
│   │   ├── SkRandom.h
│   │   ├── SkShadowUtils.h
│   │   └── mac/
│   │       └── SkCGUtils.h
│   └── views/
│       ├── SkEvent.h
│       ├── SkEventSink.h
│       ├── SkKey.h
│       ├── SkTouchGesture.h
│       └── SkView.h
├── libskia.a
├── skia.h
├── skia_bindings.cpp
└── wasm_compatible_build.patch

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.a filter=lfs diff=lfs merge=lfs -text
*.bc filter=lfs diff=lfs merge=lfs -text
*.ttc filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text


================================================
FILE: .gitignore
================================================
skia_bindings.bc
.idea/
/cmake-build-debug/
/CMakeLists.txt


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2017 Erik De Rijcke

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
This project has been superseded by Google's [CanvasKit](https://skia.org/user/modules/canvaskit)

# skia-wasm-port
Port of the Skia drawing library to wasm, for use in node & browser.

[Skia](https://skia.org/) is the drawing library used by Chrome and Firefox to provide the actual rendering of web pages.

# Goal
The goal of this project is to make skia available to Javascript without the need to rely on native code.
The end result would be a library able to do fast complex 2d drawings in both node & the browser.

# State
Currently a limited set of skia functions are defined (wip), so the library is not very usable yet. You do get a
static archive that contains all llvm bitcode needed to generate the final wasm, as well as a script to generate this
llvm bitcode from Skia sources. This library will become usable as soon as enough bindings are defined.

An example is currently available under `example_star.js` that can be run with node. Running in the
browser is also possible if the png file saving is adjusted accordingly. The example exactly matches the one found
on the Skia [website](https://skia.org/user/api/skcanvas_creation).

`example_star.js` demonstrates path rendering:

![alt text](https://raw.githubusercontent.com/Zubnix/skia-wasm-port/master/out_star.png)

`example_gradient.js` demonstrates gradient shader:

![alt text](https://raw.githubusercontent.com/Zubnix/skia-wasm-port/master/out_gradient.png)

`example_text.js` demonstrates font rendering:

![alt text](https://raw.githubusercontent.com/Zubnix/skia-wasm-port/master/out_text.png)

# WebGL

Skia WASM  can also run in the browser while utilizing a WebGL accelerated back-end. This however requires
some modifications to the existing Skia code, which is expected to be implemented upstream in the future.
The provided Skia bitcode in this repository includes the needed WebGL changes. More information can be found
[here](https://bugs.chromium.org/p/skia/issues/detail?id=8041)

A WebGL port of the Skia SDL [example](https://github.com/google/skia/blob/master/example/SkiaSDLExample.cpp) can be found in `docs/webgl.js`. You can try it out [here](https://zubnix.github.io/skia-wasm-port/). If the page fails to load, try disabling any adblocker.

# Defining bindings
Bindings are defined using [Embind](https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/embind.html).
Currently defined bindings live in `skia_bindings.cpp`.

# Building Bindings
This library requires [git lfs](https://git-lfs.github.com/)

Make sure you have the emscripten sdk installed. Current code has been tested on the linux-incoming-64bit version.

Make sure you define the correct paths in `build_bindings.sh` and run `build_bindings.sh`. You should get a `skia.js` 
and a `skia.wasm` file. To test the build, simply run `example_star.js`.


# Building Skia bitcode
Clone the official Skia git repository and copy over the `build_skia_wasm_bitcode.sh` script together with the `wasm_compatible_build.patch`,
then simply execute `bash build_skia_wasm_bitcode.sh`. Make sure you define the correct paths in the build script!


================================================
FILE: build_bindings.sh
================================================
#!/usr/bin/env bash

#eg /home/john/emsdk-portable
#EMSDK="path/to/em/sdk"
EMSDK="/home/zubzub/emsdk-portable"
#eg 1.37.27
#EM_VERSION="0.0.0"
EM_VERSION="incoming"

#export EMCC_DEBUG=1

printf "Compiling bindings to bitcode\n"
${EMSDK}/emscripten/${EM_VERSION}/emcc -O3 -std=c++11 \
-Iinclude/android \
-Iinclude/atlastext \
-Iinclude/c \
-Iinclude/codec \
-Iinclude/config \
-Iinclude/core \
-Iinclude/effects \
-Iinclude/encode \
-Iinclude/gpu \
-Iinclude/gpu/gl \
-Iinclude/pathops \
-Iinclude/ports \
-Iinclude/svg \
-Iinclude/utils \
-Iinclude/views \
-Iinclude/utils/mac \
skia_bindings.cpp -o skia_bindings.bc

printf "Generating final wasm\n"
${EMSDK}/emscripten/${EM_VERSION}/emcc -O3 -std=c++11 --bind skia_bindings.bc libskia.a -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -s NO_EXIT_RUNTIME=1 -s USE_FREETYPE=1 -s USE_LIBPNG=1 -s WASM=1 -s MODULARIZE=1 -s FORCE_FILESYSTEM=0 -o skia.js

================================================
FILE: build_skia_wasm_bitcode.sh
================================================
#!/bin/bash

patch -p0 < wasm_compatible_build.patch

#eg /home/john/emsdk-portable
EMSDK="/home/zubzub/emsdk-portable"
#eg 1.37.27
EM_VERSION="incoming"

source ${EMSDK}/emsdk_env.sh

./bin/gn gen ./out/Build-wasm-Release/Release --args="cc=\"${EMSDK}/emscripten/${EM_VERSION}/emcc\" extra_cflags_cc=[\"-frtti\",\"-s\",\"USE_FREETYPE=1\"] cxx=\"${EMSDK}/emscripten/${EM_VERSION}/em++\" extra_cflags=[\"-Wno-unknown-warning-option\",\"-s\",\"USE_FREETYPE=1\",\"-s\",\"USE_LIBPNG=1\"] \
is_debug=false \
is_official_build=true \
is_component_build=false \
target_cpu=\"wasm\" \
\
skia_use_egl=true \
skia_use_vulkan=false \
skia_use_libwebp=false \
skia_use_libpng=true \
skia_use_lua=false \
skia_use_dng_sdk=false \
skia_use_fontconfig=false \
skia_use_libjpeg_turbo=false \
skia_use_libheif=false \
skia_use_expat=false \
skia_use_vulkan=false \
skia_use_freetype=true \
skia_use_icu=false \
skia_use_expat=false \
skia_use_piex=false \
skia_use_zlib=true \
\
skia_enable_gpu=true \
skia_enable_pdf=false"

ninja -k 0 -C out/Build-wasm-Release/Release


================================================
FILE: docs/index.html
================================================
<!DOCTYPE html>
<html>
<head>
    <title>WebAssembly WebGL Skia</title>
    <script src="./skia.js"></script>
    <script src="webgl.js"></script>
</head>
<body style="margin: 0; overflow: hidden;">
</body>
</html>

================================================
FILE: docs/skia.js
================================================
var Module = function(Module) {
  Module = Module || {};

var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status,toThrow){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{throw new Error("not compiled for this environment")}Module["print"]=typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null;Module["printErr"]=typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||Module["print"];Module.print=Module["print"];Module.printErr=Module["printErr"];for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;Module.printErr(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);function addFunction(func,sig){var base=0;for(var i=base;i<base+0;i++){if(!functionPointers[i]){functionPointers[i]=func;return jsCallStartIndex+i}}throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS."}var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var PAGE_SIZE=16384;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value "+TOTAL_MEMORY+", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw"Runtime error: expected the system to be little-endian!";function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_max=Math.max;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="skia.wast";var wasmBinaryFile="skia.wasm";var asmjsCodeFile="skia.temp.asm.js";if(typeof Module["locateFile"]==="function"){if(!isDataURI(wasmTextFile)){wasmTextFile=Module["locateFile"](wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=Module["locateFile"](wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=Module["locateFile"](asmjsCodeFile)}}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":{"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})},"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){Module["printErr"]("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")}var oldView=new Int8Array(oldBuffer);var newView=new Int8Array(newBuffer);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){Module["printErr"]("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){Module["printErr"]("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){Module["printErr"]("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){Module["printErr"]("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){Module["printErr"]("wasm streaming compile failed: "+reason);Module["printErr"]("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module["wasmMaxTableSize"];if(typeof WebAssembly==="object"&&typeof WebAssembly.Table==="function"){if(MAX_TABLE_SIZE!==undefined){env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,"maximum":MAX_TABLE_SIZE,"element":"anyfunc"})}else{env["table"]=new WebAssembly.Table({"initial":TABLE_SIZE,element:"anyfunc"})}}else{env["table"]=new Array(TABLE_SIZE)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();var ASM_CONSTS=[(function(){Module["SkSurfaceProps"]["Flags"]=Module["SkSurfaceProps.Flags"];delete Module["SkSurfaceProps.Flags"]}),(function(){Module["SkPath"]["FillType"]=Module["SkPath.FillType"];delete Module["SkPath.FillType"]}),(function(){Module["SkPaint"]["Style"]=Module["SkPaint.Style"];delete Module["SkPaint.Flags"]}),(function(){Module["SkShader"]["TileMode"]=Module["SkShader.TileMode"];delete Module["SkShader.TileMode"]})];function _emscripten_asm_const_i(code){return ASM_CONSTS[code]()}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+429888;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_skia_bindings_cpp()})},{func:(function(){__GLOBAL__sub_I_bind_cpp()})});var STATIC_BUMP=429888;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___cxa_allocate_exception(size){return _malloc(size)}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var key in EXCEPTIONS.infos){var ptr=+key;var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_uncaught_exception(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___lock(){}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);return-1}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can   access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")})};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var isPosixPlatform=process.platform!="win32";var fd=process.stdin.fd;if(isPosixPlatform){var usingDevice=false;try{fd=fs.openSync("/dev/stdin","r");usingDevice=true}catch(e){}}try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null)}catch(e){if(e.toString().indexOf("EOF")!=-1)bytesRead=0;else throw e}if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete parent.contents[name]}),rmdir:(function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]}),readdir:(function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0})}};var IDBFS={dbs:{},indexedDB:(function(){if(typeof indexedDB!=="undefined")return indexedDB;var ret=null;if(typeof window==="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret}),DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:(function(mount){return MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=(function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries:entries})}),getRemoteSet:(function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=(function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}catch(e){return callback(e)}}))}),loadLocalEntry:(function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach((function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={"1024":flags["O_APPEND"],"64":flags["O_CREAT"],"128":flags["O_EXCL"],"0":flags["O_RDONLY"],"2":flags["O_RDWR"],"4096":flags["O_SYNC"],"512":flags["O_TRUNC"],"1":flags["O_WRONLY"]}}),bufferFrom:(function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsForNode:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),write:(function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts["blobs"]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])}));(mount.opts["packages"]||[]).forEach((function(pack){pack["metadata"].files.forEach((function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))}))}));return root}),createNode:(function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries}),symlink:(function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=ERRNO_CODES.EEXIST)throw e}}}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module["printErr"]("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null}),isClosed:(function(stream){return stream.fd===null}),llseek:(function(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(FS.isClosed(stream)){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";var stream=FS.open(path,opts.flags,opts.mode);if(typeof data==="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto!=="undefined"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require("crypto")["randomBytes"](1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")}),createSpecialDirectories:(function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:(function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},"/proc/self/fd")}),createStandardStreams:(function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");var stdout=FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");var stderr=FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno];if(this.stack)Object.defineProperty(this,"stack",{value:(new Error).stack,writable:true})};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}),joinPath:(function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]=="/")path=path.substr(1);return path}),absolutePath:(function(relative,base){return PATH.resolve(base,relative)}),standardizePath:(function(path){return PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}}),analyzePath:(function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret}),createFolder:(function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof parent==="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current}),createFile:(function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,"w");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node}),createDevice:(function(parent,name,input,output){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return i})});return FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);return FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!=="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(Module["read"]){try{obj.contents=intArrayFromString(Module["read"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}if(!success)___setErrNo(ERRNO_CODES.EIO);return success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module["preloadPlugins"].forEach((function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return"EM_FS_"+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach((function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!=="/"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path}),doStat:(function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret}),doWritev:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall180(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get(),zero=SYSCALLS.getZero(),offset=SYSCALLS.get64();return FS.read(stream,HEAP8,buf,count,offset)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall192(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get(),prot=SYSCALLS.get(),flags=SYSCALLS.get(),fd=SYSCALLS.get(),off=SYSCALLS.get();off<<=12;var ptr;var allocated=false;if(fd===-1){ptr=_memalign(PAGE_SIZE,len);if(!ptr)return-ERRNO_CODES.ENOMEM;_memset(ptr,0,len);allocated=true}else{var info=FS.getStream(fd);if(!info)return-ERRNO_CODES.EBADF;var res=FS.mmap(info,HEAPU8,addr,len,off,prot,flags);ptr=res.ptr;allocated=res.allocated}SYSCALLS.mappings[ptr]={malloc:ptr,len:len,allocated:allocated,fd:fd,flags:flags};return ptr}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall220(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),dirp=SYSCALLS.get(),count=SYSCALLS.get();if(!stream.getdents){stream.getdents=FS.readdir(stream.path)}var pos=0;while(stream.getdents.length>0&&pos+268<=count){var id;var type;var name=stream.getdents.pop();if(name[0]==="."){id=1;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP32[dirp+pos>>2]=id;HEAP32[dirp+pos+4>>2]=stream.position;HEAP16[dirp+pos+8>>1]=268;HEAP8[dirp+pos+10>>0]=type;stringToUTF8(name,dirp+pos+11,256);pos+=268}return pos}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21524:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+'    "use strict";'+"    return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach((function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push((function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}}))}}));if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach((function(cb){cb()}))}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(wt){return!!wt}),"toWireType":(function(destructors,o){return o?trueValue:falseValue}),"argPackAdvance":8,"readValueFromPointer":(function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])}),destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}});clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}this.$$.count.value-=1;var toDelete=0===this.$$.count.value;if(toDelete){runDestructor(this)}if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register((function(){clonedHandle["delete"]()})));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return Object.create(prototype,{$$:{value:record}})}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i<signature.length;++i){args.push("a"+i)}var name="dynCall_"+signature+"_"+rawFunction;var body="return function "+name+"("+args.join(", ")+") {\n";body+="    return dynCall(rawFunction"+(args.length?", ":"")+args.join(", ")+");\n";body+="};\n";return(new Function("dynCall","rawFunction",body))(dynCall,rawFunction)}var fp;if(Module["FUNCTION_TABLE_"+signature]!==undefined){fp=Module["FUNCTION_TABLE_"+signature][rawFunction]}else if(typeof FUNCTION_TABLE!=="undefined"){fp=FUNCTION_TABLE[rawFunction]}else{var dc=Module["asm"]["dynCall_"+signature];if(dc===undefined){dc=Module["asm"]["dynCall_"+signature.replace(/f/g,"d")];if(dc===undefined){throwBindingError("No dynCall invoker for signature: "+signature)}}fp=makeDynCaller(dc)}if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,(function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])}));whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],(function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,(function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)}));var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]}))}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",(function(){}));dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]}));return[]}))}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}var destructors=[];var args=new Array(argCount);args[0]=rawConstructor;for(var i=1;i<argCount;++i){args[i]=argTypes[i]["toWireType"](destructors,arguments[i-1])}var ptr=invoker.apply(null,args);runDestructors(destructors);return argTypes[0]["fromWireType"](ptr)};return[]}));return[]}))}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]}));return[]}))}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid "this": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with "this" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError("cannot call emscripten binding method "+humanName+" on deleted object")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],(function(classType){classType=classType[0];var humanName=classType.name+"."+fieldName;var desc={get:(function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])}),enumerable:true,configurable:true};if(setter){desc.set=(function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])})}else{desc.set=(function(v){throwBindingError(humanName+" is a read-only property")})}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],(function(types){var getterReturnType=types[0];var desc={get:(function(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))}),enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=(function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)})}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]}));return[]}))}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1};case null:{return 2};case true:{return 3};case false:{return 4};default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv}),"toWireType":(function(destructors,value){return __emval_register(value)}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return(function(pointer){var heap=signed?HEAP8:HEAPU8;return this["fromWireType"](heap[pointer])});case 1:return(function(pointer){var heap=signed?HEAP16:HEAPU16;return this["fromWireType"](heap[pointer>>1])});case 2:return(function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])});default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":(function(c){return this.constructor.values[c]}),"toWireType":(function(destructors,c){return c.value}),"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,(function(){}))}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,(function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)}),argCount-1);whenDependentTypesAreResolved([],argTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]}))}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<<bitshift>>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_smart_ptr(rawType,rawPointeeType,name,sharingPolicy,getPointeeSignature,rawGetPointee,constructorSignature,rawConstructor,shareSignature,rawShare,destructorSignature,rawDestructor){name=readLatin1String(name);rawGetPointee=embind__requireFunction(getPointeeSignature,rawGetPointee);rawConstructor=embind__requireFunction(constructorSignature,rawConstructor);rawShare=embind__requireFunction(shareSignature,rawShare);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);whenDependentTypesAreResolved([rawType],[rawPointeeType],(function(pointeeType){pointeeType=pointeeType[0];var registeredPointer=new RegisteredPointer(name,pointeeType.registeredClass,false,false,true,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor);return[registeredPointer]}))}function __embind_register_std_string(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}_free(value);return a.join("")}),"toWireType":(function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}function getTAElement(ta,index){return ta[index]}function getStringElement(string,index){return string.charCodeAt(index)}var getElement;if(value instanceof Uint8Array){getElement=getTAElement}else if(value instanceof Uint8ClampedArray){getElement=getTAElement}else if(value instanceof Int8Array){getElement=getTAElement}else if(typeof value==="string"){getElement=getStringElement}else{throwBindingError("Cannot pass non-string to std::string")}var length=value.length;var ptr=_malloc(4+length);HEAPU32[ptr>>2]=length;for(var i=0;i<length;++i){var charCode=getElement(value,i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var getHeap,shift;if(charSize===2){getHeap=(function(){return HEAPU16});shift=1}else if(charSize===4){getHeap=(function(){return HEAPU32});shift=2}registerType(rawType,{name:name,"fromWireType":(function(value){var HEAP=getHeap();var length=HEAPU32[value>>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAP[start+i])}_free(value);return a.join("")}),"toWireType":(function(destructors,value){var HEAP=getHeap();var length=value.length;var ptr=_malloc(4+length*charSize);HEAPU32[ptr>>2]=length;var start=ptr+4>>shift;for(var i=0;i<length;++i){HEAP[start+i]=value.charCodeAt(i)}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":(function(){return undefined}),"toWireType":(function(destructors,o){return undefined})})}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}var DLFCN={error:null,errorMsg:null,loadedLibs:{},loadedLibNames:{}};function _dlclose(handle){if(!DLFCN.loadedLibs[handle]){DLFCN.errorMsg="Tried to dlclose() unopened handle: "+handle;return 1}else{var lib_record=DLFCN.loadedLibs[handle];if(--lib_record.refcount==0){if(lib_record.module.cleanups){lib_record.module.cleanups.forEach((function(cleanup){cleanup()}))}delete DLFCN.loadedLibNames[lib_record.name];delete DLFCN.loadedLibs[handle]}return 0}}var _environ=STATICTOP;STATICTOP+=16;function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=staticAlloc(TOTAL_ENV_SIZE);envPtr=staticAlloc(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]==="string"){var line=key+"="+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _dlopen(filename,flag){abort("To use dlopen, you need to use Emscripten's linking support, see https://github.com/kripken/emscripten/wiki/Linking");var searchpaths=[];if(filename===0){filename="__self__"}else{var strfilename=Pointer_stringify(filename);var isValidFile=(function(filename){var target=FS.findObject(filename);return target&&!target.isFolder&&!target.isDevice});if(isValidFile(strfilename)){filename=strfilename}else{if(ENV["LD_LIBRARY_PATH"]){searchpaths=ENV["LD_LIBRARY_PATH"].split(":")}for(var ident in searchpaths){var searchfile=PATH.join2(searchpaths[ident],strfilename);if(isValidFile(searchfile)){filename=searchfile;break}}}}if(DLFCN.loadedLibNames[filename]){var handle=DLFCN.loadedLibNames[filename];DLFCN.loadedLibs[handle].refcount++;return handle}if(filename==="__self__"){var handle=-1;var lib_module=Module}else{var target=FS.findObject(filename);if(!target||target.isFolder||target.isDevice){DLFCN.errorMsg="Could not find dynamic lib: "+filename;return 0}FS.forceLoadFile(target);var lib_module;try{var lib_data=FS.readFile(filename,{encoding:"binary"});if(!(lib_data instanceof Uint8Array))lib_data=new Uint8Array(lib_data);lib_module=loadWebAssemblyModule(lib_data)}catch(e){DLFCN.errorMsg="Could not evaluate dynamic lib: "+filename+"\n"+e;return 0}var handle=1;for(var key in DLFCN.loadedLibs){if(DLFCN.loadedLibs.hasOwnProperty(key))handle++}if(flag&256){for(var ident in lib_module){if(lib_module.hasOwnProperty(ident)){if(ident[0]=="_"){Module[ident]=lib_module[ident]}}}}}DLFCN.loadedLibs[handle]={refcount:1,name:filename,module:lib_module};DLFCN.loadedLibNames[filename]=handle;return handle}function _dlsym(handle,symbol){symbol=Pointer_stringify(symbol);if(!DLFCN.loadedLibs[handle]){DLFCN.errorMsg="Tried to dlsym() from an unopened handle: "+handle;return 0}else{var lib=DLFCN.loadedLibs[handle];symbol="_"+symbol;if(!lib.module.hasOwnProperty(symbol)){DLFCN.errorMsg='Tried to lookup unknown symbol "'+symbol+'" in dynamic lib: '+lib.name;return 0}else{var result=lib.module[symbol];if(typeof result==="function"){return addFunction(result)}return result}}}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var browserIterationFunc;if(typeof arg!=="undefined"){browserIterationFunc=(function(){Module["dynCall_vi"](func,arg)})}else{browserIterationFunc=(function(){Module["dynCall_v"](func)})}var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;if(typeof SDL==="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](message+" ("+(expected-remaining)+"/"+expected+")")}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}}),runIter:(function(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)Module.printErr("exception thrown: "+[e,e.stack]);throw e}}if(Module["postMainLoop"])Module["postMainLoop"]()})},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:(function(){if(!Module["preloadPlugins"])Module["preloadPlugins"]=[];if(Browser.initted)return;Browser.initted=true;try{new Blob;Browser.hasBlobConstructor=true}catch(e){Browser.hasBlobConstructor=false;console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Browser.BlobBuilder=typeof MozBlobBuilder!="undefined"?MozBlobBuilder:typeof WebKitBlobBuilder!="undefined"?WebKitBlobBuilder:!Browser.hasBlobConstructor?console.log("warning: no BlobBuilder"):null;Browser.URLObject=typeof window!="undefined"?window.URL?window.URL:window.webkitURL:undefined;if(!Module.noImageDecoding&&typeof Browser.URLObject==="undefined"){console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");Module.noImageDecoding=true}var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=null;if(Browser.hasBlobConstructor){try{b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}}if(!b){var bb=new Browser.BlobBuilder;bb.append((new Uint8Array(byteArray)).buffer);b=bb.getBlob()}var url=Browser.URLObject.createObjectURL(b);var img=new Image;img.onload=function img_onload(){assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Module["preloadedImages"][name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=function img_onerror(event){console.log("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;Module["preloadedAudios"][name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;Module["preloadedAudios"][name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);audio.onerror=function audio_onerror(event){if(done)return;console.log("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(function(){});canvas.exitFullscreen=canvas.exitFullscreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?(function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null)||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullscreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullscreen()}}),requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");Browser.requestFullScreen=(function(lockPointer,resizeCanvas,vrDevice){return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)});return Browser.requestFullscreen(lockPointer,resizeCanvas,vrDevice)}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),asyncLoad:(function(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";Module["readAsync"](url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(dep)addRunDependency(dep)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h<Module["forcedAspectRatio"]){w=Math.round(h*Module["forcedAspectRatio"])}else{h=Math.round(w/Module["forcedAspectRatio"])}}if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvas.parentNode&&typeof screen!="undefined"){var factor=Math.min(screen.width/w,screen.height/h);w=Math.round(w*factor);h=Math.round(h*factor)}if(Browser.resizeCanvas){if(canvas.width!=w)canvas.width=w;if(canvas.height!=h)canvas.height=h;if(typeof canvas.style!="undefined"){canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}else{if(canvas.width!=wNative)canvas.width=wNative;if(canvas.height!=hNative)canvas.height=hNative;if(typeof canvas.style!="undefined"){if(w!=wNative||h!=hNative){canvas.style.setProperty("width",w+"px","important");canvas.style.setProperty("height",h+"px","important")}else{canvas.style.removeProperty("width");canvas.style.removeProperty("height")}}}}),wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:(function(){var handle=Browser.nextWgetRequestHandle;Browser.nextWgetRequestHandle++;return handle})};var EGL={errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,stringCache:{},setErrorCode:(function(code){EGL.errorCode=code}),chooseConfig:(function(display,attribList,config,config_size,numConfigs){if(display!=62e3){EGL.setErrorCode(12296);return 0}if((!config||!config_size)&&!numConfigs){EGL.setErrorCode(12300);return 0}if(numConfigs){HEAP32[numConfigs>>2]=1}if(config&&config_size>0){HEAP32[config>>2]=62002}EGL.setErrorCode(12288);return 1})};function _eglGetCurrentDisplay(){return EGL.currentContext?62e3:0}function _eglGetProcAddress(name_){return _emscripten_GetProcAddress(name_)}function _eglQueryString(display,name){if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.setErrorCode(12288);if(EGL.stringCache[name])return EGL.stringCache[name];var ret;switch(name){case 12371:ret=allocate(intArrayFromString("Emscripten"),"i8",ALLOC_NORMAL);break;case 12372:ret=allocate(intArrayFromString("1.4 Emscripten EGL"),"i8",ALLOC_NORMAL);break;case 12373:ret=allocate(intArrayFromString(""),"i8",ALLOC_NORMAL);break;case 12429:ret=allocate(intArrayFromString("OpenGL_ES"),"i8",ALLOC_NORMAL);break;default:EGL.setErrorCode(12300);return 0}EGL.stringCache[name]=ret;return ret}var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:[],currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],programInfos:{},stringCache:{},stringiCache:{},tempFixedLengthArray:[],packAlignment:4,unpackAlignment:4,init:(function(){GL.miniTempBuffer=new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);for(var i=0;i<GL.MINI_TEMP_BUFFER_SIZE;i++){GL.miniTempBufferViews[i]=GL.miniTempBuffer.subarray(0,i+1)}for(var i=0;i<32;i++){GL.tempFixedLengthArray.push(new Array(i))}}),recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:(function(table){var ret=GL.counter++;for(var i=table.length;i<ret;i++){table[i]=null}return ret}),MINI_TEMP_BUFFER_SIZE:256,miniTempBuffer:null,miniTempBufferViews:[0],getSource:(function(shader,count,string,length){var source="";for(var i=0;i<count;++i){var frag;if(length){var len=HEAP32[length+i*4>>2];if(len<0){frag=Pointer_stringify(HEAP32[string+i*4>>2])}else{frag=Pointer_stringify(HEAP32[string+i*4>>2],len)}}else{frag=Pointer_stringify(HEAP32[string+i*4>>2])}source+=frag}return source}),createContext:(function(canvas,webGLContextAttributes){if(typeof webGLContextAttributes["majorVersion"]==="undefined"&&typeof webGLContextAttributes["minorVersion"]==="undefined"){if(typeof WebGL2RenderingContext!=="undefined")webGLContextAttributes["majorVersion"]=2;else webGLContextAttributes["majorVersion"]=1;webGLContextAttributes["minorVersion"]=0}var ctx;var errorInfo="?";function onContextCreationError(event){errorInfo=event.statusMessage||errorInfo}try{canvas.addEventListener("webglcontextcreationerror",onContextCreationError,false);try{if(webGLContextAttributes["majorVersion"]==1&&webGLContextAttributes["minorVersion"]==0){ctx=canvas.getContext("webgl",webGLContextAttributes)||canvas.getContext("experimental-webgl",webGLContextAttributes)}else if(webGLContextAttributes["majorVersion"]==2&&webGLContextAttributes["minorVersion"]==0){ctx=canvas.getContext("webgl2",webGLContextAttributes)}else{throw"Unsupported WebGL context version "+majorVersion+"."+minorVersion+"!"}}finally{canvas.removeEventListener("webglcontextcreationerror",onContextCreationError,false)}if(!ctx)throw":("}catch(e){Module.print("Could not create canvas: "+[errorInfo,e,JSON.stringify(webGLContextAttributes)]);return 0}if(!ctx)return 0;var context=GL.registerContext(ctx,webGLContextAttributes);return context}),registerContext:(function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes["majorVersion"],GLctx:ctx};function getChromeVersion(){var raw=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);return raw?parseInt(raw[2],10):false}context.supportsWebGL2EntryPoints=context.version>=2&&(getChromeVersion()===false||getChromeVersion()>=58);if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes["enableExtensionsByDefault"]==="undefined"||webGLContextAttributes["enableExtensionsByDefault"]){GL.initExtensions(context)}return handle}),makeContextCurrent:(function(contextHandle){var context=GL.contexts[contextHandle];if(!context)return false;GLctx=Module.ctx=context.GLctx;GL.currentContext=context;return true}),getContext:(function(contextHandle){return GL.contexts[contextHandle]}),deleteContext:(function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null}),initExtensions:(function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;context.maxVertexAttribs=GLctx.getParameter(GLctx.MAX_VERTEX_ATTRIBS);if(context.version<2){var instancedArraysExt=GLctx.getExtension("ANGLE_instanced_arrays");if(instancedArraysExt){GLctx["vertexAttribDivisor"]=(function(index,divisor){instancedArraysExt["vertexAttribDivisorANGLE"](index,divisor)});GLctx["drawArraysInstanced"]=(function(mode,first,count,primcount){instancedArraysExt["drawArraysInstancedANGLE"](mode,first,count,primcount)});GLctx["drawElementsInstanced"]=(function(mode,count,type,indices,primcount){instancedArraysExt["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)})}var vaoExt=GLctx.getExtension("OES_vertex_array_object");if(vaoExt){GLctx["createVertexArray"]=(function(){return vaoExt["createVertexArrayOES"]()});GLctx["deleteVertexArray"]=(function(vao){vaoExt["deleteVertexArrayOES"](vao)});GLctx["bindVertexArray"]=(function(vao){vaoExt["bindVertexArrayOES"](vao)});GLctx["isVertexArray"]=(function(vao){return vaoExt["isVertexArrayOES"](vao)})}var drawBuffersExt=GLctx.getExtension("WEBGL_draw_buffers");if(drawBuffersExt){GLctx["drawBuffers"]=(function(n,bufs){drawBuffersExt["drawBuffersWEBGL"](n,bufs)})}}GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query");var automaticallyEnabledExtensions=["OES_texture_float","OES_texture_half_float","OES_standard_derivatives","OES_vertex_array_object","WEBGL_compressed_texture_s3tc","WEBGL_depth_texture","OES_element_index_uint","EXT_texture_filter_anisotropic","ANGLE_instanced_arrays","OES_texture_float_linear","OES_texture_half_float_linear","WEBGL_compressed_texture_atc","WEBKIT_WEBGL_compressed_texture_pvrtc","WEBGL_compressed_texture_pvrtc","EXT_color_buffer_half_float","WEBGL_color_buffer_float","EXT_frag_depth","EXT_sRGB","WEBGL_draw_buffers","WEBGL_shared_resources","EXT_shader_texture_lod","EXT_color_buffer_float"];var exts=GLctx.getSupportedExtensions();if(exts&&exts.length>0){GLctx.getSupportedExtensions().forEach((function(ext){if(automaticallyEnabledExtensions.indexOf(ext)!=-1){GLctx.getExtension(ext)}}))}}),populateUniformTable:(function(program){var p=GL.programs[program];GL.programInfos[program]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1};var ptable=GL.programInfos[program];var utable=ptable.uniforms;var numUniforms=GLctx.getProgramParameter(p,GLctx.ACTIVE_UNIFORMS);for(var i=0;i<numUniforms;++i){var u=GLctx.getActiveUniform(p,i);var name=u.name;ptable.maxUniformLength=Math.max(ptable.maxUniformLength,name.length+1);if(name.indexOf("]",name.length-1)!==-1){var ls=name.lastIndexOf("[");name=name.slice(0,ls)}var loc=GLctx.getUniformLocation(p,name);if(loc!=null){var id=GL.getNewId(GL.uniforms);utable[name]=[u.size,id];GL.uniforms[id]=loc;for(var j=1;j<u.size;++j){var n=name+"["+j+"]";loc=GLctx.getUniformLocation(p,n);id=GL.getNewId(GL.uniforms);GL.uniforms[id]=loc}}}})};function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glBindAttribLocation(program,index,name){name=Pointer_stringify(name);GLctx.bindAttribLocation(GL.programs[program],index,name)}function _emscripten_glBindBuffer(target,buffer){var bufferObj=buffer?GL.buffers[buffer]:null;if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,bufferObj)}function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:null)}function _emscripten_glBindProgramARB(){Module["printErr"]("missing function: emscripten_glBindProgramARB");abort(-1)}function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,renderbuffer?GL.renderbuffers[renderbuffer]:null)}function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,texture?GL.textures[texture]:null)}function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glBufferData(target,size,data,usage){if(!data){GLctx.bufferData(target,size,usage)}else{if(GL.currentContext.supportsWebGL2EntryPoints){GLctx.bufferData(target,HEAPU8,usage,data,size);return}GLctx.bufferData(target,HEAPU8.subarray(data,data+size),usage)}}function _emscripten_glBufferSubData(target,offset,size,data){if(GL.currentContext.supportsWebGL2EntryPoints){GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _emscripten_glClear(x0){GLctx["clear"](x0)}function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _emscripten_glClearDepth(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}function _emscripten_glClientActiveTexture(){Module["printErr"]("missing function: emscripten_glClientActiveTexture");abort(-1)}function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _emscripten_glColorPointer(){Module["printErr"]("missing function: emscripten_glColorPointer");abort(-1)}function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.supportsWebGL2EntryPoints){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize);return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.supportsWebGL2EntryPoints){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize);return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;GL.programs[id]=program;return id}function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i<n;i++){var id=HEAP32[buffers+i*4>>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GL.currArrayBuffer)GL.currArrayBuffer=0;if(id==GL.currElementArrayBuffer)GL.currElementArrayBuffer=0}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i<n;++i){var id=HEAP32[framebuffers+i*4>>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteObjectARB(){Module["printErr"]("missing function: emscripten_glDeleteObjectARB");abort(-1)}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null;GL.programInfos[id]=null}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i<n;i++){var id=HEAP32[renderbuffers+i*4>>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i<n;i++){var id=HEAP32[textures+i*4>>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i<n;i++){var id=HEAP32[vaos+i*4>>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRange(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawBuffers(n,bufs){var bufArray=GL.tempFixedLengthArray[n];for(var i=0;i<n;i++){bufArray[i]=HEAP32[bufs+i*4>>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawRangeElements(mode,start,end,count,type,indices){_emscripten_glDrawElements(mode,count,type,indices)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableClientState(){Module["printErr"]("missing function: emscripten_glEnableClientState");abort(-1)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function _emscripten_glFrustum(){Module["printErr"]("missing function: emscripten_glFrustum");abort(-1)}function _emscripten_glGenBuffers(n,buffers){for(var i=0;i<n;i++){var buffer=GLctx.createBuffer();if(!buffer){GL.recordError(1282);while(i<n)HEAP32[buffers+i++*4>>2]=0;return}var id=GL.getNewId(GL.buffers);buffer.name=id;GL.buffers[id]=buffer;HEAP32[buffers+i*4>>2]=id}}function _emscripten_glGenFramebuffers(n,ids){for(var i=0;i<n;++i){var framebuffer=GLctx.createFramebuffer();if(!framebuffer){GL.recordError(1282);while(i<n)HEAP32[ids+i++*4>>2]=0;return}var id=GL.getNewId(GL.framebuffers);framebuffer.name=id;GL.framebuffers[id]=framebuffer;HEAP32[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){for(var i=0;i<n;i++){var renderbuffer=GLctx.createRenderbuffer();if(!renderbuffer){GL.recordError(1282);while(i<n)HEAP32[renderbuffers+i++*4>>2]=0;return}var id=GL.getNewId(GL.renderbuffers);renderbuffer.name=id;GL.renderbuffers[id]=renderbuffer;HEAP32[renderbuffers+i*4>>2]=id}}function _emscripten_glGenTextures(n,textures){for(var i=0;i<n;i++){var texture=GLctx.createTexture();if(!texture){GL.recordError(1282);while(i<n)HEAP32[textures+i++*4>>2]=0;return}var id=GL.getNewId(GL.textures);texture.name=id;GL.textures[id]=texture;HEAP32[textures+i*4>>2]=id}}function _emscripten_glGenVertexArrays(n,arrays){for(var i=0;i<n;i++){var vao=GLctx["createVertexArray"]();if(!vao){GL.recordError(1282);while(i<n)HEAP32[arrays+i++*4>>2]=0;return}var id=GL.getNewId(GL.vaos);vao.name=id;GL.vaos[id]=vao;HEAP32[arrays+i*4>>2]=id}}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx.getActiveAttrib(program,index);if(!info)return;if(bufSize>0&&name){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx.getActiveUniform(program,index);if(!info)return;if(bufSize>0&&name){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i<len;++i){var id=GL.shaders.indexOf(result[i]);HEAP32[shaders+i*4>>2]=id}}function _emscripten_glGetAttribLocation(program,name){program=GL.programs[program];name=Pointer_stringify(name);return GLctx.getAttribLocation(program,name)}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=="Integer"&&type!=="Integer64"){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats.length;break;case 33309:if(GLctx.canvas.GLctxObject.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions();ret=2*exts.length;break;case 33307:case 33308:if(GLctx.canvas.GLctxObject.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 35097:case 36389:case 34068:{ret=0;break};default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i<result.length;++i){switch(type){case"Integer":HEAP32[p+i*4>>2]=result[i];break;case"Float":HEAPF32[p+i*4>>2]=result[i];break;case"Boolean":HEAP8[p+i>>0]=result[i]?1:0;break;default:throw"internal glGet error, bad type: "+type}}return}else if(result instanceof WebGLBuffer||result instanceof WebGLProgram||result instanceof WebGLFramebuffer||result instanceof WebGLRenderbuffer||result instanceof WebGLQuery||result instanceof WebGLSampler||result instanceof WebGLSync||result instanceof WebGLTransformFeedback||result instanceof WebGLVertexArrayObject||result instanceof WebGLTexture){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}}switch(type){case"Integer64":tempI64=[ret>>>0,(tempDouble=ret,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[p>>2]=tempI64[0],HEAP32[p+4>>2]=tempI64[1];break;case"Integer":HEAP32[p>>2]=ret;break;case"Float":HEAPF32[p>>2]=ret;break;case"Boolean":HEAP8[p>>0]=ret?1:0;break;default:throw"internal glGet error, bad type: "+type}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,"Boolean")}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){if(GL.lastError){var error=GL.lastError;GL.lastError=0;return error}else{return GLctx.getError()}}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,"Float")}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function _emscripten_glGetInfoLogARB(){Module["printErr"]("missing function: emscripten_glGetInfoLogARB");abort(-1)}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,"Integer")}function _emscripten_glGetObjectParameterivARB(){Module["printErr"]("missing function: emscripten_glGetObjectParameterivARB");abort(-1)}function _emscripten_glGetPointerv(){Module["printErr"]("missing function: emscripten_glGetPointerv");abort(-1)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";if(maxLength>0&&infoLog){var numBytesWrittenExclNull=stringToUTF8(log,infoLog,maxLength);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}var ptable=GL.programInfos[program];if(!ptable){GL.recordError(1282);return}if(pname==35716){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){HEAP32[p>>2]=ptable.maxUniformLength}else if(pname==35722){if(ptable.maxAttributeLength==-1){program=GL.programs[program];var numAttribs=GLctx.getProgramParameter(program,GLctx.ACTIVE_ATTRIBUTES);ptable.maxAttributeLength=0;for(var i=0;i<numAttribs;++i
Download .txt
gitextract_zz72p1x2/

├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── build_bindings.sh
├── build_skia_wasm_bitcode.sh
├── docs/
│   ├── LiberationMono-Regular-ttf
│   ├── index.html
│   ├── skia.js
│   ├── skia.wasm
│   └── webgl.js
├── example_gradient.js
├── example_star.js
├── example_text.js
├── include/
│   ├── android/
│   │   ├── SkAndroidFrameworkUtils.h
│   │   ├── SkAnimatedImage.h
│   │   ├── SkBRDAllocator.h
│   │   └── SkBitmapRegionDecoder.h
│   ├── atlastext/
│   │   ├── SkAtlasTextContext.h
│   │   ├── SkAtlasTextFont.h
│   │   ├── SkAtlasTextRenderer.h
│   │   └── SkAtlasTextTarget.h
│   ├── c/
│   │   ├── sk_canvas.h
│   │   ├── sk_data.h
│   │   ├── sk_image.h
│   │   ├── sk_maskfilter.h
│   │   ├── sk_matrix.h
│   │   ├── sk_paint.h
│   │   ├── sk_path.h
│   │   ├── sk_picture.h
│   │   ├── sk_shader.h
│   │   ├── sk_surface.h
│   │   └── sk_types.h
│   ├── codec/
│   │   ├── SkAndroidCodec.h
│   │   ├── SkCodec.h
│   │   ├── SkCodecAnimation.h
│   │   └── SkEncodedOrigin.h
│   ├── config/
│   │   └── SkUserConfig.h
│   ├── core/
│   │   ├── SkAnnotation.h
│   │   ├── SkBBHFactory.h
│   │   ├── SkBitmap.h
│   │   ├── SkBlendMode.h
│   │   ├── SkBlurTypes.h
│   │   ├── SkCanvas.h
│   │   ├── SkCanvasVirtualEnforcer.h
│   │   ├── SkClipOp.h
│   │   ├── SkColor.h
│   │   ├── SkColorFilter.h
│   │   ├── SkColorPriv.h
│   │   ├── SkColorSpace.h
│   │   ├── SkColorSpaceXform.h
│   │   ├── SkColorSpaceXformCanvas.h
│   │   ├── SkCoverageMode.h
│   │   ├── SkData.h
│   │   ├── SkDataTable.h
│   │   ├── SkDeferredDisplayListRecorder.h
│   │   ├── SkDeque.h
│   │   ├── SkDocument.h
│   │   ├── SkDrawFilter.h
│   │   ├── SkDrawLooper.h
│   │   ├── SkDrawable.h
│   │   ├── SkEncodedImageFormat.h
│   │   ├── SkExecutor.h
│   │   ├── SkFilterQuality.h
│   │   ├── SkFlattenable.h
│   │   ├── SkFont.h
│   │   ├── SkFontArguments.h
│   │   ├── SkFontLCDConfig.h
│   │   ├── SkFontStyle.h
│   │   ├── SkGraphics.h
│   │   ├── SkICC.h
│   │   ├── SkImage.h
│   │   ├── SkImageEncoder.h
│   │   ├── SkImageFilter.h
│   │   ├── SkImageGenerator.h
│   │   ├── SkImageInfo.h
│   │   ├── SkMallocPixelRef.h
│   │   ├── SkMaskFilter.h
│   │   ├── SkMath.h
│   │   ├── SkMatrix.h
│   │   ├── SkMatrix44.h
│   │   ├── SkMetaData.h
│   │   ├── SkMilestone.h
│   │   ├── SkMultiPictureDraw.h
│   │   ├── SkOverdrawCanvas.h
│   │   ├── SkPaint.h
│   │   ├── SkPath.h
│   │   ├── SkPathEffect.h
│   │   ├── SkPathMeasure.h
│   │   ├── SkPicture.h
│   │   ├── SkPictureRecorder.h
│   │   ├── SkPixelRef.h
│   │   ├── SkPixmap.h
│   │   ├── SkPngChunkReader.h
│   │   ├── SkPoint.h
│   │   ├── SkPoint3.h
│   │   ├── SkPostConfig.h
│   │   ├── SkPreConfig.h
│   │   ├── SkRRect.h
│   │   ├── SkRSXform.h
│   │   ├── SkRWBuffer.h
│   │   ├── SkRasterHandleAllocator.h
│   │   ├── SkRect.h
│   │   ├── SkRefCnt.h
│   │   ├── SkRegion.h
│   │   ├── SkScalar.h
│   │   ├── SkSerialProcs.h
│   │   ├── SkShader.h
│   │   ├── SkSize.h
│   │   ├── SkStream.h
│   │   ├── SkString.h
│   │   ├── SkStrokeRec.h
│   │   ├── SkSurface.h
│   │   ├── SkSurfaceCharacterization.h
│   │   ├── SkSurfaceProps.h
│   │   ├── SkSwizzle.h
│   │   ├── SkTLazy.h
│   │   ├── SkTextBlob.h
│   │   ├── SkTime.h
│   │   ├── SkTraceMemoryDump.h
│   │   ├── SkTypeface.h
│   │   ├── SkTypes.h
│   │   ├── SkUnPreMultiply.h
│   │   ├── SkVertices.h
│   │   └── SkYUVSizeInfo.h
│   ├── effects/
│   │   ├── Sk1DPathEffect.h
│   │   ├── Sk2DPathEffect.h
│   │   ├── SkAlphaThresholdFilter.h
│   │   ├── SkArithmeticImageFilter.h
│   │   ├── SkBlurDrawLooper.h
│   │   ├── SkBlurImageFilter.h
│   │   ├── SkBlurMaskFilter.h
│   │   ├── SkColorFilterImageFilter.h
│   │   ├── SkColorMatrix.h
│   │   ├── SkColorMatrixFilter.h
│   │   ├── SkComposeImageFilter.h
│   │   ├── SkCornerPathEffect.h
│   │   ├── SkDashPathEffect.h
│   │   ├── SkDiscretePathEffect.h
│   │   ├── SkDisplacementMapEffect.h
│   │   ├── SkDropShadowImageFilter.h
│   │   ├── SkGradientShader.h
│   │   ├── SkHighContrastFilter.h
│   │   ├── SkImageSource.h
│   │   ├── SkLayerDrawLooper.h
│   │   ├── SkLightingImageFilter.h
│   │   ├── SkLumaColorFilter.h
│   │   ├── SkMagnifierImageFilter.h
│   │   ├── SkMatrixConvolutionImageFilter.h
│   │   ├── SkMergeImageFilter.h
│   │   ├── SkMorphologyImageFilter.h
│   │   ├── SkOffsetImageFilter.h
│   │   ├── SkOverdrawColorFilter.h
│   │   ├── SkPaintFlagsDrawFilter.h
│   │   ├── SkPaintImageFilter.h
│   │   ├── SkPerlinNoiseShader.h
│   │   ├── SkPictureImageFilter.h
│   │   ├── SkShaderMaskFilter.h
│   │   ├── SkTableColorFilter.h
│   │   ├── SkTableMaskFilter.h
│   │   ├── SkTileImageFilter.h
│   │   ├── SkToSRGBColorFilter.h
│   │   ├── SkTrimPathEffect.h
│   │   └── SkXfermodeImageFilter.h
│   ├── encode/
│   │   ├── SkEncoder.h
│   │   ├── SkJpegEncoder.h
│   │   ├── SkPngEncoder.h
│   │   └── SkWebpEncoder.h
│   ├── gpu/
│   │   ├── GrBackendSemaphore.h
│   │   ├── GrBackendSurface.h
│   │   ├── GrBlend.h
│   │   ├── GrConfig.h
│   │   ├── GrContext.h
│   │   ├── GrContextOptions.h
│   │   ├── GrDriverBugWorkarounds.h
│   │   ├── GrDriverBugWorkaroundsAutogen.h
│   │   ├── GrGpuResource.h
│   │   ├── GrRenderTarget.h
│   │   ├── GrResourceKey.h
│   │   ├── GrSamplerState.h
│   │   ├── GrSurface.h
│   │   ├── GrTexture.h
│   │   ├── GrTypes.h
│   │   ├── gl/
│   │   │   ├── GrGLAssembleInterface.h
│   │   │   ├── GrGLConfig.h
│   │   │   ├── GrGLConfig_chrome.h
│   │   │   ├── GrGLExtensions.h
│   │   │   ├── GrGLFunctions.h
│   │   │   ├── GrGLInterface.h
│   │   │   └── GrGLTypes.h
│   │   ├── mock/
│   │   │   └── GrMockTypes.h
│   │   ├── mtl/
│   │   │   └── GrMtlTypes.h
│   │   └── vk/
│   │       ├── GrVkBackendContext.h
│   │       ├── GrVkDefines.h
│   │       ├── GrVkInterface.h
│   │       ├── GrVkMemoryAllocator.h
│   │       └── GrVkTypes.h
│   ├── pathops/
│   │   └── SkPathOps.h
│   ├── ports/
│   │   ├── SkFontConfigInterface.h
│   │   ├── SkFontMgr.h
│   │   ├── SkFontMgr_FontConfigInterface.h
│   │   ├── SkFontMgr_android.h
│   │   ├── SkFontMgr_directory.h
│   │   ├── SkFontMgr_empty.h
│   │   ├── SkFontMgr_fontconfig.h
│   │   ├── SkFontMgr_indirect.h
│   │   ├── SkRemotableFontMgr.h
│   │   ├── SkTypeface_mac.h
│   │   └── SkTypeface_win.h
│   ├── private/
│   │   ├── GrAuditTrail.h
│   │   ├── GrCCClipPath.h
│   │   ├── GrCCPerOpListPaths.h
│   │   ├── GrColor.h
│   │   ├── GrGLSL.h
│   │   ├── GrOpList.h
│   │   ├── GrRenderTargetProxy.h
│   │   ├── GrSharedEnums.h
│   │   ├── GrSingleOwner.h
│   │   ├── GrSurfaceProxy.h
│   │   ├── GrSurfaceProxyRef.h
│   │   ├── GrSwizzle.h
│   │   ├── GrTextureProxy.h
│   │   ├── GrTypesPriv.h
│   │   ├── GrVkTypesPriv.h
│   │   ├── SkArenaAlloc.h
│   │   ├── SkAtomics.h
│   │   ├── SkBitmaskEnum.h
│   │   ├── SkChecksum.h
│   │   ├── SkDeferredDisplayList.h
│   │   ├── SkEncodedInfo.h
│   │   ├── SkFixed.h
│   │   ├── SkFloatBits.h
│   │   ├── SkFloatingPoint.h
│   │   ├── SkFloatingPoint.h.orig
│   │   ├── SkFloatingPoint.h.rej
│   │   ├── SkImageInfoPriv.h
│   │   ├── SkLeanWindows.h
│   │   ├── SkMalloc.h
│   │   ├── SkMessageBus.h
│   │   ├── SkMutex.h
│   │   ├── SkOnce.h
│   │   ├── SkPathRef.h
│   │   ├── SkSafe32.h
│   │   ├── SkSafe_math.h
│   │   ├── SkSemaphore.h
│   │   ├── SkShadowFlags.h
│   │   ├── SkSpinlock.h
│   │   ├── SkTArray.h
│   │   ├── SkTDArray.h
│   │   ├── SkTFitsIn.h
│   │   ├── SkTHash.h
│   │   ├── SkTInternalLList.h
│   │   ├── SkTLogic.h
│   │   ├── SkTSearch.h
│   │   ├── SkTemplates.h
│   │   ├── SkThreadID.h
│   │   └── SkWeakRefCnt.h
│   ├── svg/
│   │   └── SkSVGCanvas.h
│   ├── utils/
│   │   ├── SkCamera.h
│   │   ├── SkCanvasStateUtils.h
│   │   ├── SkEventTracer.h
│   │   ├── SkFrontBufferedStream.h
│   │   ├── SkInterpolator.h
│   │   ├── SkLua.h
│   │   ├── SkLuaCanvas.h
│   │   ├── SkNWayCanvas.h
│   │   ├── SkNoDrawCanvas.h
│   │   ├── SkNullCanvas.h
│   │   ├── SkPaintFilterCanvas.h
│   │   ├── SkParse.h
│   │   ├── SkParsePath.h
│   │   ├── SkRandom.h
│   │   ├── SkShadowUtils.h
│   │   └── mac/
│   │       └── SkCGUtils.h
│   └── views/
│       ├── SkEvent.h
│       ├── SkEventSink.h
│       ├── SkKey.h
│       ├── SkTouchGesture.h
│       └── SkView.h
├── libskia.a
├── skia.h
├── skia_bindings.cpp
└── wasm_compatible_build.patch
Download .txt
SYMBOL INDEX (2022 symbols across 240 files)

FILE: docs/skia.js
  function staticAlloc (line 4) | function staticAlloc(size){assert(!staticSealed);var ret=STATICTOP;STATI...
  function dynamicAlloc (line 4) | function dynamicAlloc(size){assert(DYNAMICTOP_PTR);var ret=HEAP32[DYNAMI...
  function alignMemory (line 4) | function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=...
  function getNativeTypeSize (line 4) | function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1...
  function warnOnce (line 4) | function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnc...
  function addFunction (line 4) | function addFunction(func,sig){var base=0;for(var i=base;i<base+0;i++){i...
  function assert (line 4) | function assert(condition,text){if(!condition){abort("Assertion failed: ...
  function setValue (line 4) | function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(...
  function allocate (line 4) | function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof ...
  function Pointer_stringify (line 4) | function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var ...
  function UTF8ArrayToString (line 4) | function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[end...
  function UTF8ToString (line 4) | function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}
  function stringToUTF8Array (line 4) | function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(m...
  function stringToUTF8 (line 4) | function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Arr...
  function lengthBytesUTF8 (line 4) | function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){va...
  function allocateUTF8 (line 4) | function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_mall...
  function demangle (line 4) | function demangle(func){return func}
  function demangleAll (line 4) | function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(...
  function jsStackTrace (line 4) | function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new E...
  function stackTrace (line 4) | function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"]...
  function alignUp (line 4) | function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}ret...
  function updateGlobalBuffer (line 4) | function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}
  function updateGlobalBufferViews (line 4) | function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(b...
  function abortOnCannotGrowMemory (line 4) | function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. ...
  function enlargeMemory (line 4) | function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE...
  function getTotalMemory (line 4) | function getTotalMemory(){return TOTAL_MEMORY}
  function callRuntimeCallbacks (line 4) | function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var c...
  function preRun (line 4) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
  function ensureInitRuntime (line 4) | function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitial...
  function preMain (line 4) | function preMain(){callRuntimeCallbacks(__ATMAIN__)}
  function exitRuntime (line 4) | function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}
  function postRun (line 4) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
  function addOnPreRun (line 4) | function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}
  function addOnPostRun (line 4) | function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}
  function writeArrayToMemory (line 4) | function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}
  function writeAsciiToMemory (line 4) | function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.le...
  function getUniqueRunDependency (line 4) | function getUniqueRunDependency(id){return id}
  function addRunDependency (line 4) | function addRunDependency(id){runDependencies++;if(Module["monitorRunDep...
  function removeRunDependency (line 4) | function removeRunDependency(id){runDependencies--;if(Module["monitorRun...
  function isDataURI (line 4) | function isDataURI(filename){return String.prototype.startsWith?filename...
  function integrateWasmJS (line 4) | function integrateWasmJS(){var wasmTextFile="skia.wast";var wasmBinaryFi...
  function _emscripten_asm_const_i (line 4) | function _emscripten_asm_const_i(code){return ASM_CONSTS[code]()}
  function ___cxa_allocate_exception (line 4) | function ___cxa_allocate_exception(size){return _malloc(size)}
  function ___cxa_pure_virtual (line 4) | function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function ca...
  function ___cxa_throw (line 4) | function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:pt...
  function ___cxa_uncaught_exception (line 4) | function ___cxa_uncaught_exception(){return!!__ZSt18uncaught_exceptionv....
  function ___lock (line 4) | function ___lock(){}
  function ___setErrNo (line 4) | function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module...
  function ___map_file (line 4) | function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);retur...
  function trim (line 4) | function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[sta...
  function isRealDir (line 4) | function isRealDir(p){return p!=="."&&p!==".."}
  function toAbsolute (line 4) | function toAbsolute(root){return(function(p){return PATH.join2(root,p)})}
  function done (line 4) | function done(err){if(err){if(!done.errored){done.errored=true;return ca...
  function ensureParent (line 4) | function ensureParent(path){var parts=path.split("/");var parent=root;fo...
  function base (line 4) | function base(path){var parts=path.split("/");return parts[parts.length-1]}
  function doCallback (line 4) | function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--...
  function done (line 4) | function done(err){if(err){if(!done.errored){done.errored=true;return do...
  function LazyUint8Array (line 4) | function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}
  function processData (line 4) | function processData(byteArray){function finish(byteArray){if(preFinish)...
  function finish (line 4) | function finish(){if(fail==0)onload();else onerror()}
  function finish (line 4) | function finish(){if(fail==0)onload();else onerror()}
  function ___syscall140 (line 4) | function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall145 (line 4) | function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall146 (line 4) | function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall180 (line 4) | function ___syscall180(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall192 (line 4) | function ___syscall192(which,varargs){SYSCALLS.varargs=varargs;try{var a...
  function ___syscall195 (line 4) | function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var p...
  function ___syscall197 (line 4) | function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall220 (line 4) | function ___syscall220(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall221 (line 4) | function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var s...
  function ___syscall5 (line 4) | function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pat...
  function ___syscall54 (line 4) | function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var st...
  function ___syscall6 (line 4) | function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var str...
  function ___syscall91 (line 4) | function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var ad...
  function ___unlock (line 4) | function ___unlock(){}
  function getShiftFromSize (line 4) | function getShiftFromSize(size){switch(size){case 1:return 0;case 2:retu...
  function embind_init_charCodes (line 4) | function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<...
  function readLatin1String (line 4) | function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret...
  function makeLegalFunctionName (line 4) | function makeLegalFunctionName(name){if(undefined===name){return"_unknow...
  function createNamedFunction (line 4) | function createNamedFunction(name,body){name=makeLegalFunctionName(name)...
  function extendError (line 4) | function extendError(baseErrorType,errorName){var errorClass=createNamed...
  function throwBindingError (line 4) | function throwBindingError(message){throw new BindingError(message)}
  function throwInternalError (line 4) | function throwInternalError(message){throw new InternalError(message)}
  function whenDependentTypesAreResolved (line 4) | function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeCon...
  function registerType (line 4) | function registerType(rawType,registeredInstance,options){options=option...
  function __embind_register_bool (line 4) | function __embind_register_bool(rawType,name,size,trueValue,falseValue){...
  function ClassHandle_isAliasOf (line 4) | function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle))...
  function shallowCopyInternalPointer (line 4) | function shallowCopyInternalPointer(o){return{count:o.count,deleteSchedu...
  function throwInstanceAlreadyDeleted (line 4) | function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(h...
  function ClassHandle_clone (line 4) | function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDelete...
  function runDestructor (line 4) | function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smart...
  function ClassHandle_delete (line 4) | function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDelet...
  function ClassHandle_isDeleted (line 4) | function ClassHandle_isDeleted(){return!this.$$.ptr}
  function flushPendingDeletes (line 4) | function flushPendingDeletes(){while(deletionQueue.length){var obj=delet...
  function ClassHandle_deleteLater (line 4) | function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlready...
  function init_ClassHandle (line 4) | function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHand...
  function ClassHandle (line 4) | function ClassHandle(){}
  function ensureOverloadTable (line 4) | function ensureOverloadTable(proto,methodName,humanName){if(undefined===...
  function exposePublicSymbol (line 4) | function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnPro...
  function RegisteredClass (line 4) | function RegisteredClass(name,constructor,instancePrototype,rawDestructo...
  function upcastPointer (line 4) | function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desir...
  function constNoSmartPtrRawPointerToWireType (line 4) | function constNoSmartPtrRawPointerToWireType(destructors,handle){if(hand...
  function genericPointerToWireType (line 4) | function genericPointerToWireType(destructors,handle){var ptr;if(handle=...
  function nonConstNoSmartPtrRawPointerToWireType (line 4) | function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(h...
  function simpleReadValueFromPointer (line 4) | function simpleReadValueFromPointer(pointer){return this["fromWireType"]...
  function RegisteredPointer_getPointee (line 4) | function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=th...
  function RegisteredPointer_destructor (line 4) | function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.r...
  function RegisteredPointer_deleteObject (line 4) | function RegisteredPointer_deleteObject(handle){if(handle!==null){handle...
  function downcastPointer (line 4) | function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desire...
  function getInheritedInstanceCount (line 4) | function getInheritedInstanceCount(){return Object.keys(registeredInstan...
  function getLiveInheritedInstances (line 4) | function getLiveInheritedInstances(){var rv=[];for(var k in registeredIn...
  function setDelayFunction (line 4) | function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&...
  function init_embind (line 4) | function init_embind(){Module["getInheritedInstanceCount"]=getInheritedI...
  function getBasestPointer (line 4) | function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingEr...
  function getInheritedInstance (line 4) | function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,pt...
  function makeClassHandle (line 4) | function makeClassHandle(prototype,record){if(!record.ptrType||!record.p...
  function RegisteredPointer_fromWireType (line 4) | function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPoin...
  function init_RegisteredPointer (line 4) | function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee...
  function RegisteredPointer (line 4) | function RegisteredPointer(name,registeredClass,isReference,isConst,isSm...
  function replacePublicSymbol (line 4) | function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnP...
  function embind__requireFunction (line 4) | function embind__requireFunction(signature,rawFunction){signature=readLa...
  function getTypeName (line 4) | function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin...
  function throwUnboundTypeError (line 4) | function throwUnboundTypeError(message,types){var unboundTypes=[];var se...
  function __embind_register_class (line 4) | function __embind_register_class(rawType,rawPointerType,rawConstPointerT...
  function new_ (line 4) | function new_(constructor,argumentList){if(!(constructor instanceof Func...
  function runDestructors (line 4) | function runDestructors(destructors){while(destructors.length){var ptr=d...
  function craftInvokerFunction (line 4) | function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFun...
  function heap32VectorToArray (line 4) | function heap32VectorToArray(count,firstElement){var array=[];for(var i=...
  function __embind_register_class_class_function (line 4) | function __embind_register_class_class_function(rawClassType,methodName,...
  function __embind_register_class_constructor (line 4) | function __embind_register_class_constructor(rawClassType,argCount,rawAr...
  function __embind_register_class_function (line 4) | function __embind_register_class_function(rawClassType,methodName,argCou...
  function validateThis (line 4) | function validateThis(this_,classType,humanName){if(!(this_ instanceof O...
  function __embind_register_class_property (line 4) | function __embind_register_class_property(classType,fieldName,getterRetu...
  function __emval_decref (line 4) | function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[ha...
  function count_emval_handles (line 4) | function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_ar...
  function get_first_emval (line 4) | function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){...
  function init_emval (line 4) | function init_emval(){Module["count_emval_handles"]=count_emval_handles;...
  function __emval_register (line 4) | function __emval_register(value){switch(value){case undefined:{return 1}...
  function __embind_register_emval (line 4) | function __embind_register_emval(rawType,name){name=readLatin1String(nam...
  function enumReadValueFromPointer (line 4) | function enumReadValueFromPointer(name,shift,signed){switch(shift){case ...
  function __embind_register_enum (line 4) | function __embind_register_enum(rawType,name,size,isSigned){var shift=ge...
  function requireRegisteredType (line 4) | function requireRegisteredType(rawType,humanName){var impl=registeredTyp...
  function __embind_register_enum_value (line 4) | function __embind_register_enum_value(rawEnumType,name,enumValue){var en...
  function _embind_repr (line 4) | function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==...
  function floatReadValueFromPointer (line 4) | function floatReadValueFromPointer(name,shift){switch(shift){case 2:retu...
  function __embind_register_float (line 4) | function __embind_register_float(rawType,name,size){var shift=getShiftFr...
  function __embind_register_function (line 4) | function __embind_register_function(name,argCount,rawArgTypesAddr,signat...
  function integerReadValueFromPointer (line 4) | function integerReadValueFromPointer(name,shift,signed){switch(shift){ca...
  function __embind_register_integer (line 4) | function __embind_register_integer(primitiveType,name,size,minRange,maxR...
  function __embind_register_memory_view (line 4) | function __embind_register_memory_view(rawType,dataTypeIndex,name){var t...
  function __embind_register_smart_ptr (line 4) | function __embind_register_smart_ptr(rawType,rawPointeeType,name,sharing...
  function __embind_register_std_string (line 4) | function __embind_register_std_string(rawType,name){name=readLatin1Strin...
  function __embind_register_std_wstring (line 4) | function __embind_register_std_wstring(rawType,charSize,name){name=readL...
  function __embind_register_void (line 4) | function __embind_register_void(rawType,name){name=readLatin1String(name...
  function __emval_incref (line 4) | function __emval_incref(handle){if(handle>4){emval_handle_array[handle]....
  function __emval_take_value (line 4) | function __emval_take_value(type,argv){type=requireRegisteredType(type,"...
  function _abort (line 4) | function _abort(){Module["abort"]()}
  function _emscripten_get_now (line 4) | function _emscripten_get_now(){abort()}
  function _emscripten_get_now_is_monotonic (line 4) | function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||...
  function _clock_gettime (line 4) | function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()...
  function _dlclose (line 4) | function _dlclose(handle){if(!DLFCN.loadedLibs[handle]){DLFCN.errorMsg="...
  function ___buildEnvironment (line 4) | function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SI...
  function _dlopen (line 4) | function _dlopen(filename,flag){abort("To use dlopen, you need to use Em...
  function _dlsym (line 4) | function _dlsym(handle,symbol){symbol=Pointer_stringify(symbol);if(!DLFC...
  function _emscripten_set_main_loop_timing (line 4) | function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.t...
  function _emscripten_set_main_loop (line 4) | function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noS...
  function finish (line 4) | function finish(audio){if(done)return;done=true;Module["preloadedAudios"...
  function fail (line 4) | function fail(){if(done)return;done=true;Module["preloadedAudios"][name]...
  function encode64 (line 4) | function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl...
  function pointerLockChange (line 4) | function pointerLockChange(){Browser.pointerLock=document["pointerLockEl...
  function fullscreenChange (line 4) | function fullscreenChange(){Browser.isFullscreen=false;var canvasContain...
  function _eglGetCurrentDisplay (line 4) | function _eglGetCurrentDisplay(){return EGL.currentContext?62e3:0}
  function _eglGetProcAddress (line 4) | function _eglGetProcAddress(name_){return _emscripten_GetProcAddress(nam...
  function _eglQueryString (line 4) | function _eglQueryString(display,name){if(display!=62e3){EGL.setErrorCod...
  function onContextCreationError (line 4) | function onContextCreationError(event){errorInfo=event.statusMessage||er...
  function getChromeVersion (line 4) | function getChromeVersion(){var raw=navigator.userAgent.match(/Chrom(e|i...
  function _emscripten_glActiveTexture (line 4) | function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}
  function _emscripten_glAttachShader (line 4) | function _emscripten_glAttachShader(program,shader){GLctx.attachShader(G...
  function _emscripten_glBindAttribLocation (line 4) | function _emscripten_glBindAttribLocation(program,index,name){name=Point...
  function _emscripten_glBindBuffer (line 4) | function _emscripten_glBindBuffer(target,buffer){var bufferObj=buffer?GL...
  function _emscripten_glBindFramebuffer (line 4) | function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFra...
  function _emscripten_glBindProgramARB (line 4) | function _emscripten_glBindProgramARB(){Module["printErr"]("missing func...
  function _emscripten_glBindRenderbuffer (line 4) | function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindR...
  function _emscripten_glBindTexture (line 4) | function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(tar...
  function _emscripten_glBindVertexArray (line 4) | function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL....
  function _emscripten_glBlendColor (line 4) | function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1...
  function _emscripten_glBlendEquation (line 4) | function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}
  function _emscripten_glBlendEquationSeparate (line 4) | function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquation...
  function _emscripten_glBlendFunc (line 4) | function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}
  function _emscripten_glBlendFuncSeparate (line 4) | function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSe...
  function _emscripten_glBufferData (line 4) | function _emscripten_glBufferData(target,size,data,usage){if(!data){GLct...
  function _emscripten_glBufferSubData (line 4) | function _emscripten_glBufferSubData(target,offset,size,data){if(GL.curr...
  function _emscripten_glCheckFramebufferStatus (line 4) | function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFra...
  function _emscripten_glClear (line 4) | function _emscripten_glClear(x0){GLctx["clear"](x0)}
  function _emscripten_glClearColor (line 4) | function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1...
  function _emscripten_glClearDepth (line 4) | function _emscripten_glClearDepth(x0){GLctx["clearDepth"](x0)}
  function _emscripten_glClearDepthf (line 4) | function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}
  function _emscripten_glClearStencil (line 4) | function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}
  function _emscripten_glClientActiveTexture (line 4) | function _emscripten_glClientActiveTexture(){Module["printErr"]("missing...
  function _emscripten_glColorMask (line 4) | function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!...
  function _emscripten_glColorPointer (line 4) | function _emscripten_glColorPointer(){Module["printErr"]("missing functi...
  function _emscripten_glCompileShader (line 4) | function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shad...
  function _emscripten_glCompressedTexImage2D (line 4) | function _emscripten_glCompressedTexImage2D(target,level,internalFormat,...
  function _emscripten_glCompressedTexSubImage2D (line 4) | function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoff...
  function _emscripten_glCopyTexImage2D (line 4) | function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["co...
  function _emscripten_glCopyTexSubImage2D (line 4) | function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx[...
  function _emscripten_glCreateProgram (line 4) | function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);v...
  function _emscripten_glCreateShader (line 4) | function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.sh...
  function _emscripten_glCullFace (line 4) | function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}
  function _emscripten_glDeleteBuffers (line 4) | function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i<n;i++){var...
  function _emscripten_glDeleteFramebuffers (line 4) | function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i<...
  function _emscripten_glDeleteObjectARB (line 4) | function _emscripten_glDeleteObjectARB(){Module["printErr"]("missing fun...
  function _emscripten_glDeleteProgram (line 4) | function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.pr...
  function _emscripten_glDeleteRenderbuffers (line 4) | function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;...
  function _emscripten_glDeleteShader (line 4) | function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shad...
  function _emscripten_glDeleteTextures (line 4) | function _emscripten_glDeleteTextures(n,textures){for(var i=0;i<n;i++){v...
  function _emscripten_glDeleteVertexArrays (line 4) | function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i<n;i++){v...
  function _emscripten_glDepthFunc (line 4) | function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}
  function _emscripten_glDepthMask (line 4) | function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}
  function _emscripten_glDepthRange (line 4) | function _emscripten_glDepthRange(x0,x1){GLctx["depthRange"](x0,x1)}
  function _emscripten_glDepthRangef (line 4) | function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}
  function _emscripten_glDetachShader (line 4) | function _emscripten_glDetachShader(program,shader){GLctx.detachShader(G...
  function _emscripten_glDisable (line 4) | function _emscripten_glDisable(x0){GLctx["disable"](x0)}
  function _emscripten_glDisableVertexAttribArray (line 4) | function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVert...
  function _emscripten_glDrawArrays (line 4) | function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mod...
  function _emscripten_glDrawArraysInstanced (line 4) | function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){G...
  function _emscripten_glDrawBuffers (line 4) | function _emscripten_glDrawBuffers(n,bufs){var bufArray=GL.tempFixedLeng...
  function _emscripten_glDrawElements (line 4) | function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawE...
  function _emscripten_glDrawElementsInstanced (line 4) | function _emscripten_glDrawElementsInstanced(mode,count,type,indices,pri...
  function _emscripten_glDrawRangeElements (line 4) | function _emscripten_glDrawRangeElements(mode,start,end,count,type,indic...
  function _emscripten_glEnable (line 4) | function _emscripten_glEnable(x0){GLctx["enable"](x0)}
  function _emscripten_glEnableClientState (line 4) | function _emscripten_glEnableClientState(){Module["printErr"]("missing f...
  function _emscripten_glEnableVertexAttribArray (line 4) | function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertex...
  function _emscripten_glFinish (line 4) | function _emscripten_glFinish(){GLctx["finish"]()}
  function _emscripten_glFlush (line 4) | function _emscripten_glFlush(){GLctx["flush"]()}
  function _emscripten_glFramebufferRenderbuffer (line 4) | function _emscripten_glFramebufferRenderbuffer(target,attachment,renderb...
  function _emscripten_glFramebufferTexture2D (line 4) | function _emscripten_glFramebufferTexture2D(target,attachment,textarget,...
  function _emscripten_glFrontFace (line 4) | function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}
  function _emscripten_glFrustum (line 4) | function _emscripten_glFrustum(){Module["printErr"]("missing function: e...
  function _emscripten_glGenBuffers (line 4) | function _emscripten_glGenBuffers(n,buffers){for(var i=0;i<n;i++){var bu...
  function _emscripten_glGenFramebuffers (line 4) | function _emscripten_glGenFramebuffers(n,ids){for(var i=0;i<n;++i){var f...
  function _emscripten_glGenRenderbuffers (line 4) | function _emscripten_glGenRenderbuffers(n,renderbuffers){for(var i=0;i<n...
  function _emscripten_glGenTextures (line 4) | function _emscripten_glGenTextures(n,textures){for(var i=0;i<n;i++){var ...
  function _emscripten_glGenVertexArrays (line 4) | function _emscripten_glGenVertexArrays(n,arrays){for(var i=0;i<n;i++){va...
  function _emscripten_glGenerateMipmap (line 4) | function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}
  function _emscripten_glGetActiveAttrib (line 4) | function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size...
  function _emscripten_glGetActiveUniform (line 4) | function _emscripten_glGetActiveUniform(program,index,bufSize,length,siz...
  function _emscripten_glGetAttachedShaders (line 4) | function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders...
  function _emscripten_glGetAttribLocation (line 4) | function _emscripten_glGetAttribLocation(program,name){program=GL.progra...
  function emscriptenWebGLGet (line 4) | function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);re...
  function _emscripten_glGetBooleanv (line 4) | function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,"...
  function _emscripten_glGetBufferParameteriv (line 4) | function _emscripten_glGetBufferParameteriv(target,value,data){if(!data)...
  function _emscripten_glGetError (line 4) | function _emscripten_glGetError(){if(GL.lastError){var error=GL.lastErro...
  function _emscripten_glGetFloatv (line 4) | function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,"Fl...
  function _emscripten_glGetFramebufferAttachmentParameteriv (line 4) | function _emscripten_glGetFramebufferAttachmentParameteriv(target,attach...
  function _emscripten_glGetInfoLogARB (line 4) | function _emscripten_glGetInfoLogARB(){Module["printErr"]("missing funct...
  function _emscripten_glGetIntegerv (line 4) | function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,"...
  function _emscripten_glGetObjectParameterivARB (line 4) | function _emscripten_glGetObjectParameterivARB(){Module["printErr"]("mis...
  function _emscripten_glGetPointerv (line 4) | function _emscripten_glGetPointerv(){Module["printErr"]("missing functio...
  function _emscripten_glGetProgramInfoLog (line 4) | function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLo...
  function _emscripten_glGetProgramiv (line 4) | function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordErr...
  function _emscripten_glGetRenderbufferParameteriv (line 4) | function _emscripten_glGetRenderbufferParameteriv(target,pname,params){i...
  function _emscripten_glGetShaderInfoLog (line 4) | function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog)...
  function _emscripten_glGetShaderPrecisionFormat (line 4) | function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType...
  function _emscripten_glGetShaderSource (line 4) | function _emscripten_glGetShaderSource(shader,bufSize,length,source){var...
  function _emscripten_glGetShaderiv (line 4) | function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError...
  function _emscripten_glGetString (line 4) | function _emscripten_glGetString(name_){if(GL.stringCache[name_])return ...
  function _emscripten_glGetStringi (line 4) | function _emscripten_glGetStringi(name,index){if(GLctx.canvas.GLctxObjec...
  function _emscripten_glGetTexParameterfv (line 4) | function _emscripten_glGetTexParameterfv(target,pname,params){if(!params...
  function _emscripten_glGetTexParameteriv (line 4) | function _emscripten_glGetTexParameteriv(target,pname,params){if(!params...
  function _emscripten_glGetUniformLocation (line 4) | function _emscripten_glGetUniformLocation(program,name){name=Pointer_str...
  function emscriptenWebGLGetUniform (line 4) | function emscriptenWebGLGetUniform(program,location,params,type){if(!par...
  function _emscripten_glGetUniformfv (line 4) | function _emscripten_glGetUniformfv(program,location,params){emscriptenW...
  function _emscripten_glGetUniformiv (line 4) | function _emscripten_glGetUniformiv(program,location,params){emscriptenW...
  function _emscripten_glGetVertexAttribPointerv (line 4) | function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!...
  function emscriptenWebGLGetVertexAttrib (line 4) | function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!par...
  function _emscripten_glGetVertexAttribfv (line 4) | function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenW...
  function _emscripten_glGetVertexAttribiv (line 4) | function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenW...
  function _emscripten_glHint (line 4) | function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}
  function _emscripten_glIsBuffer (line 4) | function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)r...
  function _emscripten_glIsEnabled (line 4) | function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}
  function _emscripten_glIsFramebuffer (line 4) | function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers...
  function _emscripten_glIsProgram (line 4) | function _emscripten_glIsProgram(program){program=GL.programs[program];i...
  function _emscripten_glIsRenderbuffer (line 4) | function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuff...
  function _emscripten_glIsShader (line 4) | function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)r...
  function _emscripten_glIsTexture (line 4) | function _emscripten_glIsTexture(texture){var texture=GL.textures[textur...
  function _emscripten_glIsVertexArray (line 4) | function _emscripten_glIsVertexArray(array){var vao=GL.vaos[array];if(!v...
  function _emscripten_glLineWidth (line 4) | function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}
  function _emscripten_glLinkProgram (line 4) | function _emscripten_glLinkProgram(program){GLctx.linkProgram(GL.program...
  function _emscripten_glLoadIdentity (line 4) | function _emscripten_glLoadIdentity(){throw"Legacy GL function (glLoadId...
  function _emscripten_glLoadMatrixf (line 4) | function _emscripten_glLoadMatrixf(){Module["printErr"]("missing functio...
  function _emscripten_glMatrixMode (line 4) | function _emscripten_glMatrixMode(){throw"Legacy GL function (glMatrixMo...
  function _emscripten_glNormalPointer (line 4) | function _emscripten_glNormalPointer(){Module["printErr"]("missing funct...
  function _emscripten_glPixelStorei (line 4) | function _emscripten_glPixelStorei(pname,param){if(pname==3333){GL.packA...
  function _emscripten_glPolygonOffset (line 4) | function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}
  function emscriptenWebGLComputeImageSize (line 4) | function emscriptenWebGLComputeImageSize(width,height,sizePerPixel,align...
  function emscriptenWebGLGetTexPixelData (line 4) | function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,...
  function emscriptenWebGLGetHeapForType (line 4) | function emscriptenWebGLGetHeapForType(type){switch(type){case 5120:retu...
  function emscriptenWebGLGetShiftForType (line 4) | function emscriptenWebGLGetShiftForType(type){switch(type){case 5120:cas...
  function _emscripten_glReadPixels (line 4) | function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){i...
  function _emscripten_glReleaseShaderCompiler (line 4) | function _emscripten_glReleaseShaderCompiler(){}
  function _emscripten_glRenderbufferStorage (line 4) | function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbuf...
  function _emscripten_glRotatef (line 4) | function _emscripten_glRotatef(){Module["printErr"]("missing function: e...
  function _emscripten_glSampleCoverage (line 4) | function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage...
  function _emscripten_glScissor (line 4) | function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}
  function _emscripten_glShaderBinary (line 4) | function _emscripten_glShaderBinary(){GL.recordError(1280)}
  function _emscripten_glShaderSource (line 4) | function _emscripten_glShaderSource(shader,count,string,length){var sour...
  function _emscripten_glStencilFunc (line 4) | function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,...
  function _emscripten_glStencilFuncSeparate (line 4) | function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFu...
  function _emscripten_glStencilMask (line 4) | function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}
  function _emscripten_glStencilMaskSeparate (line 4) | function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSepa...
  function _emscripten_glStencilOp (line 4) | function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}
  function _emscripten_glStencilOpSeparate (line 4) | function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSe...
  function _emscripten_glTexCoordPointer (line 4) | function _emscripten_glTexCoordPointer(){Module["printErr"]("missing fun...
  function _emscripten_glTexImage2D (line 4) | function _emscripten_glTexImage2D(target,level,internalFormat,width,heig...
  function _emscripten_glTexImage3D (line 4) | function _emscripten_glTexImage3D(target,level,internalFormat,width,heig...
  function _emscripten_glTexParameterf (line 4) | function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0...
  function _emscripten_glTexParameterfv (line 4) | function _emscripten_glTexParameterfv(target,pname,params){var param=HEA...
  function _emscripten_glTexParameteri (line 4) | function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0...
  function _emscripten_glTexParameteriv (line 4) | function _emscripten_glTexParameteriv(target,pname,params){var param=HEA...
  function _emscripten_glTexStorage2D (line 4) | function _emscripten_glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"...
  function _emscripten_glTexStorage3D (line 4) | function _emscripten_glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage...
  function _emscripten_glTexSubImage2D (line 4) | function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,...
  function _emscripten_glTexSubImage3D (line 4) | function _emscripten_glTexSubImage3D(target,level,xoffset,yoffset,zoffse...
  function _emscripten_glUniform1f (line 4) | function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(GL.uniform...
  function _emscripten_glUniform1fv (line 4) | function _emscripten_glUniform1fv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform1i (line 4) | function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(GL.uniform...
  function _emscripten_glUniform1iv (line 4) | function _emscripten_glUniform1iv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform2f (line 4) | function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(GL.unif...
  function _emscripten_glUniform2fv (line 4) | function _emscripten_glUniform2fv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform2i (line 4) | function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(GL.unif...
  function _emscripten_glUniform2iv (line 4) | function _emscripten_glUniform2iv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform3f (line 4) | function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(GL.u...
  function _emscripten_glUniform3fv (line 4) | function _emscripten_glUniform3fv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform3i (line 4) | function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(GL.u...
  function _emscripten_glUniform3iv (line 4) | function _emscripten_glUniform3iv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform4f (line 4) | function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(G...
  function _emscripten_glUniform4fv (line 4) | function _emscripten_glUniform4fv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniform4i (line 4) | function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(G...
  function _emscripten_glUniform4iv (line 4) | function _emscripten_glUniform4iv(location,count,value){if(GL.currentCon...
  function _emscripten_glUniformMatrix2fv (line 4) | function _emscripten_glUniformMatrix2fv(location,count,transpose,value){...
  function _emscripten_glUniformMatrix3fv (line 4) | function _emscripten_glUniformMatrix3fv(location,count,transpose,value){...
  function _emscripten_glUniformMatrix4fv (line 4) | function _emscripten_glUniformMatrix4fv(location,count,transpose,value){...
  function _emscripten_glUseProgram (line 4) | function _emscripten_glUseProgram(program){GLctx.useProgram(program?GL.p...
  function _emscripten_glValidateProgram (line 4) | function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL...
  function _emscripten_glVertexAttrib1f (line 4) | function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,...
  function _emscripten_glVertexAttrib1fv (line 4) | function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(ind...
  function _emscripten_glVertexAttrib2f (line 4) | function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](...
  function _emscripten_glVertexAttrib2fv (line 4) | function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(ind...
  function _emscripten_glVertexAttrib3f (line 4) | function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f...
  function _emscripten_glVertexAttrib3fv (line 4) | function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(ind...
  function _emscripten_glVertexAttrib4f (line 4) | function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttri...
  function _emscripten_glVertexAttrib4fv (line 4) | function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(ind...
  function _emscripten_glVertexAttribDivisor (line 4) | function _emscripten_glVertexAttribDivisor(index,divisor){GLctx["vertexA...
  function _emscripten_glVertexAttribIPointer (line 4) | function _emscripten_glVertexAttribIPointer(index,size,type,stride,ptr){...
  function _emscripten_glVertexAttribPointer (line 4) | function _emscripten_glVertexAttribPointer(index,size,type,normalized,st...
  function _emscripten_glVertexPointer (line 4) | function _emscripten_glVertexPointer(){throw"Legacy GL function (glVerte...
  function _emscripten_glViewport (line 4) | function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,...
  function _longjmp (line 4) | function _longjmp(env,value){Module["setThrew"](env,value||1);throw"long...
  function _emscripten_longjmp (line 4) | function _emscripten_longjmp(env,value){_longjmp(env,value)}
  function arraysHaveEqualContent (line 4) | function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)r...
  function _emscripten_webgl_create_context (line 4) | function _emscripten_webgl_create_context(target,attributes){var context...
  function _emscripten_webgl_init_context_attributes (line 4) | function _emscripten_webgl_init_context_attributes(attributes){HEAP32[at...
  function _emscripten_webgl_make_context_current (line 4) | function _emscripten_webgl_make_context_current(contextHandle){var succe...
  function _getenv (line 4) | function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name)...
  function _glActiveTexture (line 4) | function _glActiveTexture(x0){GLctx["activeTexture"](x0)}
  function _glAttachShader (line 4) | function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[...
  function _glBindAttribLocation (line 4) | function _glBindAttribLocation(program,index,name){name=Pointer_stringif...
  function _glBindBuffer (line 4) | function _glBindBuffer(target,buffer){var bufferObj=buffer?GL.buffers[bu...
  function _glBindFramebuffer (line 4) | function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(ta...
  function _glBindRenderbuffer (line 4) | function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer...
  function _glBindTexture (line 4) | function _glBindTexture(target,texture){GLctx.bindTexture(target,texture...
  function _glBlendColor (line 4) | function _glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}
  function _glBlendEquation (line 4) | function _glBlendEquation(x0){GLctx["blendEquation"](x0)}
  function _glBlendFunc (line 4) | function _glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}
  function _glBufferData (line 4) | function _glBufferData(target,size,data,usage){if(!data){GLctx.bufferDat...
  function _glBufferSubData (line 4) | function _glBufferSubData(target,offset,size,data){if(GL.currentContext....
  function _glCheckFramebufferStatus (line 4) | function _glCheckFramebufferStatus(x0){return GLctx["checkFramebufferSta...
  function _glClear (line 4) | function _glClear(x0){GLctx["clear"](x0)}
  function _glClearColor (line 4) | function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}
  function _glClearStencil (line 4) | function _glClearStencil(x0){GLctx["clearStencil"](x0)}
  function _glColorMask (line 4) | function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!gree...
  function _glCompileShader (line 4) | function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}
  function _glCompressedTexImage2D (line 4) | function _glCompressedTexImage2D(target,level,internalFormat,width,heigh...
  function _glCompressedTexSubImage2D (line 4) | function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,h...
  function _glCopyTexSubImage2D (line 4) | function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSub...
  function _glCreateProgram (line 4) | function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=...
  function _glCreateShader (line 4) | function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.s...
  function _glCullFace (line 4) | function _glCullFace(x0){GLctx["cullFace"](x0)}
  function _glDeleteBuffers (line 4) | function _glDeleteBuffers(n,buffers){for(var i=0;i<n;i++){var id=HEAP32[...
  function _glDeleteFramebuffers (line 4) | function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i<n;++i){var ...
  function _glDeleteProgram (line 4) | function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];...
  function _glDeleteRenderbuffers (line 4) | function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i<n;i++){va...
  function _glDeleteShader (line 4) | function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(...
  function _glDeleteTextures (line 4) | function _glDeleteTextures(n,textures){for(var i=0;i<n;i++){var id=HEAP3...
  function _glDepthMask (line 4) | function _glDepthMask(flag){GLctx.depthMask(!!flag)}
  function _glDisable (line 4) | function _glDisable(x0){GLctx["disable"](x0)}
  function _glDisableVertexAttribArray (line 4) | function _glDisableVertexAttribArray(index){GLctx.disableVertexAttribArr...
  function _glDrawArrays (line 4) | function _glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,cou...
  function _glDrawElements (line 4) | function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mod...
  function _glEnable (line 4) | function _glEnable(x0){GLctx["enable"](x0)}
  function _glEnableVertexAttribArray (line 4) | function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray...
  function _glFinish (line 4) | function _glFinish(){GLctx["finish"]()}
  function _glFlush (line 4) | function _glFlush(){GLctx["flush"]()}
  function _glFramebufferRenderbuffer (line 4) | function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget...
  function _glFramebufferTexture2D (line 4) | function _glFramebufferTexture2D(target,attachment,textarget,texture,lev...
  function _glFrontFace (line 4) | function _glFrontFace(x0){GLctx["frontFace"](x0)}
  function _glGenBuffers (line 4) | function _glGenBuffers(n,buffers){for(var i=0;i<n;i++){var buffer=GLctx....
  function _glGenFramebuffers (line 4) | function _glGenFramebuffers(n,ids){for(var i=0;i<n;++i){var framebuffer=...
  function _glGenRenderbuffers (line 4) | function _glGenRenderbuffers(n,renderbuffers){for(var i=0;i<n;i++){var r...
  function _glGenTextures (line 4) | function _glGenTextures(n,textures){for(var i=0;i<n;i++){var texture=GLc...
  function _glGenerateMipmap (line 4) | function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}
  function _glGetBufferParameteriv (line 4) | function _glGetBufferParameteriv(target,value,data){if(!data){GL.recordE...
  function _glGetError (line 4) | function _glGetError(){if(GL.lastError){var error=GL.lastError;GL.lastEr...
  function _glGetFramebufferAttachmentParameteriv (line 4) | function _glGetFramebufferAttachmentParameteriv(target,attachment,pname,...
  function _glGetIntegerv (line 4) | function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,"Integer")}
  function _glGetProgramInfoLog (line 4) | function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=...
  function _glGetProgramiv (line 4) | function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);re...
  function _glGetRenderbufferParameteriv (line 4) | function _glGetRenderbufferParameteriv(target,pname,params){if(!params){...
  function _glGetShaderInfoLog (line 4) | function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GL...
  function _glGetShaderPrecisionFormat (line 4) | function _glGetShaderPrecisionFormat(shaderType,precisionType,range,prec...
  function _glGetShaderiv (line 4) | function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);retu...
  function _glGetString (line 4) | function _glGetString(name_){if(GL.stringCache[name_])return GL.stringCa...
  function _glGetUniformLocation (line 4) | function _glGetUniformLocation(program,name){name=Pointer_stringify(name...
  function _glIsTexture (line 4) | function _glIsTexture(texture){var texture=GL.textures[texture];if(!text...
  function _glLineWidth (line 4) | function _glLineWidth(x0){GLctx["lineWidth"](x0)}
  function _glLinkProgram (line 4) | function _glLinkProgram(program){GLctx.linkProgram(GL.programs[program])...
  function _glPixelStorei (line 4) | function _glPixelStorei(pname,param){if(pname==3333){GL.packAlignment=pa...
  function _glReadPixels (line 4) | function _glReadPixels(x,y,width,height,format,type,pixels){if(GL.curren...
  function _glRenderbufferStorage (line 4) | function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"...
  function _glScissor (line 4) | function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}
  function _glShaderSource (line 4) | function _glShaderSource(shader,count,string,length){var source=GL.getSo...
  function _glStencilFunc (line 4) | function _glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}
  function _glStencilFuncSeparate (line 4) | function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"...
  function _glStencilMask (line 4) | function _glStencilMask(x0){GLctx["stencilMask"](x0)}
  function _glStencilMaskSeparate (line 4) | function _glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}
  function _glStencilOp (line 4) | function _glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}
  function _glStencilOpSeparate (line 4) | function _glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0...
  function _glTexImage2D (line 4) | function _glTexImage2D(target,level,internalFormat,width,height,border,f...
  function _glTexParameteri (line 4) | function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}
  function _glTexParameteriv (line 4) | function _glTexParameteriv(target,pname,params){var param=HEAP32[params>...
  function _glTexSubImage2D (line 4) | function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,form...
  function _glUniform1f (line 4) | function _glUniform1f(location,v0){GLctx.uniform1f(GL.uniforms[location]...
  function _glUniform1fv (line 4) | function _glUniform1fv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform1i (line 4) | function _glUniform1i(location,v0){GLctx.uniform1i(GL.uniforms[location]...
  function _glUniform1iv (line 4) | function _glUniform1iv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform2f (line 4) | function _glUniform2f(location,v0,v1){GLctx.uniform2f(GL.uniforms[locati...
  function _glUniform2fv (line 4) | function _glUniform2fv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform2i (line 4) | function _glUniform2i(location,v0,v1){GLctx.uniform2i(GL.uniforms[locati...
  function _glUniform2iv (line 4) | function _glUniform2iv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform3f (line 4) | function _glUniform3f(location,v0,v1,v2){GLctx.uniform3f(GL.uniforms[loc...
  function _glUniform3fv (line 4) | function _glUniform3fv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform3i (line 4) | function _glUniform3i(location,v0,v1,v2){GLctx.uniform3i(GL.uniforms[loc...
  function _glUniform3iv (line 4) | function _glUniform3iv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform4f (line 4) | function _glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(GL.uniforms[...
  function _glUniform4fv (line 4) | function _glUniform4fv(location,count,value){if(GL.currentContext.suppor...
  function _glUniform4i (line 4) | function _glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(GL.uniforms[...
  function _glUniform4iv (line 4) | function _glUniform4iv(location,count,value){if(GL.currentContext.suppor...
  function _glUniformMatrix2fv (line 4) | function _glUniformMatrix2fv(location,count,transpose,value){if(GL.curre...
  function _glUniformMatrix3fv (line 4) | function _glUniformMatrix3fv(location,count,transpose,value){if(GL.curre...
  function _glUniformMatrix4fv (line 4) | function _glUniformMatrix4fv(location,count,transpose,value){if(GL.curre...
  function _glUseProgram (line 4) | function _glUseProgram(program){GLctx.useProgram(program?GL.programs[pro...
  function _glVertexAttrib1f (line 4) | function _glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}
  function _glVertexAttrib2fv (line 4) | function _glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[...
  function _glVertexAttrib3fv (line 4) | function _glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[...
  function _glVertexAttrib4fv (line 4) | function _glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[...
  function _glVertexAttribPointer (line 4) | function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){G...
  function _glViewport (line 4) | function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}
  function _llvm_exp2_f32 (line 4) | function _llvm_exp2_f32(x){return Math.pow(2,x)}
  function _llvm_log2_f32 (line 4) | function _llvm_log2_f32(x){return Math.log(x)/Math.LN2}
  function _llvm_stackrestore (line 4) | function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLV...
  function _llvm_stacksave (line 4) | function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDS...
  function _llvm_trap (line 4) | function _llvm_trap(){abort("trap!")}
  function _emscripten_memcpy_big (line 4) | function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray...
  function _pthread_cond_wait (line 4) | function _pthread_cond_wait(){return 0}
  function _pthread_getspecific (line 4) | function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}
  function _pthread_key_create (line 4) | function _pthread_key_create(key,destructor){if(key==0){return ERRNO_COD...
  function _pthread_once (line 4) | function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.se...
  function _pthread_setspecific (line 4) | function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){...
  function _sem_destroy (line 4) | function _sem_destroy(){}
  function _sem_init (line 4) | function _sem_init(){}
  function _sem_post (line 4) | function _sem_post(){}
  function _sem_wait (line 4) | function _sem_wait(){}
  function __isLeapYear (line 4) | function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400==...
  function __arraySum (line 4) | function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=arr...
  function __addDays (line 4) | function __addDays(date,days){var newDate=new Date(date.getTime());while...
  function _strftime (line 4) | function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var...
  function _strftime_l (line 4) | function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,for...
  function intArrayFromString (line 4) | function intArrayFromString(stringy,dontAddNull,length){var len=length>0...
  function invoke_ii (line 4) | function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}c...
  function invoke_iii (line 4) | function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,...
  function invoke_iiii (line 4) | function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](i...
  function invoke_iiiii (line 4) | function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiii...
  function invoke_vi (line 4) | function invoke_vi(index,a1){try{Module["dynCall_vi"](index,a1)}catch(e)...
  function invoke_vii (line 4) | function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}...
  function invoke_viii (line 4) | function invoke_viii(index,a1,a2,a3){try{Module["dynCall_viii"](index,a1...
  function invoke_viiii (line 4) | function invoke_viiii(index,a1,a2,a3,a4){try{Module["dynCall_viiii"](ind...
  function invoke_viiiii (line 4) | function invoke_viiiii(index,a1,a2,a3,a4,a5){try{Module["dynCall_viiiii"...
  function invoke_viiiiii (line 4) | function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){try{Module["dynCall_vii...
  function invoke_viiiiiiiii (line 4) | function invoke_viiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){try{Module[...
  function ExitStatus (line 4) | function ExitStatus(status){this.name="ExitStatus";this.message="Program...
  function run (line 4) | function run(args){args=args||Module["arguments"];if(runDependencies>0){...
  function exit (line 4) | function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&sta...
  function abort (line 4) | function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(wh...

FILE: docs/webgl.js
  function loadFont (line 18) | async function loadFont () {
  function create_star (line 41) | function create_star () {
  function main (line 66) | async function main (skiaModule) {
  function scheduleAnimation (line 117) | function scheduleAnimation () {
  function loadNativeModule (line 143) | function loadNativeModule (skiaModule) {

FILE: example_gradient.js
  function draw (line 4) | function draw (skiaModule, canvas) {
  function main (line 23) | function main (skiaModule) {
  function loadNativeModule (line 39) | function loadNativeModule (module) {

FILE: example_star.js
  function draw (line 4) | function draw (canvas) {
  function main (line 25) | function main (skiaModule) {
  function loadNativeModule (line 41) | function loadNativeModule (module) {

FILE: example_text.js
  function draw (line 5) | function draw (skiaModule, canvas) {
  function main (line 35) | function main (skiaModule) {
  function loadNativeModule (line 51) | function loadNativeModule (module) {

FILE: include/android/SkAndroidFrameworkUtils.h
  function class (line 20) | class SkAndroidFrameworkUtils {

FILE: include/android/SkAnimatedImage.h
  function currentFrameDuration (line 78) | int currentFrameDuration() {
  type Frame (line 105) | struct Frame {
  type SkDrawable (line 151) | typedef SkDrawable INHERITED;

FILE: include/android/SkBRDAllocator.h
  function class (line 19) | class SkBRDAllocator : public SkBitmap::Allocator {

FILE: include/android/SkBitmapRegionDecoder.h
  function class (line 20) | class SK_API SkBitmapRegionDecoder {

FILE: include/atlastext/SkAtlasTextContext.h
  function SkAtlasTextRenderer (line 26) | SkAtlasTextRenderer* renderer() const {

FILE: include/atlastext/SkAtlasTextFont.h
  function SkTypeface (line 21) | SkTypeface* typeface() const { return fTypeface.get(); }

FILE: include/atlastext/SkAtlasTextRenderer.h
  type class (line 22) | enum class
  type SDFVertex (line 27) | struct SDFVertex {

FILE: include/atlastext/SkAtlasTextTarget.h
  type SkPoint (line 19) | struct SkPoint
  function class (line 22) | class SK_API SkAtlasTextTarget {
  function SkMatrix (line 88) | SkMatrix* accessCTM() const {

FILE: include/c/sk_maskfilter.h
  type sk_blurstyle_t (line 16) | typedef enum {

FILE: include/c/sk_paint.h
  type sk_stroke_cap_t (line 92) | typedef enum {
  type sk_stroke_join_t (line 109) | typedef enum {

FILE: include/c/sk_shader.h
  type sk_shader_tilemode_t (line 21) | typedef enum {

FILE: include/c/sk_types.h
  type sk_colortype_t (line 55) | typedef enum {
  type sk_alphatype_t (line 62) | typedef enum {
  type sk_cliptype_t (line 68) | typedef enum {
  type sk_pixelgeometry_t (line 73) | typedef enum {
  type sk_imageinfo_t (line 86) | typedef struct {
  type sk_surfaceprops_t (line 93) | typedef struct {
  type sk_point_t (line 97) | typedef struct {
  type sk_irect_t (line 102) | typedef struct {
  type sk_rect_t (line 109) | typedef struct {
  type sk_matrix_t (line 169) | typedef struct {
  type sk_canvas_t (line 178) | typedef struct sk_canvas_t sk_canvas_t;
  type sk_data_t (line 182) | typedef struct sk_data_t sk_data_t;
  type sk_image_t (line 189) | typedef struct sk_image_t sk_image_t;
  type sk_maskfilter_t (line 198) | typedef struct sk_maskfilter_t sk_maskfilter_t;
  type sk_paint_t (line 203) | typedef struct sk_paint_t sk_paint_t;
  type sk_path_t (line 209) | typedef struct sk_path_t sk_path_t;
  type sk_picture_t (line 214) | typedef struct sk_picture_t sk_picture_t;
  type sk_picture_recorder_t (line 219) | typedef struct sk_picture_recorder_t sk_picture_recorder_t;
  type sk_shader_t (line 226) | typedef struct sk_shader_t sk_shader_t;
  type sk_surface_t (line 232) | typedef struct sk_surface_t sk_surface_t;
  type sk_xfermode_mode_t (line 234) | typedef enum {

FILE: include/codec/SkAndroidCodec.h
  type class (line 22) | enum class
  type AndroidOptions (line 191) | struct AndroidOptions {
  function SkCodec (line 270) | SkCodec* codec() const { return fCodec.get(); }

FILE: include/codec/SkCodec.h
  function namespace (line 33) | namespace DM {
  type Result (line 59) | enum Result {
  function SkISize (line 189) | SkISize getScaledDimensions(float desiredScale) const {
  function getValidSubset (line 219) | bool getValidSubset(SkIRect* desiredSubset) const {
  type ZeroInitialized (line 231) | enum ZeroInitialized {
  type Options (line 249) | struct Options {
  function Result (line 345) | Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) {
  function queryYUV8 (line 362) | bool queryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) con...
  function Result (line 380) | Result getYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
  function Result (line 409) | Result startIncrementalDecode(const SkImageInfo& dstInfo, void* dst, siz...
  function Result (line 468) | Result startScanlineDecode(const SkImageInfo& dstInfo) {
  type SkScanlineOrder (line 512) | enum SkScanlineOrder {
  function getFrameCount (line 578) | int getFrameCount() {
  type FrameInfo (line 589) | struct FrameInfo {
  function getFrameInfo (line 632) | bool getFrameInfo(int index, FrameInfo* info) const {
  function getRepetitionCount (line 662) | int getRepetitionCount() {
  function virtual (line 688) | virtual SkISize onGetScaledDimensions(float /*desiredScale*/) const {
  function virtual (line 698) | virtual bool onDimensionsSupported(const SkISize&) {
  function virtual (line 714) | virtual bool onQueryYUV8(SkYUVSizeInfo*, SkYUVColorSpace*) const {
  function virtual (line 718) | virtual Result onGetYUV8Planes(const SkYUVSizeInfo&, void*[3] /*planes*/) {
  function virtual (line 722) | virtual bool onGetValidSubset(SkIRect* /*desiredSubset*/) const {
  function virtual (line 744) | virtual bool onRewind() {
  function getFillValue (line 759) | uint64_t getFillValue(const SkImageInfo& dstInfo) const {
  function virtual (line 774) | virtual uint64_t onGetFillValue(const SkImageInfo& dstInfo) const;
  function SkColorSpaceXform (line 815) | SkColorSpaceXform* colorXform() const { return fColorXform.get(); }
  function virtual (line 818) | virtual int onGetFrameCount() {
  function virtual (line 822) | virtual bool onGetFrameInfo(int, FrameInfo*) const {
  function virtual (line 826) | virtual int onGetRepetitionCount() {
  function dimensionsSupported (line 865) | bool dimensionsSupported(const SkISize& dim) {
  function virtual (line 872) | virtual const SkFrameHolder* getFrameHolder() const {
  function virtual (line 882) | virtual Result onStartScanlineDecode(const SkImageInfo& /*dstInfo*/,
  function virtual (line 887) | virtual Result onStartIncrementalDecode(const SkImageInfo& /*dstInfo*/, ...
  function virtual (line 892) | virtual Result onIncrementalDecode(int*) {
  function virtual (line 897) | virtual bool onSkipScanlines(int /*countLines*/) { return false; }
  function virtual (line 899) | virtual int onGetScanlines(void* /*dst*/, int /*countLines*/, size_t /*r...
  function virtual (line 926) | virtual SkSampler* getSampler(bool /*createIfNecessary*/) { return nullp...

FILE: include/codec/SkCodecAnimation.h
  function DisposalMethod (line 19) | enum class DisposalMethod {

FILE: include/codec/SkEncodedOrigin.h
  type SkEncodedOrigin (line 11) | enum SkEncodedOrigin {

FILE: include/core/SkAnnotation.h
  type SkPoint (line 14) | struct SkPoint
  type SkRect (line 15) | struct SkRect

FILE: include/core/SkBBHFactory.h
  type SkRect (line 13) | struct SkRect
  function class (line 15) | class SK_API SkBBHFactory {

FILE: include/core/SkBitmap.h
  type SkMask (line 17) | struct SkMask
  type SkIRect (line 18) | struct SkIRect
  type SkRect (line 19) | struct SkRect
  function class (line 45) | class SK_API SkBitmap {
  type AllocFlags (line 421) | enum AllocFlags {
  function allocPixelsFlags (line 466) | void allocPixelsFlags(const SkImageInfo& info, uint32_t flags) {
  function allocPixels (line 504) | void allocPixels(const SkImageInfo& info, size_t rowBytes) {
  function allocPixels (line 540) | void allocPixels(const SkImageInfo& info) {
  function installPixels (line 628) | bool installPixels(const SkImageInfo& info, void* pixels, size_t rowByte...
  function tryAllocPixels (line 671) | bool SK_WARN_UNUSED_RESULT tryAllocPixels() {
  function allocPixels (line 682) | void allocPixels() {
  function allocPixels (line 706) | void allocPixels(Allocator* allocator) {
  function SkPixelRef (line 717) | SkPixelRef* pixelRef() const { return fPixelRef.get(); }
  function getGenerationID (line 763) | uint32_t getGenerationID() const;
  function SkColor (line 835) | SkColor getColor(int x, int y) const {
  function readPixels (line 982) | bool readPixels(const SkImageInfo& dstInfo, void* dstPixels, size_t dstR...
  function readPixels (line 1036) | bool readPixels(const SkPixmap& dst) const {
  function writePixels (line 1066) | bool writePixels(const SkPixmap& src, int dstX, int dstY) {
  function writePixels (line 1090) | bool writePixels(const SkPixmap& src) {
  function setHasHardwareMipMap (line 1139) | void setHasHardwareMipMap(bool hasHardwareMipMap) {
  function extractAlpha (line 1156) | bool extractAlpha(SkBitmap* dst) const {
  function extractAlpha (line 1173) | bool extractAlpha(SkBitmap* dst, const SkPaint* paint,
  function validate (line 1210) | SkDEBUGCODE(void validate() const;)
  type Flags (line 1256) | enum Flags {

FILE: include/core/SkBlendMode.h
  type class (line 13) | enum class

FILE: include/core/SkBlurTypes.h
  type SkBlurStyle (line 13) | enum SkBlurStyle {

FILE: include/core/SkCanvas.h
  type SkDrawShadowRec (line 28) | struct SkDrawShadowRec
  type SkRSXform (line 38) | struct SkRSXform
  type PrivateSaveLayerFlags (line 67) | enum PrivateSaveLayerFlags {
  function std (line 127) | static std::unique_ptr<SkCanvas> MakeRasterDirectN32(int width, int heig...
  function ColorBehavior (line 175) | enum class ColorBehavior {
  function saveLayer (line 543) | int saveLayer(const SkRect& bounds, const SkPaint* paint) {
  type SaveLayerFlagsSet (line 604) | enum SaveLayerFlagsSet {
  type SaveLayerFlags (line 616) | typedef uint32_t SaveLayerFlags;
  type SaveLayerRec (line 621) | struct SaveLayerRec {
  function clipRect (line 857) | void clipRect(const SkRect& rect, SkClipOp op) {
  function clipRRect (line 903) | void clipRRect(const SkRRect& rrect, SkClipOp op) {
  function clipPath (line 941) | void clipPath(const SkPath& path, SkClipOp op) {
  function setAllowSimplifyClip (line 962) | void setAllowSimplifyClip(bool allow) {
  function getLocalClipBounds (line 1014) | bool getLocalClipBounds(SkRect* bounds) const {
  function getDeviceClipBounds (line 1036) | bool getDeviceClipBounds(SkIRect* bounds) const {
  function clear (line 1054) | void clear(SkColor color) {
  function discard (line 1070) | void discard() { this->onDiscard(); }
  type PointMode (line 1084) | enum PointMode {
  function drawPoint (line 1146) | void drawPoint(SkPoint p, const SkPaint& paint) {
  function drawLine (line 1172) | void drawLine(SkPoint p0, SkPoint p1, const SkPaint& paint) {
  function drawIRect (line 1194) | void drawIRect(const SkIRect& rect, const SkPaint& paint) {
  function drawCircle (line 1270) | void drawCircle(SkPoint center, SkScalar radius, const SkPaint& paint) {
  type SrcRectConstraint (line 1378) | enum SrcRectConstraint {
  function drawImageRect (line 1483) | void drawImageRect(const sk_sp<SkImage>& image, const SkRect& src, const...
  function drawImageRect (line 1512) | void drawImageRect(const sk_sp<SkImage>& image, const SkIRect& isrc, con...
  function drawImageRect (line 1539) | void drawImageRect(const sk_sp<SkImage>& image, const SkRect& dst, const...
  type Lattice (line 1740) | struct Lattice {
  function drawString (line 1866) | void drawString(const char* string, SkScalar x, SkScalar y, const SkPain...
  function drawTextBlob (line 2065) | void drawTextBlob(const sk_sp<SkTextBlob>& blob, SkScalar x, SkScalar y,...
  function drawPicture (line 2077) | void drawPicture(const SkPicture* picture) {
  function drawPicture (line 2089) | void drawPicture(const sk_sp<SkPicture>& picture) {
  function drawPicture (line 2117) | void drawPicture(const sk_sp<SkPicture>& picture, const SkMatrix* matrix...
  function drawPatch (line 2193) | void drawPatch(const SkPoint cubics[12], const SkColor colors[4],
  function drawAtlas (line 2240) | void drawAtlas(const sk_sp<SkImage>& atlas, const SkRSXform xform[], con...
  function drawAtlas (line 2262) | void drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRe...
  function drawAtlas (line 2283) | void drawAtlas(const sk_sp<SkImage>& atlas, const SkRSXform xform[], con...
  function drawAnnotation (line 2337) | void drawAnnotation(const SkRect& rect, const char key[], const sk_sp<Sk...
  function virtual (line 2361) | virtual bool isClipEmpty() const;
  function virtual (line 2407) | virtual SkImageInfo onImageInfo() const;
  function virtual (line 2424) | virtual void willRestore() {}
  function virtual (line 2425) | virtual void didRestore() {}
  function virtual (line 2426) | virtual void didConcat(const SkMatrix& ) {}
  function virtual (line 2427) | virtual void didSetMatrix(const SkMatrix& ) {}
  function virtual (line 2428) | virtual void didTranslate(SkScalar dx, SkScalar dy) {
  type ClipEdgeStyle (line 2495) | enum ClipEdgeStyle {
  function SkMatrix (line 2537) | const SkMatrix& matrix() const;
  function SkSurface_Base (line 2600) | SkSurface_Base* getSurfaceBase() const { return fSurfaceBase; }
  function setSurfaceBase (line 2601) | void setSurfaceBase(SkSurface_Base* sb) {
  type InitFlags (line 2625) | enum InitFlags {
  function SkIRect (line 2653) | SkIRect getTopLayerBounds() const;
  type SkRefCnt (line 2712) | typedef SkRefCnt INHERITED;
  function class (line 2720) | class SkAutoCanvasRestore : SkNoncopyable {

FILE: include/core/SkClipOp.h
  type class (line 13) | enum class

FILE: include/core/SkColor.h
  type SkAlpha (line 21) | typedef uint8_t SkAlpha;
  type SkColor (line 27) | typedef uint32_t SkColor;
  function SkColor (line 31) | static constexpr inline SkColor SkColorSetARGB(U8CPU a, U8CPU r, U8CPU g...
  function SkColor (line 50) | static constexpr inline SkColor SkColorSetA(SkColor c, U8CPU a) {
  function SkColorToHSV (line 108) | static inline void SkColorToHSV(SkColor color, SkScalar hsv[3]) {
  function SkColor (line 131) | static inline SkColor SkHSVToColor(const SkScalar hsv[3]) {
  type SkPMColor (line 141) | typedef uint32_t SkPMColor;
  type SkPM4f (line 154) | struct SkPM4f
  function SkColor4f (line 159) | struct SK_API SkColor4f {

FILE: include/core/SkColorFilter.h
  type Flags (line 70) | enum Flags {
  function sk_sp (line 105) | static sk_sp<SkColorFilter> MakeComposeFilter(sk_sp<SkColorFilter> outer,
  function SkFlattenable (line 145) | static SkFlattenable::Type GetFlattenableType() {
  function virtual (line 166) | virtual sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer*) const {
  function virtual (line 177) | virtual sk_sp<SkColorFilter> onMakeComposed(sk_sp<SkColorFilter>) const ...
  type SkFlattenable (line 195) | typedef SkFlattenable INHERITED;

FILE: include/core/SkColorPriv.h
  function SkAlpha255To256 (line 20) | static inline unsigned SkAlpha255To256(U8CPU alpha) {
  function U8CPU (line 32) | static inline U8CPU SkUnitScalarClampToByte(SkScalar x) {
  function SkPMColor (line 84) | static inline SkPMColor SkPackARGB32(U8CPU a, U8CPU r, U8CPU g, U8CPU b) {
  function SkPMColor (line 98) | static inline SkPMColor SkPackARGB32NoCheck(U8CPU a, U8CPU r, U8CPU g, U...
  function SkPMColor (line 103) | static inline
  function SK_ALWAYS_INLINE (line 120) | static SK_ALWAYS_INLINE uint32_t SkAlphaMulQ(uint32_t c, unsigned scale) {
  function SkPMColor (line 128) | static inline SkPMColor SkPMSrcOver(SkPMColor src, SkPMColor dst) {
  function SkR16ToR32 (line 151) | static inline unsigned SkR16ToR32(unsigned r) {
  function SkG16ToG32 (line 155) | static inline unsigned SkG16ToG32(unsigned g) {
  function SkB16ToB32 (line 159) | static inline unsigned SkB16ToB32(unsigned b) {

FILE: include/core/SkColorSpace.h
  type skcms_ICCProfile (line 15) | struct skcms_ICCProfile
  type SkGammaNamed (line 17) | enum SkGammaNamed {
  function SkColorSpacePrimaries (line 27) | struct SK_API SkColorSpacePrimaries {
  function SkColorSpaceTransferFn (line 55) | struct SK_API SkColorSpaceTransferFn {
  type RenderTargetGamma (line 98) | enum RenderTargetGamma : uint8_t {
  type Gamut (line 108) | enum Gamut {
  type Type (line 147) | enum Type {
  function Type (line 152) | Type type() const;
  function virtual (line 261) | virtual uint32_t onToXYZD50Hash() const = 0;
  function virtual (line 270) | virtual const SkData* onProfileData() const { return nullptr; }
  type class (line 275) | enum class

FILE: include/core/SkColorSpaceXform.h
  type ColorFormat (line 27) | enum ColorFormat {
  function virtual (line 61) | virtual ~SkColorSpaceXform() {}
  type AlphaOp (line 63) | enum AlphaOp {

FILE: include/core/SkCoverageMode.h
  type class (line 20) | enum class

FILE: include/core/SkData.h
  function sk_sp (line 107) | static sk_sp<SkData> MakeWithoutCopy(const void* data, size_t length) {
  function delete (line 172) | void operator delete(void* p) { ::operator delete(p); }
  type SkRefCnt (line 179) | typedef SkRefCnt INHERITED;

FILE: include/core/SkDataTable.h
  type Dir (line 93) | struct Dir {
  type SkRefCnt (line 116) | typedef SkRefCnt INHERITED;

FILE: include/core/SkDeferredDisplayListRecorder.h
  function class (line 38) | class SK_API SkDeferredDisplayListRecorder {

FILE: include/core/SkDeque.h
  type Block (line 62) | struct Block
  type IterStart (line 67) | enum IterStart {
  function class (line 90) | class F2BIter : private Iter {

FILE: include/core/SkDocument.h
  type IXpsOMObjectFactory (line 22) | struct IXpsOMObjectFactory
  type OptionalTimestamp (line 41) | struct OptionalTimestamp {
  type SkRefCnt (line 212) | typedef SkRefCnt INHERITED;

FILE: include/core/SkDrawFilter.h
  type Type (line 28) | enum Type {

FILE: include/core/SkDrawLooper.h
  type SkRect (line 22) | struct SkRect
  function virtual (line 44) | virtual ~Context() {}
  type BlurShadowRec (line 82) | struct BlurShadowRec {
  function SkFlattenable (line 101) | static SkFlattenable::Type GetFlattenableType() {
  type SkFlattenable (line 127) | typedef SkFlattenable INHERITED;

FILE: include/core/SkDrawable.h
  type SkRect (line 17) | struct SkRect
  function SkFlattenable (line 63) | static SkFlattenable::Type GetFlattenableType() {

FILE: include/core/SkEncodedImageFormat.h
  type class (line 16) | enum class

FILE: include/core/SkExecutor.h
  function class (line 14) | class SkExecutor {

FILE: include/core/SkFilterQuality.h
  type SkFilterQuality (line 17) | enum SkFilterQuality {

FILE: include/core/SkFlattenable.h
  type SkSerialProcs (line 17) | struct SkSerialProcs
  type SkDeserialProcs (line 18) | struct SkDeserialProcs
  type Type (line 28) | enum Type {
  type sk_sp (line 43) | typedef sk_sp<SkFlattenable> (*Factory)(SkReadBuffer&);
  function virtual (line 61) | virtual const char* getTypeName() const { return FactoryToName(getFactor...
  type SkRefCnt (line 101) | typedef SkRefCnt INHERITED;

FILE: include/core/SkFont.h
  type SkTextEncoding (line 17) | enum SkTextEncoding {
  function class (line 65) | class SkFont : public SkRefCnt {

FILE: include/core/SkFontArguments.h
  function setCollectionIndex (line 15) | struct SkFontArguments {
  function Axis (line 67) | const Axis* getAxes(int* axisCount) const {

FILE: include/core/SkFontLCDConfig.h
  function class (line 13) | class SK_API SkFontLCDConfig {

FILE: include/core/SkFontStyle.h
  function class (line 13) | class SK_API SkFontStyle {
  function SkFontStyle (line 63) | static constexpr SkFontStyle Normal() {
  function SkFontStyle (line 66) | static constexpr SkFontStyle Bold() {
  function SkFontStyle (line 69) | static constexpr SkFontStyle Italic() {
  function SkFontStyle (line 72) | static constexpr SkFontStyle BoldItalic() {

FILE: include/core/SkGraphics.h
  function class (line 17) | class SK_API SkGraphics {
  function class (line 178) | class SkAutoGraphics {

FILE: include/core/SkICC.h
  type SkColorSpaceTransferFn (line 14) | struct SkColorSpaceTransferFn
  function namespace (line 18) | namespace SkICC {

FILE: include/core/SkImage.h
  function sk_sp (line 183) | static sk_sp<SkImage> MakeFromTexture(GrContext* context,
  function BitDepth (line 348) | enum class BitDepth {

FILE: include/core/SkImageEncoder.h
  function SkEncodeImage (line 41) | inline bool SkEncodeImage(SkWStream* dst, const SkBitmap& src, SkEncoded...

FILE: include/core/SkImageFilter.h
  type SkIPoint (line 24) | struct SkIPoint
  type SkImageFilterCacheKey (line 27) | struct SkImageFilterCacheKey
  function SkColorSpace (line 46) | SkColorSpace* colorSpace() const { return fColorSpace; }
  function class (line 54) | class Context {
  function class (line 86) | class CropRect {
  type TileUsage (line 120) | enum TileUsage {
  type MapDirection (line 144) | enum MapDirection {
  function isColorFilterNode (line 180) | bool isColorFilterNode(SkColorFilter** filterPtr) const {
  function asColorFilter (line 185) | bool asColorFilter(SkColorFilter** filterPtr) const {
  function SkImageFilter (line 208) | SkImageFilter* getInput(int i) const {
  function canHandleComplexCTM (line 243) | bool canHandleComplexCTM() const;
  function flatten (line 309) | void flatten(SkWriteBuffer&) const override;
  type SkFlattenable (line 475) | typedef SkFlattenable INHERITED;

FILE: include/core/SkImageGenerator.h
  function isValid (line 57) | bool isValid(GrContext* context) const {
  type Options (line 85) | struct Options {
  function virtual (line 177) | virtual sk_sp<SkData> onRefEncodedData() { return nullptr; }
  function virtual (line 178) | virtual bool onGetPixels(const SkImageInfo&, void*, size_t, const Option...
  function virtual (line 179) | virtual bool onIsValid(GrContext*) const { return true; }
  function virtual (line 180) | virtual bool onQueryYUV8(SkYUVSizeInfo*, SkYUVColorSpace*) const { retur...
  function virtual (line 181) | virtual bool onGetYUV8Planes(const SkYUVSizeInfo&, void*[3] /*planes*/) ...
  type class (line 184) | enum class

FILE: include/core/SkImageInfo.h
  type SkAlphaType (line 35) | enum SkAlphaType {
  function SkAlphaTypeIsOpaque (line 54) | static inline bool SkAlphaTypeIsOpaque(SkAlphaType at) {
  type SkColorType (line 72) | enum SkColorType {
  type SkYUVColorSpace (line 162) | enum SkYUVColorSpace {
  function SkImageInfo (line 179) | struct SK_API SkImageInfo {
  function SkImageInfo (line 290) | static SkImageInfo MakeN32Premul(const SkISize& size) {
  function SkImageInfo (line 301) | static SkImageInfo MakeA8(int width, int height) {
  function SkImageInfo (line 315) | static SkImageInfo MakeUnknown(int width, int height) {
  function SkImageInfo (line 327) | static SkImageInfo MakeUnknown() {
  function SkColorSpace (line 366) | SkColorSpace* colorSpace() const { return fColorSpace.get(); }
  function SkISize (line 402) | SkISize dimensions() const { return SkISize::Make(fWidth, fHeight); }
  function SkImageInfo (line 427) | SkImageInfo makeWH(int newWidth, int newHeight) const {
  function SkImageInfo (line 442) | SkImageInfo makeAlphaType(SkAlphaType newAlphaType) const {
  function SkImageInfo (line 456) | SkImageInfo makeColorType(SkColorType newColorType) const {
  function SkImageInfo (line 466) | SkImageInfo makeColorSpace(sk_sp<SkColorSpace> cs) const {
  function bytesPerPixel (line 475) | int bytesPerPixel() const;
  function ByteSizeOverflowed (line 571) | static bool ByteSizeOverflowed(size_t byteSize) {
  function validRowBytes (line 580) | bool validRowBytes(size_t rowBytes) const {
  function reset (line 588) | void reset() {

FILE: include/core/SkMallocPixelRef.h
  type SkPixelRef (line 85) | typedef SkPixelRef INHERITED;

FILE: include/core/SkMaskFilter.h
  type SkRect (line 17) | struct SkRect
  function SkFlattenable (line 64) | static SkFlattenable::Type GetFlattenableType() {

FILE: include/core/SkMath.h
  function sk_64_mul (line 20) | static inline int64_t sk_64_mul(int64_t a, int64_t b) {
  function SkMulDiv (line 31) | static inline int32_t SkMulDiv(int32_t numer1, int32_t numer2, int32_t d...
  function SkClampPos (line 50) | static inline int SkClampPos(int value) {
  function SkClampMax (line 60) | static inline int SkClampMax(int value, int max) {
  function SkIsPow2 (line 76) | inline bool SkIsPow2(T value) {
  function SkMul16ShiftRound (line 86) | static inline unsigned SkMul16ShiftRound(U16CPU a, U16CPU b, int shift) {
  function U8CPU (line 98) | static inline U8CPU SkMulDiv255Round(U16CPU a, U16CPU b) {
  function SkTDivMod (line 109) | void SkTDivMod(In numer, In denom, Out* div, Out* mod) {

FILE: include/core/SkMatrix.h
  type SkRSXform (line 14) | struct SkRSXform
  type SkPoint3 (line 15) | struct SkPoint3
  function SK_API (line 32) | SK_API SkMatrix {
  function SkMatrix (line 60) | static SkMatrix SK_WARN_UNUSED_RESULT MakeScale(SkScalar scale) {
  function SkMatrix (line 76) | static SkMatrix SK_WARN_UNUSED_RESULT MakeTrans(SkScalar dx, SkScalar dy) {
  function SkMatrix (line 99) | static SkMatrix SK_WARN_UNUSED_RESULT MakeAll(SkScalar scaleX, SkScalar ...
  type TypeMask (line 111) | enum TypeMask {
  function SkScalar (line 296) | SkScalar operator[](int index) const {
  function SkScalar (line 308) | SkScalar get(int index) const {
  function set (line 392) | void set(int index, SkScalar value) {
  function setScaleX (line 402) | void setScaleX(SkScalar v) { this->set(kMScaleX, v); }
  function setScaleY (line 408) | void setScaleY(SkScalar v) { this->set(kMScaleY, v); }
  function setSkewY (line 414) | void setSkewY(SkScalar v) { this->set(kMSkewY, v); }
  function setSkewX (line 420) | void setSkewX(SkScalar v) { this->set(kMSkewX, v); }
  function setTranslateX (line 426) | void setTranslateX(SkScalar v) { this->set(kMTransX, v); }
  function setTranslateY (line 432) | void setTranslateY(SkScalar v) { this->set(kMTransY, v); }
  function setPerspX (line 439) | void setPerspX(SkScalar v) { this->set(kMPersp0, v); }
  function setPerspY (line 446) | void setPerspY(SkScalar v) { this->set(kMPersp1, v); }
  function setAll (line 464) | void setAll(SkScalar scaleX, SkScalar skewX,  SkScalar transX,
  function get9 (line 485) | void get9(SkScalar buffer[9]) const {
  function setIdentity (line 527) | void setIdentity() { this->reset(); }
  function setTranslate (line 540) | void setTranslate(const SkVector& v) { this->setTranslate(v.fX, v.fY); }
  type ScaleToFit (line 1071) | enum ScaleToFit {
  function SkMatrix (line 1110) | static SkMatrix MakeRectToRect(const SkRect& src, const SkRect& dst, Sca...
  function invert (line 1139) | bool SK_WARN_UNUSED_RESULT invert(SkMatrix* inverse) const {
  function mapPoints (line 1216) | void mapPoints(SkPoint dst[], const SkPoint src[], int count) const {
  function mapPoints (line 1246) | void mapPoints(SkPoint pts[], int count) const {
  function mapXY (line 1285) | void mapXY(SkScalar x, SkScalar y, SkPoint* result) const {
  function SkPoint (line 1306) | SkPoint mapXY(SkScalar x, SkScalar y) const {
  function mapVectors (line 1364) | void mapVectors(SkVector vecs[], int count) const {
  function mapVector (line 1385) | void mapVector(SkScalar dx, SkScalar dy, SkVector* result) const {
  function SkVector (line 1407) | SkVector mapVector(SkScalar dx, SkScalar dy) const {
  function mapRect (line 1432) | bool mapRect(SkRect* rect) const {
  function SkRect (line 1441) | SkRect mapRect(const SkRect& src) const {
  function mapRectToQuad (line 1472) | void mapRectToQuad(SkPoint dst[4], const SkRect& rect) const {
  function cheapEqualTo (line 1529) | bool cheapEqualTo(const SkMatrix& m) const {
  function SkMatrix (line 1656) | static SkMatrix Concat(const SkMatrix& a, const SkMatrix& b) {
  function dirtyMatrixTypeCache (line 1665) | void dirtyMatrixTypeCache() {
  function setScaleTranslate (line 1680) | void setScaleTranslate(SkScalar sx, SkScalar sy, SkScalar tx, SkScalar t...
  function computeTypeMask (line 1742) | uint8_t computeTypeMask() const;
  function clearTypeMask (line 1758) | void clearTypeMask(int mask) {
  function updateTranslateMask (line 1782) | inline void updateTranslateMask() {
  function MapXYProc (line 1793) | static MapXYProc GetMapXYProc(TypeMask mask) {
  function MapPtsProc (line 1805) | static MapPtsProc GetMapPtsProc(TypeMask mask) {

FILE: include/core/SkMatrix44.h
  type SkMScalar (line 20) | typedef double SkMScalar;
  function SkFloatToMScalar (line 22) | static inline double SkFloatToMScalar(float x) {
  function SkMScalarToFloat (line 25) | static inline float SkMScalarToFloat(double x) {
  function SkDoubleToMScalar (line 28) | static inline double SkDoubleToMScalar(double x) {
  function SkMScalarToDouble (line 31) | static inline double SkMScalarToDouble(double x) {
  function SkMScalarAbs (line 34) | static inline double SkMScalarAbs(double x) {
  type SkMScalar (line 52) | typedef float SkMScalar;
  function SkFloatToMScalar (line 54) | static inline float SkFloatToMScalar(float x) {
  function SkMScalarToFloat (line 57) | static inline float SkMScalarToFloat(float x) {
  function SkDoubleToMScalar (line 60) | static inline float SkDoubleToMScalar(double x) {
  function SkMScalarToDouble (line 63) | static inline double SkMScalarToDouble(float x) {
  function SkMScalarAbs (line 66) | static inline float SkMScalarAbs(float x) {
  function SkVector4 (line 90) | struct SkVector4 {
  function equals (line 118) | bool equals(SkScalar x, SkScalar y, SkScalar z, SkScalar w = SK_Scalar1) {
  function set (line 123) | void set(SkScalar x, SkScalar y, SkScalar z, SkScalar w = SK_Scalar1) {
  type Uninitialized_Constructor (line 140) | enum Uninitialized_Constructor {
  type Identity_Constructor (line 143) | enum Identity_Constructor {
  function SkMatrix44 (line 147) | SkMatrix44(Uninitialized_Constructor) {}
  function SkMatrix44 (line 149) | constexpr SkMatrix44(Identity_Constructor)

FILE: include/core/SkMetaData.h
  function class (line 17) | class SK_API SkMetaData {

FILE: include/core/SkMultiPictureDraw.h
  function class (line 24) | class SK_API SkMultiPictureDraw {

FILE: include/core/SkOverdrawCanvas.h
  type SkCanvasVirtualEnforcer (line 71) | typedef SkCanvasVirtualEnforcer<SkNWayCanvas> INHERITED;

FILE: include/core/SkPaint.h
  type SkRect (line 23) | struct SkRect
  type SkPoint (line 29) | struct SkPoint
  function class (line 62) | class SK_API SkPaint {
  type Cap (line 550) | enum Cap {
  type Join (line 575) | enum Join {
  function getFillPath (line 634) | bool getFillPath(const SkPath& src, SkPath* dst) const {
  function SkShader (line 644) | SkShader* getShader() const { return fShader.get(); }
  function SkColorFilter (line 668) | SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
  function setBlendMode (line 704) | void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; }
  function SkPathEffect (line 711) | SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
  function SkMaskFilter (line 734) | SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
  function SkTypeface (line 759) | SkTypeface* getTypeface() const { return fTypeface.get(); }
  function SkImageFilter (line 780) | SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
  function SkDrawLooper (line 804) | SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
  function SkDrawLooper (line 816) | SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
  type Align (line 851) | enum Align {
  type TextEncoding (line 935) | enum TextEncoding {
  type FontMetrics (line 976) | struct FontMetrics {
  function hasUnderlinePosition (line 1029) | bool hasUnderlinePosition(SkScalar* position) const {
  function hasStrikeoutThickness (line 1044) | bool hasStrikeoutThickness(SkScalar* thickness) const {
  function hasStrikeoutPosition (line 1059) | bool hasStrikeoutPosition(SkScalar* position) const {
  function SkScalar (line 1182) | SkScalar measureText(const void* text, size_t length) const {
  function SkRect (line 1403) | const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) con...
  function SkRect (line 1427) | const SkRect& computeFastStrokeBounds(const SkRect& orig,

FILE: include/core/SkPath.h
  function class (line 37) | class SK_API SkPath {
  function class (line 1422) | class SK_API RawIter {
  function setPath (line 1445) | void setPath(const SkPath& path) {
  function Verb (line 1456) | Verb next(SkPoint pts[4]) {

FILE: include/core/SkPathEffect.h
  function class (line 75) | class PointData {
  type DashType (line 129) | enum DashType {
  type DashInfo (line 134) | struct DashInfo {
  type SkFlattenable (line 180) | typedef SkFlattenable INHERITED;

FILE: include/core/SkPathMeasure.h
  type SkConic (line 14) | struct SkConic
  type MatrixFlags (line 50) | enum MatrixFlags {
  type Segment (line 94) | struct Segment {

FILE: include/core/SkPicture.h
  type SkDeserialProcs (line 18) | struct SkDeserialProcs
  type SkSerialProcs (line 23) | struct SkSerialProcs
  type SkPictInfo (line 28) | struct SkPictInfo
  function class (line 66) | class SK_API AbortCallback {
  function virtual (line 85) | virtual SkRect cullRect() const = 0;

FILE: include/core/SkPictureRecorder.h
  function namespace (line 16) | namespace android {
  type RecordFlags (line 34) | enum RecordFlags {
  type FinishFlags (line 40) | enum FinishFlags {
  type SkNoncopyable (line 121) | typedef SkNoncopyable INHERITED;

FILE: include/core/SkPixelRef.h
  type SkIRect (line 22) | struct SkIRect
  type GenIDChangeListener (line 86) | struct GenIDChangeListener {
  function notifyAddedToCache (line 96) | void notifyAddedToCache() {
  function virtual (line 100) | virtual SkDiscardableMemory* diagnostic_only_getDiscardable() const { re...
  type Mutability (line 124) | enum Mutability {
  type SkRefCnt (line 146) | typedef SkRefCnt INHERITED;

FILE: include/core/SkPixmap.h
  type SkMask (line 16) | struct SkMask
  function class (line 30) | class SK_API SkPixmap {

FILE: include/core/SkPngChunkReader.h
  function class (line 21) | class SkPngChunkReader : public SkRefCnt {

FILE: include/core/SkPoint.h
  type SkIPoint (line 15) | struct SkIPoint
  type SkIPoint (line 16) | typedef SkIPoint SkIVector;
  function x (line 21) | struct SkIPoint {
  function set (line 58) | void set(int32_t x, int32_t y) {
  type SkPoint (line 145) | struct SkPoint
  type SK_API (line 151) | struct SK_API
  function SkPoint (line 161) | static constexpr SkPoint Make(SkScalar x, SkScalar y) {
  function set (line 188) | void set(SkScalar x, SkScalar y) {
  function iset (line 202) | void iset(int32_t x, int32_t y) {
  function iset (line 215) | void iset(const SkIPoint& p) {
  function setAbs (line 224) | void setAbs(const SkPoint& pt) {
  function Offset (line 235) | static void Offset(SkPoint points[], int count, const SkVector& offset) {
  function Offset (line 246) | static void Offset(SkPoint points[], int count, SkScalar dx, SkScalar dy) {
  function offset (line 257) | void offset(SkScalar dx, SkScalar dy) {
  function SkScalar (line 270) | SkScalar length() const { return SkPoint::Length(fX, fY); }
  function scale (line 331) | void scale(SkScalar value) { this->scale(value, this); }
  function negate (line 335) | void negate() {
  function SkScalar (line 490) | static SkScalar Distance(const SkPoint& a, const SkPoint& b) {
  function SkScalar (line 500) | static SkScalar DotProduct(const SkVector& a, const SkVector& b) {
  function SkScalar (line 514) | static SkScalar CrossProduct(const SkVector& a, const SkVector& b) {
  function SkScalar (line 527) | SkScalar cross(const SkVector& vec) const {
  function SkScalar (line 536) | SkScalar dot(const SkVector& vec) const {

FILE: include/core/SkPoint3.h
  function SkPoint3 (line 13) | struct SK_API SkPoint3 {
  type SkPoint3 (line 139) | typedef SkPoint3 SkVector3;
  type SkPoint3 (line 140) | typedef SkPoint3 SkColor3f;

FILE: include/core/SkPostConfig.h
  function SkNO_RETURN_HINT (line 104) | static inline void SkNO_RETURN_HINT() {}

FILE: include/core/SkRRect.h
  function class (line 49) | class SK_API SkRRect {

FILE: include/core/SkRSXform.h
  function MakeFromRadians (line 21) | struct SkRSXform {
  function setIdentity (line 49) | void setIdentity() {
  function set (line 54) | void set(SkScalar scos, SkScalar ssin, SkScalar tx, SkScalar ty) {
  function toQuad (line 62) | void toQuad(const SkSize& size, SkPoint quad[4]) const {

FILE: include/core/SkRWBuffer.h
  type SkBufferBlock (line 13) | struct SkBufferBlock
  type SkBufferHead (line 14) | struct SkBufferHead
  function size (line 46) | size_t size() const;

FILE: include/core/SkRasterHandleAllocator.h
  function class (line 36) | class SK_API SkRasterHandleAllocator {

FILE: include/core/SkRect.h
  type SkRect (line 16) | struct SkRect
  type SK_API (line 25) | struct SK_API
  function SkIRect (line 45) | static SkIRect SK_WARN_UNUSED_RESULT MakeLargest() {
  function SkIRect (line 57) | static constexpr SkIRect SK_WARN_UNUSED_RESULT MakeWH(int32_t w, int32_t...
  type SK_API (line 675) | struct SK_API
  function SkRect (line 695) | static SkRect SK_WARN_UNUSED_RESULT MakeLargest() {
  function SkRect (line 724) | static SkRect SK_WARN_UNUSED_RESULT MakeIWH(int w, int h) {
  function SkRect (line 749) | static constexpr SkRect SK_WARN_UNUSED_RESULT MakeLTRB(SkScalar l, SkSca...
  function contains (line 1563) | inline bool SkIRect::contains(const SkRect& r) const {

FILE: include/core/SkRefCnt.h
  function virtual (line 38) | virtual ~SkRefCntBase() {
  type SkNoncopyable (line 118) | typedef SkNoncopyable INHERITED;
  function T (line 175) | inline T* SkRef(T* obj) {
  function T (line 183) | inline T* SkSafeRef(T* obj) {
  function SkSafeUnref (line 192) | inline void SkSafeUnref(T* obj) {
  function SkSafeSetNull (line 198) | inline void SkSafeSetNull(T*& obj) {
  function fPtr (line 252) | constexpr sk_sp(std::nullptr_t) : fPtr(nullptr) {}
  function explicit (line 275) | explicit sk_sp(T* obj) : fPtr(obj) {}

FILE: include/core/SkRegion.h
  function namespace (line 18) | namespace android {
  function class (line 30) | class SK_API SkRegion {

FILE: include/core/SkScalar.h
  type SkScalar (line 16) | typedef float SkScalar;
  function SkScalarIsNaN (line 67) | static inline bool SkScalarIsNaN(SkScalar x) { return x != x; }
  function SkScalarIsFinite (line 71) | static inline bool SkScalarIsFinite(SkScalar x) { return sk_float_isfini...
  function SkScalarsAreFinite (line 73) | static inline bool SkScalarsAreFinite(SkScalar a, SkScalar b) {
  function SkScalarsAreFinite (line 77) | static inline bool SkScalarsAreFinite(const SkScalar array[], int count) {
  function SkDScalarRoundToInt (line 100) | static inline int SkDScalarRoundToInt(SkScalar x) {
  function SkScalar (line 107) | static inline SkScalar SkScalarFraction(SkScalar x) {
  function SkScalar (line 111) | static inline SkScalar SkScalarClampMax(SkScalar x, SkScalar max) {
  function SkScalar (line 117) | static inline SkScalar SkScalarPin(SkScalar x, SkScalar min, SkScalar ma...
  function SkScalar (line 123) | static inline SkScalar SkScalarSquare(SkScalar x) { return x * x; }
  function SkScalar (line 134) | static inline SkScalar SkMaxScalar(SkScalar a, SkScalar b) { return a > ...
  function SkScalar (line 135) | static inline SkScalar SkMinScalar(SkScalar a, SkScalar b) { return a < ...
  function SkScalarIsInt (line 137) | static inline bool SkScalarIsInt(SkScalar x) {
  function SkScalarSignAsInt (line 147) | static inline int SkScalarSignAsInt(SkScalar x) {
  function SkScalar (line 152) | static inline SkScalar SkScalarSignAsScalar(SkScalar x) {
  function SkScalarNearlyZero (line 158) | static inline bool SkScalarNearlyZero(SkScalar x,
  function SkScalarNearlyEqual (line 164) | static inline bool SkScalarNearlyEqual(SkScalar x, SkScalar y,
  function SkScalar (line 176) | static inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t) {
  function SkScalarsEqual (line 197) | static inline bool SkScalarsEqual(const SkScalar a[], const SkScalar b[]...

FILE: include/core/SkSerialProcs.h
  type sk_sp (line 25) | typedef sk_sp<SkData> (*SkSerialPictureProc)(SkPicture*, void* ctx);
  type sk_sp (line 26) | typedef sk_sp<SkData> (*SkSerialImageProc)(SkImage*, void* ctx);
  type sk_sp (line 27) | typedef sk_sp<SkData> (*SkSerialTypefaceProc)(SkTypeface*, void* ctx);
  type sk_sp (line 33) | typedef sk_sp<SkPicture> (*SkDeserialPictureProc)(const void* data, size...
  type sk_sp (line 42) | typedef sk_sp<SkImage> (*SkDeserialImageProc)(const void* data, size_t l...
  type sk_sp (line 48) | typedef sk_sp<SkTypeface> (*SkDeserialTypefaceProc)(const void* data, si...
  function SkSerialProcs (line 50) | struct SK_API SkSerialProcs {
  function SkDeserialProcs (line 61) | struct SK_API SkDeserialProcs {

FILE: include/core/SkShader.h
  type TileMode (line 42) | enum TileMode {
  function SkMatrix (line 73) | const SkMatrix& getLocalMatrix() const;
  type GradientType (line 135) | enum GradientType {
  type GradientInfo (line 145) | struct GradientInfo {
  type ComposeRec (line 161) | struct ComposeRec {
  function virtual (line 166) | virtual bool asACompose(ComposeRec*) const { return false; }

FILE: include/core/SkSize.h
  function MakeEmpty (line 13) | struct SkISize {
  function set (line 21) | void set(int32_t w, int32_t h) { *this = SkISize{w, h}; }
  function Make (line 47) | struct SkSize {
  function SkSize (line 61) | static SkSize MakeEmpty() { return {0, 0}; }
  function equals (line 78) | bool equals(SkScalar w, SkScalar h) const { return fWidth == w && fHeigh...
  function SkISize (line 80) | SkISize toRound() const { return {SkScalarRoundToInt(fWidth), SkScalarRo...
  function SkISize (line 84) | SkISize toFloor() const { return {SkScalarFloorToInt(fWidth), SkScalarFl...

FILE: include/core/SkStream.h
  function skip (line 61) | size_t skip(size_t size) {
  function virtual (line 78) | virtual size_t peek(void* /*buffer*/, size_t /*size*/) const { return 0; }
  function virtual (line 84) | virtual bool isAtEnd() const = 0;
  function readU16 (line 91) | bool SK_WARN_UNUSED_RESULT readU16(uint16_t* i) { return this->readS16((...
  function readU32 (line 92) | bool SK_WARN_UNUSED_RESULT readU32(uint32_t* i) { return this->readS32((...
  function readBool (line 94) | bool SK_WARN_UNUSED_RESULT readBool(bool* b) {
  function virtual (line 107) | virtual bool rewind() { return false; }
  function virtual (line 132) | virtual bool seek(size_t /*position*/) { return false; }
  function virtual (line 138) | virtual bool move(long /*offset*/) { return false; }
  function virtual (line 149) | virtual const void* getMemoryBase() { return nullptr; }
  function virtual (line 153) | virtual SkStream* onFork() const { return nullptr; }
  function getPosition (line 175) | size_t getPosition() const override = 0;
  function write8 (line 236) | bool write8(U8CPU value)   {
  function write16 (line 240) | bool write16(U16CPU value) {
  function write32 (line 244) | bool write32(uint32_t v) {
  function writeText (line 248) | bool writeText(const char text[]) {
  function newline (line 253) | bool newline() { return this->write("\n", strlen("\n")); }
  function writeBool (line 260) | bool writeBool(bool v) { return this->write8(v); }
  function write (line 277) | bool write(const void*, size_t n) override { fBytesWritten += n; return ...
  function flush (line 278) | void flush() override {}
  function std (line 306) | static std::unique_ptr<SkFILEStream> Make(const char path[]) {
  type SkStreamAsset (line 348) | typedef SkStreamAsset INHERITED;
  function isAtEnd (line 392) | bool isAtEnd() const override;
  function flush (line 436) | void flush() override;

FILE: include/core/SkString.h
  function SkStrStartsWith (line 23) | static bool SkStrStartsWith(const char string[], const char prefixStr[]) {
  function SkStrStartsWith (line 28) | static bool SkStrStartsWith(const char string[], const char prefixChar) {
  function SkStrFind (line 38) | static int SkStrFind(const char string[], const char substring[]) {
  function SkStrFindLastOf (line 44) | static int SkStrFindLastOf(const char string[], const char subchar) {
  function SkStrContains (line 50) | static bool SkStrContains(const char string[], const char substring[]) {
  function SkStrContains (line 55) | static bool SkStrContains(const char string[], const char subchar) {
  function class (line 123) | class SK_API SkString {
  function appendU32 (line 207) | void appendU32(uint32_t value) { this->insertU32((size_t)-1, value); }
  function appendScalar (line 210) | void appendScalar(SkScalar value) { this->insertScalar((size_t)-1, value...
  function prepend (line 212) | void prepend(const SkString& str) { this->insert(0, str); }
  function prepend (line 213) | void prepend(const char text[]) { this->insert(0, text); }
  function prepend (line 214) | void prepend(const char text[], size_t len) { this->insert(0, text, len); }
  function prependUnichar (line 215) | void prependUnichar(SkUnichar uni) { this->insertUnichar(0, uni); }
  function prependS32 (line 216) | void prependS32(int32_t value) { this->insertS32(0, value); }
  function prependScalar (line 219) | void prependScalar(SkScalar value) { this->insertScalar((size_t)-1, valu...
  type Rec (line 240) | struct Rec {
  function unref (line 254) | void unref() const;
  function SkString (line 275) | static inline SkString SkStringPrintf() { return SkString(); }
  function SkTSwap (line 279) | inline void SkTSwap(SkString& a, SkString& b) {
  type SkStrSplitMode (line 283) | enum SkStrSplitMode {
  function SkStrSplit (line 297) | inline void SkStrSplit(const char* str, const char* delimiters, SkTArray...

FILE: include/core/SkStrokeRec.h
  function SK_BEGIN_REQUIRE_DENSE (line 15) | SK_BEGIN_REQUIRE_DENSE
  function hasEqualEffect (line 121) | bool hasEqualEffect(const SkStrokeRec& other) const {

FILE: include/core/SkSurface.h
  function sk_sp (line 319) | static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted ...
  function sk_sp (line 340) | static sk_sp<SkSurface> MakeRenderTarget(GrContext* context, SkBudgeted ...
  type ContentChangeMode (line 393) | enum ContentChangeMode {
  type BackendHandleAccess (line 408) | enum BackendHandleAccess {
  function dirtyGenerationID (line 712) | void dirtyGenerationID() {
  type SkRefCnt (line 722) | typedef SkRefCnt INHERITED;

FILE: include/core/SkSurfaceCharacterization.h
  type class (line 31) | enum class
  function MipMapped (line 32) | enum class MipMapped : bool { kNo = false, kYes = true };
  function class (line 153) | class SK_API SkSurfaceCharacterization {

FILE: include/core/SkSurfaceProps.h
  type SkPixelGeometry (line 18) | enum SkPixelGeometry {
  function SkPixelGeometryIsRGB (line 27) | static inline bool SkPixelGeometryIsRGB(SkPixelGeometry geo) {
  function SkPixelGeometryIsBGR (line 32) | static inline bool SkPixelGeometryIsBGR(SkPixelGeometry geo) {
  function SkPixelGeometryIsH (line 37) | static inline bool SkPixelGeometryIsH(SkPixelGeometry geo) {
  function SkPixelGeometryIsV (line 42) | static inline bool SkPixelGeometryIsV(SkPixelGeometry geo) {
  function class (line 51) | class SK_API SkSurfaceProps {

FILE: include/core/SkTLazy.h
  function explicit (line 24) | explicit SkTLazy(const T* src)
  function fPtr (line 27) | SkTLazy(const SkTLazy& that) : fPtr(nullptr) { *this = that; }
  function fPtr (line 28) | fPtr(nullptr) { *this = std::move(that); }
  function T (line 74) | T* set(const T& src) {
  function reset (line 95) | void reset() {
  function T (line 112) | T* get() const { SkASSERT(this->isValid()); return fPtr; }
  function T (line 118) | T* getMaybeNull() const { return fPtr; }
  function explicit (line 153) | explicit SkTCopyOnFirstWrite(const T* initial) : fObj(initial) {}
  function fObj (line 156) | fObj(nullptr) {}
  function init (line 174) | void init(const T& initial) {
  function T (line 183) | T* writable() {
  function T (line 192) | const T* get() const { return fObj; }
  function T (line 198) | const T *operator->() const { return fObj; }
  function operator (line 200) | operator const T*() const { return fObj; }

FILE: include/core/SkTextBlob.h
  type SkSerialProcs (line 20) | struct SkSerialProcs
  type SkDeserialProcs (line 21) | struct SkDeserialProcs
  type sk_sp (line 24) | typedef sk_sp<SkTypeface> (*SkTypefaceResolverProc)(uint32_t id, void* c...
  type GlyphPositioning (line 56) | enum GlyphPositioning : uint8_t {
  function notifyAddedToCache (line 109) | void notifyAddedToCache(uint32_t cacheID) const {
  type SkRefCnt (line 126) | typedef SkRefCnt INHERITED;
  function class (line 133) | class SK_API SkTextBlobBuilder {

FILE: include/core/SkTime.h
  function class (line 20) | class SK_API SkTime {
  function class (line 44) | class SkAutoTime {

FILE: include/core/SkTraceMemoryDump.h
  function class (line 20) | class SK_API SkTraceMemoryDump {

FILE: include/core/SkTypeface.h
  type SkAdvancedTypefaceMetrics (line 25) | struct SkAdvancedTypefaceMetrics
  type SkScalerContextEffects (line 26) | struct SkScalerContextEffects
  type SkScalerContextRec (line 27) | struct SkScalerContextRec
  type SkFontID (line 29) | typedef uint32_t SkFontID;
  type SkFontTableTag (line 31) | typedef uint32_t SkFontTableTag;
  type Encoding (line 132) | enum Encoding {
  type LocalizedString (line 231) | struct LocalizedString {
  function class (line 235) | class LocalizedStrings : ::SkNoncopyable {
  function SkRect (line 283) | SkRect getBounds() const;
  function setIsFixedPitch (line 305) | void setIsFixedPitch(bool isFixedPitch) { fIsFixedPitch = isFixedPitch; }
  function setFontStyle (line 307) | void setFontStyle(SkFontStyle style) { fStyle = style; }
  function virtual (line 315) | virtual std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics(...
  type Style (line 367) | enum Style {
  type SkWeakRefCnt (line 386) | typedef SkWeakRefCnt INHERITED;

FILE: include/core/SkTypes.h
  type float32_t (line 25) | typedef float float32_t;
  type S8CPU (line 150) | typedef int S8CPU;
  type U8CPU (line 156) | typedef unsigned U8CPU;
  type S16CPU (line 162) | typedef int S16CPU;
  type U16CPU (line 168) | typedef unsigned U16CPU;
  type SkBool8 (line 173) | typedef uint8_t SkBool8;
  function D (line 176) | D SkTo(S s) {
  function SkLeftShift (line 207) | static inline int32_t SkLeftShift(int32_t value, int32_t shift) {
  function SkLeftShift (line 211) | static inline int64_t SkLeftShift(int64_t value, int32_t shift) {
  type SkFourByteTag (line 246) | typedef uint32_t SkFourByteTag;
  type SkUnichar (line 251) | typedef int32_t SkUnichar;
  type SkGlyphID (line 255) | typedef uint16_t SkGlyphID;
  type SkMSec (line 260) | typedef uint32_t SkMSec;
  function Sk32ToBool (line 288) | static inline constexpr int Sk32ToBool(uint32_t n) {
  function SkTSwap (line 294) | inline void SkTSwap(T& a, T& b) {
  function SkAbs32 (line 300) | static inline int32_t SkAbs32(int32_t value) {
  function T (line 308) | inline T SkTAbs(T value) {
  function SkMax32 (line 315) | static inline int32_t SkMax32(int32_t a, int32_t b) {
  function SkMin32 (line 321) | static inline int32_t SkMin32(int32_t a, int32_t b) {
  function SkSign32 (line 335) | static inline int32_t SkSign32(int32_t a) {
  function SkFastMin32 (line 339) | static inline int32_t SkFastMin32(int32_t value, int32_t max) {
  function T (line 347) | constexpr const T& SkTPin(const T& value, const T& min, const T& max) {
  type class (line 357) | enum class
  type class (line 366) | enum class
  function class (line 399) | class SK_API SkNoncopyable {

FILE: include/core/SkUnPreMultiply.h
  function class (line 18) | class SK_API SkUnPreMultiply {

FILE: include/core/SkVertices.h
  type VertexMode (line 22) | enum VertexMode {
  function sk_sp (line 41) | static sk_sp<SkVertices> MakeCopy(VertexMode mode, int vertexCount,
  type Sizes (line 48) | struct Sizes
  type BuilderFlags (line 50) | enum BuilderFlags {
  function class (line 54) | class Builder {

FILE: include/core/SkYUVSizeInfo.h
  type SkYUVSizeInfo (line 13) | struct SkYUVSizeInfo {

FILE: include/effects/Sk1DPathEffect.h
  type Style (line 45) | enum Style {

FILE: include/effects/Sk2DPathEffect.h
  type SkPathEffect (line 54) | typedef SkPathEffect INHERITED;
  type Sk2DPathEffect (line 88) | typedef Sk2DPathEffect INHERITED;
  type Sk2DPathEffect (line 117) | typedef Sk2DPathEffect INHERITED;

FILE: include/effects/SkAlphaThresholdFilter.h
  function class (line 15) | class SK_API SkAlphaThresholdFilter {

FILE: include/effects/SkArithmeticImageFilter.h
  function class (line 13) | class SK_API SkArithmeticImageFilter {

FILE: include/effects/SkBlurDrawLooper.h
  function namespace (line 18) | namespace SkBlurDrawLooper {

FILE: include/effects/SkBlurImageFilter.h
  function class (line 13) | class SK_API SkBlurImageFilter {

FILE: include/effects/SkBlurMaskFilter.h
  function class (line 19) | class SK_API SkBlurMaskFilter {

FILE: include/effects/SkColorFilterImageFilter.h
  type SkImageFilter (line 44) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkColorMatrix.h
  function class (line 13) | class SK_API SkColorMatrix {

FILE: include/effects/SkComposeImageFilter.h
  type SkImageFilter (line 40) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkCornerPathEffect.h
  type SkPathEffect (line 50) | typedef SkPathEffect INHERITED;

FILE: include/effects/SkDashPathEffect.h
  function class (line 13) | class SK_API SkDashPathEffect {

FILE: include/effects/SkDiscretePathEffect.h
  type SkPathEffect (line 61) | typedef SkPathEffect INHERITED;

FILE: include/effects/SkDisplacementMapEffect.h
  type ChannelSelectorType (line 15) | enum ChannelSelectorType {
  type SkImageFilter (line 63) | typedef SkImageFilter INHERITED;
  function SkImageFilter (line 64) | const SkImageFilter* getDisplacementInput() const { return getInput(0); }
  function SkImageFilter (line 65) | const SkImageFilter* getColorInput() const { return getInput(1); }

FILE: include/effects/SkDropShadowImageFilter.h
  type ShadowMode (line 18) | enum ShadowMode {
  type SkImageFilter (line 56) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkGradientShader.h
  function class (line 18) | class SK_API SkGradientShader {

FILE: include/effects/SkHighContrastFilter.h
  type SkHighContrastConfig (line 19) | struct SkHighContrastConfig {
  function class (line 76) | class SK_API SkHighContrastFilter {

FILE: include/effects/SkImageSource.h
  type SkImageFilter (line 52) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkLayerDrawLooper.h
  type Bits (line 27) | enum Bits {
  type BitFlags (line 45) | typedef int32_t BitFlags;
  function LayerInfo (line 58) | struct SK_API LayerInfo {
  type Rec (line 91) | struct Rec {
  function class (line 100) | class LayerDrawLooperContext : public SkDrawLooper::Context {
  type SkDrawLooper (line 113) | typedef SkDrawLooper INHERITED;
  function addLayer (line 136) | void addLayer() { this->addLayer(0, 0); }

FILE: include/effects/SkLightingImageFilter.h
  type SkPoint3 (line 16) | struct SkPoint3
  function flatten (line 49) | void flatten(SkWriteBuffer&) const override;
  function sk_sp (line 51) | inline sk_sp<const SkImageFilterLight> refLight() const;
  type SkImageFilter (line 59) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkLumaColorFilter.h
  type SkColorFilter (line 53) | typedef SkColorFilter INHERITED;

FILE: include/effects/SkMagnifierImageFilter.h
  type SkImageFilter (line 43) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkMatrixConvolutionImageFilter.h
  type TileMode (line 28) | enum TileMode {
  type SkImageFilter (line 129) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkMergeImageFilter.h
  type SkImageFilter (line 44) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkMorphologyImageFilter.h
  type Op (line 34) | enum Op {
  function virtual (line 39) | virtual Op op() const = 0;
  type SkMorphologyImageFilter (line 104) | typedef SkMorphologyImageFilter INHERITED;

FILE: include/effects/SkOffsetImageFilter.h
  type SkImageFilter (line 42) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkOverdrawColorFilter.h
  function sk_sp (line 26) | static sk_sp<SkOverdrawColorFilter> Make(const SkPMColor colors[kNumColo...
  type SkColorFilter (line 53) | typedef SkColorFilter INHERITED;

FILE: include/effects/SkPaintImageFilter.h
  type SkImageFilter (line 47) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkPerlinNoiseShader.h
  function class (line 25) | class SK_API SkPerlinNoiseShader {

FILE: include/effects/SkPictureImageFilter.h
  type SkImageFilter (line 57) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkShaderMaskFilter.h
  function class (line 15) | class SK_API SkShaderMaskFilter {

FILE: include/effects/SkTableColorFilter.h
  function class (line 13) | class SK_API SkTableColorFilter {

FILE: include/effects/SkTableMaskFilter.h
  function class (line 19) | class SK_API SkTableMaskFilter {

FILE: include/effects/SkTileImageFilter.h
  type SkImageFilter (line 51) | typedef SkImageFilter INHERITED;

FILE: include/effects/SkToSRGBColorFilter.h
  type SkColorFilter (line 44) | typedef SkColorFilter INHERITED;

FILE: include/effects/SkTrimPathEffect.h
  function class (line 13) | class SK_API SkTrimPathEffect {

FILE: include/effects/SkXfermodeImageFilter.h
  function class (line 19) | class SK_API SkXfermodeImageFilter {

FILE: include/encode/SkEncoder.h
  function virtual (line 24) | virtual ~SkEncoder() {}

FILE: include/encode/SkJpegEncoder.h
  type class (line 19) | enum class
  function Downsample (line 24) | enum class Downsample {

FILE: include/encode/SkPngEncoder.h
  type class (line 20) | enum class
  type Options (line 30) | struct Options {
  type SkEncoder (line 98) | typedef SkEncoder INHERITED;

FILE: include/encode/SkWebpEncoder.h
  function Compression (line 17) | enum class Compression {

FILE: include/gpu/GrBackendSemaphore.h
  function class (line 22) | class GrBackendSemaphore {

FILE: include/gpu/GrBackendSurface.h
  function class (line 25) | class SK_API GrBackendTexture {
  function class (line 32) | class SK_API GrBackendRenderTarget {
  function class (line 40) | class SK_API GrBackendFormat {
  function class (line 103) | class SK_API GrBackendTexture {
  function class (line 229) | class SK_API GrBackendRenderTarget {

FILE: include/gpu/GrBlend.h
  type GrBlendEquation (line 18) | enum GrBlendEquation {
  type GrBlendCoeff (line 51) | enum GrBlendCoeff {
  function GrBlendCoeffRefsSrc (line 76) | static constexpr bool GrBlendCoeffRefsSrc(const GrBlendCoeff coeff) {
  function GrBlendCoeffRefsDst (line 81) | static constexpr bool GrBlendCoeffRefsDst(const GrBlendCoeff coeff) {
  function GrBlendCoeffRefsSrc2 (line 86) | static constexpr bool GrBlendCoeffRefsSrc2(const GrBlendCoeff coeff) {
  function GrBlendCoeffsUseSrcColor (line 91) | static constexpr bool GrBlendCoeffsUseSrcColor(GrBlendCoeff srcCoeff, Gr...
  function GrBlendCoeffsUseDstColor (line 95) | static constexpr bool GrBlendCoeffsUseDstColor(GrBlendCoeff srcCoeff, Gr...
  function GrBlendEquationIsAdvanced (line 99) | static constexpr bool GrBlendEquationIsAdvanced(GrBlendEquation equation) {
  function GrBlendModifiesDst (line 103) | static constexpr bool GrBlendModifiesDst(GrBlendEquation equation, GrBle...
  function GrBlendAllowsCoverageAsAlpha (line 136) | static constexpr bool GrBlendAllowsCoverageAsAlpha(GrBlendEquation equat...

FILE: include/gpu/GrConfig.h
  type __int64 (line 62) | typedef __int64 int64_t;

FILE: include/gpu/GrContext.h
  type GrDrawOpAtlasConfig (line 29) | struct GrDrawOpAtlasConfig
  type GrGLInterface (line 31) | struct GrGLInterface
  type GrMockOptions (line 35) | struct GrMockOptions
  type GrVkBackendContext (line 51) | struct GrVkBackendContext
  function purgeResourcesNotUsedInMs (line 179) | void purgeResourcesNotUsedInMs(std::chrono::milliseconds msNotUsed) {
  function maxTextureSize (line 213) | int maxTextureSize() const;
  function GrContextPriv (line 279) | const GrContextPriv contextPriv() const;

FILE: include/gpu/GrContextOptions.h
  type GrContextOptions (line 22) | struct GrContextOptions {
  function class (line 39) | class PersistentCache {
  type GrContextOptions (line 240) | struct GrContextOptions {

FILE: include/gpu/GrDriverBugWorkarounds.h
  type GrDriverBugWorkaroundType (line 27) | enum GrDriverBugWorkaroundType {
  function class (line 34) | class SK_API GrDriverBugWorkarounds {

FILE: include/gpu/GrGpuResource.h
  type CntType (line 81) | enum CntType {
  function class (line 184) | class UniqueID {
  function CacheAccess (line 226) | inline const CacheAccess cacheAccess() const;
  function virtual (line 279) | virtual void onRelease() { }
  function virtual (line 283) | virtual void onAbandon() { }
  function didChangeGpuMemorySize (line 289) | void didChangeGpuMemorySize() const;

FILE: include/gpu/GrRenderTarget.h
  function class (line 27) | class GrRenderTarget : virtual public GrSurface {
  type ResolveType (line 95) | enum ResolveType {

FILE: include/gpu/GrResourceKey.h
  function class (line 24) | class GrResourceKey {
  function class (line 168) | class GrScratchKey : public GrResourceKey {
  function class (line 201) | class Builder : public INHERITED::Builder {
  function class (line 222) | class GrUniqueKey : public GrResourceKey {
  function setCustomData (line 253) | void setCustomData(sk_sp<SkData> data) {
  function SkData (line 256) | SkData* getCustomData() const {
  function class (line 262) | class Builder : public INHERITED::Builder {
  function gr_init_static_unique_key_once (line 309) | static inline void gr_init_static_unique_key_once(SkAlignedSTStorage<1,G...
  function class (line 315) | class GrUniqueKeyInvalidatedMessage {

FILE: include/gpu/GrSamplerState.h
  type class (line 18) | enum class
  function WrapMode (line 19) | enum class WrapMode : uint8_t { kClamp, kRepeat, kMirrorRepeat };

FILE: include/gpu/GrSurface.h
  function virtual (line 48) | virtual GrTexture* asTexture() { return nullptr; }
  function virtual (line 49) | virtual const GrTexture* asTexture() const { return nullptr; }
  function virtual (line 54) | virtual GrRenderTarget* asRenderTarget() { return nullptr; }
  function virtual (line 55) | virtual const GrRenderTarget* asRenderTarget() const { return nullptr; }
  function GrSurfacePriv (line 59) | inline const GrSurfacePriv surfacePriv() const;
  function setIsGLTextureRectangleOrExternal (line 74) | void setIsGLTextureRectangleOrExternal() {
  function setHasMixedSamples (line 85) | void setHasMixedSamples() {
  function setSupportsWindowRects (line 91) | void setSupportsWindowRects() {
  function setGLRTFBOIDIs0 (line 99) | void setGLRTFBOIDIs0() {

FILE: include/gpu/GrTexture.h
  function GrTexture (line 25) | const GrTexture* asTexture() const override { return this; }
  function setRelease (line 58) | void setRelease(ReleaseProc proc, ReleaseCtx ctx) {

FILE: include/gpu/GrTypes.h
  function explicit (line 63) | constexpr explicit GrTFlagsMask(int value) : fValue(value) {}
  function GrIDivRoundUp (line 135) | static inline int32_t GrIDivRoundUp(int x, int y) {
  function GrUIDivRoundUp (line 139) | static inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) {
  function GrSizeDivRoundUp (line 142) | static inline size_t GrSizeDivRoundUp(size_t x, size_t y) {
  function GrUIAlignUp (line 152) | static inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) {
  function GrSizeAlignUp (line 155) | static inline size_t GrSizeAlignUp(size_t x, size_t alignment) {
  function GrUIAlignUpPad (line 165) | static inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) {
  function GrSizeAlignUpPad (line 168) | static inline size_t GrSizeAlignUpPad(size_t x, size_t alignment) {
  function GrUIAlignDown (line 175) | static inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) {
  function GrSizeAlignDown (line 178) | static inline size_t GrSizeAlignDown(size_t x, uint32_t alignment) {
  type GrBackend (line 187) | enum GrBackend {
  type class (line 203) | enum class
  type GrSurfaceOrigin (line 214) | enum GrSurfaceOrigin {
  type GrGLBackendState (line 223) | enum GrGLBackendState {
  type class (line 249) | enum class

FILE: include/gpu/gl/GrGLAssembleInterface.h
  type GrGLFuncPtr (line 10) | typedef GrGLFuncPtr (*GrGLGetProc)(void* ctx, const char name[]);

FILE: include/gpu/gl/GrGLExtensions.h
  type GrGLInterface (line 15) | struct GrGLInterface
  function class (line 24) | class SK_API GrGLExtensions {

FILE: include/gpu/gl/GrGLFunctions.h
  type GrGLvoid (line 19) | typedef GrGLvoid (* GrGLActiveTextureProc)(GrGLenum texture);
  type GrGLvoid (line 20) | typedef GrGLvoid (* GrGLAttachShaderProc)(GrGLuint program, GrGLuint sha...
  type GrGLvoid (line 21) | typedef GrGLvoid (* GrGLBeginQueryProc)(GrGLenum target, GrGLuint id);
  type GrGLvoid (line 22) | typedef GrGLvoid (* GrGLBindAttribLocationProc)(GrGLuint program, GrGLui...
  type GrGLvoid (line 23) | typedef GrGLvoid (* GrGLBindBufferProc)(GrGLenum target, GrGLuint buffer);
  type GrGLvoid (line 24) | typedef GrGLvoid (* GrGLBindFramebufferProc)(GrGLenum target, GrGLuint f...
  type GrGLvoid (line 25) | typedef GrGLvoid (* GrGLBindRenderbufferProc)(GrGLenum target, GrGLuint ...
  type GrGLvoid (line 26) | typedef GrGLvoid (* GrGLBindTextureProc)(GrGLenum target, GrGLuint textu...
  type GrGLvoid (line 27) | typedef GrGLvoid (* GrGLBindFragDataLocationProc)(GrGLuint program, GrGL...
  type GrGLvoid (line 28) | typedef GrGLvoid (* GrGLBindFragDataLocationIndexedProc)(GrGLuint progra...
  type GrGLvoid (line 29) | typedef GrGLvoid (* GrGLBindVertexArrayProc)(GrGLuint array);
  type GrGLvoid (line 30) | typedef GrGLvoid (* GrGLBlendBarrierProc)();
  type GrGLvoid (line 31) | typedef GrGLvoid (* GrGLBlendColorProc)(GrGLclampf red, GrGLclampf green...
  type GrGLvoid (line 32) | typedef GrGLvoid (* GrGLBlendEquationProc)(GrGLenum mode);
  type GrGLvoid (line 33) | typedef GrGLvoid (* GrGLBlendFuncProc)(GrGLenum sfactor, GrGLenum dfactor);
  type GrGLvoid (line 34) | typedef GrGLvoid (* GrGLBlitFramebufferProc)(GrGLint srcX0, GrGLint srcY...
  type GrGLvoid (line 35) | typedef GrGLvoid (* GrGLBufferDataProc)(GrGLenum target, GrGLsizeiptr si...
  type GrGLvoid (line 36) | typedef GrGLvoid (* GrGLBufferSubDataProc)(GrGLenum target, GrGLintptr o...
  type GrGLenum (line 37) | typedef GrGLenum (* GrGLCheckFramebufferStatusProc)(GrGLenum target);
  type GrGLvoid (line 38) | typedef GrGLvoid (* GrGLClearProc)(GrGLbitfield mask);
  type GrGLvoid (line 39) | typedef GrGLvoid (* GrGLClearColorProc)(GrGLclampf red, GrGLclampf green...
  type GrGLvoid (line 40) | typedef GrGLvoid (* GrGLClearStencilProc)(GrGLint s);
  type GrGLvoid (line 41) | typedef GrGLvoid (* GrGLClearTexImageProc)(GrGLuint texture, GrGLint lev...
  type GrGLvoid (line 42) | typedef GrGLvoid (* GrGLClearTexSubImageProc)(GrGLuint texture, GrGLint ...
  type GrGLvoid (line 43) | typedef GrGLvoid (* GrGLColorMaskProc)(GrGLboolean red, GrGLboolean gree...
  type GrGLvoid (line 44) | typedef GrGLvoid (* GrGLCompileShaderProc)(GrGLuint shader);
  type GrGLvoid (line 45) | typedef GrGLvoid (* GrGLCompressedTexImage2DProc)(GrGLenum target, GrGLi...
  type GrGLvoid (line 46) | typedef GrGLvoid (* GrGLCompressedTexSubImage2DProc)(GrGLenum target, Gr...
  type GrGLvoid (line 47) | typedef GrGLvoid (* GrGLCopyTexSubImage2DProc)(GrGLenum target, GrGLint ...
  type GrGLuint (line 48) | typedef GrGLuint (* GrGLCreateProgramProc)();
  type GrGLuint (line 49) | typedef GrGLuint (* GrGLCreateShaderProc)(GrGLenum type);
  type GrGLvoid (line 50) | typedef GrGLvoid (* GrGLCullFaceProc)(GrGLenum mode);
  type GrGLvoid (line 51) | typedef GrGLvoid (* GrGLDeleteBuffersProc)(GrGLsizei n, const GrGLuint* ...
  type GrGLvoid (line 52) | typedef GrGLvoid (* GrGLDeleteFramebuffersProc)(GrGLsizei n, const GrGLu...
  type GrGLvoid (line 53) | typedef GrGLvoid (* GrGLDeleteProgramProc)(GrGLuint program);
  type GrGLvoid (line 54) | typedef GrGLvoid (* GrGLDeleteQueriesProc)(GrGLsizei n, const GrGLuint *...
  type GrGLvoid (line 55) | typedef GrGLvoid (* GrGLDeleteRenderbuffersProc)(GrGLsizei n, const GrGL...
  type GrGLvoid (line 56) | typedef GrGLvoid (* GrGLDeleteShaderProc)(GrGLuint shader);
  type GrGLvoid (line 57) | typedef GrGLvoid (* GrGLDeleteTexturesProc)(GrGLsizei n, const GrGLuint*...
  type GrGLvoid (line 58) | typedef GrGLvoid (* GrGLDeleteVertexArraysProc)(GrGLsizei n, const GrGLu...
  type GrGLvoid (line 59) | typedef GrGLvoid (* GrGLDepthMaskProc)(GrGLboolean flag);
  type GrGLvoid (line 60) | typedef GrGLvoid (* GrGLDisableProc)(GrGLenum cap);
  type GrGLvoid (line 61) | typedef GrGLvoid (* GrGLDisableVertexAttribArrayProc)(GrGLuint index);
  type GrGLvoid (line 62) | typedef GrGLvoid (* GrGLDrawArraysProc)(GrGLenum mode, GrGLint first, Gr...
  type GrGLvoid (line 63) | typedef GrGLvoid (* GrGLDrawArraysInstancedProc)(GrGLenum mode, GrGLint ...
  type GrGLvoid (line 64) | typedef GrGLvoid (* GrGLDrawArraysIndirectProc)(GrGLenum mode, const GrG...
  type GrGLvoid (line 65) | typedef GrGLvoid (* GrGLDrawBufferProc)(GrGLenum mode);
  type GrGLvoid (line 66) | typedef GrGLvoid (* GrGLDrawBuffersProc)(GrGLsizei n, const GrGLenum* bu...
  type GrGLvoid (line 67) | typedef GrGLvoid (* GrGLDrawElementsProc)(GrGLenum mode, GrGLsizei count...
  type GrGLvoid (line 68) | typedef GrGLvoid (* GrGLDrawElementsInstancedProc)(GrGLenum mode, GrGLsi...
  type GrGLvoid (line 69) | typedef GrGLvoid (* GrGLDrawElementsIndirectProc)(GrGLenum mode, GrGLenu...
  type GrGLvoid (line 70) | typedef GrGLvoid (* GrGLDrawRangeElementsProc)(GrGLenum mode, GrGLuint s...
  type GrGLvoid (line 71) | typedef GrGLvoid (* GrGLEnableProc)(GrGLenum cap);
  type GrGLvoid (line 72) | typedef GrGLvoid (* GrGLEnableVertexAttribArrayProc)(GrGLuint index);
  type GrGLvoid (line 73) | typedef GrGLvoid (* GrGLEndQueryProc)(GrGLenum target);
  type GrGLvoid (line 74) | typedef GrGLvoid (* GrGLFinishProc)();
  type GrGLvoid (line 75) | typedef GrGLvoid (* GrGLFlushProc)();
  type GrGLvoid (line 76) | typedef GrGLvoid (* GrGLFlushMappedBufferRangeProc)(GrGLenum target, GrG...
  type GrGLvoid (line 77) | typedef GrGLvoid (* GrGLFramebufferRenderbufferProc)(GrGLenum target, Gr...
  type GrGLvoid (line 78) | typedef GrGLvoid (* GrGLFramebufferTexture2DProc)(GrGLenum target, GrGLe...
  type GrGLvoid (line 79) | typedef GrGLvoid (* GrGLFramebufferTexture2DMultisampleProc)(GrGLenum ta...
  type GrGLvoid (line 80) | typedef GrGLvoid (* GrGLFrontFaceProc)(GrGLenum mode);
  type GrGLvoid (line 81) | typedef GrGLvoid (* GrGLGenBuffersProc)(GrGLsizei n, GrGLuint* buffers);
  type GrGLvoid (line 82) | typedef GrGLvoid (* GrGLGenFramebuffersProc)(GrGLsizei n, GrGLuint *fram...
  type GrGLvoid (line 83) | typedef GrGLvoid (* GrGLGenerateMipmapProc)(GrGLenum target);
  type GrGLvoid (line 84) | typedef GrGLvoid (* GrGLGenQueriesProc)(GrGLsizei n, GrGLuint *ids);
  type GrGLvoid (line 85) | typedef GrGLvoid (* GrGLGenRenderbuffersProc)(GrGLsizei n, GrGLuint *ren...
  type GrGLvoid (line 86) | typedef GrGLvoid (* GrGLGenTexturesProc)(GrGLsizei n, GrGLuint* textures);
  type GrGLvoid (line 87) | typedef GrGLvoid (* GrGLGenVertexArraysProc)(GrGLsizei n, GrGLuint *arra...
  type GrGLvoid (line 88) | typedef GrGLvoid (* GrGLGetBufferParameterivProc)(GrGLenum target, GrGLe...
  type GrGLenum (line 89) | typedef GrGLenum (* GrGLGetErrorProc)();
  type GrGLvoid (line 90) | typedef GrGLvoid (* GrGLGetFramebufferAttachmentParameterivProc)(GrGLenu...
  type GrGLvoid (line 91) | typedef GrGLvoid (* GrGLGetIntegervProc)(GrGLenum pname, GrGLint* params);
  type GrGLvoid (line 92) | typedef GrGLvoid (* GrGLGetMultisamplefvProc)(GrGLenum pname, GrGLuint i...
  type GrGLvoid (line 93) | typedef GrGLvoid (* GrGLGetProgramBinaryProc)(GrGLuint program, GrGLsize...
  type GrGLvoid (line 94) | typedef GrGLvoid (* GrGLGetProgramInfoLogProc)(GrGLuint program, GrGLsiz...
  type GrGLvoid (line 95) | typedef GrGLvoid (* GrGLGetProgramivProc)(GrGLuint program, GrGLenum pna...
  type GrGLvoid (line 96) | typedef GrGLvoid (* GrGLGetQueryivProc)(GrGLenum GLtarget, GrGLenum pnam...
  type GrGLvoid (line 97) | typedef GrGLvoid (* GrGLGetQueryObjecti64vProc)(GrGLuint id, GrGLenum pn...
  type GrGLvoid (line 98) | typedef GrGLvoid (* GrGLGetQueryObjectivProc)(GrGLuint id, GrGLenum pnam...
  type GrGLvoid (line 99) | typedef GrGLvoid (* GrGLGetQueryObjectui64vProc)(GrGLuint id, GrGLenum p...
  type GrGLvoid (line 100) | typedef GrGLvoid (* GrGLGetQueryObjectuivProc)(GrGLuint id, GrGLenum pna...
  type GrGLvoid (line 101) | typedef GrGLvoid (* GrGLGetRenderbufferParameterivProc)(GrGLenum target,...
  type GrGLvoid (line 102) | typedef GrGLvoid (* GrGLGetShaderInfoLogProc)(GrGLuint shader, GrGLsizei...
  type GrGLvoid (line 103) | typedef GrGLvoid (* GrGLGetShaderivProc)(GrGLuint shader, GrGLenum pname...
  type GrGLvoid (line 104) | typedef GrGLvoid (* GrGLGetShaderPrecisionFormatProc)(GrGLenum shadertyp...
  type GrGLubyte (line 105) | typedef const GrGLubyte* (* GrGLGetStringProc)(GrGLenum name);
  type GrGLubyte (line 106) | typedef const GrGLubyte* (* GrGLGetStringiProc)(GrGLenum name, GrGLuint ...
  type GrGLvoid (line 107) | typedef GrGLvoid (* GrGLGetTexLevelParameterivProc)(GrGLenum target, GrG...
  type GrGLint (line 108) | typedef GrGLint (* GrGLGetUniformLocationProc)(GrGLuint program, const c...
  type GrGLvoid (line 109) | typedef GrGLvoid (* GrGLInsertEventMarkerProc)(GrGLsizei length, const c...
  type GrGLvoid (line 110) | typedef GrGLvoid (* GrGLInvalidateBufferDataProc)(GrGLuint buffer);
  type GrGLvoid (line 111) | typedef GrGLvoid (* GrGLInvalidateBufferSubDataProc)(GrGLuint buffer, Gr...
  type GrGLvoid (line 112) | typedef GrGLvoid (* GrGLInvalidateFramebufferProc)(GrGLenum target, GrGL...
  type GrGLvoid (line 113) | typedef GrGLvoid (* GrGLInvalidateSubFramebufferProc)(GrGLenum target, G...
  type GrGLvoid (line 114) | typedef GrGLvoid (* GrGLInvalidateTexImageProc)(GrGLuint texture, GrGLin...
  type GrGLvoid (line 115) | typedef GrGLvoid (* GrGLInvalidateTexSubImageProc)(GrGLuint texture, GrG...
  type GrGLboolean (line 116) | typedef GrGLboolean (* GrGLIsTextureProc)(GrGLuint texture);
  type GrGLvoid (line 117) | typedef GrGLvoid (* GrGLLineWidthProc)(GrGLfloat width);
  type GrGLvoid (line 118) | typedef GrGLvoid (* GrGLLinkProgramProc)(GrGLuint program);
  type GrGLvoid (line 119) | typedef GrGLvoid* (* GrGLMapBufferProc)(GrGLenum target, GrGLenum access);
  type GrGLvoid (line 120) | typedef GrGLvoid* (* GrGLMapBufferRangeProc)(GrGLenum target, GrGLintptr...
  type GrGLvoid (line 121) | typedef GrGLvoid* (* GrGLMapBufferSubDataProc)(GrGLuint target, GrGLintp...
  type GrGLvoid (line 122) | typedef GrGLvoid* (* GrGLMapTexSubImage2DProc)(GrGLenum target, GrGLint ...
  type GrGLvoid (line 123) | typedef GrGLvoid (* GrGLPixelStoreiProc)(GrGLenum pname, GrGLint param);
  type GrGLvoid (line 124) | typedef GrGLvoid (* GrGLPolygonModeProc)(GrGLenum face, GrGLenum mode);
  type GrGLvoid (line 125) | typedef GrGLvoid (* GrGLPopGroupMarkerProc)();
  type GrGLvoid (line 126) | typedef GrGLvoid (* GrGLProgramBinaryProc)(GrGLuint program, GrGLenum bi...
  type GrGLvoid (line 127) | typedef GrGLvoid (* GrGLProgramParameteriProc)(GrGLuint program, GrGLenu...
  type GrGLvoid (line 128) | typedef GrGLvoid (* GrGLPushGroupMarkerProc)(GrGLsizei length, const cha...
  type GrGLvoid (line 129) | typedef GrGLvoid (* GrGLQueryCounterProc)(GrGLuint id, GrGLenum target);
  type GrGLvoid (line 130) | typedef GrGLvoid (* GrGLRasterSamplesProc)(GrGLuint samples, GrGLboolean...
  type GrGLvoid (line 131) | typedef GrGLvoid (* GrGLReadBufferProc)(GrGLenum src);
  type GrGLvoid (line 132) | typedef GrGLvoid (* GrGLReadPixelsProc)(GrGLint x, GrGLint y, GrGLsizei ...
  type GrGLvoid (line 133) | typedef GrGLvoid (* GrGLRenderbufferStorageProc)(GrGLenum target, GrGLen...
  type GrGLvoid (line 134) | typedef GrGLvoid (* GrGLRenderbufferStorageMultisampleProc)(GrGLenum tar...
  type GrGLvoid (line 135) | typedef GrGLvoid (* GrGLResolveMultisampleFramebufferProc)();
  type GrGLvoid (line 136) | typedef GrGLvoid (* GrGLScissorProc)(GrGLint x, GrGLint y, GrGLsizei wid...
  type GrGLvoid (line 138) | typedef GrGLvoid (* GrGLBindUniformLocationProc)(GrGLuint program, GrGLi...
  type GrGLvoid (line 141) | typedef GrGLvoid (* GrGLShaderSourceProc)(GrGLuint shader, GrGLsizei cou...
  type GrGLvoid (line 143) | typedef GrGLvoid (* GrGLShaderSourceProc)(GrGLuint shader, GrGLsizei cou...
  type GrGLvoid (line 145) | typedef GrGLvoid (* GrGLStencilFuncProc)(GrGLenum func, GrGLint ref, GrG...
  type GrGLvoid (line 146) | typedef GrGLvoid (* GrGLStencilFuncSeparateProc)(GrGLenum face, GrGLenum...
  type GrGLvoid (line 147) | typedef GrGLvoid (* GrGLStencilMaskProc)(GrGLuint mask);
  type GrGLvoid (line 148) | typedef GrGLvoid (* GrGLStencilMaskSeparateProc)(GrGLenum face, GrGLuint...
  type GrGLvoid (line 149) | typedef GrGLvoid (* GrGLStencilOpProc)(GrGLenum fail, GrGLenum zfail, Gr...
  type GrGLvoid (line 150) | typedef GrGLvoid (* GrGLStencilOpSeparateProc)(GrGLenum face, GrGLenum f...
  type GrGLvoid (line 151) | typedef GrGLvoid (* GrGLTexBufferProc)(GrGLenum target, GrGLenum interna...
  type GrGLvoid (line 152) | typedef GrGLvoid (* GrGLTexBufferRangeProc)(GrGLenum target, GrGLenum in...
  type GrGLvoid (line 153) | typedef GrGLvoid (* GrGLTexImage2DProc)(GrGLenum target, GrGLint level, ...
  type GrGLvoid (line 154) | typedef GrGLvoid (* GrGLTexParameteriProc)(GrGLenum target, GrGLenum pna...
  type GrGLvoid (line 155) | typedef GrGLvoid (* GrGLTexParameterivProc)(GrGLenum target, GrGLenum pn...
  type GrGLvoid (line 156) | typedef GrGLvoid (* GrGLTexStorage2DProc)(GrGLenum target, GrGLsizei lev...
  type GrGLvoid (line 157) | typedef GrGLvoid (* GrGLDiscardFramebufferProc)(GrGLenum target, GrGLsiz...
  type GrGLvoid (line 158) | typedef GrGLvoid (* GrGLTexSubImage2DProc)(GrGLenum target, GrGLint leve...
  type GrGLvoid (line 159) | typedef GrGLvoid (* GrGLTextureBarrierProc)();
  type GrGLvoid (line 160) | typedef GrGLvoid (* GrGLUniform1fProc)(GrGLint location, GrGLfloat v0);
  type GrGLvoid (line 161) | typedef GrGLvoid (* GrGLUniform1iProc)(GrGLint location, GrGLint v0);
  type GrGLvoid (line 162) | typedef GrGLvoid (* GrGLUniform1fvProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 163) | typedef GrGLvoid (* GrGLUniform1ivProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 164) | typedef GrGLvoid (* GrGLUniform2fProc)(GrGLint location, GrGLfloat v0, G...
  type GrGLvoid (line 165) | typedef GrGLvoid (* GrGLUniform2iProc)(GrGLint location, GrGLint v0, GrG...
  type GrGLvoid (line 166) | typedef GrGLvoid (* GrGLUniform2fvProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 167) | typedef GrGLvoid (* GrGLUniform2ivProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 168) | typedef GrGLvoid (* GrGLUniform3fProc)(GrGLint location, GrGLfloat v0, G...
  type GrGLvoid (line 169) | typedef GrGLvoid (* GrGLUniform3iProc)(GrGLint location, GrGLint v0, GrG...
  type GrGLvoid (line 170) | typedef GrGLvoid (* GrGLUniform3fvProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 171) | typedef GrGLvoid (* GrGLUniform3ivProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 172) | typedef GrGLvoid (* GrGLUniform4fProc)(GrGLint location, GrGLfloat v0, G...
  type GrGLvoid (line 173) | typedef GrGLvoid (* GrGLUniform4iProc)(GrGLint location, GrGLint v0, GrG...
  type GrGLvoid (line 174) | typedef GrGLvoid (* GrGLUniform4fvProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 175) | typedef GrGLvoid (* GrGLUniform4ivProc)(GrGLint location, GrGLsizei coun...
  type GrGLvoid (line 176) | typedef GrGLvoid (* GrGLUniformMatrix2fvProc)(GrGLint location, GrGLsize...
  type GrGLvoid (line 177) | typedef GrGLvoid (* GrGLUniformMatrix3fvProc)(GrGLint location, GrGLsize...
  type GrGLvoid (line 178) | typedef GrGLvoid (* GrGLUniformMatrix4fvProc)(GrGLint location, GrGLsize...
  type GrGLboolean (line 179) | typedef GrGLboolean (* GrGLUnmapBufferProc)(GrGLenum target);
  type GrGLvoid (line 180) | typedef GrGLvoid (* GrGLUnmapBufferSubDataProc)(const GrGLvoid* mem);
  type GrGLvoid (line 181) | typedef GrGLvoid (* GrGLUnmapTexSubImage2DProc)(const GrGLvoid* mem);
  type GrGLvoid (line 182) | typedef GrGLvoid (* GrGLUseProgramProc)(GrGLuint program);
  type GrGLvoid (line 183) | typedef GrGLvoid (* GrGLVertexAttrib1fProc)(GrGLuint indx, const GrGLflo...
  type GrGLvoid (line 184) | typedef GrGLvoid (* GrGLVertexAttrib2fvProc)(GrGLuint indx, const GrGLfl...
  type GrGLvoid (line 185) | typedef GrGLvoid (* GrGLVertexAttrib3fvProc)(GrGLuint indx, const GrGLfl...
  type GrGLvoid (line 186) | typedef GrGLvoid (* GrGLVertexAttrib4fvProc)(GrGLuint indx, const GrGLfl...
  type GrGLvoid (line 187) | typedef GrGLvoid (* GrGLVertexAttribDivisorProc)(GrGLuint index, GrGLuin...
  type GrGLvoid (line 188) | typedef GrGLvoid (* GrGLVertexAttribIPointerProc)(GrGLuint indx, GrGLint...
  type GrGLvoid (line 189) | typedef GrGLvoid (* GrGLVertexAttribPointerProc)(GrGLuint indx, GrGLint ...
  type GrGLvoid (line 190) | typedef GrGLvoid (* GrGLViewportProc)(GrGLint x, GrGLint y, GrGLsizei wi...
  type GrGLvoid (line 193) | typedef GrGLvoid (* GrGLMatrixLoadfProc)(GrGLenum matrixMode, const GrGL...
  type GrGLvoid (line 194) | typedef GrGLvoid (* GrGLMatrixLoadIdentityProc)(GrGLenum);
  type GrGLvoid (line 195) | typedef GrGLvoid (* GrGLPathCommandsProc)(GrGLuint path, GrGLsizei numCo...
  type GrGLvoid (line 196) | typedef GrGLvoid (* GrGLPathParameteriProc)(GrGLuint path, GrGLenum pnam...
  type GrGLvoid (line 197) | typedef GrGLvoid (* GrGLPathParameterfProc)(GrGLuint path, GrGLenum pnam...
  type GrGLuint (line 198) | typedef GrGLuint (* GrGLGenPathsProc)(GrGLsizei range);
  type GrGLvoid (line 199) | typedef GrGLvoid (* GrGLDeletePathsProc)(GrGLuint path, GrGLsizei range);
  type GrGLboolean (line 200) | typedef GrGLboolean (* GrGLIsPathProc)(GrGLuint path);
  type GrGLvoid (line 201) | typedef GrGLvoid (* GrGLPathStencilFuncProc)(GrGLenum func, GrGLint ref,...
  type GrGLvoid (line 202) | typedef GrGLvoid (* GrGLStencilFillPathProc)(GrGLuint path, GrGLenum fil...
  type GrGLvoid (line 203) | typedef GrGLvoid (* GrGLStencilStrokePathProc)(GrGLuint path, GrGLint re...
  type GrGLvoid (line 204) | typedef GrGLvoid (* GrGLStencilFillPathInstancedProc)(GrGLsizei numPaths...
  type GrGLvoid (line 205) | typedef GrGLvoid (* GrGLStencilStrokePathInstancedProc)(GrGLsizei numPat...
  type GrGLvoid (line 206) | typedef GrGLvoid (* GrGLCoverFillPathProc)(GrGLuint path, GrGLenum cover...
  type GrGLvoid (line 207) | typedef GrGLvoid (* GrGLCoverStrokePathProc)(GrGLuint name, GrGLenum cov...
  type GrGLvoid (line 208) | typedef GrGLvoid (* GrGLCoverFillPathInstancedProc)(GrGLsizei numPaths, ...
  type GrGLvoid (line 209) | typedef GrGLvoid (* GrGLCoverStrokePathInstancedProc)(GrGLsizei numPaths...
  type GrGLvoid (line 211) | typedef GrGLvoid (* GrGLStencilThenCoverFillPathProc)(GrGLuint path, GrG...
  type GrGLvoid (line 212) | typedef GrGLvoid (* GrGLStencilThenCoverStrokePathProc)(GrGLuint path, G...
  type GrGLvoid (line 213) | typedef GrGLvoid (* GrGLStencilThenCoverFillPathInstancedProc)(GrGLsizei...
  type GrGLvoid (line 214) | typedef GrGLvoid (* GrGLStencilThenCoverStrokePathInstancedProc)(GrGLsiz...
  type GrGLvoid (line 216) | typedef GrGLvoid (* GrGLProgramPathFragmentInputGenProc)(GrGLuint progra...
  type GrGLvoid (line 218) | typedef GrGLvoid (* GrGLBindFragmentInputLocationProc)(GrGLuint program,...
  type GrGLint (line 221) | typedef GrGLint (* GrGLGetProgramResourceLocationProc)(GrGLuint program,...
  type GrGLvoid (line 224) | typedef GrGLvoid (* GrGLCoverageModulationProc)(GrGLenum components);
  type GrGLvoid (line 227) | typedef GrGLvoid (* GrGLMultiDrawArraysIndirectProc)(GrGLenum mode, cons...
  type GrGLvoid (line 228) | typedef GrGLvoid (* GrGLMultiDrawElementsIndirectProc)(GrGLenum mode, Gr...
  type GrGLvoid (line 231) | typedef GrGLvoid (* GrGLMinSampleShadingProc)(GrGLfloat value);
  type GrGLsync (line 234) | typedef GrGLsync (* GrGLFenceSyncProc)(GrGLenum condition, GrGLbitfield ...
  type GrGLboolean (line 235) | typedef GrGLboolean (* GrGLIsSyncProc)(GrGLsync sync);
  type GrGLenum (line 236) | typedef GrGLenum (* GrGLClientWaitSyncProc)(GrGLsync sync, GrGLbitfield ...
  type GrGLvoid (line 237) | typedef GrGLvoid (* GrGLWaitSyncProc)(GrGLsync sync, GrGLbitfield flags,...
  type GrGLvoid (line 238) | typedef GrGLvoid (* GrGLDeleteSyncProc)(GrGLsync sync);
  type GrGLvoid (line 241) | typedef GrGLvoid (* GrGLGetInternalformativProc)(GrGLenum target, GrGLen...
  type GrGLvoid (line 244) | typedef GrGLvoid (* GrGLDebugMessageControlProc)(GrGLenum source, GrGLen...
  type GrGLvoid (line 245) | typedef GrGLvoid (* GrGLDebugMessageInsertProc)(GrGLenum source, GrGLenu...
  type GrGLvoid (line 246) | typedef GrGLvoid (* GrGLDebugMessageCallbackProc)(GRGLDEBUGPROC callback...
  type GrGLuint (line 247) | typedef GrGLuint (* GrGLGetDebugMessageLogProc)(GrGLuint count, GrGLsize...
  type GrGLvoid (line 248) | typedef GrGLvoid (* GrGLPushDebugGroupProc)(GrGLenum source, GrGLuint id...
  type GrGLvoid (line 249) | typedef GrGLvoid (* GrGLPopDebugGroupProc)();
  type GrGLvoid (line 250) | typedef GrGLvoid (* GrGLObjectLabelProc)(GrGLenum identifier, GrGLuint n...
  type GrGLvoid (line 253) | typedef GrGLvoid (* GrGLWindowRectanglesProc)(GrGLenum mode, GrGLsizei c...
  type GrEGLDisplay (line 257) | typedef GrEGLDisplay (* GrEGLGetCurrentDisplayProc)();
  type GrEGLImage (line 258) | typedef GrEGLImage (* GrEGLCreateImageProc)(GrEGLDisplay dpy, GrEGLConte...
  type GrEGLBoolean (line 259) | typedef GrEGLBoolean (* GrEGLDestroyImageProc)(GrEGLDisplay dpy, GrEGLIm...
  function GrGLFunction (line 271) | GrGLFunction(std::nullptr_t) : GrGLFunction() {}
  function GrGLFunction (line 274) | GrGLFunction(R (GR_GL_FUNCTION_TYPE* fn_ptr)(Args...)) : GrGLFunction() {
  function R (line 300) | R operator()(Args... args) const {

FILE: include/gpu/gl/GrGLInterface.h
  type GrGLInterface (line 18) | struct GrGLInterface
  function GrGLInterface (line 55) | struct SK_API GrGLInterface : public SkRefCnt {

FILE: include/gpu/gl/GrGLTypes.h
  type GrGLStandard (line 18) | enum GrGLStandard {
  type GrGLenum (line 31) | typedef unsigned int GrGLenum;
  type GrGLboolean (line 32) | typedef unsigned char GrGLboolean;
  type GrGLbitfield (line 33) | typedef unsigned int GrGLbitfield;
  type GrGLbyte (line 34) | typedef signed char GrGLbyte;
  type GrGLchar (line 35) | typedef char GrGLchar;
  type GrGLshort (line 36) | typedef short GrGLshort;
  type GrGLint (line 37) | typedef int GrGLint;
  type GrGLsizei (line 38) | typedef int GrGLsizei;
  type GrGLint64 (line 39) | typedef int64_t GrGLint64;
  type GrGLubyte (line 40) | typedef unsigned char GrGLubyte;
  type GrGLushort (line 41) | typedef unsigned short GrGLushort;
  type GrGLuint (line 42) | typedef unsigned int GrGLuint;
  type GrGLuint64 (line 43) | typedef uint64_t GrGLuint64;
  type GrGLfloat (line 44) | typedef float GrGLfloat;
  type GrGLclampf (line 45) | typedef float GrGLclampf;
  type GrGLdouble (line 46) | typedef double GrGLdouble;
  type GrGLclampd (line 47) | typedef double GrGLclampd;
  type GrGLvoid (line 48) | typedef void GrGLvoid;
  type GrGLintptr (line 51) | typedef signed long long int GrGLintptr;
  type GrGLsizeiptr (line 52) | typedef signed long long int GrGLsizeiptr;
  type GrGLintptr (line 54) | typedef signed long int GrGLintptr;
  type GrGLsizeiptr (line 55) | typedef signed long int GrGLsizeiptr;
  type GrGLintptr (line 58) | typedef signed long int GrGLintptr;
  type GrGLsizeiptr (line 59) | typedef signed long int GrGLsizeiptr;
  type __GLsync (line 62) | struct __GLsync
  type GrGLDrawArraysIndirectCommand (line 64) | struct GrGLDrawArraysIndirectCommand {
  type GrGLDrawElementsIndirectCommand (line 73) | struct GrGLDrawElementsIndirectCommand {
  type GrEGLenum (line 101) | typedef unsigned int GrEGLenum;
  type GrEGLint (line 102) | typedef int32_t GrEGLint;
  type GrEGLBoolean (line 103) | typedef unsigned int GrEGLBoolean;
  type GrGLTextureInfo (line 112) | struct GrGLTextureInfo {
  type GrGLFramebufferInfo (line 122) | struct GrGLFramebufferInfo {

FILE: include/gpu/mock/GrMockTypes.h
  type GrMockTextureInfo (line 14) | struct GrMockTextureInfo {
  type GrMockRenderTargetInfo (line 23) | struct GrMockRenderTargetInfo {
  function ConfigOptions (line 37) | struct GrMockOptions {

FILE: include/gpu/vk/GrVkBackendContext.h
  type GrVkExtensionFlags (line 17) | enum GrVkExtensionFlags {
  type GrVkFeatureFlags (line 27) | enum GrVkFeatureFlags {
  function GrVkBackendContext (line 39) | struct SK_API GrVkBackendContext : public SkRefCnt {

FILE: include/gpu/vk/GrVkDefines.h
  type VkBufferMemoryRequirementsInfo2KHR (line 61) | typedef struct VkBufferMemoryRequirementsInfo2KHR {
  type VkImageMemoryRequirementsInfo2KHR (line 67) | typedef struct VkImageMemoryRequirementsInfo2KHR {
  type VkImageSparseMemoryRequirementsInfo2KHR (line 73) | typedef struct VkImageSparseMemoryRequirementsInfo2KHR {
  type VkMemoryRequirements2KHR (line 79) | typedef struct VkMemoryRequirements2KHR {
  type VkSparseImageMemoryRequirements2KHR (line 85) | typedef struct VkSparseImageMemoryRequirements2KHR {
  type VkMemoryDedicatedRequirementsKHR (line 111) | typedef struct VkMemoryDedicatedRequirementsKHR {
  type VkMemoryDedicatedAllocateInfoKHR (line 118) | typedef struct VkMemoryDedicatedAllocateInfoKHR {

FILE: include/gpu/vk/GrVkInterface.h
  function GrVkInterface (line 23) | struct SK_API GrVkInterface : public SkRefCnt {
  type SkRefCnt (line 35) | typedef SkRefCnt INHERITED;
  type Functions (line 69) | struct Functions {

FILE: include/gpu/vk/GrVkMemoryAllocator.h
  type class (line 18) | enum class
  type class (line 36) | enum class

FILE: include/gpu/vk/GrVkTypes.h
  type GrVkBackendMemory (line 30) | typedef intptr_t GrVkBackendMemory;
  type Flag (line 59) | enum Flag {

FILE: include/pathops/SkPathOps.h
  type SkRect (line 15) | struct SkRect
  type SkPathOp (line 22) | enum SkPathOp {
  function class (line 72) | class SK_API SkOpBuilder {

FILE: include/ports/SkFontConfigInterface.h
  function virtual (line 99) | virtual sk_sp<SkTypeface> makeTypeface(const FontIdentity& identity) {
  type SkRefCnt (line 109) | typedef SkRefCnt INHERITED;

FILE: include/ports/SkFontMgr.h
  type SkRefCnt (line 161) | typedef SkRefCnt INHERITED;

FILE: include/ports/SkFontMgr_android.h
  type SkFontMgr_Android_CustomFonts (line 15) | struct SkFontMgr_Android_CustomFonts {

FILE: include/ports/SkFontMgr_indirect.h
  type DataEntry (line 64) | struct DataEntry {

FILE: include/ports/SkRemotableFontMgr.h
  function SkFontIdentity (line 19) | struct SK_API SkFontIdentity {
  function SkFontIdentity (line 41) | const SkFontIdentity& at(int index) const { return fData[index]; }
  type SkRefCnt (line 53) | typedef SkRefCnt INHERITED;

FILE: include/ports/SkTypeface_win.h
  type IDWriteFactory (line 43) | struct IDWriteFactory
  type IDWriteFontCollection (line 44) | struct IDWriteFontCollection
  type IDWriteFontFallback (line 45) | struct IDWriteFontFallback

FILE: include/private/GrAuditTrail.h
  function class (line 30) | class GrAuditTrail {

FILE: include/private/GrCCClipPath.h
  function class (line 24) | class GrCCClipPath {

FILE: include/private/GrColor.h
  type GrColor (line 23) | typedef uint32_t GrColor;
  function GrColor (line 44) | static inline GrColor GrColorPackRGBA(unsigned r, unsigned g, unsigned b...
  function GrColor (line 58) | static inline GrColor GrColorPackA4(unsigned a) {
  function GrColorIsPMAssert (line 85) | static inline void GrColorIsPMAssert(GrColor SkDEBUGCODE(c)) {
  function GrColor (line 99) | static inline GrColor GrInvertColor(GrColor c) {
  function GrColor (line 107) | static inline GrColor GrColorMul(GrColor c0, GrColor c1) {
  function GrColor (line 115) | static inline GrColor GrColorSatAdd(GrColor c0, GrColor c1) {
  function GrColorToRGBAFloat (line 124) | static inline void GrColorToRGBAFloat(GrColor color, float rgba[4]) {
  function GrNormalizeByteToFloat (line 133) | static inline float GrNormalizeByteToFloat(uint8_t value) {
  function GrColorIsOpaque (line 139) | static inline bool GrColorIsOpaque(GrColor color) {
  function GrColor (line 143) | static inline GrColor GrPremulColor(GrColor color) {
  function GrColor (line 155) | static inline GrColor GrUnpremulColor(GrColor color) {
  function Illegal_Constructor (line 177) | struct GrColor4f {
  type GrColorComponentFlags (line 277) | enum GrColorComponentFlags {

FILE: include/private/GrGLSL.h
  type GrGLSLGeneration (line 18) | enum GrGLSLGeneration {

FILE: include/private/GrOpList.h
  type SkIPoint (line 26) | struct SkIPoint
  type SkIRect (line 27) | struct SkIRect
  function class (line 29) | class GrOpList : public SkRefCnt {
  type SkRefCnt (line 180) | typedef SkRefCnt INHERITED;

FILE: include/private/GrRenderTargetProxy.h
  function class (line 21) | class GrRenderTargetProxy : virtual public GrSurfaceProxy {

FILE: include/private/GrSharedEnums.h
  type class (line 21) | enum class
  type class (line 31) | enum class

FILE: include/private/GrSingleOwner.h
  function class (line 18) | class GrSingleOwner {
  function exit (line 38) | void exit() {
  function class (line 52) | class GrSingleOwner {}

FILE: include/private/GrSurfaceProxy.h
  function class (line 31) | class GrIORefProxy : public SkNoncopyable {
  function virtual (line 149) | virtual ~GrIORefProxy() {
  function transferRefs (line 157) | void transferRefs() {
  function class (line 202) | class GrSurfaceProxy : public GrIORefProxy {
  function isWrapped_ForTesting (line 377) | bool isWrapped_ForTesting() const;
  type GrIORefProxy (line 486) | typedef GrIORefProxy INHERITED;

FILE: include/private/GrSurfaceProxyRef.h
  function class (line 15) | class GrSurfaceProxyRef : SkNoncopyable {

FILE: include/private/GrSwizzle.h
  function class (line 17) | class GrSwizzle {
  function setFromKey (line 55) | void setFromKey(uint8_t key) {
  function GrColor (line 75) | GrColor applyTo(GrColor color) const {
  function GrColor4f (line 94) | GrColor4f applyTo(const GrColor4f& color) const {
  function GrSwizzle (line 112) | static GrSwizzle RGBA() { return GrSwizzle("rgba"); }
  function GrSwizzle (line 113) | static GrSwizzle AAAA() { return GrSwizzle("aaaa"); }
  function GrSwizzle (line 114) | static GrSwizzle RRRR() { return GrSwizzle("rrrr"); }
  function GrSwizzle (line 115) | static GrSwizzle RRRA() { return GrSwizzle("rrra"); }
  function GrSwizzle (line 116) | static GrSwizzle BGRA() { return GrSwizzle("bgra"); }
  function GrSwizzle (line 118) | static GrSwizzle CreateRandom(SkRandom* random) {

FILE: include/private/GrTextureProxy.h
  function class (line 22) | class GrTextureProxy : virtual public GrSurfaceProxy {

FILE: include/private/GrTypesPriv.h
  type GrPixelConfig (line 36) | enum GrPixelConfig {
  function GrPrimitiveType (line 79) | enum class GrPrimitiveType {
  type class (line 263) | enum class
  type class (line 276) | enum class
  type class (line 284) | enum class
  type GrSLType (line 293) | enum GrSLType {
  type GrShaderType (line 332) | enum GrShaderType {
  type GrShaderFlags (line 341) | enum GrShaderFlags {
  type GrSLPrecision (line 354) | enum GrSLPrecision {
  function GrSLTypeIsFloatType (line 372) | static inline bool GrSLTypeIsFloatType(GrSLType type) {
  function GrSLTypeVecLength (line 419) | static inline int GrSLTypeVecLength(GrSLType type) {
  function GrSLTypeIs2DCombinedSamplerType (line 471) | static inline bool GrSLTypeIs2DCombinedSamplerType(GrSLType type) {
  function GrSLTypeIsCombinedSamplerType (line 517) | static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
  function GrSLTypeAcceptsPrecision (line 563) | static inline bool GrSLTypeAcceptsPrecision(GrSLType type) {
  function GrSLTypeTemporarilyAcceptsPrecision (line 611) | static inline bool GrSLTypeTemporarilyAcceptsPrecision(GrSLType type) {
  type GrVertexAttribType (line 662) | enum GrVertexAttribType {
  function GrVertexAttribTypeSize (line 694) | static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) {
  function GrSLType (line 739) | static inline GrSLType GrVertexAttribTypeToSLType(GrVertexAttribType typ...
  function GrProcessorEdgeTypeIsFill (line 784) | static inline bool GrProcessorEdgeTypeIsFill(const GrClipEdgeType edgeTy...
  function GrProcessorEdgeTypeIsInverseFill (line 788) | static inline bool GrProcessorEdgeTypeIsInverseFill(const GrClipEdgeType...
  function GrProcessorEdgeTypeIsAA (line 793) | static inline bool GrProcessorEdgeTypeIsAA(const GrClipEdgeType edgeType) {
  function GrClipEdgeType (line 798) | static inline GrClipEdgeType GrInvertProcessorEdgeType(const GrClipEdgeT...
  type GrIOType (line 817) | enum GrIOType {
  type GrBufferType (line 826) | enum GrBufferType {
  function GrBufferTypeIsVertexOrIndex (line 838) | static inline bool GrBufferTypeIsVertexOrIndex(GrBufferType type) {
  type GrAccessPattern (line 849) | enum GrAccessPattern {
  type class (line 861) | enum class
  type GrFence (line 939) | typedef uint64_t GrFence;
  type class (line 944) | enum class
  type class (line 961) | enum class
  type class (line 983) | enum class
  type class (line 988) | enum class
  function GrSRGBEncoded (line 999) | static inline GrSRGBEncoded GrPixelConfigIsSRGBEncoded(GrPixelConfig con...
  function GrPixelConfigIsSRGB (line 1028) | static inline bool GrPixelConfigIsSRGB(GrPixelConfig config) {
  function GrPixelConfig (line 1033) | static inline GrPixelConfig GrPixelConfigSwapRAndB(GrPixelConfig config) {
  function GrBytesPerPixel (line 1065) | static inline size_t GrBytesPerPixel(GrPixelConfig config) {
  function GrPixelConfigIsOpaque (line 1099) | static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
  function GrPixelConfigIsAlphaOnly (line 1128) | static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
  function GrPixelConfigIsFloatingPoint (line 1157) | static inline bool GrPixelConfigIsFloatingPoint(GrPixelConfig config) {
  function GrPixelConfigIsUnorm (line 1186) | static inline bool GrPixelConfigIsUnorm(GrPixelConfig config) {
  function GrSLPrecision (line 1218) | static inline GrSLPrecision GrSLSamplerPrecision(GrPixelConfig config) {
  function GrPixelConfigIsClamped (line 1248) | static inline GrPixelConfigIsClamped GrGetPixelConfigIsClamped(GrPixelCo...
  function GrColorType (line 1260) | enum class GrColorType {

FILE: include/private/GrVkTypesPriv.h
  type GrVkBackendSurfaceInfo (line 22) | struct GrVkBackendSurfaceInfo {

FILE: include/private/SkArenaAlloc.h
  type Tracking (line 70) | enum Tracking {kDontTrack, kTrack}
  function FooterAction (line 94) | FooterAction* releaser = [](char* objEnd) {
  function fTotalAlloc (line 228) | uint32_t       fTotalAlloc { 0}
  function fFib0 (line 233) | uint32_t       fFib0 {1}, fFib1 {1};

FILE: include/private/SkAtomics.h
  type sk_memory_order (line 17) | enum sk_memory_order {
  function explicit (line 53) | explicit SkAtomic(const T& val) : fVal(val) {}
  function T (line 56) | T load(sk_memory_order mo = default_memory_order) const {
  function store (line 60) | void store(const T& val, sk_memory_order mo = default_memory_order) {
  function T (line 75) | T fetch_add(const T& val, sk_memory_order mo = default_memory_order) {
  function T (line 79) | T fetch_sub(const T& val, sk_memory_order mo = default_memory_order) {
  function compare_exchange (line 83) | bool compare_exchange(T* expected, const T& desired,
  function sk_atomic_inc (line 156) | inline int32_t sk_atomic_inc(int32_t* ptr) { return sk_atomic_fetch_add(...
  function sk_atomic_dec (line 157) | inline int32_t sk_atomic_dec(int32_t* ptr) { return sk_atomic_fetch_add(...

FILE: include/private/SkBitmaskEnum.h
  function namespace (line 12) | namespace skstd {

FILE: include/private/SkChecksum.h
  function namespace (line 17) | namespace SkOpts {
  function class (line 21) | class SkChecksum : SkNoncopyable {
  function const (line 54) | struct SkGoodHash {
  function const (line 65) | uint32_t operator()(const SkString& k) const {

FILE: include/private/SkDeferredDisplayList.h
  function class (line 27) | class SK_API SkDeferredDisplayList {

FILE: include/private/SkEncodedInfo.h
  type SkEncodedInfo (line 15) | struct SkEncodedInfo {
  function SkImageInfo (line 120) | SkImageInfo makeImageInfo(int width, int height, sk_sp<SkColorSpace> col...

FILE: include/private/SkFixed.h
  type SkFixed (line 23) | typedef int32_t             SkFixed;
  function SkFixed (line 42) | static inline SkFixed SkFloatToFixed_Check(float x) {
  function SkFixed (line 59) | inline SkFixed SkIntToFixed(int n)
  function SkFixed (line 77) | static inline SkFixed SkFixedRoundToFixed(SkFixed x) {
  function SkFixed (line 80) | static inline SkFixed SkFixedCeilToFixed(SkFixed x) {
  function SkFixed (line 83) | static inline SkFixed SkFixedFloorToFixed(SkFixed x) {
  function SkFixed (line 94) | static inline SkFixed SkFixedMul(SkFixed a, SkFixed b) {
  function SK_ALWAYS_INLINE (line 107) | SK_ALWAYS_INLINE SkFixed SkFloatToFixed_arm(float x)
  type SkFixed3232 (line 125) | typedef int64_t SkFixed3232;

FILE: include/private/SkFloatBits.h
  function SkSignBitTo2sCompliment (line 20) | static inline int32_t SkSignBitTo2sCompliment(int32_t x) {
  function Sk2sComplimentToSignBit (line 31) | static inline int32_t Sk2sComplimentToSignBit(int32_t x) {
  function SkFloat2Bits (line 46) | static inline int32_t SkFloat2Bits(float x) {
  function SkBits2Float (line 53) | static inline float SkBits2Float(int32_t floatAsBits) {
  function SkFloatBits_IsFinite (line 62) | static inline bool SkFloatBits_IsFinite(int32_t bits) {
  function SkFloatBits_IsInf (line 66) | static inline bool SkFloatBits_IsInf(int32_t bits) {
  function SkFloatAs2sCompliment (line 76) | static inline int32_t SkFloatAs2sCompliment(float x) {
  function Sk2sComplimentAsFloat (line 83) | static inline float Sk2sComplimentAsFloat(int32_t x) {

FILE: include/private/SkFloatingPoint.h
  function sk_float_pow (line 31) | static inline float sk_float_pow(float base, float exp) {
  function sk_float_log2 (line 60) | static inline float sk_float_log2(float x) {
  function sk_float_isfinite (line 68) | static inline bool sk_float_isfinite(float x) {
  function sk_float_isinf (line 72) | static inline bool sk_float_isinf(float x) {
  function sk_float_isnan (line 76) | static inline bool sk_float_isnan(float x) {
  function sk_float_saturate2int (line 91) | static inline int sk_float_saturate2int(float x) {
  function sk_double_saturate2int (line 100) | static inline int sk_double_saturate2int(double x) {
  function sk_float_saturate2int64 (line 109) | static inline int64_t sk_float_saturate2int64(float x) {
  function sk_double_to_float (line 134) | __attribute__((no_sanitize("float-cast-overflow")))
  function sk_float_rsqrt_portable (line 144) | static inline float sk_float_rsqrt_portable(float x) {
  function sk_float_rsqrt (line 160) | static inline float sk_float_rsqrt(float x) {
  function sk_ieee_float_divide (line 197) | __attribute__((no_sanitize("float-divide-by-zero")))
  function sk_ieee_double_divide (line 204) | __attribute__((no_sanitize("float-divide-by-zero")))

FILE: include/private/SkImageInfoPriv.h
  type SkColorTypeComponentFlag (line 13) | enum SkColorTypeComponentFlag {
  function SkColorTypeComponentFlags (line 26) | static inline uint32_t SkColorTypeComponentFlags(SkColorType ct) {
  function SkColorTypeIsAlphaOnly (line 43) | static inline bool SkColorTypeIsAlphaOnly(SkColorType ct) {
  function SkAlphaTypeIsValid (line 47) | static inline bool SkAlphaTypeIsValid(unsigned value) {
  function SkColorTypeIsGray (line 51) | static inline bool SkColorTypeIsGray(SkColorType ct) {
  function SkColorTypeShiftPerPixel (line 58) | static int SkColorTypeShiftPerPixel(SkColorType ct) {
  function SkColorTypeMinRowBytes (line 75) | static inline size_t SkColorTypeMinRowBytes(SkColorType ct, int width) {
  function SkColorTypeIsValid (line 79) | static inline bool SkColorTypeIsValid(unsigned value) {
  function SkColorTypeComputeOffset (line 83) | static inline size_t SkColorTypeComputeOffset(SkColorType ct, int x, int...
  function SkImageInfoIsValid (line 93) | static inline bool SkImageInfoIsValid(const SkImageInfo& info) {
  function SkImageInfoValidConversion (line 131) | static inline bool SkImageInfoValidConversion(const SkImageInfo& dst, co...

FILE: include/private/SkMalloc.h
  function sk_bzero (line 98) | static inline void sk_bzero(void* buffer, size_t size) {

FILE: include/private/SkMessageBus.h
  function class (line 25) | class Inbox {
  function fUniqueID (line 64) | Inbox(uint32_t uniqueID) : fUniqueID(uniqueID) {

FILE: include/private/SkMutex.h
  function class (line 17) | class SkBaseMutex {
  function class (line 77) | class SkAutoExclusive {

FILE: include/private/SkOnce.h
  function class (line 20) | class SkOnce {

FILE: include/private/SkPathRef.h
  function SkPoint (line 52) | SkPoint* points() { return fPathRef->getPoints(); }
  function SkPoint (line 53) | const SkPoint* points() const { return fPathRef->points(); }
  function SkPoint (line 58) | SkPoint* atPoint(int i) {
  function SkPoint (line 62) | const SkPoint* atPoint(int i) const {
  function SkPoint (line 84) | SkPoint* growForRepeatedVerb(int /*SkPath::Verb*/ verb,
  function resetToSize (line 94) | void resetToSize(int newVerbCnt, int newPointCnt, int newConicCount) {
  function SkPathRef (line 101) | SkPathRef* pathRef() { return fPathRef; }
  function setIsOval (line 103) | void setIsOval(bool isOval, bool isCCW, unsigned start) {
  function setIsRRect (line 107) | void setIsRRect(bool isRRect, bool isCCW, unsigned start) {
  function setBounds (line 111) | void setBounds(const SkRect& rect) { fPathRef->setBounds(rect); }
  function class (line 117) | class SK_API Iter {
  function isOval (line 182) | bool isOval(SkRect* rect, bool* isCCW, unsigned* start) const {
  function isRRect (line 198) | bool isRRect(SkRRect* rrect, bool* isCCW, unsigned* start) const {
  function SkRect (line 223) | const SkRect& getBounds() const {
  function SkPoint (line 266) | const SkPoint* points() const { return fPoints; }
  function SkPoint (line 271) | const SkPoint* pointsEnd() const { return this->points() + this->countPo...
  function SkScalar (line 273) | const SkScalar* conicWeights() const { return fConicWeights.begin(); }
  function SkScalar (line 274) | const SkScalar* conicWeightsEnd() const { return fConicWeights.end(); }
  function atVerb (line 279) | uint8_t atVerb(int index) const {
  function SkPoint (line 283) | const SkPoint& atPoint(int index) const {
  function writeSize (line 298) | uint32_t writeSize() const;
  function setBounds (line 368) | void setBounds(const SkRect& rect) {
  function incReserve (line 376) | void incReserve(int additionalVerbs, int additionalPoints) {
  function makeSpace (line 440) | void makeSpace(size_t size) {
  function setIsOval (line 495) | void setIsOval(bool isOval, bool isCCW, unsigned start) {
  function setIsRRect (line 501) | void setIsRRect(bool isRRect, bool isCCW, unsigned start) {
  function SkPoint (line 508) | SkPoint* getPoints() {
  function SkPoint (line 515) | const SkPoint* getPoints() const {

FILE: include/private/SkSafe32.h
  function Sk64_pin_to_s32 (line 13) | static constexpr int32_t Sk64_pin_to_s32(int64_t x) {
  function Sk32_sat_add (line 17) | static constexpr int32_t Sk32_sat_add(int32_t a, int32_t b) {
  function Sk32_sat_sub (line 21) | static constexpr int32_t Sk32_sat_sub(int32_t a, int32_t b) {
  function Sk32_can_overflow_add (line 27) | static constexpr int32_t Sk32_can_overflow_add(int32_t a, int32_t b) {
  function Sk32_can_overflow_sub (line 30) | static constexpr int32_t Sk32_can_overflow_sub(int32_t a, int32_t b) {

FILE: include/private/SkSemaphore.h
  function class (line 15) | class SkBaseSemaphore {
  function class (line 54) | class SkSemaphore : public SkBaseSemaphore {
  function signal (line 60) | inline void SkBaseSemaphore::signal(int n) {
  function wait (line 78) | inline void SkBaseSemaphore::wait() {

FILE: include/private/SkShadowFlags.h
  type SkShadowFlags (line 12) | enum SkShadowFlags {

FILE: include/private/SkSpinlock.h
  function class (line 14) | class SkSpinlock {

FILE: include/private/SkTArray.h
  function explicit (line 35) | explicit SkTArray(int reserveCount) { this->init(0, reserveCount); }
  function explicit (line 40) | explicit SkTArray(const SkTArray& that) {
  function explicit (line 45) | explicit SkTArray(SkTArray&& that) {
  function reset (line 102) | void reset() {
  function reset (line 110) | void reset(int n) {
  function reset (line 128) | void reset(const T* array, int count) {
  function reserve (line 144) | void reserve(int n) {
  function removeShuffle (line 154) | void removeShuffle(int n) {
  function T (line 213) | T* push_back_n(int n) {
  function T (line 226) | T* push_back_n(int n, const T& t) {
  function T (line 239) | T* push_back_n(int n, const T t[]) {
  function T (line 252) | T* move_back_n(int n, T* t) {
  function pop_back (line 265) | void pop_back() {
  function pop_back_n (line 275) | void pop_back_n(int n) {
  function resize_back (line 289) | void resize_back(int newCount) {
  function swap (line 301) | void swap(SkTArray* that) {
  function T (line 317) | T* begin() {
  function T (line 320) | const T* begin() const {
  function T (line 323) | T* end() {
  function T (line 326) | const T* end() const {
  function T (line 350) | const T& front() const { SkASSERT(fCount > 0); return fItemArray[0];}
  function T (line 368) | const T& fromBack(int i) const {
  function initWithPreallocatedStorage (line 455) | void initWithPreallocatedStorage(int count, void* preallocStorage, int p...
  function copy (line 476) | void copy(const T* src) {
  function checkRealloc (line 515) | void checkRealloc(int delta) {
  function explicit (line 588) | explicit SkSTArray(const INHERITED& array)
  function explicit (line 592) | explicit SkSTArray(INHERITED&& array)
  function explicit (line 596) | explicit SkSTArray(int reserveCount)

FILE: include/private/SkTDArray.h
  function swap (line 70) | void swap(SkTDArray<T>& other) {
  function T (line 95) | T*  begin() { return fArray; }
  function T (line 96) | const T*  begin() const { return fArray; }
  function T (line 97) | T*  end() { return fArray ? fArray + fCount : nullptr; }
  function T (line 98) | const T*  end() const { return fArray ? fArray + fCount : nullptr; }
  function T (line 104) | const T&  operator[](int index) const {
  function T (line 112) | const T&  getAt(int index) const {
  function reset (line 116) | void reset() {
  function rewind (line 126) | void rewind() {
  function setCount (line 137) | void setCount(int count) {
  function setReserve (line 145) | void setReserve(int reserve) {
  function T (line 152) | T* prepend() {
  function T (line 158) | T* append() {
  function T (line 175) | T* appendClear() {
  function T (line 181) | T* insert(int index) {
  function removeShuffle (line 203) | void removeShuffle(int index) {
  function find (line 212) | int find(const T& elem) const {
  function rfind (line 224) | int rfind(const T& elem) const {
  function contains (line 239) | bool contains(const T& elem) const {
  function copyRange (line 247) | int copyRange(T* dst, int index, int max) const {
  function copy (line 258) | void copy(T* dst) const {
  function T (line 263) | T*       push() { return this->append(); }
  function push (line 264) | void     push(const T& elem) { *this->append() = elem; }
  function pop (line 267) | void     pop(T* elem) { SkASSERT(fCount > 0); if (elem) *elem = (*this)[...
  function pop (line 268) | void     pop() { SkASSERT(fCount > 0); --fCount; }
  function deleteAll (line 270) | void deleteAll() {
  function freeAll (line 280) | void freeAll() {
  function unrefAll (line 290) | void unrefAll() {
  function safeUnrefAll (line 300) | void safeUnrefAll() {
  function visitAll (line 310) | void visitAll(void visitor(T&)) {
  function shrinkToFit (line 327) | void shrinkToFit() {
  function adjustCount (line 341) | void adjustCount(int delta) {
  function resizeStorageToAtLeast (line 360) | void resizeStorageToAtLeast(int count) {

FILE: include/private/SkTFitsIn.h
  function namespace (line 50) | namespace sktfitsin {
  function SkTFitsIn (line 200) | inline bool SkTFitsIn(S s) {

FILE: include/private/SkTHash.h
  function reset (line 30) | void reset() {
  function T (line 53) | T* set(T val) {
  function T (line 61) | T* find(const K& key) const {
  function remove (line 79) | void remove(const K& key) {
  function resize (line 170) | void resize(int capacity) {
  function next (line 188) | int next(int index) const {
  function Hash (line 194) | static uint32_t Hash(const K& key) {
  type Slot (line 199) | struct Slot {
  function reset (line 227) | void reset() { fTable.reset(); }
  function V (line 239) | V* set(K key, V val) {
  function V (line 246) | V* find(const K& key) const {
  function remove (line 254) | void remove(const K& key) {
  type Pair (line 272) | struct Pair {
  function reset (line 289) | void reset() { fTable.reset(); }
  function add (line 298) | void add(T item) { fTable.set(std::move(item)); }
  function contains (line 301) | bool contains(const T& item) const { return SkToBool(this->find(item)); }
  function T (line 305) | const T* find(const T& item) const { return fTable.find(item); }
  function remove (line 308) | void remove(const T& item) {
  type Traits (line 320) | struct Traits {

FILE: include/private/SkTInternalLList.h
  function operator (line 20) | operator T*() const { return fPtr; }
  function reset (line 48) | void reset() {
  function remove (line 53) | void remove(T* entry) {
  function addToHead (line 79) | void addToHead(T* entry) {
  function addToTail (line 98) | void addToTail(T* entry) {
  function addBefore (line 122) | void addBefore(T* newEntry, T* existingEntry) {
  function addAfter (line 151) | void addAfter(T* newEntry, T* existingEntry) {
  function concat (line 175) | void concat(SkTInternalLList&& list) {
  function isEmpty (line 200) | bool isEmpty() const {
  function T (line 206) | T* tail() { return fTail; }
  function class (line 208) | class Iter {
  function isInList (line 295) | bool isInList(const T* entry) const {

FILE: include/private/SkTLogic.h
  function namespace (line 23) | namespace skstd {
  function namespace (line 92) | namespace sknonstd {

FILE: include/private/SkTSearch.h
  function class (line 126) | class SkAutoAsciiToLC {

FILE: include/private/SkTemplates.h
  function sk_ignore_unused_variable (line 31) | void sk_ignore_unused_variable(const T&) { }
  function D (line 43) | D* SkTAddOffset(S* ptr, size_t byteOffset) {
  function R (line 50) | R operator()(T* t) { return P(t); }
  function operator (line 66) | operator T*() const { return this->get(); }
  function operator (line 82) | operator T*() const { return this->get(); }
  function explicit (line 92) | explicit SkAutoTArray(int count) {
  function reset (line 113) | void reset(int count) { *this = SkAutoTArray(count);  }
  function T (line 117) | T* get() const { return fArray.get(); }
  function reset (line 154) | void reset(int count) {
  function T (line 193) | T* get() const { return fArray; }
  function T (line 195) | T* begin() { return fArray; }
  function T (line 197) | const T* begin() const { return fArray; }
  function T (line 199) | T* end() { return fArray + fCount; }
  function T (line 201) | const T* end() const { return fArray + fCount; }
  function explicit (line 237) | explicit SkAutoTMalloc(size_t count)
  function realloc (line 244) | void realloc(size_t count) {
  function T (line 254) | T* get() const { return fPtr.get(); }
  function operator (line 256) | operator T*() { return fPtr.get(); }
  function operator (line 258) | operator const T*() const { return fPtr.get(); }
  function T (line 262) | const T& operator[](int index) const { return fPtr.get()[index]; }
  function T (line 269) | T* release() { return fPtr.release(); }
  function T (line 296) | T* reset(size_t count) {
  function T (line 310) | T* get() const { return fPtr; }
  function operator (line 312) | operator T*() {
  function operator (line 316) | operator const T*() const {
  function T (line 324) | const T& operator[](int index) const {
  function realloc (line 329) | void realloc(size_t count) {

FILE: include/private/SkThreadID.h
  type SkThreadID (line 13) | typedef int64_t SkThreadID;

FILE: include/private/SkWeakRefCnt.h
  type SkRefCnt (line 172) | typedef SkRefCnt INHERITED;

FILE: include/svg/SkSVGCanvas.h
  function class (line 16) | class SK_API SkSVGCanvas {

FILE: include/utils/SkCamera.h
  type SkUnit3D (line 17) | struct SkUnit3D {
  type SkPoint3D (line 27) | struct SkPoint3D {
  type SkMatrix3D (line 37) | struct SkMatrix3D {
  function mapPoint (line 64) | void mapPoint(SkPoint3D* v) const {
  function mapVector (line 68) | void mapVector(SkVector3D* v) const {
  function class (line 73) | class SkPatch3D {
  function class (line 98) | class SkCamera3D {
  type Rec (line 144) | struct Rec {

FILE: include/utils/SkCanvasStateUtils.h
  function class (line 30) | class SK_API SkCanvasStateUtils {

FILE: include/utils/SkEventTracer.h
  function class (line 21) | class SK_API SkEventTracer {

FILE: include/utils/SkFrontBufferedStream.h
  function class (line 22) | class SK_API SkFrontBufferedStream {

FILE: include/utils/SkInterpolator.h
  type Result (line 17) | enum Result {
  function setMirror (line 45) | void setMirror(bool mirror) {
  function setRepeatCount (line 52) | void    setRepeatCount(SkScalar repeatCount) { fRepeat = repeatCount; }
  function setReset (line 58) | void setReset(bool reset) {
  type Flags (line 65) | enum Flags {
  type SkTimeCode (line 76) | struct SkTimeCode {
  type SkInterpolatorBase (line 121) | typedef SkInterpolatorBase INHERITED;

FILE: include/utils/SkLua.h
  type lua_State (line 16) | struct lua_State
  type SkRect (line 22) | struct SkRect
  function class (line 29) | class SkLua {

FILE: include/utils/SkLuaCanvas.h
  type lua_State (line 15) | struct lua_State
  function class (line 17) | class SkLuaCanvas : public SkCanvas {

FILE: include/utils/SkNoDrawCanvas.h
  type SkIRect (line 15) | struct SkIRect
  function resetCanvas (line 35) | void resetCanvas(int width, int height) {
  function onDrawAnnotation (line 43) | void onDrawAnnotation(const SkRect&, const char[], SkData*) override {}
  function onDrawDRRect (line 44) | void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) overri...
  function onDrawDrawable (line 45) | void onDrawDrawable(SkDrawable*, const SkMatrix*) override {}
  function onDrawText (line 46) | void onDrawText(const void*, size_t, SkScalar, SkScalar, const SkPaint&)...
  function onDrawPosText (line 47) | void onDrawPosText(const void*, size_t, const SkPoint[], const SkPaint&)...
  function onDrawPosTextH (line 48) | void onDrawPosTextH(const void*, size_t, const SkScalar[], SkScalar, con...
  function onDrawTextOnPath (line 49) | void onDrawTextOnPath(const void*, size_t, const SkPath&, const SkMatrix*,
  function onDrawTextRSXform (line 51) | void onDrawTextRSXform(const void*, size_t, const SkRSXform[], const SkR...
  function onDrawTextBlob (line 53) | void onDrawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint...
  function onDrawPatch (line 54) | void onDrawPatch(const SkPoint[12], const SkColor[4], const SkPoint[4], ...
  function onDrawPaint (line 57) | void onDrawPaint(const SkPaint&) override {}
  function onDrawPoints (line 58) | void onDrawPoints(PointMode, size_t, const SkPoint[], const SkPaint&) ov...
  function onDrawRect (line 59) | void onDrawRect(const SkRect&, const SkPaint&) override {}
  function onDrawRegion (line 60) | void onDrawRegion(const SkRegion&, const SkPaint&) override {}
  function onDrawOval (line 61) | void onDrawOval(const SkRect&, const SkPaint&) override {}
  function onDrawArc (line 62) | void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) ...
  function onDrawRRect (line 63) | void onDrawRRect(const SkRRect&, const SkPaint&) override {}
  function onDrawPath (line 64) | void onDrawPath(const SkPath&, const SkPaint&) override {}
  function onDrawBitmap (line 65) | void onDrawBitmap(const SkBitmap&, SkScalar, SkScalar, const SkPaint*) o...
  function onDrawBitmapRect (line 66) | void onDrawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, con...
  function onDrawImage (line 68) | void onDrawImage(const SkImage*, SkScalar, SkScalar, const SkPaint*) ove...
  function onDrawImageRect (line 69) | void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const...
  function onDrawImageNine (line 71) | void onDrawImageNine(const SkImage*, const SkIRect&, const SkRect&, cons...
  function onDrawBitmapNine (line 72) | void onDrawBitmapNine(const SkBitmap&, const SkIRect&, const SkRect&,
  function onDrawImageLattice (line 74) | void onDrawImageLattice(const SkImage*, const Lattice&, const SkRect&,
  function onDrawBitmapLattice (line 76) | void onDrawBitmapLattice(const SkBitmap&, const Lattice&, const SkRect&,
  function onDrawVerticesObject (line 78) | void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&...
  function onDrawAtlas (line 79) | void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], cons...
  function onDrawShadowRec (line 81) | void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override {}
  function onDrawPicture (line 82) | void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) ov...

FILE: include/utils/SkPaintFilterCanvas.h
  type Type (line 27) | enum Type {
  function GrContext (line 49) | GrContext*  getGrContext() override { return proxy()->getGrContext();     }
  function GrRenderTargetContext (line 50) | GrRenderTargetContext* internal_private_accessTopLayerRenderTargetContex...
  function SkCanvas (line 125) | SkCanvas* proxy() const { SkASSERT(fList.count() == 1); return fList[0]; }

FILE: include/utils/SkParse.h
  function class (line 15) | class SK_API SkParse {

FILE: include/utils/SkParsePath.h
  function class (line 17) | class SkParsePath {

FILE: include/utils/SkRandom.h
  function class (line 23) | class SkRandom {
  function nextU (line 38) | uint32_t nextU() {
  function nextS (line 46) | int32_t nextS() { return (int32_t)this->nextU(); }
  function U16CPU (line 50) | U16CPU nextU16() { return this->nextU() >> 16; }
  function S16CPU (line 54) | S16CPU nextS16() { return this->nextS() >> 16; }
  function nextF (line 59) | float nextF() {
  function nextRangeF (line 68) | float nextRangeF(float min, float max) {
  function nextBits (line 76) | uint32_t nextBits(unsigned bitCount) {
  function nextRangeU (line 84) | uint32_t nextRangeU(uint32_t min, uint32_t max) {
  function nextULessThan (line 97) | uint32_t nextULessThan(uint32_t count) {
  function SkScalar (line 105) | SkScalar nextUScalar1() { return SkFixedToScalar(this->nextUFixed1()); }
  function SkScalar (line 110) | SkScalar nextRangeScalar(SkScalar min, SkScalar max) {
  function SkScalar (line 117) | SkScalar nextSScalar1() { return SkFixedToScalar(this->nextSFixed1()); }
  function nextBool (line 121) | bool nextBool() { return this->nextU() >= 0x80000000; }
  function nextBiasedBool (line 125) | bool nextBiasedBool(SkScalar fractionTrue) {
  function next64 (line 133) | int64_t next64() {
  function setSeed (line 140) | void setSeed(uint32_t seed) { init(seed); }
  function NextLCG (line 157) | static uint32_t NextLCG(uint32_t seed) { return kMul*seed + kAdd; }
  function SkFixed (line 162) | SkFixed nextUFixed1() { return this->nextU() >> 16; }
  function SkFixed (line 167) | SkFixed nextSFixed1() { return this->nextS() >> 15; }

FILE: include/utils/SkShadowUtils.h
  function class (line 20) | class SK_API SkShadowUtils {

FILE: include/utils/mac/SkCGUtils.h
  function SkCopyPixelsFromCGImage (line 50) | static inline bool SkCopyPixelsFromCGImage(const SkPixmap& dst, CGImageR...
  function CGImageRef (line 65) | static inline CGImageRef SkCreateCGImageRef(const SkBitmap& bm) {

FILE: include/views/SkEvent.h
  type SkEventSinkID (line 18) | typedef uint32_t SkEventSinkID;
  function class (line 27) | class SkEvent {
  function findPtr (line 80) | bool findPtr(const char name[], void** value) const { return fMeta.findP...
  function findBool (line 81) | bool findBool(const char name[], bool* value) const { return fMeta.findB...
  function hasS32 (line 87) | bool hasS32(const char name[], int32_t value) const { return fMeta.hasS3...
  function hasScalar (line 89) | bool hasScalar(const char name[], SkScalar value) const { return fMeta.h...
  function hasString (line 91) | bool hasString(const char name[], const char value[]) const { return fMe...
  function hasPtr (line 93) | bool hasPtr(const char name[], void* value) const { return fMeta.hasPtr(...
  function hasBool (line 94) | bool hasBool(const char name[], bool value) const { return fMeta.hasBool...
  function hasData (line 95) | bool hasData(const char name[], const void* data, size_t byteCount) const {
  function setS32 (line 100) | void setS32(const char name[], int32_t value) { fMeta.setS32(name, value...
  function setScalar (line 102) | void setScalar(const char name[], SkScalar value) { fMeta.setScalar(name...
  function setString (line 108) | void setString(const char name[], const char value[]) { fMeta.setString(...
  function setPtr (line 110) | void setPtr(const char name[], void* value) { fMeta.setPtr(name, value); }
  function setBool (line 111) | void setBool(const char name[], bool value) { fMeta.setBool(name, value); }
  function setData (line 112) | void setData(const char name[], const void* data, size_t byteCount) {

FILE: include/views/SkEventSink.h
  function class (line 20) | class SkEventSink : public SkRefCnt {

FILE: include/views/SkKey.h
  type SkModifierKeys (line 15) | enum SkModifierKeys {

FILE: include/views/SkTouchGesture.h
  function stop (line 14) | struct SkFlingState {
  function class (line 30) | class SkTouchGesture {

FILE: include/views/SkView.h
  function class (line 25) | class SkView : public SkEventSink {

FILE: skia_bindings.cpp
  type emscripten (line 10) | namespace emscripten {
    type internal (line 11) | namespace internal {
    type internal (line 22) | namespace internal {
  type emscripten (line 21) | namespace emscripten {
    type internal (line 11) | namespace internal {
    type internal (line 22) | namespace internal {
  function val (line 39) | val getSkDataBytes(const SkData *data) {
  function makeWebGLSurface (line 43) | sk_sp<SkSurface> makeWebGLSurface(std::string id, int width, int height) {
  function EMSCRIPTEN_BINDINGS (line 94) | EMSCRIPTEN_BINDINGS(skia_module) {
Condensed preview — 283 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,222K chars).
[
  {
    "path": ".gitattributes",
    "chars": 165,
    "preview": "*.a filter=lfs diff=lfs merge=lfs -text\n*.bc filter=lfs diff=lfs merge=lfs -text\n*.ttc filter=lfs diff=lfs merge=lfs -te"
  },
  {
    "path": ".gitignore",
    "chars": 60,
    "preview": "skia_bindings.bc\n.idea/\n/cmake-build-debug/\n/CMakeLists.txt\n"
  },
  {
    "path": "LICENSE",
    "chars": 1071,
    "preview": "MIT License\n\nCopyright (c) 2017 Erik De Rijcke\n\nPermission is hereby granted, free of charge, to any person obtaining a "
  },
  {
    "path": "README.md",
    "chars": 3126,
    "preview": "This project has been superseded by Google's [CanvasKit](https://skia.org/user/modules/canvaskit)\n\n# skia-wasm-port\nPort"
  },
  {
    "path": "build_bindings.sh",
    "chars": 895,
    "preview": "#!/usr/bin/env bash\n\n#eg /home/john/emsdk-portable\n#EMSDK=\"path/to/em/sdk\"\nEMSDK=\"/home/zubzub/emsdk-portable\"\n#eg 1.37."
  },
  {
    "path": "build_skia_wasm_bitcode.sh",
    "chars": 1054,
    "preview": "#!/bin/bash\n\npatch -p0 < wasm_compatible_build.patch\n\n#eg /home/john/emsdk-portable\nEMSDK=\"/home/zubzub/emsdk-portable\"\n"
  },
  {
    "path": "docs/index.html",
    "chars": 214,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <title>WebAssembly WebGL Skia</title>\n    <script src=\"./skia.js\"></script>\n    <scrip"
  },
  {
    "path": "docs/skia.js",
    "chars": 313611,
    "preview": "var Module = function(Module) {\n  Module = Module || {};\n\nvar Module=typeof Module!==\"undefined\"?Module:{};var moduleOve"
  },
  {
    "path": "docs/webgl.js",
    "chars": 4410,
    "preview": "'use strict'\n\n//TODO port sdl example instead\n// TODO port types: SkTArray, SkRect, SkMatrix\n\nconst helpMessage = 'Click"
  },
  {
    "path": "example_gradient.js",
    "chars": 1568,
    "preview": "const fs = require('fs')\nconst skia = require('./skia')\n\nfunction draw (skiaModule, canvas) {\n  canvas.clear(0xFFFFFFFF)"
  },
  {
    "path": "example_star.js",
    "chars": 1522,
    "preview": "const fs = require('fs')\nconst skia = require('./skia')\n\nfunction draw (canvas) {\n  const scale = 256.0\n  const R = 0.45"
  },
  {
    "path": "example_text.js",
    "chars": 2366,
    "preview": "const fs = require('fs')\nconst path = require('path')\nconst skia = require('./skia')\n\nfunction draw (skiaModule, canvas)"
  },
  {
    "path": "include/android/SkAndroidFrameworkUtils.h",
    "chars": 928,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/android/SkAnimatedImage.h",
    "chars": 4626,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/android/SkBRDAllocator.h",
    "chars": 658,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/android/SkBitmapRegionDecoder.h",
    "chars": 3421,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/atlastext/SkAtlasTextContext.h",
    "chars": 1230,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/atlastext/SkAtlasTextFont.h",
    "chars": 962,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/atlastext/SkAtlasTextRenderer.h",
    "chars": 2603,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/atlastext/SkAtlasTextTarget.h",
    "chars": 3179,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_canvas.h",
    "chars": 6033,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_data.h",
    "chars": 2111,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_image.h",
    "chars": 2075,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_maskfilter.h",
    "chars": 1379,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_matrix.h",
    "chars": 1286,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_paint.h",
    "chars": 4072,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_path.h",
    "chars": 2788,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_picture.h",
    "chars": 2109,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_shader.h",
    "chars": 6080,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_surface.h",
    "chars": 2729,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/c/sk_types.h",
    "chars": 7916,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/codec/SkAndroidCodec.h",
    "chars": 11846,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/codec/SkCodec.h",
    "chars": 35351,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/codec/SkCodecAnimation.h",
    "chars": 1215,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/codec/SkEncodedOrigin.h",
    "chars": 962,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/config/SkUserConfig.h",
    "chars": 5240,
    "preview": "\n/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkAnnotation.h",
    "chars": 1366,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkBBHFactory.h",
    "chars": 674,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkBitmap.h",
    "chars": 56285,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkBlendMode.h",
    "chars": 1507,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkBlurTypes.h",
    "chars": 540,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkCanvas.h",
    "chars": 133099,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkCanvasVirtualEnforcer.h",
    "chars": 4656,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkClipOp.h",
    "chars": 860,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkColor.h",
    "chars": 6783,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkColorFilter.h",
    "chars": 7550,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkColorPriv.h",
    "chars": 5685,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkColorSpace.h",
    "chars": 9029,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkColorSpaceXform.h",
    "chars": 2626,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkColorSpaceXformCanvas.h",
    "chars": 652,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkCoverageMode.h",
    "chars": 808,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkData.h",
    "chars": 5958,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkDataTable.h",
    "chars": 3743,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkDeferredDisplayListRecorder.h",
    "chars": 6376,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkDeque.h",
    "chars": 3726,
    "preview": "\n/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkDocument.h",
    "chars": 7481,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkDrawFilter.h",
    "chars": 1255,
    "preview": "\n/*\n * Copyright 2011 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkDrawLooper.h",
    "chars": 4728,
    "preview": "\n/*\n * Copyright 2011 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkDrawable.h",
    "chars": 3285,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkEncodedImageFormat.h",
    "chars": 545,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkExecutor.h",
    "chars": 1002,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkFilterQuality.h",
    "chars": 747,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkFlattenable.h",
    "chars": 3002,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkFont.h",
    "chars": 6029,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkFontArguments.h",
    "chars": 2518,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkFontLCDConfig.h",
    "chars": 1818,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkFontStyle.h",
    "chars": 2348,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkGraphics.h",
    "chars": 6707,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkICC.h",
    "chars": 1032,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkImage.h",
    "chars": 43716,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkImageEncoder.h",
    "chars": 2268,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkImageFilter.h",
    "chars": 20583,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkImageGenerator.h",
    "chars": 8202,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkImageInfo.h",
    "chars": 26017,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkMallocPixelRef.h",
    "chars": 3202,
    "preview": "/*\n * Copyright 2008 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkMaskFilter.h",
    "chars": 3043,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkMath.h",
    "chars": 3688,
    "preview": "\n/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkMatrix.h",
    "chars": 68554,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkMatrix44.h",
    "chars": 16617,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkMetaData.h",
    "chars": 5547,
    "preview": "\n/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkMilestone.h",
    "chars": 196,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkMultiPictureDraw.h",
    "chars": 2158,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkOverdrawCanvas.h",
    "chars": 3793,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkPaint.h",
    "chars": 62546,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPath.h",
    "chars": 72988,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPathEffect.h",
    "chars": 7173,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPathMeasure.h",
    "chars": 4940,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPicture.h",
    "chars": 7805,
    "preview": "/*\n * Copyright 2007 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPictureRecorder.h",
    "chars": 4792,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkPixelRef.h",
    "chars": 5247,
    "preview": "/*\n * Copyright 2008 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPixmap.h",
    "chars": 32696,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkPngChunkReader.h",
    "chars": 1507,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkPoint.h",
    "chars": 16355,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPoint3.h",
    "chars": 3754,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkPostConfig.h",
    "chars": 10993,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkPreConfig.h",
    "chars": 9326,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkRRect.h",
    "chars": 11621,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkRSXform.h",
    "chars": 1886,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkRWBuffer.h",
    "chars": 3190,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkRasterHandleAllocator.h",
    "chars": 3583,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkRect.h",
    "chars": 58583,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkRefCnt.h",
    "chars": 15287,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkRegion.h",
    "chars": 15201,
    "preview": "\n/*\n * Copyright 2005 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkScalar.h",
    "chars": 7438,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkSerialProcs.h",
    "chars": 2644,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkShader.h",
    "chars": 11414,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkSize.h",
    "chars": 2817,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkStream.h",
    "chars": 16574,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkString.h",
    "chars": 11418,
    "preview": "\n/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkStrokeRec.h",
    "chars": 4529,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkSurface.h",
    "chars": 37117,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkSurfaceCharacterization.h",
    "chars": 7197,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkSurfaceProps.h",
    "chars": 2633,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkSwizzle.h",
    "chars": 389,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkTLazy.h",
    "chars": 5764,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkTextBlob.h",
    "chars": 11015,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkTime.h",
    "chars": 1724,
    "preview": "\n/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkTraceMemoryDump.h",
    "chars": 3363,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkTypeface.h",
    "chars": 16230,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkTypes.h",
    "chars": 12553,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/core/SkUnPreMultiply.h",
    "chars": 1201,
    "preview": "\n/*\n * Copyright 2008 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license t"
  },
  {
    "path": "include/core/SkVertices.h",
    "chars": 5081,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/core/SkYUVSizeInfo.h",
    "chars": 1064,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/Sk1DPathEffect.h",
    "chars": 2997,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/Sk2DPathEffect.h",
    "chars": 3632,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkAlphaThresholdFilter.h",
    "chars": 981,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkArithmeticImageFilter.h",
    "chars": 735,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkBlurDrawLooper.h",
    "chars": 519,
    "preview": "/*\n * Copyright 2008 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkBlurImageFilter.h",
    "chars": 1164,
    "preview": "/*\n * Copyright 2011 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkBlurMaskFilter.h",
    "chars": 1146,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkColorFilterImageFilter.h",
    "chars": 1561,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkColorMatrix.h",
    "chars": 2044,
    "preview": "/*\n * Copyright 2007 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkColorMatrixFilter.h",
    "chars": 708,
    "preview": "/*\n * Copyright 2007 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkComposeImageFilter.h",
    "chars": 1419,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkCornerPathEffect.h",
    "chars": 1505,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkDashPathEffect.h",
    "chars": 1194,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkDiscretePathEffect.h",
    "chars": 2224,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkDisplacementMapEffect.h",
    "chars": 2532,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkDropShadowImageFilter.h",
    "chars": 2051,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkGradientShader.h",
    "chars": 14538,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkHighContrastFilter.h",
    "chars": 2358,
    "preview": "/*\n* Copyright 2017 Google Inc.\n*\n* Use of this source code is governed by a BSD-style license that can be\n* found in th"
  },
  {
    "path": "include/effects/SkImageSource.h",
    "chars": 1755,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkLayerDrawLooper.h",
    "chars": 4752,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkLightingImageFilter.h",
    "chars": 2663,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkLumaColorFilter.h",
    "chars": 1384,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkMagnifierImageFilter.h",
    "chars": 1404,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkMatrixConvolutionImageFilter.h",
    "chars": 5734,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkMergeImageFilter.h",
    "chars": 1587,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkMorphologyImageFilter.h",
    "chars": 3746,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkOffsetImageFilter.h",
    "chars": 1500,
    "preview": "/*\n * Copyright 2012 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkOverdrawColorFilter.h",
    "chars": 1540,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkPaintFlagsDrawFilter.h",
    "chars": 571,
    "preview": "/*\n * Copyright 2008 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkPaintImageFilter.h",
    "chars": 1717,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkPerlinNoiseShader.h",
    "chars": 2622,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkPictureImageFilter.h",
    "chars": 2158,
    "preview": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkShaderMaskFilter.h",
    "chars": 458,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkTableColorFilter.h",
    "chars": 1429,
    "preview": "/*\n* Copyright 2015 Google Inc.\n*\n* Use of this source code is governed by a BSD-style license that can be\n* found in th"
  },
  {
    "path": "include/effects/SkTableMaskFilter.h",
    "chars": 1066,
    "preview": "/*\n * Copyright 2006 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/effects/SkTileImageFilter.h",
    "chars": 1927,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkToSRGBColorFilter.h",
    "chars": 1296,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkTrimPathEffect.h",
    "chars": 1430,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/effects/SkXfermodeImageFilter.h",
    "chars": 1075,
    "preview": "/*\n * Copyright 2013 The Android Open Source Project\n *\n * Use of this source code is governed by a BSD-style license th"
  },
  {
    "path": "include/encode/SkEncoder.h",
    "chars": 908,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/encode/SkJpegEncoder.h",
    "chars": 2847,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/encode/SkPngEncoder.h",
    "chars": 3539,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/encode/SkWebpEncoder.h",
    "chars": 1834,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrBackendSemaphore.h",
    "chars": 1657,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrBackendSurface.h",
    "chars": 11048,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrBlend.h",
    "chars": 5411,
    "preview": "\n/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/GrConfig.h",
    "chars": 5035,
    "preview": "\n/*\n * Copyright 2010 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/GrContext.h",
    "chars": 19049,
    "preview": "/*\n * Copyright 2010 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrContextOptions.h",
    "chars": 8601,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrDriverBugWorkarounds.h",
    "chars": 1349,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrDriverBugWorkaroundsAutogen.h",
    "chars": 1359,
    "preview": "// Copyright 2018 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style licen"
  },
  {
    "path": "include/gpu/GrGpuResource.h",
    "chars": 13223,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrRenderTarget.h",
    "chars": 4476,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrResourceKey.h",
    "chars": 11978,
    "preview": "\n/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/GrSamplerState.h",
    "chars": 2160,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrSurface.h",
    "chars": 4427,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/GrTexture.h",
    "chars": 2806,
    "preview": "\n/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/GrTypes.h",
    "chars": 8094,
    "preview": "/*\n * Copyright 2010 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/gl/GrGLAssembleInterface.h",
    "chars": 1289,
    "preview": "/*\n * Copyright 2014 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/gl/GrGLConfig.h",
    "chars": 4617,
    "preview": "\n/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/gl/GrGLConfig_chrome.h",
    "chars": 1140,
    "preview": "\n/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/gl/GrGLExtensions.h",
    "chars": 2184,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/gl/GrGLFunctions.h",
    "chars": 24350,
    "preview": "\n/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/gl/GrGLInterface.h",
    "chars": 18644,
    "preview": "/*\n * Copyright 2011 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/gl/GrGLTypes.h",
    "chars": 3687,
    "preview": "\n/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/mock/GrMockTypes.h",
    "chars": 2343,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/mtl/GrMtlTypes.h",
    "chars": 353,
    "preview": "/*\n * Copyright 2017 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/vk/GrVkBackendContext.h",
    "chars": 4122,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/vk/GrVkDefines.h",
    "chars": 5159,
    "preview": "\n/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/gpu/vk/GrVkInterface.h",
    "chars": 10841,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/vk/GrVkMemoryAllocator.h",
    "chars": 4265,
    "preview": "/*\n * Copyright 2018 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/gpu/vk/GrVkTypes.h",
    "chars": 4140,
    "preview": "\n/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found "
  },
  {
    "path": "include/pathops/SkPathOps.h",
    "chars": 3411,
    "preview": "/*\n * Copyright 2012 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/ports/SkFontConfigInterface.h",
    "chars": 3927,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/ports/SkFontMgr.h",
    "chars": 6562,
    "preview": "/*\n * Copyright 2013 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/ports/SkFontMgr_FontConfigInterface.h",
    "chars": 527,
    "preview": "/*\n * Copyright 2016 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  },
  {
    "path": "include/ports/SkFontMgr_android.h",
    "chars": 1477,
    "preview": "/*\n * Copyright 2015 Google Inc.\n *\n * Use of this source code is governed by a BSD-style license that can be\n * found i"
  }
]

// ... and 83 more files (download for full content)

About this extraction

This page contains the full source code of the Zubnix/skia-wasm-port GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 283 files (2.0 MB), approximately 550.2k tokens, and a symbol index with 2022 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!