{"version":3,"sources":["jsdelivr-header.js","/npm/tiff-imagery-provider@2.17.1/src/plotty/colorscales.ts","/npm/tiff-imagery-provider@2.17.1/src/plotty/arithmetics-parser.js","/npm/tiff-imagery-provider@2.17.1/src/helpers/utils.ts","/npm/tiff-imagery-provider@2.17.1/src/plotty/index.ts","/npm/tiff-imagery-provider@2.17.1/src/TIFFImageryProviderTilingScheme.ts","/npm/tiff-imagery-provider@2.17.1/src/helpers/reprojection.ts","/npm/tiff-imagery-provider@2.17.1/src/helpers/createCanavas.ts","/npm/tiff-imagery-provider@2.17.1/src/TIFFImageryProvider.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,4OCNO,MAAM,YAAc,CACvB,QAAS,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,MAC/qH,QAAS,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAC3jH,MAAO,IAAI,WAAW,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI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G,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MACnqH,OAAQ,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,I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UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC93C,UAAW,CAAC,EAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAAc,YAAc,YAAc,YAAc,WAA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","file":"/npm/tiff-imagery-provider@2.17.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/tiff-imagery-provider@2.17.1/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export const colorscales = {\r\n    viridis: new Uint8Array([68,1,84,255,68,2,86,255,69,4,87,255,69,5,89,255,70,7,90,255,70,8,92,255,70,10,93,255,70,11,94,255,71,13,96,255,71,14,97,255,71,16,99,255,71,17,100,255,71,19,101,255,72,20,103,255,72,22,104,255,72,23,105,255,72,24,106,255,72,26,108,255,72,27,109,255,72,28,110,255,72,29,111,255,72,31,112,255,72,32,113,255,72,33,115,255,72,35,116,255,72,36,117,255,72,37,118,255,72,38,119,255,72,40,120,255,72,41,121,255,71,42,122,255,71,44,122,255,71,45,123,255,71,46,124,255,71,47,125,255,70,48,126,255,70,50,126,255,70,51,127,255,70,52,128,255,69,53,129,255,69,55,129,255,69,56,130,255,68,57,131,255,68,58,131,255,68,59,132,255,67,61,132,255,67,62,133,255,66,63,133,255,66,64,134,255,66,65,134,255,65,66,135,255,65,68,135,255,64,69,136,255,64,70,136,255,63,71,136,255,63,72,137,255,62,73,137,255,62,74,137,255,62,76,138,255,61,77,138,255,61,78,138,255,60,79,138,255,60,80,139,255,59,81,139,255,59,82,139,255,58,83,139,255,58,84,140,255,57,85,140,255,57,86,140,255,56,88,140,255,56,89,140,255,55,90,140,255,55,91,141,255,54,92,141,255,54,93,141,255,53,94,141,255,53,95,141,255,52,96,141,255,52,97,141,255,51,98,141,255,51,99,141,255,50,100,142,255,50,101,142,255,49,102,142,255,49,103,142,255,49,104,142,255,48,105,142,255,48,106,142,255,47,107,142,255,47,108,142,255,46,109,142,255,46,110,142,255,46,111,142,255,45,112,142,255,45,113,142,255,44,113,142,255,44,114,142,255,44,115,142,255,43,116,142,255,43,117,142,255,42,118,142,255,42,119,142,255,42,120,142,255,41,121,142,255,41,122,142,255,41,123,142,255,40,124,142,255,40,125,142,255,39,126,142,255,39,127,142,255,39,128,142,255,38,129,142,255,38,130,142,255,38,130,142,255,37,131,142,255,37,132,142,255,37,133,142,255,36,134,142,255,36,135,142,255,35,136,142,255,35,137,142,255,35,138,141,255,34,139,141,255,34,140,141,255,34,141,141,255,33,142,141,255,33,143,141,255,33,144,141,255,33,145,140,255,32,146,140,255,32,146,140,255,32,147,140,255,31,148,140,255,31,149,139,255,31,150,139,255,31,151,139,255,31,152,139,255,31,153,138,255,31,154,138,255,30,155,138,255,30,156,137,255,30,157,137,255,31,158,137,255,31,159,136,255,31,160,136,255,31,161,136,255,31,161,135,255,31,162,135,255,32,163,134,255,32,164,134,255,33,165,133,255,33,166,133,255,34,167,133,255,34,168,132,255,35,169,131,255,36,170,131,255,37,171,130,255,37,172,130,255,38,173,129,255,39,173,129,255,40,174,128,255,41,175,127,255,42,176,127,255,44,177,126,255,45,178,125,255,46,179,124,255,47,180,124,255,49,181,123,255,50,182,122,255,52,182,121,255,53,183,121,255,55,184,120,255,56,185,119,255,58,186,118,255,59,187,117,255,61,188,116,255,63,188,115,255,64,189,114,255,66,190,113,255,68,191,112,255,70,192,111,255,72,193,110,255,74,193,109,255,76,194,108,255,78,195,107,255,80,196,106,255,82,197,105,255,84,197,104,255,86,198,103,255,88,199,101,255,90,200,100,255,92,200,99,255,94,201,98,255,96,202,96,255,99,203,95,255,101,203,94,255,103,204,92,255,105,205,91,255,108,205,90,255,110,206,88,255,112,207,87,255,115,208,86,255,117,208,84,255,119,209,83,255,122,209,81,255,124,210,80,255,127,211,78,255,129,211,77,255,132,212,75,255,134,213,73,255,137,213,72,255,139,214,70,255,142,214,69,255,144,215,67,255,147,215,65,255,149,216,64,255,152,216,62,255,155,217,60,255,157,217,59,255,160,218,57,255,162,218,55,255,165,219,54,255,168,219,52,255,170,220,50,255,173,220,48,255,176,221,47,255,178,221,45,255,181,222,43,255,184,222,41,255,186,222,40,255,189,223,38,255,192,223,37,255,194,223,35,255,197,224,33,255,200,224,32,255,202,225,31,255,205,225,29,255,208,225,28,255,210,226,27,255,213,226,26,255,216,226,25,255,218,227,25,255,221,227,24,255,223,227,24,255,226,228,24,255,229,228,25,255,231,228,25,255,234,229,26,255,236,229,27,255,239,229,28,255,241,229,29,255,244,230,30,255,246,230,32,255,248,230,33,255,251,231,35,255,253,231,37,255]),\r\n    inferno: new Uint8Array([0,0,4,255,1,0,5,255,1,1,6,255,1,1,8,255,2,1,10,255,2,2,12,255,2,2,14,255,3,2,16,255,4,3,18,255,4,3,20,255,5,4,23,255,6,4,25,255,7,5,27,255,8,5,29,255,9,6,31,255,10,7,34,255,11,7,36,255,12,8,38,255,13,8,41,255,14,9,43,255,16,9,45,255,17,10,48,255,18,10,50,255,20,11,52,255,21,11,55,255,22,11,57,255,24,12,60,255,25,12,62,255,27,12,65,255,28,12,67,255,30,12,69,255,31,12,72,255,33,12,74,255,35,12,76,255,36,12,79,255,38,12,81,255,40,11,83,255,41,11,85,255,43,11,87,255,45,11,89,255,47,10,91,255,49,10,92,255,50,10,94,255,52,10,95,255,54,9,97,255,56,9,98,255,57,9,99,255,59,9,100,255,61,9,101,255,62,9,102,255,64,10,103,255,66,10,104,255,68,10,104,255,69,10,105,255,71,11,106,255,73,11,106,255,74,12,107,255,76,12,107,255,77,13,108,255,79,13,108,255,81,14,108,255,82,14,109,255,84,15,109,255,85,15,109,255,87,16,110,255,89,16,110,255,90,17,110,255,92,18,110,255,93,18,110,255,95,19,110,255,97,19,110,255,98,20,110,255,100,21,110,255,101,21,110,255,103,22,110,255,105,22,110,255,106,23,110,255,108,24,110,255,109,24,110,255,111,25,110,255,113,25,110,255,114,26,110,255,116,26,110,255,117,27,110,255,119,28,109,255,120,28,109,255,122,29,109,255,124,29,109,255,125,30,109,255,127,30,108,255,128,31,108,255,130,32,108,255,132,32,107,255,133,33,107,255,135,33,107,255,136,34,106,255,138,34,106,255,140,35,105,255,141,35,105,255,143,36,105,255,144,37,104,255,146,37,104,255,147,38,103,255,149,38,103,255,151,39,102,255,152,39,102,255,154,40,101,255,155,41,100,255,157,41,100,255,159,42,99,255,160,42,99,255,162,43,98,255,163,44,97,255,165,44,96,255,166,45,96,255,168,46,95,255,169,46,94,255,171,47,94,255,173,48,93,255,174,48,92,255,176,49,91,255,177,50,90,255,179,50,90,255,180,51,89,255,182,52,88,255,183,53,87,255,185,53,86,255,186,54,85,255,188,55,84,255,189,56,83,255,191,57,82,255,192,58,81,255,193,58,80,255,195,59,79,255,196,60,78,255,198,61,77,255,199,62,76,255,200,63,75,255,202,64,74,255,203,65,73,255,204,66,72,255,206,67,71,255,207,68,70,255,208,69,69,255,210,70,68,255,211,71,67,255,212,72,66,255,213,74,65,255,215,75,63,255,216,76,62,255,217,77,61,255,218,78,60,255,219,80,59,255,221,81,58,255,222,82,56,255,223,83,55,255,224,85,54,255,225,86,53,255,226,87,52,255,227,89,51,255,228,90,49,255,229,92,48,255,230,93,47,255,231,94,46,255,232,96,45,255,233,97,43,255,234,99,42,255,235,100,41,255,235,102,40,255,236,103,38,255,237,105,37,255,238,106,36,255,239,108,35,255,239,110,33,255,240,111,32,255,241,113,31,255,241,115,29,255,242,116,28,255,243,118,27,255,243,120,25,255,244,121,24,255,245,123,23,255,245,125,21,255,246,126,20,255,246,128,19,255,247,130,18,255,247,132,16,255,248,133,15,255,248,135,14,255,248,137,12,255,249,139,11,255,249,140,10,255,249,142,9,255,250,144,8,255,250,146,7,255,250,148,7,255,251,150,6,255,251,151,6,255,251,153,6,255,251,155,6,255,251,157,7,255,252,159,7,255,252,161,8,255,252,163,9,255,252,165,10,255,252,166,12,255,252,168,13,255,252,170,15,255,252,172,17,255,252,174,18,255,252,176,20,255,252,178,22,255,252,180,24,255,251,182,26,255,251,184,29,255,251,186,31,255,251,188,33,255,251,190,35,255,250,192,38,255,250,194,40,255,250,196,42,255,250,198,45,255,249,199,47,255,249,201,50,255,249,203,53,255,248,205,55,255,248,207,58,255,247,209,61,255,247,211,64,255,246,213,67,255,246,215,70,255,245,217,73,255,245,219,76,255,244,221,79,255,244,223,83,255,244,225,86,255,243,227,90,255,243,229,93,255,242,230,97,255,242,232,101,255,242,234,105,255,241,236,109,255,241,237,113,255,241,239,117,255,241,241,121,255,242,242,125,255,242,244,130,255,243,245,134,255,243,246,138,255,244,248,142,255,245,249,146,255,246,250,150,255,248,251,154,255,249,252,157,255,250,253,161,255,252,255,164,255]),\r\n    turbo: new Uint8Array([48,18,59,255,50,21,67,255,51,24,74,255,52,27,81,255,53,30,88,255,54,33,95,255,55,36,102,255,56,39,109,255,57,42,115,255,58,45,121,255,59,47,128,255,60,50,134,255,61,53,139,255,62,56,145,255,63,59,151,255,63,62,156,255,64,64,162,255,65,67,167,255,65,70,172,255,66,73,177,255,66,75,181,255,67,78,186,255,68,81,191,255,68,84,195,255,68,86,199,255,69,89,203,255,69,92,207,255,69,94,211,255,70,97,214,255,70,100,218,255,70,102,221,255,70,105,224,255,70,107,227,255,71,110,230,255,71,113,233,255,71,115,235,255,71,118,238,255,71,120,240,255,71,123,242,255,70,125,244,255,70,128,246,255,70,130,248,255,70,133,250,255,70,135,251,255,69,138,252,255,69,140,253,255,68,143,254,255,67,145,254,255,66,148,255,255,65,150,255,255,64,153,255,255,62,155,254,255,61,158,254,255,59,160,253,255,58,163,252,255,56,165,251,255,55,168,250,255,53,171,248,255,51,173,247,255,49,175,245,255,47,178,244,255,46,180,242,255,44,183,240,255,42,185,238,255,40,188,235,255,39,190,233,255,37,192,231,255,35,195,228,255,34,197,226,255,32,199,223,255,31,201,221,255,30,203,218,255,28,205,216,255,27,208,213,255,26,210,210,255,26,212,208,255,25,213,205,255,24,215,202,255,24,217,200,255,24,219,197,255,24,221,194,255,24,222,192,255,24,224,189,255,25,226,187,255,25,227,185,255,26,228,182,255,28,230,180,255,29,231,178,255,31,233,175,255,32,234,172,255,34,235,170,255,37,236,167,255,39,238,164,255,42,239,161,255,44,240,158,255,47,241,155,255,50,242,152,255,53,243,148,255,56,244,145,255,60,245,142,255,63,246,138,255,67,247,135,255,70,248,132,255,74,248,128,255,78,249,125,255,82,250,122,255,85,250,118,255,89,251,115,255,93,252,111,255,97,252,108,255,101,253,105,255,105,253,102,255,109,254,98,255,113,254,95,255,117,254,92,255,121,254,89,255,125,255,86,255,128,255,83,255,132,255,81,255,136,255,78,255,139,255,75,255,143,255,73,255,146,255,71,255,150,254,68,255,153,254,66,255,156,254,64,255,159,253,63,255,161,253,61,255,164,252,60,255,167,252,58,255,169,251,57,255,172,251,56,255,175,250,55,255,177,249,54,255,180,248,54,255,183,247,53,255,185,246,53,255,188,245,52,255,190,244,52,255,193,243,52,255,195,241,52,255,198,240,52,255,200,239,52,255,203,237,52,255,205,236,52,255,208,234,52,255,210,233,53,255,212,231,53,255,215,229,53,255,217,228,54,255,219,226,54,255,221,224,55,255,223,223,55,255,225,221,55,255,227,219,56,255,229,217,56,255,231,215,57,255,233,213,57,255,235,211,57,255,236,209,58,255,238,207,58,255,239,205,58,255,241,203,58,255,242,201,58,255,244,199,58,255,245,197,58,255,246,195,58,255,247,193,58,255,248,190,57,255,249,188,57,255,250,186,57,255,251,184,56,255,251,182,55,255,252,179,54,255,252,177,54,255,253,174,53,255,253,172,52,255,254,169,51,255,254,167,50,255,254,164,49,255,254,161,48,255,254,158,47,255,254,155,45,255,254,153,44,255,254,150,43,255,254,147,42,255,254,144,41,255,253,141,39,255,253,138,38,255,252,135,37,255,252,132,35,255,251,129,34,255,251,126,33,255,250,123,31,255,249,120,30,255,249,117,29,255,248,114,28,255,247,111,26,255,246,108,25,255,245,105,24,255,244,102,23,255,243,99,21,255,242,96,20,255,241,93,19,255,240,91,18,255,239,88,17,255,237,85,16,255,236,83,15,255,235,80,14,255,234,78,13,255,232,75,12,255,231,73,12,255,229,71,11,255,228,69,10,255,226,67,10,255,225,65,9,255,223,63,8,255,221,61,8,255,220,59,7,255,218,57,7,255,216,55,6,255,214,53,6,255,212,51,5,255,210,49,5,255,208,47,5,255,206,45,4,255,204,43,4,255,202,42,4,255,200,40,3,255,197,38,3,255,195,37,3,255,193,35,2,255,190,33,2,255,188,32,2,255,185,30,2,255,183,29,2,255,180,27,1,255,178,26,1,255,175,24,1,255,172,23,1,255,169,22,1,255,167,20,1,255,164,19,1,255,161,18,1,255,158,16,1,255,155,15,1,255,152,14,1,255,149,13,1,255,146,11,1,255,142,10,1,255,139,9,2,255,136,8,2,255,133,7,2,255,129,6,2,255,126,5,2,255,122,4,3,255]),\r\n  rainbow: {\r\n    colors: ['#96005A','#0000C8','#0019FF','#0098FF','#2CFF96','#97FF00','#FFEA00','#FF6F00','#FF0000'],\r\n    positions: [0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1]\r\n  },\r\n  jet: {\r\n    colors: ['#000083','#003CAA','#05FFFF','#FFFF00','#FA0000','#800000'],\r\n    positions: [0, 0.125, 0.375, 0.625, 0.875, 1]\r\n  },\r\n  hsv: {\r\n    colors: ['#ff0000','#fdff02','#f7ff02','#00fc04','#00fc0a','#01f9ff','#0200fd','#0800fd','#ff00fb','#ff00f5','#ff0006'],\r\n    positions: [0,0.169,0.173,0.337,0.341,0.506,0.671,0.675,0.839,0.843,1]\r\n  },\r\n  hot: {\r\n    colors: ['#000000','#e60000','#ffd200','#ffffff'],\r\n    positions: [0,0.3,0.6,1]\r\n  },\r\n  cool: {\r\n    colors: ['#00ffff','#ff00ff'],\r\n    positions: [0,1]\r\n  },\r\n  spring: {\r\n    colors: ['#ff00ff','#ffff00'],\r\n    positions: [0,1]\r\n  },\r\n  summer: {\r\n    colors: ['#008066','#ffff66'],\r\n    positions: [0,1]\r\n  },\r\n  autumn: {\r\n    colors: ['#ff0000','#ffff00'],\r\n    positions: [0,1]\r\n  },\r\n  winter: {\r\n    colors: ['#0000ff','#00ff80'],\r\n    positions: [0,1]\r\n  },\r\n  bone: {\r\n    colors: ['#000000','#545474','#a9c8c8','#ffffff'],\r\n    positions: [0,0.376,0.753,1]\r\n  },\r\n  copper: {\r\n    colors: ['#000000','#ffa066','#ffc77f'],\r\n    positions: [0,0.804,1]\r\n  },\r\n  greys: {\r\n    colors: ['#000000','#ffffff'],\r\n    positions: [0,1]\r\n  },\r\n  ylgnbu: {\r\n    colors: ['#081d58','#253494','#225ea8','#1d91c0','#41b6c4','#7fcdbb','#c7e9b4','#edf8d9','#ffffd9'],\r\n    positions: [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]\r\n  },\r\n  greens: {\r\n    colors: ['#00441b','#006d2c','#238b45','#41ab5d','#74c476','#a1d99b','#c7e9c0','#e5f5e0','#f7fcf5'],\r\n    positions: [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]\r\n  },\r\n  ylorrd: {\r\n    colors: ['#800026','#bd0026','#e31a1c','#fc4e2a','#fd8d3c','#feb24c','#fed976','#ffeda0','#ffffcc'],\r\n    positions: [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]\r\n  },\r\n  bluered: {\r\n    colors: ['#0000ff','#ff0000'],\r\n    positions: [0,1]\r\n  },\r\n  rdbu: {\r\n    colors: ['#050aac','#6a89f7','#bebebe','#dcaa84','#e6915a','#b20a1c'],\r\n    positions: [0,0.35,0.5,0.6,0.7,1]\r\n  },\r\n  picnic: {\r\n    colors: ['#0000ff','#3399ff','#66ccff','#99ccff','#ccccff','#ffffff','#ffccff','#ff99ff','#ff66cc','#ff6666','#ff0000'],\r\n    positions: [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]\r\n  },\r\n  portland: {\r\n    colors: ['#0c3383','#0a88ba','#f2d338','#f28f38','#d91e1e'],\r\n    positions: [0,0.25,0.5,0.75,1]\r\n  },\r\n  blackbody: {\r\n    colors: ['#000000','#e60000','#e6d200','#ffffff','#a0c8ff'],\r\n    positions: [0,0.2,0.4,0.7,1]\r\n  },\r\n  earth: {\r\n    colors: ['#000082','#00b4b4','#28d228','#e6e632','#784614','#ffffff'],\r\n    positions: [0,0.1,0.2,0.4,0.6,1]\r\n  },\r\n  electric: {\r\n    colors: ['#000000','#1e0064','#780064','#a05a00','#e6c800','#fffadc'],\r\n    positions: [0,0.15,0.4,0.6,0.8,1]\r\n  },\r\n  magma: new Uint8Array([0,0,4,255,1,0,5,255,1,1,6,255,1,1,8,255,2,1,9,255,2,2,11,255,2,2,13,255,3,3,15,255,3,3,18,255,4,4,20,255,5,4,22,255,6,5,24,255,6,5,26,255,7,6,28,255,8,7,30,255,9,7,32,255,10,8,34,255,11,9,36,255,12,9,38,255,13,10,41,255,14,11,43,255,16,11,45,255,17,12,47,255,18,13,49,255,19,13,52,255,20,14,54,255,21,14,56,255,22,15,59,255,24,15,61,255,25,16,63,255,26,16,66,255,28,16,68,255,29,17,71,255,30,17,73,255,32,17,75,255,33,17,78,255,34,17,80,255,36,18,83,255,37,18,85,255,39,18,88,255,41,17,90,255,42,17,92,255,44,17,95,255,45,17,97,255,47,17,99,255,49,17,101,255,51,16,103,255,52,16,105,255,54,16,107,255,56,16,108,255,57,15,110,255,59,15,112,255,61,15,113,255,63,15,114,255,64,15,116,255,66,15,117,255,68,15,118,255,69,16,119,255,71,16,120,255,73,16,120,255,74,16,121,255,76,17,122,255,78,17,123,255,79,18,123,255,81,18,124,255,82,19,124,255,84,19,125,255,86,20,125,255,87,21,126,255,89,21,126,255,90,22,126,255,92,22,127,255,93,23,127,255,95,24,127,255,96,24,128,255,98,25,128,255,100,26,128,255,101,26,128,255,103,27,128,255,104,28,129,255,106,28,129,255,107,29,129,255,109,29,129,255,110,30,129,255,112,31,129,255,114,31,129,255,115,32,129,255,117,33,129,255,118,33,129,255,120,34,129,255,121,34,130,255,123,35,130,255,124,35,130,255,126,36,130,255,128,37,130,255,129,37,129,255,131,38,129,255,132,38,129,255,134,39,129,255,136,39,129,255,137,40,129,255,139,41,129,255,140,41,129,255,142,42,129,255,144,42,129,255,145,43,129,255,147,43,128,255,148,44,128,255,150,44,128,255,152,45,128,255,153,45,128,255,155,46,127,255,156,46,127,255,158,47,127,255,160,47,127,255,161,48,126,255,163,48,126,255,165,49,126,255,166,49,125,255,168,50,125,255,170,51,125,255,171,51,124,255,173,52,124,255,174,52,123,255,176,53,123,255,178,53,123,255,179,54,122,255,181,54,122,255,183,55,121,255,184,55,121,255,186,56,120,255,188,57,120,255,189,57,119,255,191,58,119,255,192,58,118,255,194,59,117,255,196,60,117,255,197,60,116,255,199,61,115,255,200,62,115,255,202,62,114,255,204,63,113,255,205,64,113,255,207,64,112,255,208,65,111,255,210,66,111,255,211,67,110,255,213,68,109,255,214,69,108,255,216,69,108,255,217,70,107,255,219,71,106,255,220,72,105,255,222,73,104,255,223,74,104,255,224,76,103,255,226,77,102,255,227,78,101,255,228,79,100,255,229,80,100,255,231,82,99,255,232,83,98,255,233,84,98,255,234,86,97,255,235,87,96,255,236,88,96,255,237,90,95,255,238,91,94,255,239,93,94,255,240,95,94,255,241,96,93,255,242,98,93,255,242,100,92,255,243,101,92,255,244,103,92,255,244,105,92,255,245,107,92,255,246,108,92,255,246,110,92,255,247,112,92,255,247,114,92,255,248,116,92,255,248,118,92,255,249,120,93,255,249,121,93,255,249,123,93,255,250,125,94,255,250,127,94,255,250,129,95,255,251,131,95,255,251,133,96,255,251,135,97,255,252,137,97,255,252,138,98,255,252,140,99,255,252,142,100,255,252,144,101,255,253,146,102,255,253,148,103,255,253,150,104,255,253,152,105,255,253,154,106,255,253,155,107,255,254,157,108,255,254,159,109,255,254,161,110,255,254,163,111,255,254,165,113,255,254,167,114,255,254,169,115,255,254,170,116,255,254,172,118,255,254,174,119,255,254,176,120,255,254,178,122,255,254,180,123,255,254,182,124,255,254,183,126,255,254,185,127,255,254,187,129,255,254,189,130,255,254,191,132,255,254,193,133,255,254,194,135,255,254,196,136,255,254,198,138,255,254,200,140,255,254,202,141,255,254,204,143,255,254,205,144,255,254,207,146,255,254,209,148,255,254,211,149,255,254,213,151,255,254,215,153,255,254,216,154,255,253,218,156,255,253,220,158,255,253,222,160,255,253,224,161,255,253,226,163,255,253,227,165,255,253,229,167,255,253,231,169,255,253,233,170,255,253,235,172,255,252,236,174,255,252,238,176,255,252,240,178,255,252,242,180,255,252,244,182,255,252,246,184,255,252,247,185,255,252,249,187,255,252,251,189,255,252,253,191,255]),\r\n  plasma: new Uint8Array([13,8,135,255,16,7,136,255,19,7,137,255,22,7,138,255,25,6,140,255,27,6,141,255,29,6,142,255,32,6,143,255,34,6,144,255,36,6,145,255,38,5,145,255,40,5,146,255,42,5,147,255,44,5,148,255,46,5,149,255,47,5,150,255,49,5,151,255,51,5,151,255,53,4,152,255,55,4,153,255,56,4,154,255,58,4,154,255,60,4,155,255,62,4,156,255,63,4,156,255,65,4,157,255,67,3,158,255,68,3,158,255,70,3,159,255,72,3,159,255,73,3,160,255,75,3,161,255,76,2,161,255,78,2,162,255,80,2,162,255,81,2,163,255,83,2,163,255,85,2,164,255,86,1,164,255,88,1,164,255,89,1,165,255,91,1,165,255,92,1,166,255,94,1,166,255,96,1,166,255,97,0,167,255,99,0,167,255,100,0,167,255,102,0,167,255,103,0,168,255,105,0,168,255,106,0,168,255,108,0,168,255,110,0,168,255,111,0,168,255,113,0,168,255,114,1,168,255,116,1,168,255,117,1,168,255,119,1,168,255,120,1,168,255,122,2,168,255,123,2,168,255,125,3,168,255,126,3,168,255,128,4,168,255,129,4,167,255,131,5,167,255,132,5,167,255,134,6,166,255,135,7,166,255,136,8,166,255,138,9,165,255,139,10,165,255,141,11,165,255,142,12,164,255,143,13,164,255,145,14,163,255,146,15,163,255,148,16,162,255,149,17,161,255,150,19,161,255,152,20,160,255,153,21,159,255,154,22,159,255,156,23,158,255,157,24,157,255,158,25,157,255,160,26,156,255,161,27,155,255,162,29,154,255,163,30,154,255,165,31,153,255,166,32,152,255,167,33,151,255,168,34,150,255,170,35,149,255,171,36,148,255,172,38,148,255,173,39,147,255,174,40,146,255,176,41,145,255,177,42,144,255,178,43,143,255,179,44,142,255,180,46,141,255,181,47,140,255,182,48,139,255,183,49,138,255,184,50,137,255,186,51,136,255,187,52,136,255,188,53,135,255,189,55,134,255,190,56,133,255,191,57,132,255,192,58,131,255,193,59,130,255,194,60,129,255,195,61,128,255,196,62,127,255,197,64,126,255,198,65,125,255,199,66,124,255,200,67,123,255,201,68,122,255,202,69,122,255,203,70,121,255,204,71,120,255,204,73,119,255,205,74,118,255,206,75,117,255,207,76,116,255,208,77,115,255,209,78,114,255,210,79,113,255,211,81,113,255,212,82,112,255,213,83,111,255,213,84,110,255,214,85,109,255,215,86,108,255,216,87,107,255,217,88,106,255,218,90,106,255,218,91,105,255,219,92,104,255,220,93,103,255,221,94,102,255,222,95,101,255,222,97,100,255,223,98,99,255,224,99,99,255,225,100,98,255,226,101,97,255,226,102,96,255,227,104,95,255,228,105,94,255,229,106,93,255,229,107,93,255,230,108,92,255,231,110,91,255,231,111,90,255,232,112,89,255,233,113,88,255,233,114,87,255,234,116,87,255,235,117,86,255,235,118,85,255,236,119,84,255,237,121,83,255,237,122,82,255,238,123,81,255,239,124,81,255,239,126,80,255,240,127,79,255,240,128,78,255,241,129,77,255,241,131,76,255,242,132,75,255,243,133,75,255,243,135,74,255,244,136,73,255,244,137,72,255,245,139,71,255,245,140,70,255,246,141,69,255,246,143,68,255,247,144,68,255,247,145,67,255,247,147,66,255,248,148,65,255,248,149,64,255,249,151,63,255,249,152,62,255,249,154,62,255,250,155,61,255,250,156,60,255,250,158,59,255,251,159,58,255,251,161,57,255,251,162,56,255,252,163,56,255,252,165,55,255,252,166,54,255,252,168,53,255,252,169,52,255,253,171,51,255,253,172,51,255,253,174,50,255,253,175,49,255,253,177,48,255,253,178,47,255,253,180,47,255,253,181,46,255,254,183,45,255,254,184,44,255,254,186,44,255,254,187,43,255,254,189,42,255,254,190,42,255,254,192,41,255,253,194,41,255,253,195,40,255,253,197,39,255,253,198,39,255,253,200,39,255,253,202,38,255,253,203,38,255,252,205,37,255,252,206,37,255,252,208,37,255,252,210,37,255,251,211,36,255,251,213,36,255,251,215,36,255,250,216,36,255,250,218,36,255,249,220,36,255,249,221,37,255,248,223,37,255,248,225,37,255,247,226,37,255,247,228,37,255,246,230,38,255,246,232,38,255,245,233,38,255,245,235,39,255,244,237,39,255,243,238,39,255,243,240,39,255,242,242,39,255,241,244,38,255,241,245,37,255,240,247,36,255,240,249,33,255]),\r\n  redblue: {\r\n    colors: ['#ff0000', '#0000ff'],\r\n    positions: [0,1]\r\n  },\r\n  coolwarm: {\r\n    colors: ['#0000ff', '#ffffff', '#ff0000'],\r\n    positions: [0,0.5,1]\r\n  },\r\n  diverging_1: {\r\n    colors: ['#400040','#3b004d','#36005b','#320068','#2d0076','#290084','#240091','#20009f','#1b00ad','#1600ba','#1200c8','#0d00d6','#0900e3','#0400f1','#0000ff','#0217ff','#042eff','#0645ff','#095cff','#0b73ff','#0d8bff','#10a2ff','#12b9ff','#14d0ff','#17e7ff','#19ffff','#3fffff','#66ffff','#8cffff','#b2ffff','#d8ffff','#ffffff','#ffffd4','#ffffaa','#ffff7f','#ffff54','#ffff2a','#ffff00','#ffed00','#ffdd00','#ffcc00','#ffba00','#ffaa00','#ff9900','#ff8700','#ff7700','#ff6600','#ff5400','#ff4400','#ff3300','#ff2100','#ff1100','#ff0000','#ff0017','#ff002e','#ff0045','#ff005c','#ff0073','#ff008b','#ff00a2','#ff00b9','#ff00d0','#ff00e7','#ff00ff'],\r\n    positions: [0.0,0.01587301587,0.03174603174,0.04761904761,0.06349206348,0.07936507935,0.09523809522,0.11111111109,0.12698412696,0.14285714283,0.15873015870,0.17460317457,0.19047619044,0.20634920631,0.22222222218,0.23809523805,0.25396825392,0.26984126979,0.28571428566,0.30158730153,0.31746031740,0.33333333327,0.34920634914,0.36507936501,0.38095238088,0.39682539675,0.41269841262,0.42857142849,0.44444444436,0.46031746023,0.47619047610,0.49206349197,0.50793650784,0.52380952371,0.53968253958,0.55555555545,0.57142857132,0.58730158719,0.60317460306,0.61904761893,0.63492063480,0.65079365067,0.66666666654,0.68253968241,0.69841269828,0.71428571415,0.73015873002,0.74603174589,0.76190476176,0.77777777763,0.79365079350,0.80952380937,0.82539682524,0.84126984111,0.85714285698,0.87301587285,0.88888888872,0.90476190459,0.92063492046,0.93650793633,0.95238095220,0.96825396807,0.98412698394,1]\r\n  },\r\n  diverging_2: {\r\n    colors: ['#000000','#030aff','#204aff','#3c8aff','#77c4ff','#f0ffff','#f0ffff','#f2ff7f','#ffff00','#ff831e','#ff083d','#ff00ff'],\r\n    positions: [0,0.0000000001,0.1,0.2,0.3333,0.4666,0.5333,0.6666,0.8,0.9,0.999999999999,1]\r\n  },\r\n  blackwhite: {\r\n    colors: ['#000000','#ffffff'],\r\n    positions: [0,1]\r\n  },\r\n  twilight: {\r\n    colors: ['#E2D9E2', '#E0D9E2', '#DDD9E0', '#DAD8DF', '#D6D7DD', '#D2D5DB', '#CDD3D8', '#C8D0D6', '#C2CED4', '#BCCBD1', '#B6C8CF', '#B0C5CD', '#AAC2CC', '#A4BECA', '#9EBBC9', '#99B8C8', '#93B4C6', '#8EB1C5', '#89ADC5', '#85A9C4', '#80A5C3', '#7CA2C2', '#789EC2', '#759AC1', '#7196C1', '#6E92C0', '#6C8EBF', '#698ABF', '#6786BE', '#6682BD', '#647DBC', '#6379BB', '#6275BA', '#6170B9', '#606CB8', '#6067B6', '#5F62B4', '#5F5EB3', '#5F59B1', '#5E54AE', '#5E4FAC', '#5E4BA9', '#5E46A6', '#5D41A3', '#5D3CA0', '#5C379C', '#5B3298', '#5A2E93', '#59298E', '#572588', '#562182', '#531E7C', '#511A75', '#4E186F', '#4B1668', '#471461', '#44135A', '#411254', '#3D114E', '#3A1149', '#371144', '#351140', '#33113C', '#311339', '#301437', '#331237', '#351138', '#381139', '#3B113B', '#3F123D', '#43123E', '#481341', '#4D1443', '#521545', '#571647', '#5C1749', '#61184B', '#67194C', '#6C1B4E', '#711D4F', '#761F4F', '#7B2150', '#802350', '#852650', '#8A2950', '#8E2C50', '#922F50', '#963350', '#9A3750', '#9E3B50', '#A13F50', '#A54350', '#A84750', '#AB4B50', '#AE5051', '#B15452', '#B35953', '#B65D54', '#B86255', '#BA6657', '#BC6B59', '#BE705B', '#C0755E', '#C27A61', '#C37F64', '#C58468', '#C6896C', '#C78E71', '#C89275', '#C9977B', '#CA9C80', '#CCA186', '#CDA68C', '#CEAB92', '#CFAF99', '#D1B4A0', '#D2B8A7', '#D4BDAD', '#D6C1B4', '#D8C5BB', '#D9C9C2', '#DBCCC8', '#DDD0CE', '#DED3D3', '#DFD5D8', '#E0D7DB', '#E1D8DF', '#E2D9E1'],\r\n    positions: [0.0000000000, 0.0078740157, 0.0157480315, 0.0236220472, 0.0314960630, 0.0393700787, 0.0472440945, 0.0551181102, 0.0629921260, 0.0708661417, 0.0787401575, 0.0866141732, 0.0944881890, 0.1023622047, 0.1102362205, 0.1181102362, 0.1259842520, 0.1338582677, 0.1417322835, 0.1496062992, 0.1574803150, 0.1653543307, 0.1732283465, 0.1811023622, 0.1889763780, 0.1968503937, 0.2047244094, 0.2125984252, 0.2204724409, 0.2283464567, 0.2362204724, 0.2440944882, 0.2519685039, 0.2598425197, 0.2677165354, 0.2755905512, 0.2834645669, 0.2913385827, 0.2992125984, 0.3070866142, 0.3149606299, 0.3228346457, 0.3307086614, 0.3385826772, 0.3464566929, 0.3543307087, 0.3622047244, 0.3700787402, 0.3779527559, 0.3858267717, 0.3937007874, 0.4015748031, 0.4094488189, 0.4173228346, 0.4251968504, 0.4330708661, 0.4409448819, 0.4488188976, 0.4566929134, 0.4645669291, 0.4724409449, 0.4803149606, 0.4881889764, 0.4960629921, 0.5039370079, 0.5118110236, 0.5196850394, 0.5275590551, 0.5354330709, 0.5433070866, 0.5511811024, 0.5590551181, 0.5669291339, 0.5748031496, 0.5826771654, 0.5905511811, 0.5984251969, 0.6062992126, 0.6141732283, 0.6220472441, 0.6299212598, 0.6377952756, 0.6456692913, 0.6535433071, 0.6614173228, 0.6692913386, 0.6771653543, 0.6850393701, 0.6929133858, 0.7007874016, 0.7086614173, 0.7165354331, 0.7244094488, 0.7322834646, 0.7401574803, 0.7480314961, 0.7559055118, 0.7637795276, 0.7716535433, 0.7795275591, 0.7874015748, 0.7952755906, 0.8031496063, 0.8110236220, 0.8188976378, 0.8267716535, 0.8346456693, 0.8425196850, 0.8503937008, 0.8582677165, 0.8661417323, 0.8740157480, 0.8818897638, 0.8897637795, 0.8976377953, 0.9055118110, 0.9133858268, 0.9212598425, 0.9291338583, 0.9370078740, 0.9448818898, 0.9527559055, 0.9606299213, 0.9685039370, 0.9763779528, 0.9842519685, 0.9921259843, 1.0000000000]\r\n  },\r\n  twilight_shifted: {\r\n    colors: ['#301437', '#32123A', '#34113E', '#361142', '#391146', '#3C114B', '#3F1251', '#421257', '#46145E', '#491564', '#4C176B', '#4F1972', '#521C79', '#551F7F', '#572385', '#58278B', '#5A2B90', '#5B3095', '#5C359A', '#5D3A9E', '#5D3EA1', '#5E43A5', '#5E48A8', '#5E4DAB', '#5E52AD', '#5F57B0', '#5F5BB2', '#5F60B4', '#5F65B5', '#6069B7', '#606EB8', '#6172BA', '#6277BB', '#637BBC', '#657FBD', '#6684BD', '#6888BE', '#6B8CBF', '#6D90C0', '#7094C0', '#7398C1', '#769CC1', '#7AA0C2', '#7EA4C3', '#82A7C3', '#87ABC4', '#8CAFC5', '#91B2C6', '#96B6C7', '#9CB9C8', '#A1BDC9', '#A7C0CB', '#ADC3CD', '#B3C6CE', '#B9C9D0', '#BFCCD3', '#C5CFD5', '#CBD2D7', '#D0D4D9', '#D4D6DC', '#D8D8DE', '#DCD9DF', '#DED9E1', '#E1D9E2', '#E2D9E1', '#E1D8DF', '#E0D7DB', '#DFD5D8', '#DED3D3', '#DDD0CE', '#DBCCC8', '#D9C9C2', '#D8C5BB', '#D6C1B4', '#D4BDAD', '#D2B8A7', '#D1B4A0', '#CFAF99', '#CEAB92', '#CDA68C', '#CCA186', '#CA9C80', '#C9977B', '#C89275', '#C78E71', '#C6896C', '#C58468', '#C37F64', '#C27A61', '#C0755E', '#BE705B', '#BC6B59', '#BA6657', '#B86255', '#B65D54', '#B35953', '#B15452', '#AE5051', '#AB4B50', '#A84750', '#A54350', '#A13F50', '#9E3B50', '#9A3750', '#963350', '#922F50', '#8E2C50', '#8A2950', '#852650', '#802350', '#7B2150', '#761F4F', '#711D4F', '#6C1B4E', '#67194C', '#61184B', '#5C1749', '#571647', '#521545', '#4D1443', '#481341', '#43123E', '#3F123D', '#3B113B', '#381139', '#351138', '#331237', '#301437'],\r\n    positions: [0.0000000000, 0.0078740157, 0.0157480315, 0.0236220472, 0.0314960630, 0.0393700787, 0.0472440945, 0.0551181102, 0.0629921260, 0.0708661417, 0.0787401575, 0.0866141732, 0.0944881890, 0.1023622047, 0.1102362205, 0.1181102362, 0.1259842520, 0.1338582677, 0.1417322835, 0.1496062992, 0.1574803150, 0.1653543307, 0.1732283465, 0.1811023622, 0.1889763780, 0.1968503937, 0.2047244094, 0.2125984252, 0.2204724409, 0.2283464567, 0.2362204724, 0.2440944882, 0.2519685039, 0.2598425197, 0.2677165354, 0.2755905512, 0.2834645669, 0.2913385827, 0.2992125984, 0.3070866142, 0.3149606299, 0.3228346457, 0.3307086614, 0.3385826772, 0.3464566929, 0.3543307087, 0.3622047244, 0.3700787402, 0.3779527559, 0.3858267717, 0.3937007874, 0.4015748031, 0.4094488189, 0.4173228346, 0.4251968504, 0.4330708661, 0.4409448819, 0.4488188976, 0.4566929134, 0.4645669291, 0.4724409449, 0.4803149606, 0.4881889764, 0.4960629921, 0.5039370079, 0.5118110236, 0.5196850394, 0.5275590551, 0.5354330709, 0.5433070866, 0.5511811024, 0.5590551181, 0.5669291339, 0.5748031496, 0.5826771654, 0.5905511811, 0.5984251969, 0.6062992126, 0.6141732283, 0.6220472441, 0.6299212598, 0.6377952756, 0.6456692913, 0.6535433071, 0.6614173228, 0.6692913386, 0.6771653543, 0.6850393701, 0.6929133858, 0.7007874016, 0.7086614173, 0.7165354331, 0.7244094488, 0.7322834646, 0.7401574803, 0.7480314961, 0.7559055118, 0.7637795276, 0.7716535433, 0.7795275591, 0.7874015748, 0.7952755906, 0.8031496063, 0.8110236220, 0.8188976378, 0.8267716535, 0.8346456693, 0.8425196850, 0.8503937008, 0.8582677165, 0.8661417323, 0.8740157480, 0.8818897638, 0.8897637795, 0.8976377953, 0.9055118110, 0.9133858268, 0.9212598425, 0.9291338583, 0.9370078740, 0.9448818898, 0.9527559055, 0.9606299213, 0.9685039370, 0.9763779528, 0.9842519685, 0.9921259843, 1.0000000000]\r\n  },\r\n};\r\n","// Generated by PEG.js v0.11.0-master.f69239d, https://pegjs.org/\r\n\r\n\"use strict\";\r\n\r\nfunction peg$subclass(child, parent) {\r\n  function C() { this.constructor = child; }\r\n  C.prototype = parent.prototype;\r\n  child.prototype = new C();\r\n}\r\n\r\nfunction peg$SyntaxError(message, expected, found, location) {\r\n  this.message = message;\r\n  this.expected = expected;\r\n  this.found = found;\r\n  this.location = location;\r\n  this.name = \"SyntaxError\";\r\n\r\n  // istanbul ignore next\r\n  if (typeof Error.captureStackTrace === \"function\") {\r\n    Error.captureStackTrace(this, peg$SyntaxError);\r\n  }\r\n}\r\n\r\npeg$subclass(peg$SyntaxError, Error);\r\n\r\npeg$SyntaxError.buildMessage = function(expected, found) {\r\n  var DESCRIBE_EXPECTATION_FNS = {\r\n    literal: function(expectation) {\r\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\r\n    },\r\n\r\n    class: function(expectation) {\r\n      var escapedParts = expectation.parts.map(function(part) {\r\n        return Array.isArray(part)\r\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\r\n          : classEscape(part);\r\n      });\r\n\r\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\r\n    },\r\n\r\n    any: function() {\r\n      return \"any character\";\r\n    },\r\n\r\n    end: function() {\r\n      return \"end of input\";\r\n    },\r\n\r\n    other: function(expectation) {\r\n      return expectation.description;\r\n    },\r\n\r\n    not: function(expectation) {\r\n      return \"not \" + describeExpectation(expectation.expected);\r\n    }\r\n  };\r\n\r\n  function hex(ch) {\r\n    return ch.charCodeAt(0).toString(16).toUpperCase();\r\n  }\r\n\r\n  function literalEscape(s) {\r\n    return s\r\n      .replace(/\\\\/g, \"\\\\\\\\\")\r\n      .replace(/\"/g,  \"\\\\\\\"\")\r\n      .replace(/\\0/g, \"\\\\0\")\r\n      .replace(/\\t/g, \"\\\\t\")\r\n      .replace(/\\n/g, \"\\\\n\")\r\n      .replace(/\\r/g, \"\\\\r\")\r\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\r\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\r\n  }\r\n\r\n  function classEscape(s) {\r\n    return s\r\n      .replace(/\\\\/g, \"\\\\\\\\\")\r\n      .replace(/\\]/g, \"\\\\]\")\r\n      .replace(/\\^/g, \"\\\\^\")\r\n      .replace(/-/g,  \"\\\\-\")\r\n      .replace(/\\0/g, \"\\\\0\")\r\n      .replace(/\\t/g, \"\\\\t\")\r\n      .replace(/\\n/g, \"\\\\n\")\r\n      .replace(/\\r/g, \"\\\\r\")\r\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\r\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\r\n  }\r\n\r\n  function describeExpectation(expectation) {\r\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\r\n  }\r\n\r\n  function describeExpected(expected) {\r\n    var descriptions = expected.map(describeExpectation);\r\n    var i, j;\r\n\r\n    descriptions.sort();\r\n\r\n    if (descriptions.length > 0) {\r\n      for (i = 1, j = 1; i < descriptions.length; i++) {\r\n        if (descriptions[i - 1] !== descriptions[i]) {\r\n          descriptions[j] = descriptions[i];\r\n          j++;\r\n        }\r\n      }\r\n      descriptions.length = j;\r\n    }\r\n\r\n    switch (descriptions.length) {\r\n      case 1:\r\n        return descriptions[0];\r\n\r\n      case 2:\r\n        return descriptions[0] + \" or \" + descriptions[1];\r\n\r\n      default:\r\n        return descriptions.slice(0, -1).join(\", \")\r\n          + \", or \"\r\n          + descriptions[descriptions.length - 1];\r\n    }\r\n  }\r\n\r\n  function describeFound(found) {\r\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\r\n  }\r\n\r\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\r\n};\r\n\r\nfunction peg$parse(input, options) {\r\n  options = options !== undefined ? options : {};\r\n\r\n  var peg$FAILED = {};\r\n\r\n  var peg$startRuleFunctions = { Expression: peg$parseExpression };\r\n  var peg$startRuleFunction = peg$parseExpression;\r\n\r\n  var peg$c0 = \"+\";\r\n  var peg$c1 = \"-\";\r\n  var peg$c2 = \"*\";\r\n  var peg$c3 = \"/\";\r\n  var peg$c4 = \"**\";\r\n  var peg$c5 = \"(\";\r\n  var peg$c6 = \")\";\r\n\r\n  var peg$r0 = /^[\\-+]/;\r\n  var peg$r1 = /^[0-9]/;\r\n  var peg$r2 = /^[a-zA-Z_$]/;\r\n  var peg$r3 = /^[a-zA-Z_$0-9]/;\r\n  var peg$r4 = /^[ \\t\\n\\r]/;\r\n\r\n  var peg$e0 = peg$literalExpectation(\"+\", false);\r\n  var peg$e1 = peg$literalExpectation(\"-\", false);\r\n  var peg$e2 = peg$literalExpectation(\"*\", false);\r\n  var peg$e3 = peg$literalExpectation(\"/\", false);\r\n  var peg$e4 = peg$literalExpectation(\"**\", false);\r\n  var peg$e5 = peg$literalExpectation(\"(\", false);\r\n  var peg$e6 = peg$literalExpectation(\")\", false);\r\n  var peg$e7 = peg$otherExpectation(\"float\");\r\n  var peg$e8 = peg$otherExpectation(\"integer\");\r\n  var peg$e9 = peg$otherExpectation(\"identifier\");\r\n  var peg$e10 = peg$otherExpectation(\"whitespace\");\r\n\r\n  var peg$f0 = function(head, tail) {\r\n        var lhs = head;\r\n        var i, op;\r\n\r\n        for (i = 0; i < tail.length; i++) {\r\n          op = tail[i][1];\r\n          lhs = makeNode(lhs, tail[i][3], op);\r\n        }\r\n\r\n        return lhs;\r\n      };\r\n  var peg$f1 = function(head, tail) {\r\n        var lhs = head;\r\n        var i, op;\r\n\r\n        for (i = 0; i < tail.length; i++) {\r\n          op = tail[i][1];\r\n          lhs = makeNode(lhs, tail[i][3], op);\r\n        }\r\n        return lhs;\r\n      };\r\n  var peg$f2 = function(expr) { return expr; };\r\n  var peg$f3 = function(n, e) { return {fn:n, lhs:e}};\r\n  var peg$f4 = function() { return parseFloat(text(), 10); };\r\n  var peg$f5 = function() { return parseInt(text(), 10); };\r\n  var peg$f6 = function() { return text(); };\r\n\r\n  var peg$currPos = 0;\r\n  var peg$savedPos = 0;\r\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\r\n  var peg$expected = [];\r\n  var peg$silentFails = 0;\r\n\r\n  var peg$result;\r\n\r\n  if (\"startRule\" in options) {\r\n    if (!(options.startRule in peg$startRuleFunctions)) {\r\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\r\n    }\r\n\r\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\r\n  }\r\n\r\n  function text() {\r\n    return input.substring(peg$savedPos, peg$currPos);\r\n  }\r\n\r\n  function offset() {\r\n    return peg$savedPos;\r\n  }\r\n\r\n  function range() {\r\n    return [peg$savedPos, peg$currPos];\r\n  }\r\n\r\n  function location() {\r\n    return peg$computeLocation(peg$savedPos, peg$currPos);\r\n  }\r\n\r\n  function expected(description, location) {\r\n    location = location !== undefined\r\n      ? location\r\n      : peg$computeLocation(peg$savedPos, peg$currPos);\r\n\r\n    throw peg$buildStructuredError(\r\n      [peg$otherExpectation(description)],\r\n      input.substring(peg$savedPos, peg$currPos),\r\n      location\r\n    );\r\n  }\r\n\r\n  function error(message, location) {\r\n    location = location !== undefined\r\n      ? location\r\n      : peg$computeLocation(peg$savedPos, peg$currPos);\r\n\r\n    throw peg$buildSimpleError(message, location);\r\n  }\r\n\r\n  function peg$literalExpectation(text, ignoreCase) {\r\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\r\n  }\r\n\r\n  function peg$classExpectation(parts, inverted, ignoreCase) {\r\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\r\n  }\r\n\r\n  function peg$anyExpectation() {\r\n    return { type: \"any\" };\r\n  }\r\n\r\n  function peg$endExpectation() {\r\n    return { type: \"end\" };\r\n  }\r\n\r\n  function peg$otherExpectation(description) {\r\n    return { type: \"other\", description: description };\r\n  }\r\n\r\n  function peg$computePosDetails(pos) {\r\n    var details = peg$posDetailsCache[pos];\r\n    var p;\r\n\r\n    if (details) {\r\n      return details;\r\n    } else {\r\n      p = pos - 1;\r\n      while (!peg$posDetailsCache[p]) {\r\n        p--;\r\n      }\r\n\r\n      details = peg$posDetailsCache[p];\r\n      details = {\r\n        line: details.line,\r\n        column: details.column\r\n      };\r\n\r\n      while (p < pos) {\r\n        if (input.charCodeAt(p) === 10) {\r\n          details.line++;\r\n          details.column = 1;\r\n        } else {\r\n          details.column++;\r\n        }\r\n\r\n        p++;\r\n      }\r\n\r\n      peg$posDetailsCache[pos] = details;\r\n\r\n      return details;\r\n    }\r\n  }\r\n\r\n  var peg$VALIDFILENAME = typeof options.filename === \"string\" && options.filename.length > 0;\r\n  function peg$computeLocation(startPos, endPos) {\r\n    var loc = {};\r\n\r\n    if ( peg$VALIDFILENAME ) loc.filename = options.filename;\r\n\r\n    var startPosDetails = peg$computePosDetails(startPos);\r\n    loc.start = {\r\n      offset: startPos,\r\n      line: startPosDetails.line,\r\n      column: startPosDetails.column\r\n    };\r\n\r\n    var endPosDetails = peg$computePosDetails(endPos);\r\n    loc.end = {\r\n      offset: endPos,\r\n      line: endPosDetails.line,\r\n      column: endPosDetails.column\r\n    };\r\n\r\n    return loc;\r\n  }\r\n\r\n  function peg$begin() {\r\n    peg$expected.push({ pos: peg$currPos, variants: [] });\r\n  }\r\n\r\n  function peg$expect(expected) {\r\n    var top = peg$expected[peg$expected.length - 1];\r\n\r\n    if (peg$currPos < top.pos) { return; }\r\n\r\n    if (peg$currPos > top.pos) {\r\n      top.pos = peg$currPos;\r\n      top.variants = [];\r\n    }\r\n\r\n    top.variants.push(expected);\r\n  }\r\n\r\n  function peg$end(invert) {\r\n    var expected = peg$expected.pop();\r\n    var top = peg$expected[peg$expected.length - 1];\r\n    var variants = expected.variants;\r\n\r\n    if (top.pos !== expected.pos) { return; }\r\n\r\n    if (invert) {\r\n      variants = variants.map(function(e) {\r\n        return e.type === \"not\" ? e.expected : { type: \"not\", expected: e };\r\n      });\r\n    }\r\n\r\n    Array.prototype.push.apply(top.variants, variants);\r\n  }\r\n\r\n  function peg$buildSimpleError(message, location) {\r\n    return new peg$SyntaxError(message, null, null, location);\r\n  }\r\n\r\n  function peg$buildStructuredError(expected, found, location) {\r\n    return new peg$SyntaxError(\r\n      peg$SyntaxError.buildMessage(expected, found),\r\n      expected,\r\n      found,\r\n      location\r\n    );\r\n  }\r\n\r\n  function peg$buildError() {\r\n    var expected = peg$expected[0];\r\n    var failPos = expected.pos;\r\n\r\n    return peg$buildStructuredError(\r\n      expected.variants,\r\n      failPos < input.length ? input.charAt(failPos) : null,\r\n      failPos < input.length\r\n        ? peg$computeLocation(failPos, failPos + 1)\r\n        : peg$computeLocation(failPos, failPos)\r\n    );\r\n  }\r\n\r\n  function peg$parseExpression() {\r\n    var s0, s1, s2, s3, s4, s5, s6, s7;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    s0 = peg$currPos;\r\n    s1 = peg$parseTerm();\r\n    if (s1 !== peg$FAILED) {\r\n      s2 = [];\r\n      s3 = peg$currPos;\r\n      s4 = peg$parse_();\r\n      rule$expects(peg$e0);\r\n      if (input.charCodeAt(peg$currPos) === 43) {\r\n        s5 = peg$c0;\r\n        peg$currPos++;\r\n      } else {\r\n        s5 = peg$FAILED;\r\n      }\r\n      if (s5 === peg$FAILED) {\r\n        rule$expects(peg$e1);\r\n        if (input.charCodeAt(peg$currPos) === 45) {\r\n          s5 = peg$c1;\r\n          peg$currPos++;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n      }\r\n      if (s5 !== peg$FAILED) {\r\n        s6 = peg$parse_();\r\n        s7 = peg$parseTerm();\r\n        if (s7 !== peg$FAILED) {\r\n          s4 = [s4, s5, s6, s7];\r\n          s3 = s4;\r\n        } else {\r\n          peg$currPos = s3;\r\n          s3 = peg$FAILED;\r\n        }\r\n      } else {\r\n        peg$currPos = s3;\r\n        s3 = peg$FAILED;\r\n      }\r\n      while (s3 !== peg$FAILED) {\r\n        s2.push(s3);\r\n        s3 = peg$currPos;\r\n        s4 = peg$parse_();\r\n        rule$expects(peg$e0);\r\n        if (input.charCodeAt(peg$currPos) === 43) {\r\n          s5 = peg$c0;\r\n          peg$currPos++;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n        if (s5 === peg$FAILED) {\r\n          rule$expects(peg$e1);\r\n          if (input.charCodeAt(peg$currPos) === 45) {\r\n            s5 = peg$c1;\r\n            peg$currPos++;\r\n          } else {\r\n            s5 = peg$FAILED;\r\n          }\r\n        }\r\n        if (s5 !== peg$FAILED) {\r\n          s6 = peg$parse_();\r\n          s7 = peg$parseTerm();\r\n          if (s7 !== peg$FAILED) {\r\n            s4 = [s4, s5, s6, s7];\r\n            s3 = s4;\r\n          } else {\r\n            peg$currPos = s3;\r\n            s3 = peg$FAILED;\r\n          }\r\n        } else {\r\n          peg$currPos = s3;\r\n          s3 = peg$FAILED;\r\n        }\r\n      }\r\n      peg$savedPos = s0;\r\n      s0 = peg$f0(s1, s2);\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parseTerm() {\r\n    var s0, s1, s2, s3, s4, s5, s6, s7;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    s0 = peg$currPos;\r\n    s1 = peg$parseExponential();\r\n    if (s1 !== peg$FAILED) {\r\n      s2 = [];\r\n      s3 = peg$currPos;\r\n      s4 = peg$parse_();\r\n      rule$expects(peg$e2);\r\n      if (input.charCodeAt(peg$currPos) === 42) {\r\n        s5 = peg$c2;\r\n        peg$currPos++;\r\n      } else {\r\n        s5 = peg$FAILED;\r\n      }\r\n      if (s5 === peg$FAILED) {\r\n        rule$expects(peg$e3);\r\n        if (input.charCodeAt(peg$currPos) === 47) {\r\n          s5 = peg$c3;\r\n          peg$currPos++;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n      }\r\n      if (s5 !== peg$FAILED) {\r\n        s6 = peg$parse_();\r\n        s7 = peg$parseExponential();\r\n        if (s7 !== peg$FAILED) {\r\n          s4 = [s4, s5, s6, s7];\r\n          s3 = s4;\r\n        } else {\r\n          peg$currPos = s3;\r\n          s3 = peg$FAILED;\r\n        }\r\n      } else {\r\n        peg$currPos = s3;\r\n        s3 = peg$FAILED;\r\n      }\r\n      while (s3 !== peg$FAILED) {\r\n        s2.push(s3);\r\n        s3 = peg$currPos;\r\n        s4 = peg$parse_();\r\n        rule$expects(peg$e2);\r\n        if (input.charCodeAt(peg$currPos) === 42) {\r\n          s5 = peg$c2;\r\n          peg$currPos++;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n        if (s5 === peg$FAILED) {\r\n          rule$expects(peg$e3);\r\n          if (input.charCodeAt(peg$currPos) === 47) {\r\n            s5 = peg$c3;\r\n            peg$currPos++;\r\n          } else {\r\n            s5 = peg$FAILED;\r\n          }\r\n        }\r\n        if (s5 !== peg$FAILED) {\r\n          s6 = peg$parse_();\r\n          s7 = peg$parseExponential();\r\n          if (s7 !== peg$FAILED) {\r\n            s4 = [s4, s5, s6, s7];\r\n            s3 = s4;\r\n          } else {\r\n            peg$currPos = s3;\r\n            s3 = peg$FAILED;\r\n          }\r\n        } else {\r\n          peg$currPos = s3;\r\n          s3 = peg$FAILED;\r\n        }\r\n      }\r\n      peg$savedPos = s0;\r\n      s0 = peg$f1(s1, s2);\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parseExponential() {\r\n    var s0, s1, s2, s3, s4, s5, s6, s7;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    s0 = peg$currPos;\r\n    s1 = peg$parseFactor();\r\n    if (s1 !== peg$FAILED) {\r\n      s2 = [];\r\n      s3 = peg$currPos;\r\n      s4 = peg$parse_();\r\n      rule$expects(peg$e4);\r\n      if (input.substr(peg$currPos, 2) === peg$c4) {\r\n        s5 = peg$c4;\r\n        peg$currPos += 2;\r\n      } else {\r\n        s5 = peg$FAILED;\r\n      }\r\n      if (s5 !== peg$FAILED) {\r\n        s6 = peg$parse_();\r\n        s7 = peg$parseFactor();\r\n        if (s7 !== peg$FAILED) {\r\n          s4 = [s4, s5, s6, s7];\r\n          s3 = s4;\r\n        } else {\r\n          peg$currPos = s3;\r\n          s3 = peg$FAILED;\r\n        }\r\n      } else {\r\n        peg$currPos = s3;\r\n        s3 = peg$FAILED;\r\n      }\r\n      while (s3 !== peg$FAILED) {\r\n        s2.push(s3);\r\n        s3 = peg$currPos;\r\n        s4 = peg$parse_();\r\n        rule$expects(peg$e4);\r\n        if (input.substr(peg$currPos, 2) === peg$c4) {\r\n          s5 = peg$c4;\r\n          peg$currPos += 2;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n        if (s5 !== peg$FAILED) {\r\n          s6 = peg$parse_();\r\n          s7 = peg$parseFactor();\r\n          if (s7 !== peg$FAILED) {\r\n            s4 = [s4, s5, s6, s7];\r\n            s3 = s4;\r\n          } else {\r\n            peg$currPos = s3;\r\n            s3 = peg$FAILED;\r\n          }\r\n        } else {\r\n          peg$currPos = s3;\r\n          s3 = peg$FAILED;\r\n        }\r\n      }\r\n      peg$savedPos = s0;\r\n      s0 = peg$f1(s1, s2);\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parseFactor() {\r\n    var s0, s1, s2, s3, s4, s5;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    s0 = peg$currPos;\r\n    rule$expects(peg$e5);\r\n    if (input.charCodeAt(peg$currPos) === 40) {\r\n      s1 = peg$c5;\r\n      peg$currPos++;\r\n    } else {\r\n      s1 = peg$FAILED;\r\n    }\r\n    if (s1 !== peg$FAILED) {\r\n      s2 = peg$parse_();\r\n      s3 = peg$parseExpression();\r\n      if (s3 !== peg$FAILED) {\r\n        s4 = peg$parse_();\r\n        rule$expects(peg$e6);\r\n        if (input.charCodeAt(peg$currPos) === 41) {\r\n          s5 = peg$c6;\r\n          peg$currPos++;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n        if (s5 !== peg$FAILED) {\r\n          peg$savedPos = s0;\r\n          s0 = peg$f2(s3);\r\n        } else {\r\n          peg$currPos = s0;\r\n          s0 = peg$FAILED;\r\n        }\r\n      } else {\r\n        peg$currPos = s0;\r\n        s0 = peg$FAILED;\r\n      }\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n    if (s0 === peg$FAILED) {\r\n      s0 = peg$parseFloat();\r\n      if (s0 === peg$FAILED) {\r\n        s0 = peg$parseInteger();\r\n        if (s0 === peg$FAILED) {\r\n          s0 = peg$currPos;\r\n          s1 = peg$parseIdentifier();\r\n          if (s1 !== peg$FAILED) {\r\n            rule$expects(peg$e5);\r\n            if (input.charCodeAt(peg$currPos) === 40) {\r\n              s2 = peg$c5;\r\n              peg$currPos++;\r\n            } else {\r\n              s2 = peg$FAILED;\r\n            }\r\n            if (s2 !== peg$FAILED) {\r\n              s3 = peg$parseExpression();\r\n              if (s3 !== peg$FAILED) {\r\n                rule$expects(peg$e6);\r\n                if (input.charCodeAt(peg$currPos) === 41) {\r\n                  s4 = peg$c6;\r\n                  peg$currPos++;\r\n                } else {\r\n                  s4 = peg$FAILED;\r\n                }\r\n                if (s4 !== peg$FAILED) {\r\n                  peg$savedPos = s0;\r\n                  s0 = peg$f3(s1, s3);\r\n                } else {\r\n                  peg$currPos = s0;\r\n                  s0 = peg$FAILED;\r\n                }\r\n              } else {\r\n                peg$currPos = s0;\r\n                s0 = peg$FAILED;\r\n              }\r\n            } else {\r\n              peg$currPos = s0;\r\n              s0 = peg$FAILED;\r\n            }\r\n          } else {\r\n            peg$currPos = s0;\r\n            s0 = peg$FAILED;\r\n          }\r\n          if (s0 === peg$FAILED) {\r\n            s0 = peg$parseIdentifier();\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parseFloat() {\r\n    var s0, s1, s2, s3, s4, s5;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    rule$expects(peg$e7);\r\n    peg$silentFails++;\r\n    s0 = peg$currPos;\r\n    s1 = [];\r\n    if (peg$r0.test(input.charAt(peg$currPos))) {\r\n      s2 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s2 = peg$FAILED;\r\n    }\r\n    while (s2 !== peg$FAILED) {\r\n      s1.push(s2);\r\n      if (peg$r0.test(input.charAt(peg$currPos))) {\r\n        s2 = input.charAt(peg$currPos);\r\n        peg$currPos++;\r\n      } else {\r\n        s2 = peg$FAILED;\r\n      }\r\n    }\r\n    s2 = [];\r\n    if (peg$r1.test(input.charAt(peg$currPos))) {\r\n      s3 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s3 = peg$FAILED;\r\n    }\r\n    if (s3 !== peg$FAILED) {\r\n      while (s3 !== peg$FAILED) {\r\n        s2.push(s3);\r\n        if (peg$r1.test(input.charAt(peg$currPos))) {\r\n          s3 = input.charAt(peg$currPos);\r\n          peg$currPos++;\r\n        } else {\r\n          s3 = peg$FAILED;\r\n        }\r\n      }\r\n    } else {\r\n      s2 = peg$FAILED;\r\n    }\r\n    if (s2 !== peg$FAILED) {\r\n      if (input.length > peg$currPos) {\r\n        s3 = input.charAt(peg$currPos);\r\n        peg$currPos++;\r\n      } else {\r\n        s3 = peg$FAILED;\r\n      }\r\n      if (s3 !== peg$FAILED) {\r\n        s4 = [];\r\n        if (peg$r1.test(input.charAt(peg$currPos))) {\r\n          s5 = input.charAt(peg$currPos);\r\n          peg$currPos++;\r\n        } else {\r\n          s5 = peg$FAILED;\r\n        }\r\n        if (s5 !== peg$FAILED) {\r\n          while (s5 !== peg$FAILED) {\r\n            s4.push(s5);\r\n            if (peg$r1.test(input.charAt(peg$currPos))) {\r\n              s5 = input.charAt(peg$currPos);\r\n              peg$currPos++;\r\n            } else {\r\n              s5 = peg$FAILED;\r\n            }\r\n          }\r\n        } else {\r\n          s4 = peg$FAILED;\r\n        }\r\n        if (s4 !== peg$FAILED) {\r\n          peg$savedPos = s0;\r\n          s0 = peg$f4();\r\n        } else {\r\n          peg$currPos = s0;\r\n          s0 = peg$FAILED;\r\n        }\r\n      } else {\r\n        peg$currPos = s0;\r\n        s0 = peg$FAILED;\r\n      }\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n    peg$silentFails--;\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parseInteger() {\r\n    var s0, s1, s2, s3;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    rule$expects(peg$e8);\r\n    peg$silentFails++;\r\n    s0 = peg$currPos;\r\n    s1 = [];\r\n    if (peg$r0.test(input.charAt(peg$currPos))) {\r\n      s2 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s2 = peg$FAILED;\r\n    }\r\n    while (s2 !== peg$FAILED) {\r\n      s1.push(s2);\r\n      if (peg$r0.test(input.charAt(peg$currPos))) {\r\n        s2 = input.charAt(peg$currPos);\r\n        peg$currPos++;\r\n      } else {\r\n        s2 = peg$FAILED;\r\n      }\r\n    }\r\n    s2 = [];\r\n    if (peg$r1.test(input.charAt(peg$currPos))) {\r\n      s3 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s3 = peg$FAILED;\r\n    }\r\n    if (s3 !== peg$FAILED) {\r\n      while (s3 !== peg$FAILED) {\r\n        s2.push(s3);\r\n        if (peg$r1.test(input.charAt(peg$currPos))) {\r\n          s3 = input.charAt(peg$currPos);\r\n          peg$currPos++;\r\n        } else {\r\n          s3 = peg$FAILED;\r\n        }\r\n      }\r\n    } else {\r\n      s2 = peg$FAILED;\r\n    }\r\n    if (s2 !== peg$FAILED) {\r\n      peg$savedPos = s0;\r\n      s0 = peg$f5();\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n    peg$silentFails--;\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parseIdentifier() {\r\n    var s0, s1, s2, s3, s4;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    rule$expects(peg$e9);\r\n    peg$silentFails++;\r\n    s0 = peg$currPos;\r\n    s1 = [];\r\n    if (peg$r0.test(input.charAt(peg$currPos))) {\r\n      s2 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s2 = peg$FAILED;\r\n    }\r\n    while (s2 !== peg$FAILED) {\r\n      s1.push(s2);\r\n      if (peg$r0.test(input.charAt(peg$currPos))) {\r\n        s2 = input.charAt(peg$currPos);\r\n        peg$currPos++;\r\n      } else {\r\n        s2 = peg$FAILED;\r\n      }\r\n    }\r\n    if (peg$r2.test(input.charAt(peg$currPos))) {\r\n      s2 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s2 = peg$FAILED;\r\n    }\r\n    if (s2 !== peg$FAILED) {\r\n      s3 = [];\r\n      if (peg$r3.test(input.charAt(peg$currPos))) {\r\n        s4 = input.charAt(peg$currPos);\r\n        peg$currPos++;\r\n      } else {\r\n        s4 = peg$FAILED;\r\n      }\r\n      while (s4 !== peg$FAILED) {\r\n        s3.push(s4);\r\n        if (peg$r3.test(input.charAt(peg$currPos))) {\r\n          s4 = input.charAt(peg$currPos);\r\n          peg$currPos++;\r\n        } else {\r\n          s4 = peg$FAILED;\r\n        }\r\n      }\r\n      peg$savedPos = s0;\r\n      s0 = peg$f6();\r\n    } else {\r\n      peg$currPos = s0;\r\n      s0 = peg$FAILED;\r\n    }\r\n    peg$silentFails--;\r\n\r\n    return s0;\r\n  }\r\n\r\n  function peg$parse_() {\r\n    var s0, s1;\r\n\r\n    var rule$expects = function (expected) {\r\n      if (peg$silentFails === 0) peg$expect(expected);\r\n    }\r\n\r\n    rule$expects(peg$e10);\r\n    peg$silentFails++;\r\n    s0 = [];\r\n    if (peg$r4.test(input.charAt(peg$currPos))) {\r\n      s1 = input.charAt(peg$currPos);\r\n      peg$currPos++;\r\n    } else {\r\n      s1 = peg$FAILED;\r\n    }\r\n    while (s1 !== peg$FAILED) {\r\n      s0.push(s1);\r\n      if (peg$r4.test(input.charAt(peg$currPos))) {\r\n        s1 = input.charAt(peg$currPos);\r\n        peg$currPos++;\r\n      } else {\r\n        s1 = peg$FAILED;\r\n      }\r\n    }\r\n    peg$silentFails--;\r\n\r\n    return s0;\r\n  }\r\n\r\n\r\n      function makeNode(lhs, rhs, op) {\r\n        if (typeof lhs === 'number' && typeof rhs === 'number') {\r\n          switch(op) {\r\n            case '+':\r\n              return lhs + rhs;\r\n            case '-':\r\n              return lhs - rhs;\r\n            case '*':\r\n              return lhs * rhs;\r\n            case '/':\r\n              return lhs / rhs;\r\n            case '**':\r\n              return Math.pow(lhs, rhs);\r\n            default:\r\n              break;\r\n          }\r\n        }\r\n\r\n        return {\r\n          lhs: lhs,\r\n          rhs: rhs,\r\n          op: op\r\n        };\r\n      }\r\n\r\n\r\n  peg$begin();\r\n  peg$result = peg$startRuleFunction();\r\n\r\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\r\n    return peg$result;\r\n  } else {\r\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\r\n      peg$expect(peg$endExpectation());\r\n    }\r\n\r\n    throw peg$buildError();\r\n  }\r\n}\r\n\r\nexport { peg$SyntaxError as SyntaxError, peg$parse as parse }","import { Color } from \"cesium\";\r\nimport { TypedArray } from \"geotiff\";\r\n\r\nexport function getMinMax(data: number[], nodata: number) {\r\n  let min: number, max: number;\r\n  for (let j = 0; j < data.length; j += 1) {\r\n    const val = data[j];\r\n    if (val === nodata) continue;\r\n    if (min === undefined && max === undefined) {\r\n      min = max = val;\r\n      continue;\r\n    }\r\n    if (val < min) {\r\n      min = val;\r\n    } else if (val > max) {\r\n      max = val;\r\n    }\r\n  }\r\n  return {\r\n    min, max\r\n  }\r\n}\r\n\r\nexport function decimal2rgb(number: number) {\r\n  return Math.round(number * 255)\r\n}\r\n\r\nexport function getRange(bands: Record<number, {\r\n  min: number;\r\n  max: number;\r\n}>, opts: {\r\n  min?: number,\r\n  max?: number,\r\n  band: number\r\n} | undefined) {\r\n  const band = bands[opts.band]\r\n  if (!band) {\r\n    throw new Error(`Invalid band${opts.band}`)\r\n  }\r\n  const min = opts?.min ?? +band.min;\r\n  const max = opts?.max ?? +band.max;\r\n  const range = max - min;\r\n  return { min, max, range };\r\n}\r\n\r\nexport function generateColorScale(colors: [number, string][] | string[], minMax: number[]) {\r\n  let stops: [number, string][];\r\n\r\n  if (typeof colors[0] === 'string') {\r\n    stops = (colors as string[]).map((color, index) => [index / colors.length, color])\r\n  } else {\r\n    const [min, max] = minMax;\r\n    stops = (colors as [number, string][]).map(item => [((item[0] - min) / (max - min)), item[1]])\r\n  }\r\n\r\n  stops.sort((a, b) => a[0] - b[0]);\r\n  // delete extra break points\r\n  let i = stops.length - 1;\r\n  while (i > 1 && stops[i][0] >= 1 && stops[i - 1][0] >= 1) {\r\n    stops.pop();\r\n    i--;\r\n  }\r\n\r\n  if (stops[0][0] > 0) {\r\n    stops = [[0, stops[0][1]], ...stops]\r\n  }\r\n\r\n  const colorScale = {\r\n    colors: stops.map(stop => stop[1]),\r\n    positions: stops.map(stop => {\r\n      let s = stop[0];\r\n      if (s < 0) return 0;\r\n      if (s > 1) return 1;\r\n      return s;\r\n    }),\r\n  }\r\n\r\n  return colorScale;\r\n}\r\n\r\nexport function findAndSortBandNumbers(str: string) {\r\n  const regex = /b(\\d+)/g;\r\n  const bandNumbers = new Set<number>();\r\n  let match: string[];\r\n  while ((match = regex.exec(str)) !== null) {\r\n    bandNumbers.add(parseInt(match[1]) - 1);\r\n  }\r\n  return Array.from(bandNumbers).sort((a, b) => a - b);\r\n}\r\n\r\nexport function stringColorToRgba(color: string) {\r\n  const newColor = Color.fromCssColorString(color);\r\n  const { red, green, blue, alpha } = newColor;\r\n\r\n  return [red, green, blue, alpha].map(val => Math.round(val * 255));\r\n}\r\n\r\nexport async function reverseArray({ array, width, height }: { array: TypedArray, width: number, height: number }): Promise<TypedArray> {\r\n  const newArray = new (array.constructor as any)(array.length);\r\n  for (let i = 0; i < height; i++) {\r\n    const srcRow = (height - 1 - i) * width;\r\n    const dstRow = i * width;\r\n    for (let j = 0; j < width; j++) {\r\n      newArray[dstRow + j] = array[srcRow + j];\r\n    }\r\n  }\r\n  return newArray;\r\n}\r\n","/**\r\n * The main plotty module.\r\n * @module plotty\r\n * @name plotty\r\n * @author: Daniel Santillan\r\n */\r\n\r\n/**\r\n * @constant\r\n */\r\nimport { colorscales } from './colorscales';\r\nimport { parse as parseArithmetics } from './arithmetics-parser';\r\nimport { ColorScaleNames, DataSet, PlotOptions, RenderColorType, RGBOptions, TypedArray } from './typing';\r\nimport { stringColorToRgba } from '../helpers/utils';\r\n\r\nfunction hasOwnProperty(obj: any, prop: string) {\r\n  return Object.prototype.hasOwnProperty.call(obj, prop);\r\n}\r\n\r\nfunction defaultFor(arg: any, val: any) { return typeof arg !== 'undefined' ? arg : val; }\r\n\r\nfunction create3DContext(canvas: HTMLCanvasElement | OffscreenCanvas, optAttribs: { premultipliedAlpha: boolean; }) {\r\n  let context: WebGL2RenderingContext | null = null;\r\n  try {\r\n    context = canvas.getContext('webgl2', optAttribs) as WebGL2RenderingContext;\r\n  } catch (e) { }\r\n\r\n  if (!context) {\r\n    return null;\r\n  }\r\n  return context;\r\n}\r\n\r\nfunction createProgram(gl: WebGLRenderingContext, vertexShaderSource: string, fragmentShaderSource: string) {\r\n  const vertexShader = gl.createShader(gl.VERTEX_SHADER);\r\n  gl.shaderSource(vertexShader, vertexShaderSource);\r\n  gl.compileShader(vertexShader);\r\n\r\n  if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\r\n    console.error('Vertex shader compilation failed:', gl.getShaderInfoLog(vertexShader));\r\n    gl.deleteShader(vertexShader);\r\n    return null;\r\n  }\r\n\r\n  const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\r\n  gl.shaderSource(fragmentShader, fragmentShaderSource);\r\n  gl.compileShader(fragmentShader);\r\n\r\n  if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\r\n    console.error('Fragment shader compilation failed:', gl.getShaderInfoLog(fragmentShader));\r\n    gl.deleteShader(vertexShader);\r\n    gl.deleteShader(fragmentShader);\r\n    return null;\r\n  }\r\n\r\n  const program = gl.createProgram();\r\n  gl.attachShader(program, vertexShader);\r\n  gl.attachShader(program, fragmentShader);\r\n  gl.linkProgram(program);\r\n\r\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\r\n    console.error('Shader program linking failed:', gl.getProgramInfoLog(program));\r\n    gl.deleteProgram(program);\r\n    gl.deleteShader(vertexShader);\r\n    gl.deleteShader(fragmentShader);\r\n    return null;\r\n  }\r\n\r\n  gl.deleteShader(vertexShader);\r\n  gl.deleteShader(fragmentShader);\r\n\r\n  return program;\r\n}\r\n\r\nfunction setRectangle(gl: WebGLRenderingContext, x: number, y: number, width: number, height: number) {\r\n  const x1 = x;\r\n  const x2 = x + width;\r\n  const y1 = y;\r\n  const y2 = y + height;\r\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\r\n    x1, y1,\r\n    x2, y1,\r\n    x1, y2,\r\n    x1, y2,\r\n    x2, y1,\r\n    x2, y2]), gl.STATIC_DRAW);\r\n}\r\n\r\nfunction createDataset(gl: WebGL2RenderingContext, id: string, data: TypedArray, width: number, height: number, noDataValue: number) {\r\n  let textureData: WebGLTexture;\r\n  if (gl) {\r\n    gl.viewport(0, 0, width, height);\r\n    textureData = gl.createTexture();\r\n    gl.bindTexture(gl.TEXTURE_2D, textureData);\r\n\r\n    // Set the parameters so we can render any size image.\r\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\r\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\r\n\r\n    const processedData = new Float32Array(data.length);\r\n\r\n    for (let i = 0; i < data.length; i++) {\r\n      processedData[i] = isNaN(data[i]) ? noDataValue : data[i];\r\n    }\r\n\r\n    // Use R32F format for single channel float data in WebGL2\r\n    gl.texImage2D(\r\n      gl.TEXTURE_2D,    // target\r\n      0,                // level\r\n      gl.R32F,         // internalformat - use R32F instead of LUMINANCE\r\n      width,           // width\r\n      height,          // height\r\n      0,               // border\r\n      gl.RED,          // format - use RED instead of LUMINANCE\r\n      gl.FLOAT,        // type\r\n      processedData    // data\r\n    );\r\n  }\r\n  return { textureData, width, height, data, id };\r\n}\r\n\r\nfunction destroyDataset(gl: WebGLRenderingContext, dataset: DataSet) {\r\n  if (gl) {\r\n    gl.deleteTexture(dataset.textureData);\r\n  }\r\n}\r\n\r\n/**\r\n * Add a new colorscale to the list of available colorscales.\r\n * @memberof module:plotty\r\n * @param {String} name the name of the newly defined color scale\r\n * @param {String[]} colors the array containing the colors. Each entry shall\r\n *                          adhere to the CSS color definitions.\r\n * @param {Number[]} positions the value position for each of the colors\r\n */\r\nfunction addColorScale(name: string, colors: string[], positions: number[]) {\r\n  if (colors.length !== positions.length) {\r\n    throw new Error('Invalid color scale.');\r\n  }\r\n  colorscales[name] = { colors, positions };\r\n}\r\n\r\n/**\r\n * Render the colorscale to the specified canvas.\r\n * @memberof module:plotty\r\n * @param {String} name the name of the color scale to render\r\n * @param {Object} options options for rendering\r\n * @param {HTMLCanvasElement} options.canvas the canvas to render to\r\n * @param {RenderColorType} [options.type='continuous'] the type of color scale to render\r\n */\r\nfunction renderColorScaleToCanvas(\r\n  name: string,\r\n  options: {\r\n    canvas: HTMLCanvasElement;\r\n    type?: RenderColorType;\r\n  }\r\n) {\r\n  const { canvas, type = 'continuous' } = options;\r\n  const csDef = colorscales[name];\r\n  canvas.height = 1;\r\n  const ctx = canvas.getContext('2d');\r\n\r\n  if (!ctx) {\r\n    throw new Error('Unable to get canvas context.');\r\n  }\r\n\r\n  const width = 256;\r\n\r\n  if (Object.prototype.toString.call(csDef) === '[object Object]') {\r\n    canvas.width = width;\r\n\r\n    if (type === 'continuous') {\r\n      const gradient = ctx.createLinearGradient(0, 0, width, 1);\r\n\r\n      for (let i = 0; i < csDef.colors.length; ++i) {\r\n        gradient.addColorStop(csDef.positions[i], csDef.colors[i]);\r\n      }\r\n\r\n      ctx.fillStyle = gradient;\r\n      ctx.fillRect(0, 0, width, 1);\r\n    } else if (type === 'discrete') {\r\n      for (let i = 0; i < csDef.colors.length; ++i) {\r\n        const nowPos = csDef.positions[i], lastPos = csDef.positions[i + 1];\r\n        const startPos = nowPos * (width - 10);\r\n        const endPos = lastPos ? lastPos * (width - 10) : width;\r\n        ctx.fillStyle = csDef.colors[i];\r\n        ctx.fillRect(startPos, 0, endPos - startPos, 1);\r\n      }\r\n    } else {\r\n      throw new Error('Invalid color scale type.');\r\n    }\r\n  } else if (Object.prototype.toString.call(csDef) === '[object Uint8Array]') {\r\n    canvas.width = width;\r\n    const imgData = ctx.createImageData(width, 1);\r\n    imgData.data.set(csDef);\r\n    ctx.putImageData(imgData, 0, 0);\r\n  } else {\r\n    throw new Error('Color scale not defined.');\r\n  }\r\n}\r\n\r\nconst vertexShaderSource = `#version 300 es\r\n  precision mediump float;\r\n  \r\n  in vec2 a_position;\r\n  in vec2 a_texCoord;\r\n  uniform mat3 u_matrix;\r\n  uniform vec2 u_resolution;\r\n  uniform vec2 u_targetSize;\r\n  uniform vec4 u_window;\r\n  out vec2 v_texCoord;\r\n  out vec2 v_sourceTexCoord;\r\n\r\n  void main() {\r\n    vec2 position = (u_matrix * vec3(a_position, 1)).xy;\r\n    vec2 zeroToOne = position / u_resolution;\r\n    vec2 zeroToTwo = zeroToOne * 2.0;\r\n    vec2 clipSpace = zeroToTwo - 1.0;\r\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);\r\n    \r\n    v_texCoord = a_texCoord;\r\n    v_sourceTexCoord = mix(u_window.xy, u_window.zw, a_position / u_targetSize);\r\n  }\r\n`;\r\n\r\n/**\r\n * The raster plot class.\r\n * @memberof module:plotty\r\n * @constructor\r\n * @param {Object} options the options to pass to the plot.\r\n * @param {HTMLCanvasElement} [options.canvas=document.createElement('canvas')]\r\n *        the canvas to render to\r\n * @param {TypedArray} [options.data] the raster data to render\r\n * @param {Number} [options.width] the width of the input raster\r\n * @param {Number} [options.height] the height of the input raster\r\n * @param {Object[]} [options.datasets=undefined] a list of named datasets. each\r\n *         must have 'id', 'data', 'width' and 'height'.\r\n * @param {(HTMLCanvasElement|HTMLImageElement)} [options.colorScaleImage=undefined]\r\n *        the color scale image to use\r\n * @param {String} [options.colorScale] the name of a named color scale to use\r\n * @param {Number[]} [options.domain=[0, 1]] the value domain to scale the color\r\n * @param {Number[]} [options.displayRange=[0, 1]] range of values that will be\r\n *        rendered, values outside of the range will be transparent\r\n * @param {Boolean} [options.applyDisplayRange=false] set if displayRange should\r\n *        be used\r\n * @param {Boolean} [options.clampLow=true] whether or now values below the domain\r\n *        shall be clamped\r\n * @param {Boolean} [options.clampHigh=clampLow] whether or now values above the\r\n * domain shall be clamped (if not defined defaults to clampLow value)\r\n * @param {Number} [options.noDataValue = undefined] the no-data value that shall\r\n *         always be hidden\r\n * @param {Array} [options.matrix=[1, 0, 0, 0, 1, 0, 0, 0, 1 ]] Transformation matrix\r\n * @param {Boolean} [options.useWebGL=true] plotty can also function with pure javascript\r\n *         but it is much slower then using WebGl rendering\r\n *\r\n */\r\nclass plot {\r\n  canvas: HTMLCanvasElement | OffscreenCanvas;\r\n  currentDataset: DataSet;\r\n  datasetCollection: Record<string, DataSet>;\r\n  gl: WebGL2RenderingContext | null;\r\n  program: WebGLProgram;\r\n  texCoordBuffer: WebGLBuffer;\r\n  ctx: CanvasRenderingContext2D;\r\n  displayRange: number[];\r\n  applyDisplayRange: boolean;\r\n  matrix: number[];\r\n  colorScaleImage: HTMLCanvasElement | HTMLImageElement;\r\n  domain: number[];\r\n  colorScaleCanvas: HTMLCanvasElement;\r\n  name: ColorScaleNames;\r\n  clampLow: boolean;\r\n  clampHigh: boolean;\r\n  textureScale: WebGLTexture;\r\n  noDataValue: number;\r\n  expressionAst: string;\r\n  colorType: RenderColorType = 'continuous';\r\n  positionBuffer: WebGLBuffer;\r\n  programCache: Record<string, WebGLProgram> = {};\r\n  window: number[];\r\n  interpolationMethod: 'nearest' | 'bilinear' = 'nearest';\r\n  tileWidth: number;\r\n  tileHeight: number;\r\n  buffer: number;\r\n  private _rgbBands: {\r\n    r?: { band: number; min?: number; max?: number; };\r\n    g?: { band: number; min?: number; max?: number; };\r\n    b?: { band: number; min?: number; max?: number; };\r\n  };\r\n  private _colorMapping: [number[], number[]][] = [];\r\n  private _isRGB: boolean = false;\r\n\r\n  constructor(options: PlotOptions) {\r\n    this.datasetCollection = {};\r\n    this.currentDataset = null;\r\n\r\n    this.setCanvas(options.canvas);\r\n    this.setColorType(options.type);\r\n    // check if a webgl context is requested and available and set up the shaders\r\n\r\n    if (options.rgbOptions) {\r\n      this._rgbBands = options.rgbOptions.bands;\r\n      this._isRGB = true;\r\n      if (options.rgbOptions.colorMapping) {\r\n        this._colorMapping = Object.entries(options.rgbOptions.colorMapping)\r\n          .map(([from, to]) => [stringColorToRgba(from), stringColorToRgba(to)]) as [number[], number[]][];\r\n      }\r\n    }\r\n\r\n    if (defaultFor(options.useWebGL, true)) {\r\n      const gl = create3DContext(this.canvas, { premultipliedAlpha: false });\r\n      if (gl !== null) {\r\n        this.gl = gl;\r\n        this.program = createProgram(gl, vertexShaderSource, this.createFragmentShader(null));\r\n        if (!this.program) {\r\n          console.error('Failed to create WebGL program');\r\n          return;\r\n        }\r\n        gl.useProgram(this.program);\r\n\r\n        // Get attribute locations\r\n        const positionLocation = gl.getAttribLocation(this.program, 'a_position');\r\n        const texCoordLocation = gl.getAttribLocation(this.program, 'a_texCoord');\r\n\r\n        // Create and set position buffer\r\n        this.positionBuffer = gl.createBuffer();\r\n        gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\r\n        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\r\n          0, 0,\r\n          1, 0,\r\n          0, 1,\r\n          0, 1,\r\n          1, 0,\r\n          1, 1\r\n        ]), gl.STATIC_DRAW);\r\n\r\n        // Create and set texture coordinate buffer\r\n        this.texCoordBuffer = gl.createBuffer();\r\n        gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\r\n        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\r\n          0.0, 0.0,\r\n          1.0, 0.0,\r\n          0.0, 1.0,\r\n          0.0, 1.0,\r\n          1.0, 0.0,\r\n          1.0, 1.0]), gl.STATIC_DRAW);\r\n\r\n        // Enable vertex attribute arrays\r\n        if (positionLocation !== -1) {\r\n          gl.enableVertexAttribArray(positionLocation);\r\n          gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\r\n          gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\r\n        }\r\n\r\n        if (texCoordLocation !== -1) {\r\n          gl.enableVertexAttribArray(texCoordLocation);\r\n          gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\r\n          gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\r\n        }\r\n      } else {\r\n        this.ctx = (this.canvas as HTMLCanvasElement).getContext('2d');\r\n      }\r\n    } else {\r\n      this.ctx = (this.canvas as HTMLCanvasElement).getContext('2d');\r\n    }\r\n\r\n    if (options.colorScaleImage) {\r\n      this.setColorScaleImage(options.colorScaleImage);\r\n    } else {\r\n      this.setColorScale(defaultFor(options.colorScale, 'viridis'));\r\n    }\r\n    this.setDomain(defaultFor(options.domain, [0, 1]));\r\n    this.displayRange = defaultFor(options.displayRange, [0, 1]);\r\n    this.applyDisplayRange = defaultFor(options.applyDisplayRange, false);\r\n    this.setClamp(defaultFor(options.clampLow, true), options.clampHigh);\r\n    this.setNoDataValue(options.noDataValue);\r\n\r\n    if (options.data) {\r\n      const l = options.data.length;\r\n      this.setData(\r\n        options.data,\r\n        defaultFor(options.width, options.data[l - 2]),\r\n        defaultFor(options.height, options.data[l - 2])\r\n      );\r\n    }\r\n\r\n    if (options.datasets) {\r\n      for (let i = 0; i < options.datasets.length; ++i) {\r\n        const ds = options.datasets[i];\r\n        this.addDataset(ds.id, ds.data, ds.width, ds.height);\r\n      }\r\n    }\r\n\r\n    if (options.matrix) {\r\n      this.matrix = options.matrix;\r\n    } else {  // if no matrix is provided, supply identity matrix\r\n      this.matrix = [\r\n        1, 0, 0,\r\n        0, 1, 0,\r\n        0, 0, 1,\r\n      ];\r\n    }\r\n\r\n    this.tileWidth = options.tileWidth || 256;\r\n    this.tileHeight = options.tileHeight || 256;\r\n    this.buffer = options.buffer || 1;\r\n\r\n    if (options.rgbOptions) {\r\n      this.setRGBOptions(options.rgbOptions);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get the raw data from the currently selected dataset.\r\n   * @returns {TypedArray} the data of the currently selected dataset.\r\n   */\r\n  getData(): TypedArray {\r\n    const dataset = this.currentDataset;\r\n    if (!dataset) {\r\n      throw new Error('No dataset available.');\r\n    }\r\n    return dataset.data;\r\n  }\r\n\r\n  /**\r\n   * Query the raw raster data at the specified coordinates.\r\n   * @param {Number} x the x coordinate\r\n   * @param {Number} y the y coordinate\r\n   * @returns {Number} the value at the specified coordinates\r\n   */\r\n  atPoint(x: number, y: number): number {\r\n    const dataset = this.currentDataset;\r\n    if (!dataset) {\r\n      throw new Error('No dataset available.');\r\n    } else if (x >= dataset.width || y >= dataset.height) {\r\n      throw new Error('Coordinates are outside of image bounds.');\r\n    }\r\n    return dataset.data[(y * dataset.width) + x];\r\n  }\r\n\r\n  /**\r\n   * Set the raw raster data to be rendered. This creates a new unnamed dataset.\r\n   * @param {TypedArray} data the raw raster data. This can be a typed array of\r\n   *                          any type, but will be coerced to Float32Array when\r\n   *                          beeing rendered.\r\n   * @param {number} width the width of the raster image\r\n   * @param {number} height the height of the data\r\n   */\r\n  setData(data: TypedArray, width: number, height: number) {\r\n    if (this.currentDataset && this.currentDataset.id === null) {\r\n      destroyDataset(this.gl, this.currentDataset);\r\n    }\r\n    this.currentDataset = createDataset(this.gl, null, data, width, height, this.noDataValue);\r\n  }\r\n\r\n  /**s\r\n   * Add a new named dataset. The semantics are the same as with @see setData.\r\n   * @param {string} id the identifier for the dataset.\r\n   * @param {TypedArray} data the raw raster data. This can be a typed array of\r\n   *                          any type, but will be coerced to Float32Array when\r\n   *                          beeing rendered.\r\n   * @param {number} width the width of the raster image\r\n   * @param {number} height the height of the data\r\n   */\r\n  addDataset(id: string, data: TypedArray, width: number, height: number) {\r\n    if (this.datasetAvailable(id)) {\r\n      throw new Error(`There is already a dataset registered with id '${id}'`);\r\n    }\r\n    this.datasetCollection[id] = createDataset(this.gl, id, data, width, height, this.noDataValue);\r\n    if (!this.currentDataset) {\r\n      this.currentDataset = this.datasetCollection[id];\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set the current dataset to be rendered.\r\n   * @param {string} id the identifier of the dataset to be rendered.\r\n   */\r\n  setCurrentDataset(id: string) {\r\n    if (!this.datasetAvailable(id)) {\r\n      throw new Error(`No such dataset registered: '${id}'`);\r\n    }\r\n    if (this.currentDataset && this.currentDataset.id === null) {\r\n      destroyDataset(this.gl, this.currentDataset);\r\n    }\r\n    this.currentDataset = this.datasetCollection[id];\r\n  }\r\n\r\n  /**\r\n   * Remove the dataset.\r\n   * @param {string} id the identifier of the dataset to be removed.\r\n   */\r\n  removeDataset(id: string) {\r\n    const dataset = this.datasetCollection[id];\r\n    if (!dataset) {\r\n      throw new Error(`No such dataset registered: '${id}'`);\r\n    }\r\n    destroyDataset(this.gl, dataset);\r\n    if (this.currentDataset === dataset) {\r\n      this.currentDataset = null;\r\n    }\r\n    delete this.datasetCollection[id];\r\n  }\r\n\r\n  removeAllDataset() {\r\n    Object.keys(this.datasetCollection).forEach(id => {\r\n      const dataset = this.datasetCollection[id];\r\n      if (dataset) {\r\n        destroyDataset(this.gl, dataset);\r\n        delete this.datasetCollection[id];\r\n      }\r\n    });\r\n    this.currentDataset = null;\r\n  }\r\n\r\n  /**\r\n   * Check if the dataset is available.\r\n   * @param {string} id the identifier of the dataset to check.\r\n   * @returns {Boolean} whether or not a dataset with that identifier is defined\r\n   */\r\n  datasetAvailable(id: string): boolean {\r\n    return hasOwnProperty(this.datasetCollection, id);\r\n  }\r\n\r\n  /**\r\n   * Retrieve the rendered color scale image.\r\n   * @returns {(HTMLCanvasElement|HTMLImageElement)} the canvas or image element\r\n   *                                                 for the rendered color scale\r\n   */\r\n  getColorScaleImage(): (HTMLCanvasElement | HTMLImageElement) {\r\n    return this.colorScaleImage;\r\n  }\r\n\r\n  /**\r\n   * Set the canvas to draw to. When no canvas is supplied, a new canvas element\r\n   * is created.\r\n   * @param {HTMLCanvasElement | OffscreenCanvas} [canvas] the canvas element to render to.\r\n   */\r\n  setCanvas(canvas: HTMLCanvasElement | OffscreenCanvas) {\r\n    this.canvas = canvas || document.createElement('canvas');\r\n  }\r\n\r\n  setColorType(type: RenderColorType) {\r\n    this.colorType = type ?? 'continuous';\r\n  }\r\n\r\n  /**\r\n   * Set the new value domain for the rendering.\r\n   * @param {number[]} domain the value domain range in the form [low, high]\r\n   */\r\n  setDomain(domain: number[]) {\r\n    if (!domain || domain.length !== 2) {\r\n      throw new Error('Invalid domain specified.');\r\n    }\r\n    this.domain = domain;\r\n  }\r\n\r\n  /**\r\n   * Set the display range that will be rendered, values outside of the range\r\n   * will not be rendered (transparent)\r\n   * @param {number[]} displayRange range array in the form [min, max]\r\n   */\r\n  setDisplayRange(displayRange: number[]) {\r\n    if (!displayRange || displayRange.length !== 2) {\r\n      throw new Error('Invalid view range specified.');\r\n    }\r\n    this.displayRange = displayRange;\r\n    // When setting view range automatically enable the apply flag\r\n    this.applyDisplayRange = true;\r\n  }\r\n\r\n  /**\r\n   * Get the canvas that is currently rendered to.\r\n   * @returns {HTMLCanvasElement} the canvas that is currently rendered to.\r\n   */\r\n  getCanvas(): HTMLCanvasElement | OffscreenCanvas {\r\n    return this.canvas;\r\n  }\r\n\r\n  /**\r\n   * Set the currently selected color scale.\r\n   * @param {ColorScaleNames} name the name of the colorscale. Must be registered.\r\n   */\r\n  setColorScale(name: ColorScaleNames) {\r\n    if (!hasOwnProperty(colorscales, name)) {\r\n      throw new Error(`No such color scale '${name}'`);\r\n    }\r\n    if (!this.colorScaleCanvas) {\r\n      // Create single canvas to render colorscales\r\n      this.colorScaleCanvas = document.createElement('canvas');\r\n      this.colorScaleCanvas.width = 256;\r\n      this.colorScaleCanvas.height = 1;\r\n    }\r\n    renderColorScaleToCanvas(name, {\r\n      canvas: this.colorScaleCanvas,\r\n      type: this.colorType,\r\n    });\r\n    this.name = name;\r\n    this.setColorScaleImage(this.colorScaleCanvas);\r\n  }\r\n\r\n  /**\r\n   * Set the clamping for the lower and the upper border of the values. When\r\n   * clamping is enabled for either side, the values below or above will be\r\n   * clamped to the minimum/maximum color.\r\n   * @param {Boolean} clampLow whether or not the minimum shall be clamped.\r\n   * @param {Boolean} clampHigh whether or not the maxmimum shall be clamped.\r\n   *                            defaults to clampMin.\r\n   */\r\n  setClamp(clampLow: boolean, clampHigh: boolean) {\r\n    this.clampLow = clampLow;\r\n    this.clampHigh = (typeof clampHigh !== 'undefined') ? clampHigh : clampLow;\r\n  }\r\n\r\n  /**\r\n   * Set the currently selected color scale as an image or canvas.\r\n   * @param {(HTMLCanvasElement|HTMLImageElement)} colorScaleImage the new color\r\n   *                                                               scale image\r\n   */\r\n  setColorScaleImage(colorScaleImage: (HTMLCanvasElement | HTMLImageElement)) {\r\n    this.colorScaleImage = colorScaleImage;\r\n    const gl = this.gl;\r\n    if (gl) {\r\n      if (this.textureScale) {\r\n        gl.deleteTexture(this.textureScale);\r\n      }\r\n      this.textureScale = gl.createTexture();\r\n      gl.bindTexture(gl.TEXTURE_2D, this.textureScale);\r\n\r\n      // Set texture parameters\r\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n\r\n      try {\r\n        // Upload texture data\r\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, colorScaleImage);\r\n      } catch (e) {\r\n        console.error('Failed to upload color scale texture:', e);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set the no-data-value: a special value that will be rendered transparent.\r\n   * @param {number} noDataValue the no-data-value. Use null to clear a\r\n   *                            previously set no-data-value.\r\n   */\r\n  setNoDataValue(noDataValue: number) {\r\n    this.noDataValue = isNaN(noDataValue) ? Number.MIN_SAFE_INTEGER : noDataValue;\r\n  }\r\n\r\n  /**\r\n   * Render the map to the specified canvas with the given settings.\r\n   */\r\n  render(window?: [number, number, number, number]) {\r\n    const dataset = this.currentDataset;\r\n\r\n    // Set canvas size to target size (tile size)\r\n    if (this.canvas instanceof HTMLCanvasElement) {\r\n      this.canvas.width = this.tileWidth;\r\n      this.canvas.height = this.tileHeight;\r\n    } else {\r\n      // OffscreenCanvas needs width/height to be integers\r\n      this.canvas.width = Math.round(this.tileWidth);\r\n      this.canvas.height = Math.round(this.tileHeight);\r\n    }\r\n\r\n    this.window = window || [0, 0, 1, 1];\r\n\r\n    let ids = this.getExpressionIds();\r\n\r\n    if (this.gl) {\r\n      this.renderWebGL(dataset, ids);\r\n    } else if (this.ctx) {\r\n      this.render2D(dataset);\r\n    }\r\n  }\r\n\r\n  private getExpressionIds(): string[] | null {\r\n    if (!this.expressionAst) return null;\r\n\r\n    const idsSet = new Set<string>();\r\n    const getIds = (node: any) => {\r\n      if (typeof node === 'string') {\r\n        idsSet.add(node.replace(/[+-]/g, ''));\r\n      }\r\n      if (typeof node.lhs === 'string') {\r\n        idsSet.add(node.lhs.replace(/[+-]/g, ''));\r\n      } else if (typeof node.lhs === 'object') {\r\n        getIds(node.lhs);\r\n      }\r\n      if (typeof node.rhs === 'string') {\r\n        idsSet.add(node.rhs.replace(/[+-]/g, ''));\r\n      } else if (typeof node.rhs === 'object') {\r\n        getIds(node.rhs);\r\n      }\r\n    };\r\n    getIds(this.expressionAst);\r\n    return Array.from(idsSet);\r\n  }\r\n\r\n  private renderWebGL(dataset: any, ids: string[] | null) {\r\n    const gl = this.gl!;\r\n    gl.viewport(0, 0, this.tileWidth, this.tileHeight);\r\n\r\n    const program = this.getOrCreateProgram(ids);\r\n    if (!program) {\r\n      console.error('Failed to create WebGL program');\r\n      return;\r\n    }\r\n\r\n    gl.useProgram(program);\r\n\r\n    this.setupTextures(program, ids, dataset);\r\n    this.setupUniforms(program);\r\n    this.setupAttributes(program);\r\n\r\n    // Draw the rectangle\r\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\r\n  }\r\n\r\n  private getOrCreateProgram(ids: string[] | null): WebGLProgram | null {\r\n    if (!this.expressionAst) {\r\n      return this.program;\r\n    }\r\n\r\n    const exprKey = JSON.stringify(this.expressionAst);\r\n    if (this.programCache[exprKey]) {\r\n      return this.programCache[exprKey];\r\n    }\r\n\r\n    const fragmentShader = this.createFragmentShader(ids);\r\n    const program = createProgram(this.gl!, vertexShaderSource, fragmentShader);\r\n\r\n    if (program) {\r\n      this.programCache[exprKey] = program;\r\n      return program;\r\n    } else {\r\n      console.error('Failed to create WebGL program');\r\n      return null;\r\n    }\r\n  }\r\n\r\n  private createFragmentShader(ids: string[] | null): string {\r\n    const baseShader = `#version 300 es\r\nprecision mediump float;\r\nprecision mediump sampler2D;\r\n\r\nuniform sampler2D u_textureScale;\r\nuniform vec2 u_sourceSize;\r\nuniform vec2 u_targetSize;\r\nuniform vec2 u_domain;\r\nuniform vec2 u_display_range;\r\nuniform bool u_apply_display_range;\r\nuniform float u_noDataValue;\r\nuniform bool u_clampLow;\r\nuniform bool u_clampHigh;\r\nuniform int u_interpolationMethod;\r\nuniform float u_buffer;\r\n\r\n${this._isRGB ? `\r\nuniform sampler2D u_texture_r;\r\nuniform sampler2D u_texture_g;\r\nuniform sampler2D u_texture_b;\r\nuniform float u_r_min;\r\nuniform float u_r_max;\r\nuniform float u_g_min;\r\nuniform float u_g_max;\r\nuniform float u_b_min;\r\nuniform float u_b_max;\r\nuniform vec4 u_mapping_from[${Math.max(1, this._colorMapping.length)}];\r\nuniform vec4 u_mapping_to[${Math.max(1, this._colorMapping.length)}];\r\n` : ''}\r\n\r\nin vec2 v_texCoord;\r\nin vec2 v_sourceTexCoord;\r\nout vec4 fragColor;\r\n\r\nbool isNoData(float value) {\r\n    return (value == u_noDataValue) || (value != value);\r\n}\r\n\r\nfloat getValue(sampler2D tex, vec2 point) {\r\n    if (any(lessThan(point, vec2(0.0))) || any(greaterThanEqual(point, vec2(1.0)))) {\r\n        return u_noDataValue;\r\n    }\r\n\r\n    vec2 clampedSamplePoint = clamp(point, vec2(0.0), vec2(1.0) - (1.0 / u_sourceSize));\r\n    return texture(tex, clampedSamplePoint).r;\r\n}\r\n\r\nfloat sampleNearest(sampler2D tex, vec2 uv) {\r\n    vec2 adjustedPoint = (uv * (u_sourceSize - vec2(2.0 * u_buffer)) + vec2(u_buffer)) / u_sourceSize;\r\n    return getValue(tex, adjustedPoint);\r\n}\r\n\r\nvec4 sampleBilinear(sampler2D tex, vec2 uv) {\r\n    vec2 texelCoords = uv * (u_sourceSize - vec2(2.0 * u_buffer)) + vec2(u_buffer);\r\n    vec2 f = fract(texelCoords);\r\n\r\n    vec2 tl = (floor(texelCoords) + vec2(0.0, 0.0)) / u_sourceSize;\r\n    vec2 tr = (floor(texelCoords) + vec2(1.0, 0.0)) / u_sourceSize;\r\n    vec2 bl = (floor(texelCoords) + vec2(0.0, 1.0)) / u_sourceSize;\r\n    vec2 br = (floor(texelCoords) + vec2(1.0, 1.0)) / u_sourceSize;\r\n\r\n    float tlSample = getValue(tex, tl);\r\n    float trSample = getValue(tex, tr);\r\n    float blSample = getValue(tex, bl);\r\n    float brSample = getValue(tex, br);\r\n\r\n    float w1 = (1.0 - f.x) * (1.0 - f.y);\r\n    float w2 = f.x * (1.0 - f.y);\r\n    float w3 = (1.0 - f.x) * f.y;\r\n    float w4 = f.x * f.y;\r\n\r\n    float value = 0.0;\r\n    float totalWeight = 0.0;\r\n\r\n    if (!isNoData(tlSample)) {\r\n        value += tlSample * w1;\r\n        totalWeight += w1;\r\n    }\r\n    if (!isNoData(trSample)) {\r\n        value += trSample * w2;\r\n        totalWeight += w2;\r\n    }\r\n    if (!isNoData(blSample)) {\r\n        value += blSample * w3;\r\n        totalWeight += w3;\r\n    }\r\n    if (!isNoData(brSample)) {\r\n        value += brSample * w4;\r\n        totalWeight += w4;\r\n    }\r\n\r\n    if (totalWeight == 0.0) {\r\n        return vec4(u_noDataValue, 0.0, 0.0, 0.0);\r\n    }\r\n\r\n    return vec4(value / totalWeight, 0.0, 0.0, totalWeight);\r\n}\r\n\r\n${this._isRGB ? `\r\nvec4 processRGBValue(vec4 rValue, vec4 gValue, vec4 bValue) {\r\n    if(isNoData(rValue.r) || isNoData(gValue.r) || isNoData(bValue.r)) {\r\n        return vec4(0.0, 0.0, 0.0, 0.0);\r\n    }\r\n\r\n    float r = (rValue.r - u_r_min) / (u_r_max - u_r_min);\r\n    float g = (gValue.r - u_g_min) / (u_g_max - u_g_min);\r\n    float b = (bValue.r - u_b_min) / (u_b_max - u_b_min);\r\n\r\n    vec4 color = vec4(r, g, b, 1.0);\r\n    \r\n    // Apply color mapping\r\n    for(int i = 0; i < ${Math.max(1, this._colorMapping.length)}; i++) {\r\n        if(abs(color.r - u_mapping_from[i].r) < 0.01 && \r\n           abs(color.g - u_mapping_from[i].g) < 0.01 && \r\n           abs(color.b - u_mapping_from[i].b) < 0.01) {\r\n            return u_mapping_to[i];\r\n        }\r\n    }\r\n    \r\n    return color;\r\n}\r\n` : ''}`;\r\n\r\n    let mainFunction: string;\r\n    if (this._isRGB) {\r\n      mainFunction = `\r\nvoid main() {\r\n    vec4 rValue, gValue, bValue;\r\n    \r\n    if (u_interpolationMethod == 0) {\r\n        rValue = vec4(sampleNearest(u_texture_r, v_sourceTexCoord), 0.0, 0.0, 1.0);\r\n        gValue = vec4(sampleNearest(u_texture_g, v_sourceTexCoord), 0.0, 0.0, 1.0);\r\n        bValue = vec4(sampleNearest(u_texture_b, v_sourceTexCoord), 0.0, 0.0, 1.0);\r\n    } else {\r\n        rValue = sampleBilinear(u_texture_r, v_sourceTexCoord);\r\n        gValue = sampleBilinear(u_texture_g, v_sourceTexCoord); \r\n        bValue = sampleBilinear(u_texture_b, v_sourceTexCoord);\r\n    }\r\n    \r\n    fragColor = processRGBValue(rValue, gValue, bValue);\r\n}`;\r\n    } else {\r\n      mainFunction = `\r\nvoid main() {\r\n    vec4 sampledValue;\r\n    \r\n    if (u_interpolationMethod == 0) {\r\n        sampledValue = vec4(sampleNearest(u_textureData, v_sourceTexCoord), 0.0, 0.0, 1.0);\r\n    } else {\r\n        sampledValue = sampleBilinear(u_textureData, v_sourceTexCoord);\r\n    }\r\n\r\n    float value = sampledValue.r;\r\n    float alpha = sampledValue.a;\r\n\r\n    if (isNoData(value) || alpha == 0.0) {\r\n        fragColor = vec4(0.0, 0.0, 0.0, 0.0);\r\n    } else if (u_apply_display_range && (value < u_display_range[0] || value >= u_display_range[1])) {\r\n        fragColor = vec4(0.0, 0.0, 0.0, 0.0);\r\n    } else if ((!u_clampLow && value < u_domain[0]) || (!u_clampHigh && value > u_domain[1])) {\r\n        fragColor = vec4(0.0, 0.0, 0.0, 0.0);\r\n    } else {\r\n        float normalisedValue = (value - u_domain[0]) / (u_domain[1] - u_domain[0]);\r\n        vec4 color = texture(u_textureScale, vec2(normalisedValue, 0.0));\r\n        fragColor = vec4(color.rgb, color.a * alpha);\r\n    }\r\n}`;\r\n    }\r\n\r\n    return `${baseShader}\r\n${ids ? ids.map((id: string) => `uniform sampler2D u_texture_${id};`).join('\\n') : this._isRGB ? '' : 'uniform sampler2D u_textureData;'}\r\n${mainFunction}`;\r\n  }\r\n\r\n  private setupTextures(program: WebGLProgram, ids: string[] | null, dataset: any) {\r\n    const gl = this.gl!;\r\n\r\n    if (this._isRGB) {\r\n      ['r', 'g', 'b'].forEach((band, index) => {\r\n        if (this._rgbBands[band]) {\r\n          const ds = this.datasetCollection[`band${this._rgbBands[band].band}`];\r\n          if (!ds) {\r\n            throw new Error(`No such dataset registered: 'band${this._rgbBands[band].band}'`);\r\n          }\r\n          gl.uniform1i(gl.getUniformLocation(program, `u_texture_${band}`), index);\r\n          gl.activeTexture(gl[`TEXTURE${index}`]);\r\n          gl.bindTexture(gl.TEXTURE_2D, ds.textureData);\r\n        }\r\n      });\r\n\r\n      // Set RGB band ranges\r\n      gl.uniform1f(gl.getUniformLocation(program, 'u_r_min'), this._rgbBands.r?.min || 0);\r\n      gl.uniform1f(gl.getUniformLocation(program, 'u_r_max'), this._rgbBands.r?.max || 255);\r\n      gl.uniform1f(gl.getUniformLocation(program, 'u_g_min'), this._rgbBands.g?.min || 0);\r\n      gl.uniform1f(gl.getUniformLocation(program, 'u_g_max'), this._rgbBands.g?.max || 255);\r\n      gl.uniform1f(gl.getUniformLocation(program, 'u_b_min'), this._rgbBands.b?.min || 0);\r\n      gl.uniform1f(gl.getUniformLocation(program, 'u_b_max'), this._rgbBands.b?.max || 255);\r\n\r\n      // Set color mapping uniforms\r\n      if (this._colorMapping.length > 0) {\r\n        const fromColors = new Float32Array(this._colorMapping.map(([from]) => from).flat());\r\n        const toColors = new Float32Array(this._colorMapping.map(([, to]) => to).flat());\r\n\r\n        gl.uniform4fv(gl.getUniformLocation(program, 'u_mapping_from'), fromColors);\r\n        gl.uniform4fv(gl.getUniformLocation(program, 'u_mapping_to'), toColors);\r\n      }\r\n    } else {\r\n      if (ids) {\r\n        gl.uniform1i(gl.getUniformLocation(program, 'u_textureScale'), 0);\r\n        gl.activeTexture(gl.TEXTURE0);\r\n        gl.bindTexture(gl.TEXTURE_2D, this.textureScale);\r\n\r\n        ids.forEach((id, index) => {\r\n          const location = index + 1;\r\n          const ds = this.datasetCollection[id];\r\n          if (!ds) {\r\n            throw new Error(`No such dataset registered: '${id}'`);\r\n          }\r\n          gl.uniform1i(gl.getUniformLocation(program, `u_texture_${id}`), location);\r\n          gl.activeTexture(gl[`TEXTURE${location}`]);\r\n          gl.bindTexture(gl.TEXTURE_2D, ds.textureData);\r\n        });\r\n      } else {\r\n        gl.uniform1i(gl.getUniformLocation(program, 'u_textureData'), 0);\r\n        gl.uniform1i(gl.getUniformLocation(program, 'u_textureScale'), 1);\r\n        gl.activeTexture(gl.TEXTURE0);\r\n        gl.bindTexture(gl.TEXTURE_2D, dataset.textureData);\r\n        gl.activeTexture(gl.TEXTURE1);\r\n        gl.bindTexture(gl.TEXTURE_2D, this.textureScale);\r\n      }\r\n    }\r\n  }\r\n\r\n  private setupUniforms(program: WebGLProgram) {\r\n    const gl = this.gl!;\r\n    gl.uniform2f(gl.getUniformLocation(program, 'u_resolution'), this.tileWidth, this.tileHeight);\r\n    gl.uniform2f(gl.getUniformLocation(program, 'u_sourceSize'), this.currentDataset.width, this.currentDataset.height);\r\n    gl.uniform2f(gl.getUniformLocation(program, 'u_targetSize'), this.tileWidth, this.tileHeight);\r\n    gl.uniform2fv(gl.getUniformLocation(program, 'u_domain'), this.domain);\r\n    gl.uniform2fv(gl.getUniformLocation(program, 'u_display_range'), this.displayRange);\r\n    gl.uniform1i(gl.getUniformLocation(program, 'u_apply_display_range'), +this.applyDisplayRange);\r\n    gl.uniform1i(gl.getUniformLocation(program, 'u_clampLow'), +this.clampLow);\r\n    gl.uniform1i(gl.getUniformLocation(program, 'u_clampHigh'), +this.clampHigh);\r\n    gl.uniform1f(gl.getUniformLocation(program, 'u_noDataValue'), this.noDataValue);\r\n    gl.uniformMatrix3fv(gl.getUniformLocation(program, 'u_matrix'), false, this.matrix);\r\n    gl.uniform4fv(gl.getUniformLocation(program, 'u_window'), this.window);\r\n    gl.uniform1i(gl.getUniformLocation(program, 'u_interpolationMethod'), this.interpolationMethod === 'nearest' ? 0 : 1);\r\n    gl.uniform1f(gl.getUniformLocation(program, 'u_buffer'), this.buffer);\r\n  }\r\n\r\n  private setupAttributes(program: WebGLProgram) {\r\n    const gl = this.gl!;\r\n\r\n    const positionLocation = gl.getAttribLocation(program, 'a_position');\r\n    if (positionLocation === -1) {\r\n      console.error('Unable to get position attribute location');\r\n      return;\r\n    }\r\n\r\n    const positionBuffer = gl.createBuffer();\r\n    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\r\n    gl.enableVertexAttribArray(positionLocation);\r\n    gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\r\n    setRectangle(gl, 0, 0, this.tileWidth, this.tileHeight);\r\n  }\r\n\r\n  private render2D(dataset: any) {\r\n    const ctx = this.ctx;\r\n    const w = this.canvas.width;\r\n    const h = this.canvas.height;\r\n\r\n    const imageData = ctx.createImageData(w, h);\r\n\r\n    const trange = this.domain[1] - this.domain[0];\r\n    const steps = this.colorScaleCanvas.width;\r\n    const csImageData = this.colorScaleCanvas.getContext('2d').getImageData(0, 0, steps, 1).data;\r\n    let alpha: number;\r\n\r\n    const data = dataset.data;\r\n\r\n    for (let y = 0; y < h; y++) {\r\n      for (let x = 0; x < w; x++) {\r\n        const i = (y * w) + x;\r\n        // TODO: Possible increase of performance through use of worker threads?\r\n\r\n        let c = Math.floor(((data[i] - this.domain[0]) / trange) * (steps - 1));\r\n        alpha = 255;\r\n        if (c < 0) {\r\n          c = 0;\r\n          if (!this.clampLow) {\r\n            alpha = 0;\r\n          }\r\n        } else if (c > 255) {\r\n          c = 255;\r\n          if (!this.clampHigh) {\r\n            alpha = 0;\r\n          }\r\n        }\r\n        // NaN values should be the only values that are not equal to itself\r\n        if (data[i] === this.noDataValue || data[i] !== data[i]) {\r\n          alpha = 0;\r\n        } else if (this.applyDisplayRange\r\n          && (data[i] < this.displayRange[0] || data[i] >= this.displayRange[1])) {\r\n          alpha = 0;\r\n        }\r\n\r\n        const index = ((y * w) + x) * 4;\r\n        imageData.data[index + 0] = csImageData[c * 4];\r\n        imageData.data[index + 1] = csImageData[(c * 4) + 1];\r\n        imageData.data[index + 2] = csImageData[(c * 4) + 2];\r\n        imageData.data[index + 3] = Math.min(alpha, csImageData[(c * 4) + 3]);\r\n      }\r\n    }\r\n\r\n    ctx.putImageData(imageData, 0, 0); // at coords 0,0\r\n  }\r\n\r\n  /**\r\n   * Render the specified dataset with the current settings.\r\n   * @param {string} id the identifier of the dataset to render.\r\n   */\r\n  renderDataset(id: string, window?: [number, number, number, number]) {\r\n    this.setCurrentDataset(id);\r\n    return this.render(window);\r\n  }\r\n\r\n  /**\r\n   * Get the color for the specified value.\r\n   * @param {number} val the value to query the color for.\r\n   * @returns {Array} the 4-tuple: red, green, blue, alpha in the range 0-255.\r\n   */\r\n  getColor(val: number): Array<any> {\r\n    const steps = this.colorScaleCanvas.width;\r\n    const csImageData = this.colorScaleCanvas.getContext('2d')\r\n      .getImageData(0, 0, steps, 1).data;\r\n    const trange = this.domain[1] - this.domain[0];\r\n    let c = Math.round(((val - this.domain[0]) / trange) * steps);\r\n    let alpha = 255;\r\n    if (c < 0) {\r\n      c = 0;\r\n      if (!this.clampLow) {\r\n        alpha = 0;\r\n      }\r\n    }\r\n    if (c > 255) {\r\n      c = 255;\r\n      if (!this.clampHigh) {\r\n        alpha = 0;\r\n      }\r\n    }\r\n\r\n    return [\r\n      csImageData[c * 4],\r\n      csImageData[(c * 4) + 1],\r\n      csImageData[(c * 4) + 2],\r\n      alpha,\r\n    ];\r\n  }\r\n  /**\r\n   * Sets a mathematical expression to be evaluated on the plot. Expression can contain mathematical operations with integer/float values, dataset identifiers or GLSL supported functions with a single parameter.\r\n   * Supported mathematical operations are: add '+', subtract '-', multiply '*', divide '/', power '**', unary plus '+a', unary minus '-a'.\r\n   * Useful GLSL functions are for example: radians, degrees, sin, asin, cos, acos, tan, atan, log2, log, sqrt, exp2, exp, abs, sign, floor, ceil, fract.\r\n   * @param {string} expression Mathematical expression. Example: '-2 * sin(3.1415 - dataset1) ** 2'\r\n   */\r\n  setExpression(expression: string) {\r\n    if (!expression || !expression.length) {\r\n      this.expressionAst = null;\r\n    } else {\r\n      this.expressionAst = parseArithmetics(expression);\r\n    }\r\n  }\r\n\r\n  setInterpolationMethod(method: 'nearest' | 'bilinear') {\r\n    this.interpolationMethod = method;\r\n  }\r\n\r\n  destroy() {\r\n    // 在使用完WebGL上下文后，释放资源\r\n    this.gl?.deleteProgram(this.program);\r\n    this.removeAllDataset();\r\n  }\r\n\r\n  /**\r\n   * Set RGB rendering options\r\n   */\r\n  setRGBOptions(options: RGBOptions) {\r\n    this._rgbBands = options.bands;\r\n    this._isRGB = true;\r\n\r\n    if (options.colorMapping) {\r\n      this._colorMapping = Object.entries(options.colorMapping)\r\n        .map(([from, to]) => [stringColorToRgba(from), stringColorToRgba(to)]) as [number[], number[]][];\r\n    } else {\r\n      this._colorMapping = [];\r\n    }\r\n\r\n    // 重新创建着色器程序\r\n    if (this.gl) {\r\n      this.program = createProgram(this.gl, vertexShaderSource, this.createFragmentShader(null));\r\n      this.gl.useProgram(this.program);\r\n    }\r\n  }\r\n}\r\n\r\n// register the symbols to be exported at the 'global' object (to be replaced by browserify)\r\nexport { plot, addColorScale, colorscales, renderColorScaleToCanvas };","import {\r\n  Cartesian2,\r\n  Cartographic,\r\n  Math as CesiumMath,\r\n  Rectangle,\r\n  WebMercatorTilingScheme,\r\n  Cartesian3,\r\n  Ellipsoid,\r\n} from 'cesium';\r\n\r\nclass TIFFImageryProviderTilingScheme extends WebMercatorTilingScheme {\r\n  readonly nativeRectangle: Rectangle;\r\n\r\n  constructor(options?: {\r\n    ellipsoid?: Ellipsoid;\r\n    numberOfLevelZeroTilesX?: number;\r\n    numberOfLevelZeroTilesY?: number;\r\n    rectangleSouthwestInMeters?: Cartesian2;\r\n    rectangleNortheastInMeters?: Cartesian2;\r\n    /** projection function, convert [lon, lat] position to [x, y] */\r\n    project: (pos: number[]) => number[];\r\n    /** unprojection function, convert [x, y] position to [lon, lat] */\r\n    unproject: (pos: number[]) => number[];\r\n  }) {\r\n    super(options);\r\n    \r\n    const { project, unproject } = options;\r\n\r\n    this.nativeRectangle = new Rectangle(options.rectangleSouthwestInMeters.x, options.rectangleSouthwestInMeters.y, options.rectangleNortheastInMeters.x, options.rectangleNortheastInMeters.y)\r\n\r\n    // @ts-ignore\r\n    this._projection = {\r\n      ellipsoid: this.ellipsoid,\r\n      project(cartographic: Cartographic, result?: Cartesian3): Cartesian3 {\r\n        const [x, y] = project([cartographic.longitude, cartographic.latitude].map(CesiumMath.toDegrees));\r\n        const z = cartographic.height;\r\n        return Cartesian3.fromElements(x, y, z, result);\r\n      },\r\n      unproject(cartesian: Cartesian3, result?: Cartographic): Cartographic {\r\n        const [longitude, latitude] = unproject([cartesian.x, cartesian.y]);\r\n        const height = cartesian.z;\r\n        return Cartographic.fromDegrees(longitude, latitude, height, result);\r\n      },\r\n    };\r\n    \r\n    const swMeters = new Cartesian3();\r\n    options.rectangleSouthwestInMeters.clone(swMeters);\r\n    const neMeters = new Cartesian3();\r\n    options.rectangleNortheastInMeters.clone(neMeters);\r\n    const seMeters = new Cartesian3(neMeters.x, swMeters.y);\r\n    const nwMeters = new Cartesian3(swMeters.x, neMeters.y);\r\n\r\n    const southwest = this.projection.unproject(swMeters);\r\n    const southeast = this.projection.unproject(seMeters);\r\n    const northwest = this.projection.unproject(nwMeters);\r\n    const northeast = this.projection.unproject(neMeters);\r\n\r\n    // @ts-ignore\r\n    this._rectangle = Rectangle.fromCartographicArray([southwest, southeast, northwest, northeast])\r\n  }\r\n\r\n  tileXYToNativeRectangle2(\r\n    x: number,\r\n    y: number,\r\n    level: number,\r\n  ) {\r\n    const rect = this.tileXYToRectangle(x, y, level);\r\n\r\n    const projection = this.projection;\r\n    const ws = projection.project(new Cartographic(rect.west, rect.south));\r\n    const wn = projection.project(new Cartographic(rect.west, rect.north));\r\n    const en = projection.project(new Cartographic(rect.east, rect.north));\r\n    const es = projection.project(new Cartographic(rect.east, rect.south));\r\n    const positions = [ws, wn, en, es];\r\n\r\n    const xx = positions.map(pos => pos.x);\r\n    const yy = positions.map(pos => pos.y);\r\n    return new Rectangle(\r\n      Math.min(...xx),\r\n      Math.min(...yy),\r\n      Math.max(...xx),\r\n      Math.max(...yy)\r\n    );\r\n  };\r\n\r\n  tileXYToRectangle(\r\n    x: number,\r\n    y: number,\r\n    level: number,\r\n  ) {\r\n    const rect = this.tileXYToNativeRectangle(x, y, level);\r\n\r\n    const projection = this.projection;\r\n    const ws = projection.unproject(new Cartesian3(rect.west, rect.south));\r\n    const wn = projection.unproject(new Cartesian3(rect.west, rect.north));\r\n    const en = projection.unproject(new Cartesian3(rect.east, rect.north));\r\n    const es = projection.unproject(new Cartesian3(rect.east, rect.south));\r\n    const newRect = Rectangle.fromCartographicArray([ws, wn, en, es]);\r\n    if (newRect.east < newRect.west) {\r\n      newRect.east += CesiumMath.TWO_PI;\r\n    }\r\n    return newRect;\r\n  };\r\n}\r\n\r\nexport default TIFFImageryProviderTilingScheme;\r\n","import { TypedArray } from \"geotiff\";\r\n\r\nexport function copyNewSize(array: TypedArray, width: number, height: number, samplesPerPixel = 1) {\r\n  return new (Object.getPrototypeOf(array).constructor)(width * height * samplesPerPixel) as typeof array;\r\n}\r\n\r\nexport type BBox = [minX: number, minY: number, maxX: number, maxY: number];\r\n\r\nexport type ReprojectionOptions = {\r\n  project: (pos: number[]) => number[];\r\n  sourceBBox: BBox;\r\n  targetBBox: BBox;\r\n  data: TypedArray;\r\n  sourceWidth: number;\r\n  sourceHeight: number;\r\n  targetWidth?: number;\r\n  targetHeight?: number;\r\n  nodata?: any;\r\n}\r\n\r\nfunction inRange(val: number, range: [number, number]) {\r\n  if ((val < range[0] && val < range[1]) || (val > range[0] && val > range[1])) {\r\n    return false;\r\n  } else {\r\n    return true;\r\n  }\r\n}\r\n\r\n// 处理单个数据块\r\nfunction processChunk(\r\n  options: ReprojectionOptions,\r\n  result: TypedArray,\r\n  startRow: number,\r\n  endRow: number,\r\n  targetWidth: number,\r\n  targetHeight: number\r\n) {\r\n  const { data, sourceBBox, targetBBox, project, sourceWidth, sourceHeight, nodata } = options;\r\n  const [minX, minY, maxX, maxY] = sourceBBox;\r\n  const [minLon, minLat, maxLon, maxLat] = targetBBox;\r\n\r\n  const stepX = Math.abs(maxX - minX) / sourceWidth;\r\n  const stepY = Math.abs(maxY - minY) / sourceHeight;\r\n  const stepLon = Math.abs(maxLon - minLon) / targetWidth;\r\n  const stepLat = Math.abs(maxLat - minLat) / targetHeight;\r\n\r\n  // 使用批量处理优化内部循环\r\n  const colBatchSize = 100;\r\n  for (let i = startRow; i < endRow; i++) {\r\n    for (let jBatch = 0; jBatch < targetWidth; jBatch += colBatchSize) {\r\n      const endJ = Math.min(jBatch + colBatchSize, targetWidth);\r\n      for (let j = jBatch; j < endJ; j++) {\r\n        const lon = minLon + stepLon * (j + 0.5);\r\n        const lat = maxLat - stepLat * (i + 0.5);\r\n        const [x, y] = project([lon, lat]);\r\n\r\n        if (!inRange(x, [minX, maxX]) || !inRange(y, [minY, maxY])) {\r\n          result[i * targetWidth + j] = nodata;\r\n          continue;\r\n        }\r\n\r\n        const indexX = ~~((x - minX) / stepX);\r\n        const indexY = ~~((maxY - y) / stepY);\r\n        result[i * targetWidth + j] = data[indexY * sourceWidth + indexX];\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport async function reprojection(options: ReprojectionOptions): Promise<TypedArray> {\r\n  const { targetWidth = options.sourceWidth, targetHeight = options.sourceHeight } = options;\r\n  const result = copyNewSize(options.data, targetWidth, targetHeight).fill(options.nodata);\r\n\r\n  // 如果数据量较小，使用同步处理\r\n  if (targetHeight * targetWidth < 10000) {\r\n    processChunk(options, result, 0, targetHeight, targetWidth, targetHeight);\r\n    return result;\r\n  }\r\n\r\n  // 计算最佳的块大小\r\n  const CHUNK_SIZE = Math.min(100, Math.max(10, Math.floor(targetHeight / 10)));\r\n\r\n  try {\r\n    // 分块处理\r\n    for (let startRow = 0; startRow < targetHeight; startRow += CHUNK_SIZE) {\r\n      const endRow = Math.min(startRow + CHUNK_SIZE, targetHeight);\r\n      await new Promise<void>((resolve) => {\r\n        requestAnimationFrame(() => {\r\n          processChunk(options, result, startRow, endRow, targetWidth, targetHeight);\r\n          resolve();\r\n        });\r\n      });\r\n    }\r\n    return result;\r\n  } finally {\r\n    // 在 finally 块中清理源数据，确保无论成功失败都会执行\r\n    if (options.data !== result) {\r\n      try {\r\n        options.data.fill(0);\r\n      } catch (e) {\r\n        console.warn('Failed to clean up source data:', e);\r\n      }\r\n    }\r\n  }\r\n}","export function createCanavas(width: number, height: number) {\r\n  if ('OffscreenCanvas' in window) {\r\n    return new OffscreenCanvas(width, height);\r\n  } else {\r\n    const canv = document.createElement(\"canvas\");\r\n    canv.width = width;\r\n    canv.height = height;\r\n    return canv;\r\n  }\r\n}","import { Event, GeographicTilingScheme, Credit, Rectangle, ImageryLayerFeatureInfo, Math as CesiumMath, DeveloperError, defined, Cartesian2, WebMercatorTilingScheme } from \"cesium\";\r\nimport GeoTIFF, { Pool, fromUrl, fromBlob, GeoTIFFImage, TypedArrayArrayWithDimensions } from 'geotiff';\r\n\r\nimport { addColorScale, plot } from './plotty'\r\nimport { getMinMax, generateColorScale, findAndSortBandNumbers, stringColorToRgba } from \"./helpers/utils\";\r\nimport { ColorScaleNames, TypedArray } from \"./plotty/typing\";\r\nimport TIFFImageryProviderTilingScheme from \"./TIFFImageryProviderTilingScheme\";\r\nimport { BBox, reprojection } from \"./helpers/reprojection\";\r\n\r\nimport { reverseArray } from \"./helpers/utils\";\r\nimport { createCanavas } from \"./helpers/createCanavas\";\r\n\r\n\r\nexport interface SingleBandRenderOptions {\r\n  /** band index start from 1, defaults to 1 */\r\n  band?: number;\r\n\r\n  /**\r\n   * The color scale image to use.\r\n   */\r\n  colorScaleImage?: HTMLCanvasElement | HTMLImageElement;\r\n\r\n  /**\r\n   * The name of a named color scale to use.\r\n   */\r\n  colorScale?: ColorScaleNames;\r\n\r\n  /** custom interpolate colors, [stopValue(0 - 1), color] or [color], if the latter, means equal distribution \r\n   * @example\r\n   * [[0, 'red'], [0.6, 'green'], [1, 'blue']]\r\n  */\r\n  colors?: [number, string][] | string[];\r\n\r\n  /** Determine whether to use the true value range for custom color ranges */\r\n  useRealValue?: boolean;\r\n\r\n  /** defaults to continuous */\r\n  type?: 'continuous' | 'discrete';\r\n\r\n  /**\r\n   * The value domain to scale the color.\r\n   */\r\n  domain?: [number, number];\r\n\r\n  /**\r\n   * Range of values that will be rendered, values outside of the range will be transparent.\r\n   */\r\n  displayRange?: [number, number];\r\n\r\n  /**\r\n   * Set if displayRange should be used.\r\n   */\r\n  applyDisplayRange?: boolean;\r\n\r\n  /**\r\n   * Whether or not values below the domain shall be clamped.\r\n   */\r\n  clampLow?: boolean;\r\n\r\n  /**\r\n   * Whether or not values above the domain shall be clamped (if not defined defaults to clampLow value).\r\n   */\r\n  clampHigh?: boolean;\r\n\r\n  /**\r\n   * Sets a mathematical expression to be evaluated on the plot. Expression can contain mathematical operations with integer/float values, band identifiers or GLSL supported functions with a single parameter.\r\n   * Supported mathematical operations are: add '+', subtract '-', multiply '*', divide '/', power '**', unary plus '+a', unary minus '-a'.\r\n   * Useful GLSL functions are for example: radians, degrees, sin, asin, cos, acos, tan, atan, log2, log, sqrt, exp2, exp, abs, sign, floor, ceil, fract.\r\n   * Don't forget to set the domain parameter!\r\n   * @example \r\n   * '-2 * sin(3.1415 - b1) ** 2'\r\n   * '(b1 - b2) / (b1 + b2)'\r\n   */\r\n  expression?: string;\r\n}\r\n\r\nexport interface MultiBandRenderOptions {\r\n  /** Band value starts from 1 */\r\n  r?: {\r\n    band: number;\r\n    min?: number;\r\n    max?: number;\r\n  };\r\n  g?: {\r\n    band: number;\r\n    min?: number;\r\n    max?: number;\r\n  };\r\n  b?: {\r\n    band: number;\r\n    min?: number;\r\n    max?: number;\r\n  };\r\n}\r\n\r\nexport type TIFFImageryProviderRenderOptions = {\r\n  /** nodata value, default read from tiff meta */\r\n  nodata?: number;\r\n  /** Only valid for three band rendering, defaults to { 'black': 'transparent' } */\r\n  colorMapping?: Record<string, string>;\r\n  /** try to render multi band cog to RGB, priority 1 */\r\n  convertToRGB?: boolean;\r\n  /** priority 2 */\r\n  multi?: MultiBandRenderOptions;\r\n  /** priority 3 */\r\n  single?: SingleBandRenderOptions;\r\n  /** resample method, defaults to nearest */\r\n  resampleMethod?: 'nearest' | 'bilinear'\r\n}\r\n\r\nexport interface TIFFImageryProviderOptions {\r\n  requestOptions?: {\r\n    /** defaults to false */\r\n    forceXHR?: boolean;\r\n    headers?: Record<string, any>;\r\n    credentials?: boolean;\r\n    /** defaults to 0 */\r\n    maxRanges?: number;\r\n    /** defaults to false */\r\n    allowFullFile?: boolean;\r\n    [key: string]: any;\r\n  };\r\n  credit?: string;\r\n  tileSize?: number;\r\n  maximumLevel?: number;\r\n  /** \r\n   * If true, the maximumLevel will be calculated based on the tile number\r\n   * @default false\r\n   * */\r\n  useImageCountAsMaximumLevel?: boolean;\r\n  minimumLevel?: number;\r\n  enablePickFeatures?: boolean;\r\n  hasAlphaChannel?: boolean;\r\n  renderOptions?: TIFFImageryProviderRenderOptions;\r\n  /**\r\n   * If TIFF's projection is not EPSG:4326 or EPSG:3857, you can pass the ``projFunc`` to handle the projection\r\n   * @experimental\r\n   */\r\n  projFunc?: (code: number) => {\r\n    /** projection function, convert [lon, lat] position to [x, y] */\r\n    project: ((pos: number[]) => number[]);\r\n    /** unprojection function, convert [x, y] position to [lon, lat] */\r\n    unproject: ((pos: number[]) => number[]);\r\n  } | undefined;\r\n  /** cache size, defaults to 100 */\r\n  cacheSize?: number;\r\n  /** resample web worker pool size, defaults to the number of CPUs available. \r\n   * When this parameter is `null` or 0, \r\n   * then the resampling will be done in the main thread. \r\n   * */\r\n  workerPoolSize?: number;\r\n}\r\n\r\nconst canvas = createCanavas(256, 256);\r\n\r\nexport class TIFFImageryProvider {\r\n  ready: boolean;\r\n  tilingScheme: TIFFImageryProviderTilingScheme | GeographicTilingScheme | WebMercatorTilingScheme;\r\n  rectangle: Rectangle;\r\n  tileSize: number;\r\n  tileWidth: number;\r\n  tileHeight: number;\r\n  maximumLevel: number;\r\n  minimumLevel: number;\r\n  credit: Credit;\r\n  errorEvent: Event;\r\n  readyPromise: Promise<boolean>;\r\n  bands: Record<number, {\r\n    min: number;\r\n    max: number;\r\n  }>;\r\n  noData: number;\r\n  hasAlphaChannel: boolean;\r\n  plot?: plot;\r\n  renderOptions: TIFFImageryProviderRenderOptions;\r\n  readSamples: number[];\r\n  requestLevels: number[];\r\n  bbox: number[];\r\n  private _destroyed = false;\r\n  private _source!: GeoTIFF;\r\n  private _imageCount!: number;\r\n  private _images: (GeoTIFFImage | null)[] = [];\r\n   private _masks: (GeoTIFFImage | null)[] = [];\r\n  private _imagesCache: Map<string, ImageData | HTMLCanvasElement | HTMLImageElement | OffscreenCanvas> = new Map();\r\n  private _cacheSize: number;\r\n  private _isTiled: boolean;\r\n  private _proj?: {\r\n    /** projection function, convert [lon, lat] position to EPSG:4326 */\r\n    project: (pos: number[]) => number[];\r\n    /** unprojection function */\r\n    unproject: (pos: number[]) => number[];\r\n  };\r\n  origin: number[];\r\n  reverseY: boolean = false;\r\n  samples: number;\r\n  geotiffWorkerPool: Pool;\r\n  private _buffer: number = 1;\r\n  private _rgbPlot: plot;\r\n\r\n  constructor(private readonly options: TIFFImageryProviderOptions & {\r\n    /**\r\n     * @deprecated \r\n     * Deprecated after cesium@1.104+, you can use fromUrl instead\r\n     * @example \r\n     * const provider = await TIFFImageryProvider.fromUrl(url)\r\n     */\r\n    url: string | File | Blob;\r\n  }) {\r\n    this.hasAlphaChannel = options.hasAlphaChannel ?? true;\r\n    this.maximumLevel = options.maximumLevel ?? 18;\r\n    this.minimumLevel = options.minimumLevel ?? 0;\r\n    this.credit = new Credit(options.credit || \"\", false);\r\n    this.errorEvent = new Event();\r\n    this._cacheSize = options.cacheSize ?? 100;\r\n    this.geotiffWorkerPool = new Pool(options.workerPoolSize);\r\n\r\n    this.ready = false;\r\n    if (defined(options.url)) {\r\n      this.readyPromise = this._build(options.url, options).then(() => {\r\n        return true;\r\n      })\r\n    }\r\n  }\r\n\r\n  get isDestroyed() {\r\n    return this._destroyed\r\n  }\r\n\r\n  private async _build(url: string | File | Blob, options: TIFFImageryProviderOptions = {}) {\r\n    const { tileSize, renderOptions, projFunc, requestOptions } = options;\r\n    let source = await (url instanceof File || url instanceof Blob ? fromBlob(url) : fromUrl(url, requestOptions))\r\n    let image = await source.getImage();\r\n    this._isTiled = image.isTiled;\r\n\r\n    // handle native tiff range request error\r\n    if (!this._isTiled && typeof url === 'string') {\r\n      source = await fromBlob(await (await fetch(url)).blob());\r\n      image = await source.getImage();\r\n    }\r\n\r\n    this._source = source;\r\n\r\n    // get bounding box\r\n    this.origin = this._getOrigin(image);\r\n    this.bbox = image.getBoundingBox();\r\n    this.reverseY = this._checkIfReversed(image);\r\n    const [west, south, east, north] = this.bbox;\r\n\r\n    const prjCode = +(image.geoKeys.ProjectedCSTypeGeoKey ?? image.geoKeys.GeographicTypeGeoKey)\r\n\r\n    this._proj = projFunc?.(prjCode)\r\n    if (prjCode === 3857 || prjCode === 900913) {\r\n      this.tilingScheme = new WebMercatorTilingScheme({\r\n        rectangleNortheastInMeters: new Cartesian2(east, north),\r\n        rectangleSouthwestInMeters: new Cartesian2(west, south),\r\n      })\r\n    } else if (prjCode === 4326) {\r\n      this.tilingScheme = new GeographicTilingScheme({\r\n        rectangle: Rectangle.fromDegrees(...this.bbox),\r\n        numberOfLevelZeroTilesX: 1,\r\n        numberOfLevelZeroTilesY: 1\r\n      });\r\n    } else if (typeof this._proj?.project === 'function' && typeof this._proj?.unproject === 'function') {\r\n      console.warn(`[Experimental] Reprojection EPSG:${prjCode}`)\r\n      this.tilingScheme = new TIFFImageryProviderTilingScheme({\r\n        rectangleNortheastInMeters: new Cartesian2(east, north),\r\n        rectangleSouthwestInMeters: new Cartesian2(west, south),\r\n        ...this._proj\r\n      })\r\n    } else {\r\n      const error = new DeveloperError(`Unspported projection type: EPSG:${prjCode}, please add projFunc parameter to handle projection`)\r\n      throw error;\r\n    }\r\n\r\n    this.rectangle = this.tilingScheme.rectangle\r\n    // dealing with situations crossing the 180 degree meridian\r\n    // https://github.com/CesiumGS/cesium/blob/da00d26473f663db180cacd8e662ca4309e09560/packages/engine/Source/Core/TileAvailability.js#L195\r\n    if (this.rectangle.east < this.rectangle.west) {\r\n      this.rectangle.east += CesiumMath.TWO_PI;\r\n    }\r\n\r\n    this._imageCount = await source.getImageCount();\r\n    for (let i = 0; i < this._imageCount; i++) {\r\n      const img = await source.getImage(i);\r\n      if (this._isMask(img)) {\r\n        // console.warn(`Image ${i} is a mask image, skipping...`);\r\n        this._masks.push(img);\r\n      }\r\n      else {\r\n        this._images.push(img);\r\n      }\r\n    }\r\n    this._imageCount = this._images.length;\r\n    if (options.useImageCountAsMaximumLevel) {\r\n      this.maximumLevel = this._imageCount - 1;\r\n    }\r\n    this.tileSize = this.tileWidth = tileSize || (this._isTiled ? image.getTileWidth() : image.getWidth()) || 256;\r\n    this.tileHeight = tileSize || (this._isTiled ? image.getTileHeight() : image.getHeight()) || 256;\r\n    // get the appropriate COG level\r\n    this.requestLevels = this._isTiled ? await this._getCogLevels() : [0];\r\n    // this._images = new Array(this._imageCount).fill(null);\r\n\r\n    // Get the number of bands\r\n    const samples = image.getSamplesPerPixel();\r\n    this.samples = samples;\r\n    this.renderOptions = renderOptions ?? {}\r\n    // Get nodata value\r\n    const noData = image.getGDALNoData();\r\n    this.noData = this.renderOptions.nodata ?? noData;\r\n\r\n    // Assign initial value\r\n    if (samples < 3 && this.renderOptions.convertToRGB) {\r\n      const error = new DeveloperError('Can not render the image as RGB, please check the convertToRGB parameter')\r\n      throw error;\r\n    }\r\n    if (!this.renderOptions.single && !this.renderOptions.multi && !this.renderOptions.convertToRGB) {\r\n      if (samples > 2) {\r\n        this.renderOptions = {\r\n          convertToRGB: true,\r\n          ...this.renderOptions\r\n        }\r\n      } else {\r\n        this.renderOptions = {\r\n          single: {\r\n            band: 1\r\n          },\r\n          ...this.renderOptions\r\n        }\r\n      }\r\n    }\r\n    if (this.renderOptions.single) {\r\n      this.renderOptions.single.band = this.renderOptions.single.band ?? 1;\r\n    }\r\n\r\n    const { single, multi, convertToRGB } = this.renderOptions;\r\n    this.readSamples = multi ? [multi.r.band - 1, multi.g.band - 1, multi.b.band - 1] : convertToRGB ? [0, 1, 2] : [single.band - 1];\r\n    if (single?.expression) {\r\n      this.readSamples = findAndSortBandNumbers(single.expression);\r\n    }\r\n\r\n    // Get the maximum and minimum value information of the band\r\n    const bands: Record<number, {\r\n      min: number;\r\n      max: number;\r\n    }> = {};\r\n    await Promise.all(this.readSamples.map(async (i) => {\r\n      const element = image.getGDALMetadata(i);\r\n      const bandNum = i + 1;\r\n\r\n      if (element?.STATISTICS_MINIMUM && element?.STATISTICS_MAXIMUM) {\r\n        bands[bandNum] = {\r\n          min: +element.STATISTICS_MINIMUM,\r\n          max: +element.STATISTICS_MAXIMUM,\r\n        }\r\n      } else {\r\n        if (convertToRGB) {\r\n          bands[bandNum] = {\r\n            min: 0,\r\n            max: 255,\r\n          }\r\n        };\r\n\r\n        if (multi) {\r\n          const inputBand = multi[Object.keys(multi).find(key => multi[key]?.band === bandNum)]\r\n          if (inputBand?.min !== undefined && inputBand?.max !== undefined) {\r\n            const { min, max } = inputBand\r\n            bands[bandNum] = {\r\n              min, max\r\n            }\r\n          }\r\n        }\r\n\r\n        if (single && !single.expression && single.band === bandNum && single.domain) {\r\n          bands[bandNum] = {\r\n            min: single.domain[0],\r\n            max: single.domain[1],\r\n          }\r\n        }\r\n\r\n        if (!single?.expression && !bands[bandNum]) {\r\n          // Try to get the maximum and minimum values ​​of the band\r\n          console.warn(`Can not get band${bandNum} min/max, try to calculate min/max values, or setting ${single ? 'domain' : 'min / max'}`)\r\n\r\n          const previewImage = await source.getImage(this.requestLevels[0])\r\n          const data = (await previewImage.readRasters({\r\n            samples: [i],\r\n            pool: this.geotiffWorkerPool,\r\n          }) as unknown as number[][])[0].filter((item: any) => !isNaN(item))\r\n          bands[bandNum] = getMinMax(data, noData)\r\n        }\r\n      }\r\n    }))\r\n    this.bands = bands;\r\n\r\n    try {\r\n      // 如果是单波段渲染,创建plot对象\r\n      if (this.renderOptions.single) {\r\n        const band = this.bands[single.band];\r\n        if (!single.expression && !band) {\r\n          throw new DeveloperError(`Invalid band${single.band}`);\r\n        }\r\n        const domain = single.domain ?? [band.min, band.max]\r\n        this.plot = new plot({\r\n          canvas,\r\n          ...single,\r\n          domain,\r\n          tileWidth: this.tileWidth,\r\n          tileHeight: this.tileHeight,\r\n          buffer: this._buffer\r\n        })\r\n        this.plot.setNoDataValue(this.noData);\r\n\r\n        const { expression, colors, colorScaleImage } = single;\r\n        this.plot.setExpression(expression);\r\n        if (colors) {\r\n          const colorScale = generateColorScale(colors, single?.useRealValue ? domain : [0, 1])\r\n          addColorScale('temp', colorScale.colors, colorScale.positions);\r\n          this.plot.setColorScale('temp' as any);\r\n        } else if (!colorScaleImage) {\r\n          this.plot.setColorScale(single?.colorScale ?? 'blackwhite');\r\n        }\r\n      }\r\n\r\n      // 如果是RGB渲染,创建RGB plot对象\r\n      if (this.renderOptions.multi || this.renderOptions.convertToRGB) {\r\n        this._rgbPlot = new plot({\r\n          canvas,\r\n          tileWidth: this.tileWidth,\r\n          tileHeight: this.tileHeight,\r\n          buffer: this._buffer\r\n        });\r\n      }\r\n\r\n    } catch (e) {\r\n      console.error(e);\r\n      this.errorEvent.raiseEvent(e);\r\n    }\r\n    this.readyPromise = Promise.resolve(true);\r\n    this.ready = true;\r\n  }\r\n\r\n  static async fromUrl(url: string | File | Blob, options: TIFFImageryProviderOptions = {}) {\r\n    const provider = new TIFFImageryProvider(options as any);\r\n\r\n    await provider._build(url, {\r\n      ...options,\r\n      url: undefined\r\n    } as any)\r\n\r\n    return provider;\r\n  }\r\n\r\n  /**\r\n   * Get the origin of an image.  If the image does not have an affine transform,\r\n   * the top-left corner of the pixel bounds is returned.\r\n   * @param {GeoTIFFImage} image The image.\r\n   * @return {Array<number>} The image origin.\r\n   */\r\n  private _getOrigin(image: GeoTIFFImage): number[] {\r\n    try {\r\n      return image.getOrigin().slice(0, 2);\r\n    } catch (_) {\r\n      return [0, image.fileDirectory.ImageLength];\r\n    }\r\n  }\r\n  private _isMask(image: GeoTIFFImage): boolean {\r\n  const fileDirectory = image.fileDirectory;\r\n  const type = fileDirectory.NewSubfileType || 0;\r\n  return (type & 4) === 4;\r\n}\r\n\r\n  private _checkIfReversed(image: GeoTIFFImage) {\r\n    const pixelScale = image.getFileDirectory().ModelPixelScale;\r\n    if (pixelScale) {\r\n      const pixelScaleY = pixelScale[1];\r\n      if (pixelScaleY < 0) return true;\r\n    }\r\n\r\n    const transformation = image.getFileDirectory().ModelTransformation;\r\n    if (transformation) {\r\n      const originX = transformation[3];\r\n      const originY = transformation[7];\r\n      if (originY > originX) return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  /**\r\n   * get suitable cog levels\r\n   */\r\n  private async _getCogLevels() {\r\n    const levels: number[] = [];\r\n    let maximumLevel: number = this._imageCount - 1;\r\n    for (let i = this._imageCount - 1; i >= 0; i--) {\r\n      const image = this._images[i] ;\r\n      const width = image.getWidth();\r\n      const height = image.getHeight();\r\n      const size = Math.max(width, height);\r\n\r\n      // If the image tileSize of the first tile is greater than 256, the sequence will be delayed to reduce the amount of requests.\r\n      if (i === this._imageCount - 1) {\r\n        const firstImageLevel = Math.ceil((size - this.tileSize) / this.tileSize)\r\n        levels.push(...new Array(firstImageLevel).fill(i))\r\n      }\r\n\r\n      // add 50% tilewidth tolerance\r\n      if (size > (this.tileSize * 0.5)) {\r\n        maximumLevel = i;\r\n        break;\r\n      }\r\n    }\r\n    let nowCogLevel: number = maximumLevel;\r\n    while (nowCogLevel >= 0) {\r\n      levels.push(nowCogLevel--);\r\n    }\r\n    return levels;\r\n  }\r\n\r\n  /**\r\n   * Get tile data\r\n   * @param x \r\n   * @param y \r\n   * @param z \r\n   */\r\n  private async _loadTile(reqx: number, reqy: number, reqz: number) {\r\n    try {\r\n      let x = reqx, y = reqy, z = reqz, startX = reqx, startY = reqy;\r\n      const maxCogLevel = this.requestLevels.length - 1;\r\n      if (z > maxCogLevel) {\r\n        z = maxCogLevel;\r\n        x = x >> (reqz - maxCogLevel)\r\n        y = y >> (reqz - maxCogLevel)\r\n        startX = x << (reqz - z);\r\n        startY = y << (reqz - z);\r\n      }\r\n\r\n      const index = this.requestLevels[z];\r\n      let image = this._images[index];\r\n      if (!image) {\r\n        image = this._images[index] = await this._source.getImage(index);\r\n      }\r\n\r\n      const width = image.getWidth();\r\n      const height = image.getHeight();\r\n      const tileXNum = this.tilingScheme.getNumberOfXTilesAtLevel(z);\r\n      const tileYNum = this.tilingScheme.getNumberOfYTilesAtLevel(z);\r\n      const tilePixel = {\r\n        xWidth: width / tileXNum,\r\n        yWidth: height / tileYNum\r\n      }\r\n      let window = [\r\n        Math.round(x * tilePixel.xWidth),\r\n        Math.round(y * tilePixel.yWidth),\r\n        Math.round((x + 1) * tilePixel.xWidth),\r\n        Math.round((y + 1) * tilePixel.yWidth),\r\n      ];\r\n\r\n      if (this._proj && this.tilingScheme instanceof TIFFImageryProviderTilingScheme) {\r\n        const targetRect = this.tilingScheme.tileXYToNativeRectangle2(x, y, z);\r\n        const nativeRect = this.tilingScheme.nativeRectangle;\r\n        targetRect.west -= (nativeRect.width / width)\r\n        targetRect.east += (nativeRect.width / width)\r\n        targetRect.south -= (nativeRect.height / height)\r\n        targetRect.north += (nativeRect.height / height)\r\n\r\n        window = [\r\n          ~~((targetRect.west - nativeRect.west) / nativeRect.width * width),\r\n          ~~((nativeRect.north - targetRect.north) / nativeRect.height * height),\r\n          ~~((targetRect.east - nativeRect.west) / nativeRect.width * width),\r\n          ~~((nativeRect.north - targetRect.south) / nativeRect.height * height),\r\n        ]\r\n      }\r\n      if (this.reverseY) {\r\n        window = [window[0], height - window[3], window[2], height - window[1]];\r\n      }\r\n      window = [window[0] - this._buffer, window[1] - this._buffer, window[2] + this._buffer, window[3] + this._buffer]\r\n      const sourceWidth = window[2] - window[0], sourceHeight = window[3] - window[1];\r\n\r\n      const options = {\r\n        window,\r\n        pool: this.geotiffWorkerPool,\r\n        samples: this.readSamples,\r\n        fillValue: this.noData,\r\n        interleave: false,\r\n      }\r\n\r\n      let res: TypedArrayArrayWithDimensions | TypedArray[];\r\n\r\n      // 使用 AbortController 来控制异步操作\r\n      const abortController = new AbortController();\r\n      const timeoutId = setTimeout(() => abortController.abort(), 30000); // 30秒超时\r\n\r\n      try {\r\n        if (this.renderOptions.convertToRGB) {\r\n          res = await image.readRGB(options) as TypedArrayArrayWithDimensions;\r\n        } else {\r\n          res = await image.readRasters(options) as TypedArrayArrayWithDimensions;\r\n          if (this.reverseY) {\r\n            res = await Promise.all((res as TypedArray[]).map((array) =>\r\n              reverseArray({ array, width: sourceWidth, height: sourceHeight })\r\n            )) as TypedArray[];\r\n          }\r\n        }\r\n\r\n        if (this._proj?.project && this.tilingScheme instanceof TIFFImageryProviderTilingScheme) {\r\n          const sourceRect = this.tilingScheme.tileXYToNativeRectangle2(x, y, z);\r\n          const targetRect = this.tilingScheme.tileXYToRectangle(x, y, z);\r\n\r\n          const sourceBBox: BBox = [sourceRect.west, sourceRect.south, sourceRect.east, sourceRect.north];\r\n          const targetBBox = [targetRect.west, targetRect.south, targetRect.east, targetRect.north].map(CesiumMath.toDegrees) as BBox;\r\n\r\n          const result: TypedArray[] = [];\r\n          for (let i = 0; i < res.length; i++) {\r\n            try {\r\n              // 在循环中释放临时数据\r\n              const sourceData = res[i] as TypedArray;\r\n              const prjData = await reprojection({\r\n                data: sourceData,\r\n                sourceWidth,\r\n                sourceHeight,\r\n                nodata: this.noData,\r\n                project: this._proj.project,\r\n                sourceBBox,\r\n                targetBBox,\r\n              });\r\n              result.push(prjData);\r\n            } finally {\r\n              // 如果不是最后一个通道，释放源数据\r\n              if (i < res.length - 1 && res[i]) {\r\n                try {\r\n                  (res[i] as TypedArray).fill(0);\r\n                  res[i] = null;\r\n                } catch (e) {\r\n                  console.warn('Failed to clean up channel data:', e);\r\n                }\r\n              }\r\n            }\r\n          }\r\n          res = result;\r\n        }\r\n\r\n        const tileNum = 1 << (reqz - z)\r\n        const x0 = (reqx - startX) / tileNum;\r\n        const y0 = (reqy - startY) / tileNum;\r\n        const step = 1 / (1 << (reqz - z))\r\n        const x1 = x0 + step;\r\n        const y1 = y0 + step;\r\n\r\n        clearTimeout(timeoutId);\r\n        return {\r\n          data: res,\r\n          width: sourceWidth,\r\n          height: sourceHeight,\r\n          window: [x0, y0, x1, y1] as [number, number, number, number]\r\n        };\r\n      } catch (error) {\r\n        if (error.name === 'AbortError') {\r\n          throw new Error('Tile loading timeout');\r\n        }\r\n        throw error;\r\n      }\r\n    } catch (error) {\r\n      this.errorEvent.raiseEvent(error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  async requestImage(x: number, y: number, z: number) {\r\n    if (!this.ready) {\r\n      throw new DeveloperError(\r\n        \"requestImage must not be called before the imagery provider is ready.\"\r\n      );\r\n    }\r\n    if (z < this.minimumLevel || z > this.maximumLevel) return undefined;\r\n\r\n    const cacheKey = `${x}_${y}_${z}`;\r\n    if (this._imagesCache.has(cacheKey)) {\r\n      return this._imagesCache.get(cacheKey);\r\n    }\r\n\r\n    const { single, multi, convertToRGB } = this.renderOptions;\r\n\r\n    try {\r\n      const { width, height, data, window } = await this._loadTile(x, y, z);\r\n\r\n      if (this._destroyed || !width || !height) {\r\n        return undefined;\r\n      }\r\n\r\n      let result: ImageData | HTMLImageElement | HTMLCanvasElement | OffscreenCanvas;\r\n      let targetPlot: plot;\r\n\r\n      try {\r\n        // Determine which plot to use\r\n        if (multi || convertToRGB) {\r\n          if (!this._rgbPlot) {\r\n            console.warn('RGB plot not initialized');\r\n            return undefined;\r\n          }\r\n          targetPlot = this._rgbPlot;\r\n\r\n          // Setup RGB rendering\r\n          targetPlot.removeAllDataset();\r\n          this.readSamples.forEach((sample, index) => {\r\n            targetPlot.addDataset(`band${sample + 1}`, data[index], width, height);\r\n          });\r\n\r\n          targetPlot.setRGBOptions({\r\n            bands: multi ?? ['r', 'g', 'b'].reduce((pre, val, index) => ({\r\n              ...pre,\r\n              [val]: {\r\n                band: index + 1,\r\n                min: 0,\r\n                max: 255\r\n              }\r\n            }), {}),\r\n            colorMapping: this.renderOptions.colorMapping\r\n          });\r\n        } else if (single && this.plot) {\r\n          targetPlot = this.plot;\r\n\r\n          // Setup single band rendering\r\n          targetPlot.removeAllDataset();\r\n          this.readSamples.forEach((sample, index) => {\r\n            targetPlot.addDataset(`b${sample + 1}`, data[index], width, height);\r\n          });\r\n\r\n          if (single.expression) {\r\n            targetPlot.render(window);\r\n          } else {\r\n            targetPlot.renderDataset(`b${single.band}`, window);\r\n          }\r\n        } else {\r\n          return undefined;\r\n        }\r\n\r\n        // Set interpolation method\r\n        targetPlot.setInterpolationMethod(this.renderOptions.resampleMethod || 'nearest');\r\n\r\n        // Render to canvas\r\n        targetPlot.render(window);\r\n        const canv = createCanavas(this.tileWidth, this.tileHeight);\r\n        const ctx = canv.getContext(\"2d\") as CanvasRenderingContext2D;\r\n        ctx.drawImage(targetPlot.canvas, 0, 0);\r\n        result = canv;\r\n\r\n        // Cache the result\r\n        if (result) {\r\n          if (this._imagesCache.size >= this._cacheSize) {\r\n            const oldestKey = this._imagesCache.keys().next().value;\r\n            this._imagesCache.delete(oldestKey);\r\n          }\r\n          this._imagesCache.set(cacheKey, result);\r\n        }\r\n\r\n        return result;\r\n      } catch (e) {\r\n        console.error('Error during rendering:', e);\r\n        return undefined;\r\n      }\r\n    } catch (e) {\r\n      console.error(e);\r\n      this.errorEvent.raiseEvent(e);\r\n      throw e;\r\n    }\r\n  }\r\n\r\n  async pickFeatures(x: number, y: number, zoom: number, longitude: number, latitude: number) {\r\n    if (!this.options.enablePickFeatures) return undefined\r\n\r\n    const z = zoom > this.maximumLevel ? this.maximumLevel : zoom;\r\n    const index = this.requestLevels[z];\r\n    let image = this._images[index];\r\n    if (!image) {\r\n      image = this._images[index] = await this._source.getImage(index);\r\n    }\r\n    const width = image.getWidth();\r\n    const height = image.getHeight();\r\n    let posX: number, posY: number, window: number[];\r\n    const { west, south, north, width: lonWidth } = this.rectangle;\r\n    let lonGap = longitude - west;\r\n    // Handling cases across 180° longitude\r\n    if (longitude < west) {\r\n      lonGap += CesiumMath.TWO_PI;\r\n    }\r\n\r\n    posX = ~~(Math.abs(lonGap / lonWidth) * width);\r\n    posY = ~~(Math.abs((north - latitude) / (north - south)) * height);\r\n    window = [posX, posY, posX + 1, posY + 1];\r\n\r\n    if (this.reverseY) {\r\n      posY = height - posY;\r\n      window = [posX, posY - 1, posX + 1, posY]\r\n    }\r\n    const options = {\r\n      window,\r\n      height: 1,\r\n      width: 1,\r\n      pool: this.geotiffWorkerPool,\r\n      interleave: false,\r\n    }\r\n    let res: TypedArray[];\r\n    if (this.renderOptions.convertToRGB) {\r\n      res = await image.readRGB(options) as TypedArray[];\r\n    } else {\r\n      res = await image.readRasters(options) as TypedArray[];\r\n    }\r\n\r\n    const featureInfo = new ImageryLayerFeatureInfo()\r\n    featureInfo.name = `lon:${(longitude / Math.PI * 180).toFixed(6)}, lat:${(latitude / Math.PI * 180).toFixed(6)}`;\r\n    const data = {};\r\n    res?.forEach((item: any, index: number) => {\r\n      data[index] = item?.[0];\r\n    })\r\n    featureInfo.data = data\r\n    if (res) {\r\n      featureInfo.configureDescriptionFromProperties(data)\r\n    }\r\n    return [featureInfo];\r\n  }\r\n\r\n  destroy() {\r\n    // 清理图像缓存\r\n    if (this._imagesCache) {\r\n      for (const key in this._imagesCache) {\r\n        delete this._imagesCache[key];\r\n      }\r\n      this._imagesCache.clear();\r\n    }\r\n\r\n    // 销毁WebGL资源\r\n    if (this.plot && this.plot.gl) {\r\n      for (const programKey in this.plot.programCache) {\r\n        this.plot.gl.deleteProgram(this.plot.programCache[programKey]);\r\n      }\r\n      this.plot.gl.deleteBuffer(this.plot.positionBuffer);\r\n    }\r\n\r\n    // 清理其他资源\r\n    this.plot?.destroy();\r\n    this._images = [];\r\n    this._masks = [];\r\n    this._source = undefined;\r\n    this._destroyed = true;\r\n    this._rgbPlot?.destroy();\r\n    this._rgbPlot = undefined;\r\n  }\r\n}\r\n\r\nexport default TIFFImageryProvider;"]}